From 3e847ba58d7a14ee32c49574558ec4355e2990de Mon Sep 17 00:00:00 2001 From: mk Date: Fri, 3 Apr 2026 15:40:14 -0300 Subject: [PATCH] adding prosody --- social/prosody/.env.example | 6 + social/prosody/docker-compose.yml | 44 ++++++ social/prosody/prosody.cfg.lua | 225 ++++++++++++++++++++++++++++++ 3 files changed, 275 insertions(+) create mode 100644 social/prosody/.env.example create mode 100644 social/prosody/docker-compose.yml create mode 100644 social/prosody/prosody.cfg.lua diff --git a/social/prosody/.env.example b/social/prosody/.env.example new file mode 100644 index 0000000..1e3df5a --- /dev/null +++ b/social/prosody/.env.example @@ -0,0 +1,6 @@ +# The XMPP domain users will register under (e.g. xmpp.example.com) +XMPP_DOMAIN=xmpp.example.com + +# Admin JID(s) — comma-separated, must match XMPP_DOMAIN +# e.g. XMPP_ADMIN=admin@xmpp.example.com +XMPP_ADMIN=admin@xmpp.example.com diff --git a/social/prosody/docker-compose.yml b/social/prosody/docker-compose.yml new file mode 100644 index 0000000..fe31156 --- /dev/null +++ b/social/prosody/docker-compose.yml @@ -0,0 +1,44 @@ +services: + # One-time init: creates ./data and ./certs with the correct ownership + # Also, prosody's official docker image do not have any latest tag, so using current latest tag 13.0 + prosody-init: + image: prosodyim/prosody:13.0 + container_name: prosody-init + restart: "no" + entrypoint: /bin/sh + command: -c "mkdir -p /var/lib/prosody /etc/prosody/certs && chown prosody:prosody /var/lib/prosody /etc/prosody/certs" + volumes: + - ./data:/var/lib/prosody + - ./certs:/etc/prosody/certs + + # One-time init: dumps certs from Traefik's acme.json and makes them readable + certs-init: + image: ldez/traefik-certs-dumper:latest + container_name: prosody-certs-init + restart: "no" + entrypoint: /bin/sh + command: -c "traefik-certs-dumper file --version v2 --source /traefik/acme.json --dest /output && chmod 644 /output/certs/*.crt /output/private/*.key" + volumes: + - ../../tools/wireguard/letsencrypt:/traefik:ro # Change this to cert path if not using same folder structure + - ./certs:/output + + prosody: + image: prosodyim/prosody:13.0 + container_name: prosody + restart: unless-stopped + env_file: .env + volumes: + - ./prosody.cfg.lua:/etc/prosody/prosody.cfg.lua:ro + - ./data:/var/lib/prosody + - ./certs:/etc/prosody/certs + networks: + - traefik_portal + depends_on: + prosody-init: + condition: service_completed_successfully + certs-init: + condition: service_completed_successfully + +networks: + traefik_portal: + external: true diff --git a/social/prosody/prosody.cfg.lua b/social/prosody/prosody.cfg.lua new file mode 100644 index 0000000..a913cb1 --- /dev/null +++ b/social/prosody/prosody.cfg.lua @@ -0,0 +1,225 @@ +-- Prosody MK Configuration File +-- +-- Tip: You can check that the syntax of this file is correct +-- when you have finished by running this command: +-- prosodyctl check config + +---------- Server-wide settings ---------- +local xmpp_domain = Lua.os.getenv("XMPP_DOMAIN") or "example.com" +local xmpp_admin = Lua.os.getenv("XMPP_ADMIN") or ("admin@" .. xmpp_domain) + +admins = { xmpp_admin } + +--plugin_paths = {} + +-- This is the list of modules Prosody will load on startup. +-- Documentation for bundled modules can be found at: https://prosody.im/doc/modules +modules_enabled = { + + -- Generally required + "disco", -- Service discovery + "roster", -- Allow users to have a roster. Recommended ;) + "saslauth", -- Authentication for clients and servers. Recommended if you want to log in. + "tls", -- Add support for secure TLS on c2s/s2s connections + + -- Not essential, but recommended + "blocklist", -- Allow users to block communications with other users + "bookmarks", -- Synchronise the list of open rooms between clients + "carbons", -- Keep multiple online clients in sync + "dialback", -- Support for verifying remote servers using DNS + "limits", -- Enable bandwidth limiting for XMPP connections + "pep", -- Allow users to store public and private data in their account + "private", -- Legacy account storage mechanism (XEP-0049) + "smacks", -- Stream management and resumption (XEP-0198) + "vcard4", -- User profiles (stored in PEP) + "vcard_legacy", -- Conversion between legacy vCard and PEP Avatar, vcard + + -- Nice to have + "csi_simple", -- Simple but effective traffic optimizations for mobile devices + "invites", -- Create and manage invites + "invites_adhoc", -- Allow admins/users to create invitations via their client + "invites_register", -- Allows invited users to create accounts + "ping", -- Replies to XMPP pings with pongs + "register", -- Allow users to register on this server using a client and change passwords + "time", -- Let others know the time here on this server + "uptime", -- Report how long server has been running + "version", -- Replies to server version requests + "mam"; -- Store recent messages to allow multi-device synchronization + --"turn_external"; -- Provide external STUN/TURN service for e.g. audio/video calls + + -- Admin interfaces + "admin_adhoc", -- Allows administration via an XMPP client that supports ad-hoc commands + "admin_shell", -- Allow secure administration via 'prosodyctl shell' + + -- HTTP modules + "http_file_share"; -- HTTP file upload for sharing files/images in chat (XEP-0363) + --"bosh"; -- Enable BOSH clients, aka "Jabber over HTTP" + --"http_openmetrics"; -- for exposing metrics to stats collectors + --"websocket"; -- XMPP over WebSockets + + -- Other specific functionality + "announce"; -- Send announcement to all online users + --"groups"; -- Shared roster support + --"legacyauth"; -- Legacy authentication. Only used by some old clients and bots. + --"mimicking"; -- Prevent address spoofing + --"motd"; -- Send a message to users when they log in + --"proxy65"; -- Enables a file transfer proxy service which clients behind NAT can use + --"s2s_bidi"; -- Bi-directional server-to-server (XEP-0288) + --"server_contact_info"; -- Publish contact information for this service + --"tombstones"; -- Prevent registration of deleted accounts + --"watchregistrations"; -- Alert admins of registrations + --"welcome"; -- Welcome users who register accounts +} + +-- These modules are auto-loaded, but should you want +-- to disable them then uncomment them here: +modules_disabled = { + -- "offline"; -- Store offline messages + -- "c2s"; -- Handle client connections + -- "s2s"; -- Handle server-to-server connections + -- "posix"; -- POSIX functionality, sends server to background, etc. +} + + +-- Server-to-server authentication +-- Require valid certificates for server-to-server connections? +-- If false, other methods such as dialback (DNS) may be used instead. + +s2s_secure_auth = true + +-- Some servers have invalid or self-signed certificates. You can list +-- remote domains here that will not be required to authenticate using +-- certificates. They will be authenticated using other methods instead, +-- even when s2s_secure_auth is enabled. + +--s2s_insecure_domains = { "insecure.example" } + +-- Even if you disable s2s_secure_auth, you can still require valid +-- certificates for some domains by specifying a list here. + +--s2s_secure_domains = { "jabber.org" } + + +-- Rate limits +-- Enable rate limits for incoming client and server connections. These help +-- protect from excessive resource consumption and denial-of-service attacks. + +limits = { + c2s = { + rate = "50kb/s", + }, + s2sin = { + rate = "300kb/s", + }, +} + +-- Authentication +-- Many authentication providers, including the default one, allow you to +-- create user accounts via Prosody's admin interfaces. For details, see the +-- documentation at https://prosody.im/doc/creating_accounts +authentication = "internal_hashed" + +-- Storage +-- Select the storage backend to use. By default Prosody uses flat files +-- in its configured data directory, but it also supports more backends +-- through modules. An "sql" backend is included by default, but requires +-- additional dependencies. See https://prosody.im/doc/storage for more info. + +storage = "sql" -- Default is "internal" + +-- For the "sql" backend, you can uncomment *one* of the below to configure: +sql = { driver = "SQLite3", database = "prosody.sqlite" } -- Default. 'database' is the filename. +--sql = { driver = "MySQL", database = "prosody", username = "prosody", password = "secret", host = "localhost" } +--sql = { driver = "PostgreSQL", database = "prosody", username = "prosody", password = "secret", host = "localhost" } + + +-- Archiving configuration +-- If mod_mam is enabled, Prosody will store a copy of every message. This +-- is used to synchronize conversations between multiple clients, even if +-- they are offline. This setting controls how long Prosody will keep +-- messages in the archive before removing them. + +archive_expires_after = "1w" -- Remove archived messages after 1 week + +-- You can also configure messages to be stored in-memory only. For more +-- archiving options, see https://prosody.im/doc/modules/mod_mam + + +-- Audio/video call relay (STUN/TURN) +-- To ensure clients connected to the server can establish connections for +-- low-latency media streaming (such as audio and video calls), it is +-- recommended to run a STUN/TURN server for clients to use. If you do this, +-- specify the details here so clients can discover it. +-- Find more information at https://prosody.im/doc/turn + +-- Specify the address of the TURN service (you may use the same domain as XMPP) +--turn_external_host = "turn.example.com" + +-- This secret must be set to the same value in both Prosody and the TURN server +--turn_external_secret = "your-secret-turn-access-token" + + +-- Logging configuration +-- For advanced logging see https://prosody.im/doc/logging +log = { + -- Docker: log to stdout/stderr + info = "*console"; + error = "*console"; + -- "*syslog"; -- Uncomment to also log to syslog +} + + +-- statistics = "internal" + + +-- Certificates +ssl = { + certificate = "/etc/prosody/certs/certs/" .. xmpp_domain .. ".crt", + key = "/etc/prosody/certs/private/" .. xmpp_domain .. ".key", +} + +-- HTTP file upload (XEP-0363) +http_file_share_size_limit = 10 * 1024 * 1024 -- 10 MB per file +http_file_share_expire_after = 60 * 60 * 24 * 14 -- delete after 14 days +http_external_url = "https://" .. xmpp_domain .. "/" + +----------- Virtual hosts ----------- +-- You need to add a VirtualHost entry for each domain you wish Prosody to serve. +-- Settings under each VirtualHost entry apply *only* to that host. + +VirtualHost(xmpp_domain) + +------ Components ------ +-- You can specify components to add hosts that provide special services, +-- like multi-user conferences, and transports. +-- For more information on components, see https://prosody.im/doc/components + +-- Multi-user chat (group chats) +Component("conference." .. xmpp_domain, "muc") + modules_enabled = { "muc_mam" } -- store group chat history + -- Default room settings applied to every newly created room + muc_room_default_public = true -- rooms are listed in the room browser + muc_room_default_persistent = true -- rooms survive when the last user leaves + muc_room_default_members_only = false -- anyone can join + muc_room_default_allow_register = true -- users can bookmark with a nickname + muc_room_default_history_length = 50 -- messages shown on join + +---Set up an external component (default component port is 5347) +-- +-- External components allow adding various services, such as gateways/ +-- bridges to non-XMPP networks and services. For more info +-- see: https://prosody.im/doc/components#adding_an_external_component +-- +--Component "gateway.example.com" +-- component_secret = "password" + + +---------- End of the Prosody Configuration file ---------- +-- You usually **DO NOT** want to add settings here at the end, as they would +-- only apply to the last defined VirtualHost or Component. +-- +-- Settings for the global section should go higher up, before the first +-- VirtualHost or Component line, while settings intended for specific hosts +-- should go under the corresponding VirtualHost or Component line. +-- +-- For more information see https://prosody.im/doc/configure