Compare commits

..
355 Commits
Author SHA1 Message Date
notplants 9817485ee0 chore: publish 7.3.1+v1.157.1 release
continuous-integration/drone/push Build is failing
continuous-integration/drone/tag Build is passing
2026-08-03 15:36:54 -04:00
notplants ebdb29e366 Merge pull request 'chore: upgrade synapse v1.157.1, MAS 1.21.0, nginx 1.31.3' (#81) from upgrade-essential-v1.157.1 into main
continuous-integration/drone/push Build is failing
Reviewed-on: #81
2026-08-03 19:36:27 +00:00
notplants 9c79be5ead chore: upgrade synapse v1.157.1, MAS 1.21.0, nginx 1.31.3 2026-08-03 18:22:27 +00:00
simon 743c64a13c chore: publish 7.3.0+v1.155.0 release
continuous-integration/drone/push Build is failing
continuous-integration/drone/tag Build is passing
2026-06-29 12:20:05 +02:00
simon 019762d7f7 chore: update image tags 2026-06-29 10:15:09 +02:00
notplants 35a981ca5b chore: publish 7.2.1+v1.155.0 release
continuous-integration/drone/push Build is failing
continuous-integration/drone/tag Build is passing
2026-06-22 14:33:21 -04:00
notplants 037002f05a Merge pull request 'chore: upgrade synapse v1.155.0, MAS 1.19.0, nginx 1.31.2' (#76) from upgrade-7.2.1+v1.154.0 into main
continuous-integration/drone/push Build is failing
Reviewed-on: #76
2026-06-22 18:18:08 +00:00
notplants 53c6bab5c4 chore: upgrade synapse v1.155.0, MAS 1.19.0, nginx 1.31.2 2026-06-22 18:13:43 +00:00
notplants 94e7c31369 Merge pull request 'upgrade-7.2.0+v1.154.0' (#72) from upgrade-7.3.0+v1.154.0 into main
continuous-integration/drone/push Build is failing
Reviewed-on: #72
2026-06-15 17:10:06 +00:00
notplants 5fc9296e61 chore: upgrade to 7.2.0+v1.154.0
continuous-integration/drone/tag Build is passing
- synapse v1.149.1 -> v1.154.0
- nginx 1.29.6 -> 1.31.1
- matrix-authentication-service 1.14.0 -> 1.18.0
- pgautoupgrade 17 -> 18, pin PGDATA to legacy path for in-place upgrade
2026-06-15 17:06:43 +00:00
moritz 3e838734de fix .env parsing error when running abra app ls -S -s
continuous-integration/drone/push Build is failing
2026-06-09 11:09:51 +02:00
notplants 74f1adaccb Merge pull request 'Add documentation for matrix federation + traefik labels for federation via port 8448 on matrix-federation entrypoint' (#62) from compress-and-federate into main
continuous-integration/drone/push Build is failing
Reviewed-on: #62
Reviewed-by: 3wordchant <3wordchant@noreply.git.coopcloud.tech>
2026-06-08 18:17:34 +00:00
notplants 17a399ba25 Merge pull request 'Add compression to recipe' (#61) from compress into main
continuous-integration/drone/push Build is failing
Reviewed-on: #61
2026-06-08 18:17:11 +00:00
notplants b63dde1275 Merge remote-tracking branch 'origin/main' into compress
# Conflicts:
#	homeserver.yaml.tmpl
2026-06-08 18:13:25 +00:00
notplants f836c74386 improvements to readme 2026-06-08 14:03:16 -04:00
notplants e257349b37 improve documentation of federation 2026-06-04 14:30:29 -04:00
3wordchant 5b21a6b4f9 Merge pull request 'chore: Configure Renovate' (#56) from renovate/configure into main
continuous-integration/drone/push Build is failing
Reviewed-on: #56
2026-05-28 17:11:13 +00:00
notplants b730cadb06 docs: document the three federation setup options 2026-05-25 13:05:11 -04:00
notplants 59ad89cfb4 add traefik labels for matrix-federation entrypoint
Adds a second Traefik router on the web (nginx) service that listens on
the `matrix-federation` entrypoint (host port 8448 via the traefik
recipe's compose.matrix.yml) and uses Host(${SERVER_NAME}).

Lets remote homeservers reach this server's federation/key endpoints via
the standard `<server_name>:8448` fallback when no .well-known or SRV
delegation exists for SERVER_NAME — useful when SERVER_NAME differs from
DOMAIN and no external service serves /.well-known/matrix/server.

Requires MATRIX_FEDERATION_ENABLED=1 on the traefik stack.
2026-05-25 15:52:16 +00:00
simonandCursor d75ca4f11f chore: publish 7.1.1+v1.149.1 release
continuous-integration/drone/push Build is failing
continuous-integration/drone/tag Build is passing
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-05-12 23:52:32 +02:00
simon cff6cfb001 fix minor bugs with mas integration
continuous-integration/drone/push Build is failing
2026-05-12 21:46:13 +02:00
simon d82d539424 docs: update mad readme
continuous-integration/drone/push Build is failing
2026-05-11 13:51:33 +02:00
simon b4c3db38c3 Merge pull request 'add matrix authentication service incl migration #57' (#58) from add-matrix-authentication-service into main
continuous-integration/drone/push Build is failing
Reviewed-on: #58
2026-05-11 11:25:53 +00:00
simon 3f488167bc chore: publish 7.1.0+v1.149.1 release
continuous-integration/drone/tag Build is passing
2026-05-11 13:19:17 +02:00
notplants f66bfef727 working on configurable room complexity limits 2026-04-30 15:06:54 -04:00
notplants a809333dcb comments 2026-04-29 15:18:13 -04:00
notplants b39c60d594 add run_compressor command 2026-04-29 15:01:50 -04:00
notplants 4830b0596c adding many abra commands 2026-04-29 14:47:51 -04:00
notplants 43d68aefb4 use vacuum full 2026-04-29 13:44:55 -04:00
notplants 91efd92d31 add abra command for vacuum full 2026-04-29 13:40:41 -04:00
notplants 3fab725957 Add optional compose for rust-synapse-compress-state 2026-04-29 13:14:49 -04:00
simon c71dc162cb readd cleanup trap to mas migration script 2026-04-09 11:51:39 +02:00
simon 625b0381f8 readd cleanup trap to mas migration script 2026-04-09 11:48:25 +02:00
simon 7492e8bd4e add mas healthcheck 2026-04-09 10:54:51 +02:00
simon 60bd8b1b49 provide readme for mas setup and migration 2026-04-08 14:06:10 +02:00
simon 6f47fca73b add script to perform mas migration compatibility check 2026-04-08 13:18:28 +02:00
simon dd92cd4bd7 add config for upstream oidc provider for mas 2026-04-08 13:02:22 +02:00
simon cf30cebf8e add function to init mas database 2026-04-07 16:20:34 +02:00
simon 5481b7e31c add initial mas setup 2026-04-07 14:59:19 +02:00
simon 8a7978b388 add docs for breaking share secret authenticator
continuous-integration/drone/push Build is failing
2026-03-31 15:17:29 +02:00
simon d0d5cfb1bc chore: publish 7.0.2+v1.149.1 release
continuous-integration/drone/tag Build is passing
continuous-integration/drone/push Build is failing
2026-03-31 14:55:43 +02:00
simon 3d13505330 bumb python version for shared secret authenticator
continuous-integration/drone/push Build is failing
2026-03-31 14:53:32 +02:00
moritz 68fd515297 chore: publish 7.0.1+v1.149.1 release
continuous-integration/drone/tag Build is passing
continuous-integration/drone/push Build is failing
2026-03-30 13:04:48 +02:00
moritz 01e3feb1cf fix: healthchecks and restart_policy for web container 2026-03-30 13:02:27 +02:00
moritz c51120c41a chore: publish 7.0.0+v1.149.1 release
continuous-integration/drone/push Build is failing
continuous-integration/drone/tag Build is passing
2026-03-25 01:20:30 +01:00
moritz b81fecdd23 chore: replace depricated traefik.docker.* with traefik.swarm.*
continuous-integration/drone/push Build is failing
2026-03-17 17:26:54 +01:00
renovate-bot a5a3a1938d Add renovate.json 2026-03-10 19:22:42 +00:00
knoflook 18b658c452 chore: publish 6.8.3+v1.139.2 release
continuous-integration/drone/tag Build is passing
continuous-integration/drone/push Build is failing
2026-03-05 14:49:59 +01:00
knoflook 553fee0e9d feat: compress db dumps 2026-03-05 14:49:11 +01:00
val 61f357b49e new patch version of recipe
continuous-integration/drone/push Build is failing
continuous-integration/drone/tag Build is passing
2026-01-15 16:58:40 +01:00
val 0e55594727 Merge pull request 'revert to recipe state of v6.8.0' (#55) from revert-changes into main
continuous-integration/drone/push Build is failing
Reviewed-on: #55
2026-01-15 15:48:56 +00:00
val 460f5a969c revert to recipe state of v6.8.0 2026-01-15 11:13:51 +01:00
moritz 8640abbe79 increase healthcheck retries
continuous-integration/drone/push Build is failing
2025-12-23 13:26:48 +01:00
val 3e0c9063c4 Merge branch '6.8.1fix'
continuous-integration/drone/push Build is passing
continuous-integration/drone/tag Build is passing
2025-10-29 13:55:54 +01:00
val db6440b317 fixed MAX_UPLOAD_SIZE and AUTO_JOIN_ROOM_LIST config 2025-10-29 13:49:02 +01:00
vdietrich 24f7e0cb35 chore: publish 6.8.1+v1.139.2 release
continuous-integration/drone/tag Build is passing
continuous-integration/drone/push Build is passing
2025-10-28 17:17:22 +01:00
lambdabundesverband 6d1397562b Merge pull request 'added env to configure several auto_join_rooms' (#52) from auto_join_room_list into main
continuous-integration/drone/push Build is passing
Reviewed-on: #52
2025-10-28 16:14:38 +00:00
lambdabundesverband e0c0861c16 Merge branch 'main' into auto_join_room_list 2025-10-28 16:14:13 +00:00
vdietrich 41fdcafaa0 added env to configure several auto_join_rooms 2025-10-28 17:12:33 +01:00
cas 730dbc4569 Merge pull request 'Expose max_upload_size as a configurable option' (#51) from cas_expose_maxupload into main
continuous-integration/drone/push Build is passing
Reviewed-on: #51
Reviewed-by: decentral1se <decentral1se@noreply.git.coopcloud.tech>
2025-10-17 17:05:30 +00:00
simon 809055dadb chore: publish 6.8.0+v1.139.2 release
continuous-integration/drone/push Build is passing
continuous-integration/drone/tag Build is passing
2025-10-08 16:43:20 +02:00
cas 7703bbbce7 Bump config versions 2025-10-03 11:20:39 -07:00
cas e3df032bda Expose max_upload_size as a configurable option 2025-10-02 11:40:51 -07:00
moritz 0cf9d0a244 chore: publish 6.7.1+v1.133.0 release
continuous-integration/drone/tag Build is passing
continuous-integration/drone/push Build is passing
2025-09-07 11:49:20 +02:00
moritz 86a44afd19 fix nginx 2025-09-07 11:27:17 +02:00
carla cf47a9c1b0 chore: publish 6.7.0+v1.133.0 release
continuous-integration/drone/push Build is passing
continuous-integration/drone/tag Build is passing
2025-07-07 16:11:13 +02:00
val aaa59a7718 chore: publish 6.6.3+v1.124.0 release
continuous-integration/drone/tag Build is passing
continuous-integration/drone/push Build is passing
2025-06-12 22:28:18 +02:00
val e072cf0766 Merge pull request 'old-signing-key - anyone an idea how to escape so it's only one env var?' (#50) from old-signing-key into main
continuous-integration/drone/push Build is passing
Reviewed-on: #50
Reviewed-by: 3wordchant <3wordchant@noreply.git.coopcloud.tech>
2025-06-12 20:23:56 +00:00
val 22cc356a56 Merge branch 'main' into old-signing-key 2025-06-12 20:23:13 +00:00
moritz 160b0eb2cf fix: remove full env name "ADMIN_INTERFACE_ENABLED" from comment to
continuous-integration/drone/push Build is passing
allow autouncomment
2025-06-11 14:48:43 +02:00
val af7f7eca2f typos 2025-06-10 18:47:38 +02:00
val 5808fef48d add env 2025-06-08 12:20:46 +02:00
vdietrich a8483dccf9 chore: publish 6.6.2+v1.124.0 release
continuous-integration/drone/tag Build is passing
continuous-integration/drone/push Build is passing
2025-06-05 11:04:16 +02:00
lambdabundesverband 8e82c16e3d Merge pull request 'added-env-vars' (#49) from added-env-vars into main
continuous-integration/drone/push Build is passing
Reviewed-on: #49
2025-06-05 08:58:39 +00:00
vdietrich dafb17aace added some privacy related optional env-vars 2025-06-04 18:12:01 +02:00
vdietrich 237e2c832b user directory env vars 2025-06-04 16:59:58 +02:00
moritz bf4de0df97 Set healthcheck interval higher for slow systems
continuous-integration/drone/push Build is passing
2025-05-15 11:06:21 +02:00
vdietrich 61222baaa0 chore: publish 6.6.1+v1.124.0 release
continuous-integration/drone/tag Build is passing
continuous-integration/drone/push Build is passing
2025-05-14 17:01:58 +02:00
marlon 32721ace23 Merge pull request 'Add REGISTRATION_REQUIRES_TOKEN to matrix config' (#46) from FunPecan/matrix-synapse:add-registration-token into main
continuous-integration/drone/push Build is passing
Reviewed-on: #46
Reviewed-by: decentral1se <decentral1se@noreply.git.coopcloud.tech>
2025-04-15 21:47:06 +00:00
Jeremy Blanchard 5a7b7f04ed Bump homeserver version 2025-04-15 08:45:05 -07:00
Jeremy Blanchard 8809f25ab1 Add regsitration token 2025-04-14 16:49:58 -07:00
moritz 0645a9f487 chore: publish 6.6.0+v1.124.0 release
continuous-integration/drone/tag Build is passing
continuous-integration/drone/push Build is passing
2025-02-11 19:02:04 +01:00
moritz a1d7fdad2d bump python version in shared_secret_authenticator module 2025-02-11 19:01:59 +01:00
moritz a90ccaa65b add synapse-admin
continuous-integration/drone/push Build is passing
2025-01-28 17:42:07 +01:00
simon 7c0e822940 fix bridge token extraction
continuous-integration/drone/push Build is passing
2025-01-17 20:13:09 +01:00
simon d6178fd380 improve set_bridge_tokens
continuous-integration/drone/push Build is passing
2025-01-17 17:45:18 +01:00
simon 2a18291f48 add script to setup bridge tokens
continuous-integration/drone/push Build is passing
2025-01-17 15:43:47 +01:00
vdietrich 943ed58db4 new version of signal bridge conf
continuous-integration/drone/push Build is passing
2025-01-16 15:53:46 +01:00
lambdabundesverband 09b60947ee Merge pull request 'updated signal bridge to 0.7.5 and added env var for default encry bridge2server' (#44) from addtional-env-vars into main
continuous-integration/drone/push Build is passing
Reviewed-on: #44
Reviewed-by: decentral1se <decentral1se@noreply.git.coopcloud.tech>
2025-01-16 14:00:16 +00:00
vdietrich bff6fe9b09 updated signal bridge to 0.7.5 and added env var for default encry bridge2server 2025-01-16 14:15:04 +01:00
cas 6f4efd64e8 Update .drone.yml
continuous-integration/drone/push Build is passing
2025-01-08 10:09:13 -08:00
moritz 202af642cf chore: publish 6.5.0+v1.117.0 release
continuous-integration/drone/tag Build is passing
continuous-integration/drone/push Build is passing
2024-10-29 15:34:42 +01:00
moritz 29f31e0a7b fix drone runner
continuous-integration/drone/push Build is passing
2024-10-24 14:41:32 +02:00
moritz 5c6985596e update backupbot label
continuous-integration/drone/push Build is failing
2024-10-24 14:30:32 +02:00
3wordchant dfe893160f chore: publish 6.4.0+v1.116.0 release
continuous-integration/drone/push Build is failing
continuous-integration/drone/tag Build is passing
2024-10-02 15:14:01 -04:00
simon 99bce91794 chore: publish 6.3.0+v1.113.0 release
continuous-integration/drone/push Build is failing
2024-09-19 14:59:56 +02:00
simon 599a219a5f Merge branch 'update-signalbot' 2024-09-19 14:58:13 +02:00
simon 0498d8006f finalize signal bot upgrade 2024-09-19 14:57:49 +02:00
simon 28ccd46ef1 enable relay mode 2024-09-11 16:24:08 +02:00
simon 8c60f7e5d5 add server_name to .env
continuous-integration/drone/push Build is failing
2024-09-11 14:51:23 +02:00
simon 77ffb17f86 Update Bridge Readme
continuous-integration/drone/push Build is failing
2024-08-29 13:32:13 +02:00
simon eae5c82d88 update signalbot and fix configs 2024-08-29 13:30:25 +02:00
javielico 68ff2b64da chore: publish 6.2.0+v1.113.0 release
continuous-integration/drone/push Build is failing
2024-08-26 18:27:52 +01:00
javielico ef6e35ba3a chore: publish 6.1.4+v1.112.0 release
continuous-integration/drone/push Build is failing
2024-08-26 18:26:37 +01:00
javielico 8c4d88b20c chore: publish 6.1.3+v1.111.1 release
continuous-integration/drone/push Build is failing
2024-08-26 18:25:45 +01:00
javielico 6bd2f0b779 chore: publish 6.1.2+v1.111.0 release
continuous-integration/drone/push Build is failing
2024-08-26 18:22:58 +01:00
simon 8f9c66e95d Update Bridge Readme 2024-08-21 18:37:06 +02:00
moritz e2bec9e4b4 README: create user
continuous-integration/drone/push Build is failing
2024-08-13 11:47:11 +02:00
moritz da95b5c70d chore: publish 6.1.1+v1.110.0 release
continuous-integration/drone/push Build is failing
2024-07-26 14:09:19 +02:00
moritz f13856b14c add web_client_location 2024-07-26 14:09:12 +02:00
moritz 2c8dc7c960 chore: publish 6.1.0+v1.110.0 release
continuous-integration/drone/push Build is failing
2024-07-16 15:30:01 +02:00
moritz c36c147dff add alakazam integration file alaconnect.yml
continuous-integration/drone/push Build is failing
2024-05-13 17:37:27 +02:00
moritz 8a37984e15 chore: publish 6.0.2+v1.100.0 release
continuous-integration/drone/push Build is failing
continuous-integration/drone/tag Build is passing
2024-04-17 16:40:04 +02:00
moritz 63a1abb2c0 fix backup label 2024-04-17 16:37:26 +02:00
3wordchant 86106b6b6f chore: publish 6.0.1+v1.100.0 release
continuous-integration/drone/push Build is failing
continuous-integration/drone/tag Build is passing
2024-04-13 11:05:40 -03:00
3wordchant 8250916051 Update release notes
[ci skip]
2024-04-13 11:05:21 -03:00
3wordchant e007bda255 chore: publish 6.0.0+v1.100.0 release
continuous-integration/drone/tag Build is passing
continuous-integration/drone/push Build is failing
2024-04-12 12:31:50 -03:00
3wordchant 951fc56434 app → web, synapse → app
Fixes #42
2024-04-12 12:30:05 -03:00
moritz 6fe14edef7 chore: publish 5.0.5+v1.100.0 release
continuous-integration/drone/push Build is failing
continuous-integration/drone/tag Build is passing
2024-04-09 10:10:07 +02:00
moritz a0a9c2b863 Revert "chore: publish 5.0.5+1.25.3 release"
This reverts commit bdf8e11dc5.
2024-04-09 10:08:22 +02:00
3wordchant bdf8e11dc5 chore: publish 5.0.5+1.25.3 release
continuous-integration/drone/push Build is failing
2024-03-27 00:45:39 -03:00
3wordchant 2658fed366 Fix permissions on generated files
continuous-integration/drone/push Build is failing
2024-03-27 00:38:39 -03:00
simon 72b59ce4ad chore: publish 5.0.4+v1.100.0 release
continuous-integration/drone/push Build is failing
2024-03-13 14:18:51 +01:00
moritz dfed1e54da chore: publish 5.0.4+v1.100.0 release
continuous-integration/drone/push Build is failing
2024-02-19 13:55:03 +01:00
3wordchant d4ccb3588b chore: publish 5.0.3+v1.100.0 release
continuous-integration/drone/push Build is failing
2024-02-08 14:59:48 -03:00
3wordchant 11f70b7878 chore: publish 5.1.0+1.25.3 release
continuous-integration/drone/push Build is failing
2024-02-08 14:47:50 -03:00
moritz fd601c23f3 chore: publish 5.0.2+v1.93.0 release
continuous-integration/drone/push Build encountered an error
2023-11-09 13:01:48 +01:00
knoflook b9097c1f94 fix: don't break when logging in with keycloak
continuous-integration/drone/push Build is failing
2023-10-23 20:19:17 +02:00
moritz 75d1303118 set timeout and autoupdates
continuous-integration/drone/push Build is failing
2023-10-19 18:15:10 +02:00
moritz 90c8d0dbba fix secrets
continuous-integration/drone/push Build is failing
2023-10-19 15:33:29 +02:00
decentral1se a85310346b fix: drop config if not using
continuous-integration/drone/push Build is failing
2023-10-11 13:23:54 +02:00
decentral1se 116840623b Merge pull request 'Homeserver config updates' (#40) from homeserver-config-updates into main
continuous-integration/drone/push Build is failing
Reviewed-on: #40
2023-10-11 11:02:24 +00:00
decentral1se 919aaf0116 feat: new config options with defaults 2023-10-11 13:01:16 +02:00
decentral1se 43a3502fad refactor: point to config manual 2023-10-11 12:45:06 +02:00
decentral1se 08b49c14d9 feat: use nginx proxy, config for public rooms (fedi)
continuous-integration/drone/push Build is failing
See #38.
2023-10-08 01:41:29 +02:00
decentral1se 7683ebd189 fix: match env var to config
continuous-integration/drone/push Build is failing
continuous-integration/drone Build is failing
2023-10-06 20:36:55 +02:00
decentral1se a3c9dfd65b feat: make v4 release & add notes
continuous-integration/drone/push Build is failing
2023-10-06 19:16:06 +02:00
decentral1se 6dacecbfac fix: make TIMEOUT / ENABLE_AUTO_UPDATE optional 2023-10-06 19:15:44 +02:00
decentral1se 4770a03cb7 chore: minor (synapse: v1.93.0, telegram:v0.14.2)
continuous-integration/drone/push Build is failing
2023-10-06 19:10:04 +02:00
decentral1se 7ead29b750 chore: publish 3.13.0+v1.92.2 release
continuous-integration/drone/push Build is failing
2023-09-15 15:50:35 +02:00
decentral1se 3c772cc1e5 chore: publish 3.12.0+v1.90.0 release
continuous-integration/drone/push Build is failing
2023-08-27 19:34:10 +02:00
decentral1se e146435394 chore: publish 3.11.0+v1.89.0 release
continuous-integration/drone/push Build is failing
2023-08-01 21:08:27 +02:00
decentral1se 795c2eb685 chore: publish 3.10.0+v1.88.0 release
continuous-integration/drone/push Build is failing
2023-07-20 17:06:08 +02:00
moritz 7b1b5c37ed fix secrets
continuous-integration/drone/push Build is failing
2023-07-19 22:53:35 +02:00
philippr 84204b03a7 chore: publish 3.9.1+v1.87.0 release
continuous-integration/drone/push Build is passing
2023-07-18 21:47:15 +02:00
philippr b57b73d5d6 fix: bump homeserver config version 2023-07-18 21:46:54 +02:00
philippr 66bd6be8fc chore: publish 3.9.0+v1.87.0 release
continuous-integration/drone/push Build is passing
2023-07-18 21:34:53 +02:00
moritz dda7f2a369 fix domain env
continuous-integration/drone/push Build is passing
2023-07-09 23:38:22 +02:00
moritz d22a8257fb command for adding admin user
continuous-integration/drone/push Build is passing
2023-07-06 17:02:49 +02:00
philippr 2445d9f33a fix: healthchecks
continuous-integration/drone/push Build is passing
2023-06-12 14:14:43 +02:00
moritz 2a45273541 fix second oidc configuration
continuous-integration/drone/push Build is passing
2023-05-31 15:50:55 +02:00
decentral1se 48efb7de51 chore: publish 3.8.0+v1.84.1 release
continuous-integration/drone/push Build is passing
2023-05-30 20:00:17 +02:00
decentral1se b2e8bf9c8b chore: bump telegram config
continuous-integration/drone/push Build is passing
2023-05-10 18:03:46 +02:00
decentral1se d02981a2bf feat: sync_channel_members configurable for telegram bridge
continuous-integration/drone/push Build is passing
2023-05-10 17:57:54 +02:00
decentral1se c6f9b117e2 chore: publish 3.7.0+v1.82.0 release
continuous-integration/drone/push Build is passing
2023-05-08 00:53:44 +02:00
3wordchant ade6147f35 chore: publish 3.6.0+v1.81.0 release
continuous-integration/drone/push Build is passing
2023-04-23 15:36:37 -04:00
3wordchant 50e0aa06cc Support separate DOMAIN vs SERVER_NAME
continuous-integration/drone/push Build is passing
2023-04-23 15:34:58 -04:00
3wordchant f3732c8392 Goodbye, foo.yaml!
continuous-integration/drone/push Build is passing
2023-04-13 12:14:35 -04:00
decentral1se e171ce052e chore: publish 3.5.0+v1.81.0 release
continuous-integration/drone/push Build is passing
2023-04-11 16:29:41 +02:00
knoflook 5d5bd70818 Merge branch 'main' of https://git.coopcloud.tech/coop-cloud/matrix-synapse
continuous-integration/drone/push Build is passing
2023-04-08 23:09:33 +02:00
knoflook fd1a6c7a4a fix keyserver problems when federating 2023-04-08 23:09:16 +02:00
decentral1se 39a47a2515 chore: publish 3.4.0+v1.80.0 release
continuous-integration/drone/push Build is passing
2023-04-02 14:25:02 +02:00
knoflook 6e556c8b2d fix: put smtp password in quotes
continuous-integration/drone/push Build is passing
2023-03-05 12:05:26 +01:00
decentral1se 74fb8014fa chore: publish 3.3.0+v1.78.0 release
continuous-integration/drone/push Build is passing
2023-03-04 14:12:33 +01:00
decentral1se 787e0fb3a9 chore: publish 3.2.0+v1.77.0 release
continuous-integration/drone/push Build is passing
2023-02-27 19:33:34 +01:00
knoflook ead52c1acd Merge branch 'main' of https://git.coopcloud.tech/coop-cloud/matrix-synapse
continuous-integration/drone/push Build is failing
2023-02-21 13:56:06 +01:00
knoflook fca551b735 add keycloak 2 and 3 2023-02-21 13:56:01 +01:00
decentral1se f43a47d4c8 fix: use new mount for shared secret auth
continuous-integration/drone/push Build is passing
See https://github.com/devture/matrix-synapse-shared-secret-auth/commit/b3dfa110976206173db0efe46a3924a4445891c5
2023-02-14 10:00:28 +01:00
decentral1se beeb1e47b1 chore: publish 3.1.0+v1.76.0 release
continuous-integration/drone/push Build is failing
2023-02-13 09:26:27 +01:00
decentral1se 931e89f5f5 Merge pull request 'homserver -> homeserver' (#34) from speling into main
continuous-integration/drone/push Build encountered an error
Reviewed-on: #34
2023-02-02 19:09:48 +00:00
josef 5a72540db2 homserver -> homeserver 2023-02-02 18:12:12 +00:00
3wordchant 703b8d91d2 Switch to self-hosted stack-ssh-deploy image [mass update]
continuous-integration/drone/push Build is passing
2023-01-21 11:49:56 -08:00
3wordchant 05e9ee0732 Add drone configs / secrets [mass update]
continuous-integration/drone/push Build is passing
2023-01-20 21:32:06 -08:00
3wordchant ec22040bd3 Add CI and catalogue generation [mass update]
continuous-integration/drone/push Build is failing
2023-01-20 10:45:03 -08:00
3wordchant d5c70f5567 Update abra syntax in examples (finally) [mass update] 2023-01-19 16:02:28 -08:00
decentral1se 4445e0249f docs: README pass 2023-01-08 02:09:55 +01:00
decentral1se 89f5069aa2 chore: new v3 recipe release 2023-01-08 02:05:27 +01:00
decentral1se 77b3dbdaa9 fix: use correct user, role does exist 2023-01-08 01:59:46 +01:00
decentral1se 1a0211b743 fix: quote YAML inline dicts correctly 2023-01-08 01:56:30 +01:00
decentral1se eb541c41ee fix: consistent compression config 2023-01-08 01:56:13 +01:00
decentral1se 008ec1126b docs: comments in env sample (getting large!) 2023-01-08 01:28:15 +01:00
decentral1se 0c26ea22f9 docs: write release notes 2023-01-08 01:22:30 +01:00
decentral1se e3bf165da0 refactor!: remove KEYCLOAK2* env vars
The experiment is over.
2023-01-08 01:15:36 +01:00
decentral1se 245e81e4bb fix: make bridge logging ERROR only
Decryption happens on the bridges (between systems) so in order to stop
plaintext logging of chat messages, we default to ERROR. If people need
more, they can submit changes for customisation.
2023-01-08 01:11:58 +01:00
decentral1se 9b12e4a0eb refactor!: unlimited permissions bridge config 2023-01-08 01:04:52 +01:00
decentral1se e7f81cb9ea fix: support openid + federation
Closes #30
2023-01-08 00:46:05 +01:00
decentral1se 88bcc2186b chore: bump homeserver config version 2023-01-08 00:12:03 +01:00
decentral1se 9b3e1793e0 fix: reduce config to match upstream
Closes #33
2023-01-08 00:10:28 +01:00
decentral1se ee6d1e92f4 fix: media retention is configurable
Closes #32
2023-01-08 00:10:03 +01:00
decentral1se 3e3c239c88 fix: drop missing role 2023-01-07 23:49:36 +01:00
decentral1se e905c24eb2 style: sort config env vars 2023-01-07 23:44:56 +01:00
decentral1se 91d29cfe92 chore: publish 2.6.0+v1.74.0 release 2022-12-20 20:49:03 +01:00
decentral1se 9eb0856888 chore: publish 2.5.0+v1.73.0 release 2022-12-12 17:29:50 +01:00
decentral1se 2cc70498f6 feat: patch bump signal/telegram bridges 2022-12-06 02:40:40 +01:00
decentral1se 92a9ea2f22 chore: publish 2.4.0+v1.72.0 release 2022-11-23 15:46:59 +01:00
decentral1se ca2e0d7dc0 chore: new signal/telegram minor/patch versions 2022-11-18 09:48:56 +01:00
decentral1se 09ff470ba6 chore: publish 2.3.0+v1.71.0 release 2022-11-16 15:30:50 +01:00
philippr 09c4ca146f chore: publish 2.2.0+v1.68.0 release 2022-10-17 13:18:04 +02:00
decentral1se 99f45636f5 expose shared secret also 2022-09-22 16:11:47 +02:00
decentral1se 1e8b616cba feat: shared secret auth 2022-09-22 16:01:19 +02:00
decentral1se 13edf77ece signal bridging mayhem working 2022-09-21 10:54:27 +02:00
decentral1se f56d9db3f6 thread env vars & sort 2022-09-06 01:07:04 +02:00
decentral1se 4cae5f5b75 bump new version 2022-09-06 01:05:11 +02:00
decentral1se 77170432eb bump homeserver config 2022-09-06 01:04:00 +02:00
decentral1se c423db2cb7 config media retention settings 2022-09-06 01:03:45 +02:00
decentral1se e59de33d5b enable complexity limiting 2022-09-06 01:03:28 +02:00
decentral1se 998583c2a5 set ALLOWED_LIFETIME_MAX (retention) 2022-09-06 01:03:15 +02:00
decentral1se 0dff883beb upgrading to latest bridge tag 2022-09-02 14:36:03 +02:00
decentral1se cd0f6359b1 fix typo & add helpful note 2022-07-19 16:26:36 +02:00
decentral1se edf72453a6 pin to working tag 2022-07-16 00:59:05 +02:00
decentral1se f18f098b45 remove release notes 2022-07-16 00:32:17 +02:00
decentral1se 0838cb819e chore: publish 2.1.0+v1.62.0 release 2022-07-15 16:04:52 +02:00
decentral1se 0e3c286eaf feat: discord bridging
See #31
2022-05-16 18:55:32 +02:00
decentral1se 2beb6e4bf0 feat: telegram bridge admins 2022-05-15 10:59:50 +02:00
decentral1se bf3db9999f documenting the chaos 2022-05-15 10:47:52 +02:00
decentral1se 00b0375b1c fix: no underscore, synapse doesn't like it 2022-05-15 10:39:42 +02:00
decentral1se 1832911526 docs: re-format guide 2022-05-12 22:32:35 +02:00
decentral1se 2bac1aa31c fix: try this depends_on trick for the db 2022-05-12 22:29:27 +02:00
decentral1se dd4841dbe0 fix: telegram bot - hacking it until it runs 2022-05-12 22:27:12 +02:00
decentral1se 467a35e7b9 fix: add missing secret 2022-05-12 21:52:58 +02:00
decentral1se 06381aceaf fix: file path for telegram bridge config 2022-05-12 21:46:11 +02:00
decentral1se d9c5248f8c remove additional config 2022-05-12 21:33:24 +02:00
decentral1se 786bf0587f feat: first run at telegram bridge
See #29
2022-05-12 21:31:50 +02:00
decentral1se 840f532376 docs: typo [ci skip] 2022-05-12 19:32:36 +02:00
philippr dcc9ec543d chore: publish 2.0.0+v1.58.1 release 2022-05-12 17:26:14 +02:00
philippr 65a149eac3 add env vars for idp_id, allow_existing_users
Migrating from an idp old homeserver.yaml config could require to set
the idp_id to 'oidc' see this issue for reference:
https://github.com/matrix-org/synapse/issues/9514#issuecomment-788805476
2022-05-12 16:59:22 +02:00
philippr 6041ad6112 fix: use in to allow multiple overrides 2022-04-12 23:32:18 +02:00
decentral1se 1afa8cf7b7 chore: remove whitespace 2022-04-12 17:53:30 +02:00
decentral1se b5831114f4 fix: thread RETENTION_MAX_LIFETIME & set to 1 month
Previously "1 minute" :/
2022-04-12 17:53:01 +02:00
decentral1se 02d78e9aa9 Merge pull request 'add comrade backupbot' (#28) from backupbot into main
Reviewed-on: #28
2022-04-12 13:47:24 +00:00
philippr af3c8fd252 add comrade backupbot 2022-04-12 15:29:56 +02:00
decentral1se 40d6b1df4e Add note about federation. 2022-04-06 16:07:31 +00:00
philippr 0378e8d89f bump homeserver.yaml version 2022-04-06 17:31:14 +02:00
philippr c542629264 add SERVE_SERVER_WELLKNOWN variable
This config allows matrix-synapse to create a endpoint on
$DOMAIN/.well-known/matrix/server used for federation.
It's a straight forward way (no port opening required)
to enable federation if you are okay having a subdomain
(matrix.example.org) as your homeserver address.
2022-04-06 13:01:28 +02:00
decentral1se 005ce43f61 feat: encryption by default
See #22.
2022-04-03 19:25:19 +02:00
decentral1se bca2a983c0 docs: more feedback on deploy 2022-03-31 17:56:04 +02:00
decentral1se 89892ed818 chore: publish 1.3.0+v1.55.2 release 2022-03-31 17:46:21 +02:00
decentral1se 1b32621af9 config to hide local login
Closes #25.
2022-03-14 17:19:56 +01:00
decentral1se 919e9253ae Disable registrations by default
See #22.
2022-03-13 16:55:48 +01:00
decentral1se c71f3bc519 very hacky multiple keycloaks!
See #24.
2022-03-08 09:34:00 +01:00
decentral1se e9b5a5360f fix: provide correct initargs
Closes #23.
2022-03-08 09:17:27 +01:00
decentral1se 1188f5d770 chore: publish 1.2.0+v1.52.0 release 2022-02-10 11:21:01 +01:00
decentral1se 17ad6ac250 docs: more tips around privacy stuff 2022-02-08 01:49:08 +01:00
decentral1se 1bcb2d83b2 docs: document features 2022-02-08 01:42:32 +01:00
decentral1se 8ded1abe20 docs: inline commands, fix links 2022-02-08 01:41:44 +01:00
decentral1se 6f3e135b1d docs: newline in metadata 2022-02-08 01:38:23 +01:00
decentral1se 02a9d526fd docs: remove old badge 2022-02-08 01:38:19 +01:00
decentral1se d5bde0c969 chore: remove old file 2022-02-08 01:37:35 +01:00
decentral1se 29c4b53f40 docs: more tips from tracking configs 2022-02-08 01:37:17 +01:00
decentral1se 89bb7a9f58 chore: ignore synapse clone 2022-02-08 01:37:10 +01:00
decentral1se 9c1bdb632b chore: publish 1.1.0+v1.51.0 release 2022-02-08 00:46:28 +01:00
decentral1se 32b1f856b7 fix: remove old vendor & bump log config 2022-02-08 00:32:58 +01:00
decentral1se c807a7813d feat: more privacy friendly defaults
See #22
2022-02-08 00:32:28 +01:00
decentral1se f5275b2384 bump config version 2022-01-12 11:34:09 +01:00
decentral1se ef7d74d102 autojoin room config 2022-01-12 11:27:43 +01:00
decentral1se a8f43e725d fix: metadata parsing 2021-12-26 02:30:53 +01:00
decentral1se fa101da24b drop that back for testing 2021-12-13 17:29:20 +01:00
decentral1se 98635cb612 fix: close up and quote password 2021-12-13 17:28:53 +01:00
decentral1se 643eceae13 update vendor 2021-12-13 17:24:22 +01:00
decentral1se 64905ccc35 feat: smtp support 2021-12-13 17:21:07 +01:00
decentral1se 965809ce11 fix: whitelist SSO 2021-12-13 16:55:38 +01:00
decentral1se 047dac8d21 WIP remove nginx proxying for now
See #20
2021-12-13 16:40:47 +01:00
decentral1se 33d6f5819c fix: support openid 2021-12-13 15:00:04 +01:00
decentral1se 96a28d62ca fix: use root 2021-12-13 14:12:10 +01:00
decentral1se 038f03d872 fix: quotes 2021-12-13 14:01:37 +01:00
decentral1se 37465d7baf fix: do fedi port work in traefik 2021-12-13 13:55:16 +01:00
decentral1se d2db4622a6 fix: drop that 2021-12-13 13:47:39 +01:00
decentral1se 9800197803 fix: fixed turn_uris 2021-12-13 13:42:02 +01:00
decentral1se e13dee14bd fix: fedi port and bind_addresses 2021-12-13 13:41:05 +01:00
decentral1se ff78ac0aab fix: env var + escaping logic 2021-12-13 13:22:14 +01:00
decentral1se 85949eed2b fix: set default 2021-12-13 13:18:17 +01:00
decentral1se e9748c1641 fix: drop deploy opts on non-app service 2021-12-13 13:16:22 +01:00
decentral1se 2f294803ac fix: more conn tweaks for postgres 2021-12-13 13:10:23 +01:00
decentral1se fa503e1f1d fix: ; 2021-12-13 12:58:46 +01:00
decentral1se 8222f55f64 fix: faster turn around 2021-12-13 12:57:57 +01:00
decentral1se 9ddafdbbc6 fix: pass secret 2021-12-13 12:56:34 +01:00
decentral1se 522b1ef917 fix: omg thread in the right place 2021-12-13 12:54:09 +01:00
decentral1se 1763e0f749 fix: switch over to list for threading 2021-12-13 12:52:48 +01:00
decentral1se 789d5d0745 fix: thread STACK_NAME again 2021-12-13 12:50:01 +01:00
decentral1se 8ab11e14a8 fix: thread STACK_NAME 2021-12-13 12:46:48 +01:00
decentral1se 184252de29 fix: get the full addr 2021-12-13 12:46:00 +01:00
decentral1se aa7357596a docs: log generation 2021-12-13 12:43:51 +01:00
decentral1se b4b867bf4f fix: generate new log config 2021-12-13 12:42:40 +01:00
decentral1se 4daf9eecb3 fix: logging config 2021-12-13 12:39:19 +01:00
decentral1se 68d73bd4e7 fix: no hardcoded secrets 2021-12-13 12:16:23 +01:00
decentral1se 6727434db5 fix: remove test domain 2021-12-13 12:06:26 +01:00
decentral1se 85598331b7 fix: get perms working 2021-12-13 12:06:20 +01:00
decentral1se 0c0c1d6052 fix: pass domain 2021-12-13 10:56:36 +01:00
decentral1se 7094f51810 fix: stop templating falling over keycloak 2021-12-13 10:56:27 +01:00
decentral1se e8a876a28c fix: vendor homeserver config 2021-12-13 10:46:18 +01:00
decentral1se 17d116c600 fix: drop that missing password 2021-12-13 10:38:55 +01:00
decentral1se d53efd82b9 fix: set right type 2021-12-13 10:37:46 +01:00
decentral1se fd76821803 fix: pass list for turn_uris 2021-12-13 10:37:03 +01:00
decentral1se e2d21764f1 fix: dont use turn user/pass 2021-12-13 10:32:06 +01:00
decentral1se daf4fcb02e feat: turn config
Closes #17.
2021-12-13 00:03:24 +01:00
decentral1se 4f936a594a feat: keycloak config
Closes #18.
2021-12-12 23:56:34 +01:00
decentral1se 10e459f183 feat: disable federation
Closes #19.
2021-12-12 23:50:45 +01:00
decentral1se 650e0cbc28 feat: proxying support
Part of #1.
2021-12-12 23:31:37 +01:00
decentral1se a5f9105613 fix: template secret, skip _FILE dance 2021-12-12 23:26:06 +01:00
decentral1se b2a29da9a3 fix: admin email & sort 2021-12-12 23:25:24 +01:00
decentral1se b7cce0a516 WIP: postgres db support
Part of #2.
2021-12-12 20:01:30 +01:00
decentral1se 93ae4d6c8a chore: version label 2021-12-12 19:47:43 +01:00
decentral1se 1ec30af608 chore: bump to latest 2021-12-12 19:23:09 +01:00
decentral1se dc6146c597 chore: formatting, style 2021-12-12 19:22:49 +01:00
decentral1se 87df9c99c6 chore: remove old file 2021-12-12 19:21:56 +01:00
3wordchant 867c07f88f Goodbye, emojis! 😢
[ci skip]
2021-11-23 12:19:05 +02:00
d1admin 1b1cdf4af2 Revert internal network change (see https://git.autonomic.zone/coop-cloud/organising/issues/62)
continuous-integration/drone/push Build is passing
2021-07-15 16:08:45 +02:00
renovate-bot 68f18336d7 Version v1.38.0; sync labels
continuous-integration/drone/push Build is passing
2021-07-14 07:02:39 +00:00
renovate-bot 012a93a689 Update matrixdotorg/synapse Docker tag to v1.38.0
continuous-integration/drone/pr Build is failing
continuous-integration/drone/push Build is passing
2021-07-14 07:02:29 +00:00
d1admin bbb28ff6c2 Scope internal network internally
continuous-integration/drone/push Build is passing
2021-07-10 15:41:39 +02:00
renovate-bot a79a2aa2d8 Version v1.37.1; sync labels
continuous-integration/drone/push Build is passing
2021-07-01 07:02:32 +00:00
renovate-bot c1ad176dfc Update matrixdotorg/synapse Docker tag to v1.37.1
continuous-integration/drone/pr Build is failing
continuous-integration/drone/push Build is passing
2021-07-01 07:02:21 +00:00
renovate-bot 627a0b6a01 Version v1.37.0; sync labels
continuous-integration/drone/push Build is passing
2021-06-30 07:02:33 +00:00
renovate-bot 44836c713a Update matrixdotorg/synapse Docker tag to v1.37.0
continuous-integration/drone/pr Build is failing
continuous-integration/drone/push Build is failing
2021-06-30 07:02:22 +00:00
d1admin 92ff8ebcb7 Version v1.36.0; sync labels
continuous-integration/drone/push Build is passing
2021-06-21 10:31:40 +00:00
d1admin 4aca0bbf14 Use new image namespace
continuous-integration/drone/push Build is passing
2021-06-21 12:31:29 +02:00
decentral1se a0aea386a4 Version v1.36.0; sync labels
continuous-integration/drone/push Build is passing
2021-06-16 07:40:30 +00:00
decentral1se 7238f765b1 Version v1.36.0; sync labels
continuous-integration/drone/push Build is passing
2021-06-16 09:39:18 +02:00
renovate-bot 03bbade383 Update matrixdotorg/synapse Docker tag to v1.36.0
continuous-integration/drone/pr Build is failing
continuous-integration/drone/push Build is passing
2021-06-16 07:02:25 +00:00
renovate-bot 6da0caae76 Version v1.35.1; sync labels
continuous-integration/drone/push Build is passing
2021-06-04 07:03:30 +00:00
renovate-bot 107737c377 Update matrixdotorg/synapse Docker tag to v1.35.1
continuous-integration/drone/pr Build is failing
continuous-integration/drone/push Build is failing
2021-06-04 07:03:18 +00:00
decentral1se 84574ff569 Remove trigger, we make the tags [ci skip] 2021-06-04 00:14:56 +02:00
decentral1se 56f2323bbb Add release logic CI setup 2021-06-03 22:35:41 +02:00
decentral1se f7b95a6687 Version v1.35.0; sync labels 2021-06-03 22:34:06 +02:00
renovate-bot a2e22e4a54 Update matrixdotorg/synapse Docker tag to v1.35.0 2021-06-03 22:34:06 +02:00
renovate-bot 2952c623a1 Update matrixdotorg/synapse Docker tag to v1.34.0 2021-05-18 07:01:48 +00:00
decentral1se 74f7a698aa Merge pull request 'Update matrixdotorg/synapse Docker tag to v1.33.2 (main)' (#9) from renovate/main-docker-matrixdotorg-synapse-1.x into main
Reviewed-on: https://git.autonomic.zone/coop-cloud/matrix-synapse/pulls/9
2021-05-17 09:44:40 +02:00
renovate-bot 7aed440d97 Update matrixdotorg/synapse Docker tag to v1.33.2 2021-05-12 07:01:49 +00:00
decentral1se aca1a644d9 Merge pull request 'Update matrixdotorg/synapse Docker tag to v1.33.1 (main)' (#8) from renovate/main-docker-matrixdotorg-synapse-1.x into main
Reviewed-on: https://git.autonomic.zone/coop-cloud/matrix-synapse/pulls/8
2021-05-10 10:26:23 +02:00
renovate-bot 241b8bd7ff Update matrixdotorg/synapse Docker tag to v1.33.1 2021-05-07 07:01:57 +00:00
decentral1se 3c74eccfa1 Version v1.33.0; sync labels 2021-05-06 09:38:03 +02:00
decentral1se b704f7aceb Merge pull request 'Update matrixdotorg/synapse Docker tag to v1.33.0 (main)' (#7) from renovate/main-docker-matrixdotorg-synapse-1.x into main
Reviewed-on: https://git.autonomic.zone/coop-cloud/matrix-synapse/pulls/7
2021-05-06 09:37:14 +02:00
renovate-bot c0bde0b431 Update matrixdotorg/synapse Docker tag to v1.33.0 2021-05-06 07:01:48 +00:00
decentral1se d968f064af Version v1.32.2; sync labels 2021-05-03 09:27:34 +02:00
decentral1se d8307ad2bf Merge pull request 'Update matrixdotorg/synapse Docker tag to v1.32.2 (main)' (#6) from renovate/main-docker-matrixdotorg-synapse-1.x into main
Reviewed-on: https://git.autonomic.zone/coop-cloud/matrix-synapse/pulls/6
2021-05-03 09:26:39 +02:00
renovate-bot d9ed3f07be Update matrixdotorg/synapse Docker tag to v1.32.2 2021-04-23 07:02:18 +00:00
decentral1se f98f61063a Merge pull request 'Update matrixdotorg/synapse Docker tag to v1.31.0 (main)' (#5) from renovate/main-docker-matrixdotorg-synapse-1.x into main
Reviewed-on: https://git.autonomic.zone/coop-cloud/matrix-synapse/pulls/5
2021-04-07 11:57:07 +02:00
renovate-bot 714f11df3b Update matrixdotorg/synapse Docker tag to v1.31.0 2021-04-07 07:01:57 +00:00
3wordchant c1c6ece1dc Merge pull request 'Update matrixdotorg/synapse Docker tag to v1.30.1 (main)' (#4) from renovate/main-docker-matrixdotorg-synapse-1.x into main
Reviewed-on: https://git.autonomic.zone/coop-cloud/matrix-synapse/pulls/4
2021-04-06 10:37:58 +02:00
renovate-bot 1f01929ed8 Update matrixdotorg/synapse Docker tag to v1.30.1 2021-04-06 07:01:48 +00:00
3wc fbb5b5a984 Version v1.9.1; sync labels 2021-04-05 11:45:45 +02:00
3wc e695bea733 Pin docker image tag 2021-04-05 11:44:11 +02:00
3wc 9420ca82ec Fix type name in README
[ci skip]
2021-03-02 20:24:18 +02:00
3wc 6f383f2c3a Fix README links & CI status
[ci skip]
2021-03-02 20:12:59 +02:00
3wc 31d1aba393 compose-stacks → coop-cloud
[ci skip]
2021-03-02 19:58:21 +02:00
3wc bc7d4c3c92 Follow new exciting README standard
See coop-cloud/organising#31
2021-03-02 18:38:38 +02:00
3wc e66832b78a Move config to abra.sh
Ref coop-cloud/abra#43
2021-02-08 15:28:40 +02:00
3wc 93c6214959 Fix embarrassing mass-typo 😳 2020-12-31 23:02:26 +02:00
3wc e490ccbfca APP → TYPE
Ref coop-cloud/abra#47
2020-12-31 22:54:41 +02:00
3wc 139c4ecfc4 Switch from envrc → env format
Ref coop-cloud/abra#40
2020-12-30 13:23:03 +02:00
3wc 52af3d76ae SERVICE -> APP 2020-10-29 19:48:31 +02:00
d1admin 8a20bddd41 Remove whitespace 2020-10-27 08:48:06 +01:00
d1admin 6f0999895f Make generic 2020-10-27 08:47:59 +01:00
decentral1se a75a19a120 Merge pull request 'Configure Renovate' (#3) from renovate/configure into main
Reviewed-on: https://git.autonomic.zone/compose-stacks/matrix-synapse/pulls/3
2020-09-15 08:53:33 +02:00
renovate-bot 28c64539da Add renovate.json 2020-09-14 20:02:13 +00:00
56 changed files with 3663 additions and 120 deletions
+53
View File
@@ -0,0 +1,53 @@
---
kind: pipeline
name: deploy to swarm-test.autonomic.zone
steps:
- name: deployment
image: git.coopcloud.tech/coop-cloud/stack-ssh-deploy:latest
settings:
host: swarm-test.autonomic.zone
stack: matrix-synapse
generate_secrets: true
purge: true
deploy_key:
from_secret: drone_ssh_swarm_test
networks:
- proxy
environment:
DOMAIN: matrix-synapse.swarm-test.autonomic.zone
STACK_NAME: matrix-synapse
LETS_ENCRYPT_ENV: production
DISCORD_BRIDGE_YAML_VERSION: v2
ENTRYPOINT_CONF_VERSION: v3
HOMESERVER_YAML_VERSION: v29
LOG_CONFIG_VERSION: v2
SHARED_SECRET_AUTH_VERSION: v2
SIGNAL_BRIDGE_YAML_VERSION: v5
TELEGRAM_BRIDGE_YAML_VERSION: v6
PG_BACKUP_VERSION: v1
WK_CLIENT_VERSION: v1
WK_SERVER_VERSION: v1
NGINX_CONFIG_VERSION: v8
SECRET_DB_PASSWORD_VERSION: v1
SECRET_FORM_SECRET_VERSION: v1
SECRET_MACAROON_VERSION: v1
SECRET_REGISTRATION_VERSION: v1
trigger:
branch:
- main
---
kind: pipeline
name: generate recipe catalogue
steps:
- name: release a new version
image: plugins/downstream
settings:
server: https://build.coopcloud.tech
token:
from_secret: drone_abra-bot_token
fork: true
repositories:
- toolshed/auto-recipes-catalogue-json
trigger:
event: tag
+260
View File
@@ -0,0 +1,260 @@
TYPE=matrix-synapse
DOMAIN=matrix-synapse.example.com
# SERVER_NAME=example.com
TIMEOUT=300
ENABLE_AUTO_UPDATE=true
LETS_ENCRYPT_ENV=production
COMPOSE_FILE="compose.yml"
# POST_DEPLOY_CMDS="db set_admin"
ENABLE_BACKUPS=true
## Admin details
ADMIN_EMAIL=admin@example.com
## Secrets
SECRET_DB_PASSWORD_VERSION=v1
SECRET_FORM_SECRET_VERSION=v1
SECRET_MACAROON_VERSION=v1
SECRET_REGISTRATION_VERSION=v1
## Authentication
# All login / SSO / MAS-related toggles in one place.
### Local password & registration (Synapse native)
# With MAS_ENABLED=1 you must set PASSWORD_LOGIN_ENABLED=false — Synapse forbids legacy password DB alongside matrix_authentication_service.
PASSWORD_LOGIN_ENABLED=true
ENABLE_REGISTRATION=false
# Token based registration. Enable ADMIN_INTERFACE (below) to use the admin interface to generate tokens.
#REGISTRATION_REQUIRES_TOKEN=true
### OIDC via Keycloak-shaped API (e.g. Authentik)
#COMPOSE_FILE="$COMPOSE_FILE:compose.keycloak.yml"
#KEYCLOAK_ENABLED=1
#KEYCLOAK_ID=keycloak
#KEYCLOAK_NAME=
#KEYCLOAK_URL=
#KEYCLOAK_CLIENT_ID=
#KEYCLOAK_CLIENT_DOMAIN=
#KEYCLOAK_ALLOW_EXISTING_USERS=false
#SECRET_KEYCLOAK_CLIENT_SECRET_VERSION=v1
### Second OIDC provider (compose.keycloak2.yml)
#COMPOSE_FILE="$COMPOSE_FILE:compose.keycloak2.yml"
#KEYCLOAK2_ENABLED=1
#KEYCLOAK2_ID=keycloak2
#KEYCLOAK2_NAME=
#KEYCLOAK2_URL=
#KEYCLOAK2_CLIENT_ID=
#KEYCLOAK2_CLIENT_DOMAIN=
#KEYCLOAK2_ALLOW_EXISTING_USERS=false
#SECRET_KEYCLOAK2_CLIENT_SECRET_VERSION=v1
### Third OIDC provider (compose.keycloak3.yml)
#COMPOSE_FILE="$COMPOSE_FILE:compose.keycloak3.yml"
#KEYCLOAK3_ENABLED=1
#KEYCLOAK3_ID=keycloak3
#KEYCLOAK3_NAME=
#KEYCLOAK3_URL=
#KEYCLOAK3_CLIENT_ID=
#KEYCLOAK3_CLIENT_DOMAIN=
#KEYCLOAK3_ALLOW_EXISTING_USERS=false
#SECRET_KEYCLOAK3_CLIENT_SECRET_VERSION=v1
### Matrix Authentication Service (MAS) — Element X / OIDC-native auth
#COMPOSE_FILE="$COMPOSE_FILE:compose.mas.yml"
#MAS_ENABLED=1 # Leave commented if you plan to migrate an existing homeserver
#PASSWORD_LOGIN_ENABLED=false
#SECRET_MAS_ENCRYPTION_VERSION=v1 # length=64 charset=hex
#SECRET_MAS_SYNAPSE_SHARED_VERSION=v1 # length=64 charset=hex
# PEM private key: abra cannot generate this format — use `abra app cmd -l YOURAPPDOMAIN generate_mas_signing_rsa`
#SECRET_MAS_SIGNING_RSA_VERSION=v1 # generate=false
#### MAS upstream OIDC provider (e.g. Authentik)
# Create a new OAuth2 app in your IdP with redirect URI: https://<DOMAIN>/upstream/callback/<MAS_UPSTREAM_PROVIDER_ID>
#COMPOSE_FILE="$COMPOSE_FILE:compose.mas-upstream.yml"
#MAS_UPSTREAM_PROVIDER_ID= # ULID, e.g. 01JSHPZHAXC50QBKH67MH33TNF — generate at https://www.ulidtools.com
#MAS_UPSTREAM_ISSUER= # e.g. https://auth.example.com/application/o/matrix-mas/
#MAS_UPSTREAM_CLIENT_ID=
#MAS_UPSTREAM_HUMAN_NAME=Authentik
# For migration from previous direct Keycloud-style config: set to oidc-<your old KEYCLOAK_ID> so syn2mas maps users correctly.
#MAS_UPSTREAM_SYNAPSE_IDP_ID=
#SECRET_MAS_UPSTREAM_CLIENT_VERSION=v1
### Shared secret auth (bridges / automation)
#COMPOSE_FILE="$COMPOSE_FILE:compose.shared_secret_auth.yml"
#SHARED_SECRET_AUTH_ENABLED=1
#SECRET_SHARED_SECRET_AUTH_VERSION=v1 # length=128
## Federation
#DISABLE_FEDERATION=1
# SERVE_SERVER_WELLKNOWN only works if SERVER_NAME and DOMAIN are the same
# if they are different, then a different federation method is needed (like compose.wellknown.yml)
# Set "true" to enable federation endpoint on $DOMAIN/.well-known/matrix/server
SERVE_SERVER_WELLKNOWN=false
# Serve /.well-known/matrix/{server,client} on SERVER_NAME via Traefik.
# Can be used when SERVER_NAME is other than DOMAIN and SERVER_NAME is served by Traefik.
#COMPOSE_FILE="$COMPOSE_FILE:compose.wellknown.yml"
ALLOW_PUBLIC_ROOMS_FEDERATION=false
## Room auto-join
#AUTO_JOIN_ROOM_ENABLED=1
#AUTO_JOIN_ROOM="#example:example.com"
## Logging
# for the homserver
SQL_LOG_LEVEL=WARN
ROOT_LOG_LEVEL=WARN
# for nginx
NGINX_ACCESS_LOG_LOCATION="/dev/null"
NGINX_ERROR_LOG_LOCATION="/dev/null"
# Comment the previous two lines and uncomment these to enable logging
#NGINX_ACCESS_LOG_LOCATION="/dev/stdout"
#NGINX_ERROR_LOG_LOCATION="/dev/stderr"
## Privacy
ENABLE_3PID_LOOKUP=true
USER_IPS_MAX_AGE=1d
ENCRYPTED_BY_DEFAULT=all
#ENABLE_ALLOWLIST=1
#FEDERATION_ALLOWLIST="[]"
# Set these to keyservers you trust - usually the same as your federation allowlist
#TRUSTED_KEYSERVERS="trusted_key_servers:\n - server_name: 'example.com'\n - server_name: 'example2.com'"
# some optional configs to increase privacy and security
#REQUIRE_AUTH_FOR_PROFILE_REQUESTS=true
#LIMIT_PROFILE_REQUESTS_TO_USERS_WHO_SHARE_ROOMS=true
#DELETE_STALE_DEVICES_AFTER=1y
#SESSION_LIFETIME=60d
#TRACK_PUPPETED_USER_IPS=true
## Room complexity limit (prevents joining large remote rooms that cause DB bloat)
## complexity ≈ state_events / 500. Default 100.0 blocks rooms with >50000 state events.
#ROOM_COMPLEXITY_LIMIT=100.0
## Retention
ALLOWED_LIFETIME_MAX=4w
REDACTION_RETENTION_PERIOD=7d
RETENTION_MAX_LIFETIME=4w
#MEDIA_RETENTION_LOCAL_LIFETIME=30d
#MEDIA_RETENTION_REMOTE_LIFETIME=14d
## Old Signing Key
#OLD_SIGNING_KEY_ID=a_OLDKEYID
#OLD_SIGNING_KEY=base64string
#OLD_SIGNING_KEY_EXPIRES=123456789123
## Ratelimit
#LOGIN_LIMIT_IP_PER_SECOND=5
#LOGIN_LIMIT_IP_BURST=15
#LOGIN_LIMIT_ACCOUNT_PER_SECOND=1
#LOGIN_LIMIT_ACCOUNT_BURST=10
## TURN
#COMPOSE_FILE="$COMPOSE_FILE:compose.turn.yml"
#TURN_ENABLED=1
#TURN_URIS="[\"turns:coturn.foo.zone?transport=udp\", \"turns:coturn.foo.zone?transport=tcp\"]"
#TURN_ALLOW_GUESTS=true
#SECRET_TURN_SHARED_SECRET_VERSION=v1
## SMTP
#COMPOSE_FILE="$COMPOSE_FILE:compose.smtp.yml"
#SMTP_ENABLED=1
#SMTP_APP_NAME=
#SMTP_FROM=
#SMTP_HOST=
#SMTP_PORT=
#SMTP_USER=
#SECRET_SMTP_PASSWORD_VERSION=v1
## USER-DIRECTORY
#USER_DIRECTORY_ENABLED=true
#USER_DIRECTORY_SEARCH_ALL_USERS=true
#USER_DIRECTORY_PREFER_LOCAL_USERS=true
#USER_DIRECTORY_SHOW_LOCKED_USERS=false
## App services
#APP_SERVICES_ENABLED=1
#APP_SERVICE_CONFIGS="[\"...\"]"
## Telegram bridge
#COMPOSE_FILE="$COMPOSE_FILE:compose.telegram.yml"
#APP_SERVICE_BOT_USERNAME=telegrambot
#APP_SERVICE_DISPLAY_NAME="Telegram bridge bot"
#APP_SERVICE_ID=
#HOMESERVER_DOMAIN=$DOMAIN
#HOMESERVER_URL=https://$DOMAIN
#VERIFY_SSL=false
#ENABLE_ENCRYPTION=true
#TELEGRAM_APP_ID=
#TELEGRAM_BRIDGE_PERMISSIONS="{ \"*\": \"relaybot\", \"@foo:matrix.example.com\": \"admin\" }"
#TELEGRAM_SYNC_CHANNEL_MEMBERS=true
#SECRET_TELEGRAM_DB_PASSWORD_VERSION=v1
#SECRET_TELEGRAM_API_HASH_VERSION=v1
#SECRET_TELEGRAM_BOT_TOKEN_VERSION=v1
#SECRET_TELEGRAM_AS_TOKEN_VERSION=v1
#SECRET_TELEGRAM_HS_TOKEN_VERSION=v1
## Discord bridge
#COMPOSE_FILE="$COMPOSE_FILE:compose.discord.yml"
#DISCORD_CLIENT_ID=
#DISCORD_BRIDGE_ADMIN=
#SECRET_DISCORD_BOT_TOKEN_VERSION=v1
#SECRET_DISCORD_DB_PASSWORD_VERSION=v1
## Signal bridge
#COMPOSE_FILE="$COMPOSE_FILE:compose.signal.yml"
#SIGNAL_ENABLE_ENCRYPTION=true
#SIGNAL_DEFAULT_ENCRYPTION=true
#SIGNAL_BRIDGE_PERMISSIONS="{ \"*\": \"relay\" }"
#SECRET_SIGNAL_AS_TOKEN_VERSION=v1
#SECRET_SIGNAL_DB_PASSWORD_VERSION=v1
#SECRET_SIGNAL_HS_TOKEN_VERSION=v1
#SECRET_SIGNAL_PICKLE_KEY_VERSION=v1
## Web Client (Redirect)
#WEB_CLIENT_LOCATION=https://element-web.example.com
## State compression (reduces database bloat from federation)
## Runs synapse_auto_compressor daily, built from source on first start
#COMPOSE_FILE="$COMPOSE_FILE:compose.compress-state.yml"
# See https://github.com/matrix-org/rust-synapse-compress-state#running-options
#STATE_COMPRESS_CHUNK_SIZE=500
#STATE_COMPRESS_CHUNKS=100
#STATE_COMPRESS_SCHEDULE=0 3 * * *
## Admin interface at /admin
#COMPOSE_FILE="$COMPOSE_FILE:compose.admin.yml"
#ADMIN_INTERFACE_ENABLED=1
-11
View File
@@ -1,11 +0,0 @@
export STACK_NAME=matrix
export APP=matrix
export DOMAIN=matrix.example.com
export LETS_ENCRYPT_ENV=production
export ENTRYPOINT_CONF_VERSION=v1
## TURN server
#export TURNSERVER_CONF_VERSION=v1
#export COTURN_SHARED_SECRET_VERSION=v1
+2 -1
View File
@@ -1 +1,2 @@
/.envrc
.envrc
synapse
+279 -16
View File
@@ -1,19 +1,282 @@
# Matrix Synapse
# Matrix (Synapse)
Matrix Synapse, based on the [official `matrixdotorg/synapse`
image][synapse-docker].
<!-- metadata -->
1. Set up Docker Swarm and [`abra`][abra]
2. Deploy [`compose-stacks/traefik`][compose-traefik]
2. `cp .envrc.sample .envrc`
3. Edit `.envrc` - be sure to change `$DOMAIN` to something that resolves to
your Docker swarm box
4. `direnv allow` (or `. .envrc`)
4. `abra secret_generate coturn_shared_secret`
5. `abra deploy`
6. `abra service_run synapse` to open a shell
7. `abra register_new_matrix_user`
* **Category**: Apps
* **Status**: 0, work-in-progress
* **Image**: [`matrixdotorg/synapse`](https://hub.docker.com/r/matrixdotorg/synapse), 4, upstream
* **Healthcheck**: Yes
* **Backups**: No
* **Email**: Yes
* **Tests**: No
* **SSO**: Yes
[synapse-docker]: https://hub.docker.com/r/matrixdotorg/synapse
[abra]: https://git.autonomic.zone/autonomic-cooperative/abra
[compose-traefik]: https://git.autonomic.zone/compose-stacks/traefik
<!-- endmetadata -->
## Basic usage
1. Set up Docker Swarm and [`abra`](https://docs.coopcloud.tech/abra/)
2. Deploy [`coop-cloud/traefik`](https://git.coopcloud.tech/coop-cloud/traefik)
3. `abra app new matrix-synapse --secrets` (optionally with `--pass` if you'd like to save secrets in `pass`)
4. `abra app config YOURAPPDOMAIN` - be sure to change `$DOMAIN` to something that resolves to your Docker swarm box
5. `abra app deploy YOURAPPDOMAIN`
6. Create an initial user: `abra app run YOURAPPDOMAIN app register_new_matrix_user -c /data/homeserver.yaml http://localhost:8008`
## Tips & Tricks
### Create User
`register_new_matrix_user -u <username> -k $(cat /var/run/secrets/registration) -p <password>`
### Set Admin User
`abra app cmd YOURAPPDOMAIN db set_admin <adminuser>`
### Disabling federation
- Use `DISABLE_FEDERATION=1` to turn off federation listeners
- Don't use [`compose.matrix.yml`](https://git.coopcloud.tech/coop-cloud/traefik/src/branch/master/compose.matrix.yml) in your traefik config to keep the federation ports closed
### Enabling federation
Federation is on by default (`DISABLE_FEDERATION=0`). Remote homeservers need a way to discover the host:port that serves your `SERVER_NAME`.
There are three supported approaches. At least one needs to be working for federation to work (and matrix will fallback between them).
#### Option 1: built-in well-known (`SERVER_NAME` = `DOMAIN`)
Set `SERVE_SERVER_WELLKNOWN=true` and leave `SERVER_NAME` unset (defaults to `DOMAIN`). The recipe's nginx serves `/.well-known/matrix/server` and `/.well-known/matrix/client` on `DOMAIN`.
Suitable when users are e.g. `@alice:matrix.example.com`.
#### Option 2: external well-known on `SERVER_NAME`
Use when you want users to be e.g. `@alice:example.com` while Synapse runs at `matrix.example.com` (and SERVER_NAME is served by the same machine that Synapse is running on). Set:
```
SERVER_NAME=example.com
DOMAIN=matrix.example.com
SERVE_SERVER_WELLKNOWN=false
```
The two paths that must be served on `SERVER_NAME` are:
- `https://example.com/.well-known/matrix/server``{"m.server": "matrix.example.com:443"}`
- `https://example.com/.well-known/matrix/client``{"m.homeserver": {"base_url": "https://matrix.example.com"}}`
**Recommended — let this recipe serve them via Traefik** by enabling `compose.wellknown.yml`:
```
COMPOSE_FILE="$COMPOSE_FILE:compose.wellknown.yml"
```
This publishes a Traefik router `Host(${SERVER_NAME}) && PathPrefix(/.well-known/matrix)`
pointing at the matrix nginx, which already serves both files. The path-scoped, high-priority
rule coexists with any apex website that also serves `Host(${SERVER_NAME})` — that site keeps
serving everything except `/.well-known/matrix`. `SERVER_NAME` must resolve to this Traefik so
ACME can issue its certificate.
**Alternative** — serve the two files yourself from whatever already hosts `example.com`.
#### Option 3: Traefik `matrix-federation` entrypoint (port 8448)
Use when `SERVER_NAME``DOMAIN` but you have no separate web service at `SERVER_NAME`. Remote homeservers fall back to `SERVER_NAME:8448` when there's no delegation (also requires SERVER_NAME pointing to same server that matrix is running on).
Requirements:
- [traefik](https://git.coopcloud.tech/coop-cloud/traefik) `>= 5.1.2+v3.6.15` with `MATRIX_FEDERATION_ENABLED=1` and `compose.matrix.yml` enabled.
- `SERVER_NAME` set in your matrix-synapse env (used by the federation router's Host rule).
With these in place, the recipe publishes a Traefik router on `Host(${SERVER_NAME})` via the `matrix-federation` entrypoint, reusing the existing matrix nginx → synapse path.
#### Option 4: DNS SRV records (usually not viable here)
For reasons explained below, I might be confused, but I think SRV records usually don't help with co-op cloud matrix deployments.
You should probably prefer Option 2 (well known), but the possibility of SRV is explained below:
Federation can also be delegated with a DNS `SRV` record on `SERVER_NAME` instead of well-known:
```
_matrix-fed._tcp.example.com. 3600 IN SRV 10 0 8448 matrix.example.com. # modern
_matrix._tcp.example.com. 3600 IN SRV 10 0 8448 matrix.example.com. # deprecated, for older peers
```
The catch is TLS: on the SRV path a remote validates the certificate against **`SERVER_NAME`**, *not* the SRV target. This recipe's Traefik only issues a cert for **`DOMAIN`**, so:
- **SRV → `DOMAIN`:443 fails** — the presented cert is for `DOMAIN`, but the peer requires one for `SERVER_NAME`.
- **SRV → `SERVER_NAME`:443 collides** — Traefik routes TLS by SNI, and `Host(SERVER_NAME)` on `:443` is already owned by whatever apex site serves `SERVER_NAME`.
- **SRV → `SERVER_NAME`:8448 works** — the Option 3 `matrix-federation` router holds a cert for `SERVER_NAME` — but that's just Option 3 made explicit (the `:8448` fallback already works with no SRV record).
#### Verifying
The canonical test:
- https://federationtester.matrix.org/#YOUR_SERVER_NAME
Or check the underlying paths directly. They should all return JSON:
```bash
# Options 1 & 2 — delegation
curl https://SERVER_NAME/.well-known/matrix/server
# Option 3 — federation endpoint via 8448
curl https://SERVER_NAME:8448/_matrix/key/v2/server
# Confirms Synapse itself is healthy (independent of the path remote servers use)
curl https://DOMAIN/_matrix/key/v2/server
```
### Getting client discovery on a custom domain
Enable `compose.wellknown.yml` (see Option 2 above) — it serves `/.well-known/matrix/client`
on `SERVER_NAME` too, so clients signing in as `@alice:example.com` auto-discover the homeserver.
### Matrix Authentication Service (MAS)
[MAS](https://element-hq.github.io/matrix-authentication-service/) is Elements OAuth/OIDC-native auth service for Matrix: it handles login, tokens, and upstream IdPs while Synapse delegates authentication via `matrix_authentication_service`.
> [!IMPORTANT]
> **If you plan to migrate an existing homeserver with `syn2mas`:** deploy and configure MAS as below, but **leave `MAS_ENABLED=1` commented** until migration and cutover are done, so Synapse keeps using your current login path until you intentionally switch. You cannot use Synapse legacy OIDC/Keycloak SSO alongside MAS; plan IdP apps and envs accordingly.
**Enable the stack:**
- In `.env`, uncomment `compose.mas.yml` (and `compose.mas-upstream.yml` plus upstream envs if you use an external IdP), and uncomment the `SECRET_MAS_*` version lines.
- `abra app secret generate YOURAPPDOMAIN`
- `abra app cmd -l YOURAPPDOMAIN generate_mas_signing_rsa` — generates and inserts the PEM RSA key for `SECRET_MAS_SIGNING_RSA_VERSION`. Requires `openssl` on the local machine.
- `abra app cmd YOURAPPDOMAIN db ensure_mas_database` (once, creates the `mas` database in Postgres)
- `abra app deploy YOURAPPDOMAIN`
<details>
<summary><strong>Migrating an existing server (<code>syn2mas</code>)</strong></summary>
Requires PostgreSQL on Synapse and a dedicated MAS database. Backup Postgres (and configs) before you start. Official background: [MAS migration guide](https://element-hq.github.io/matrix-authentication-service/setup/migration.html).
1. **Prepare (Synapse still running):** With MAS in `COMPOSE_FILE` but **`MAS_ENABLED` still off**, deploy, then run checks from your machine:
```bash
abra app cmd YOURAPPDOMAIN prepare_mas_migration
```
This fetches rendered `homeserver.yaml` into the MAS container, runs `syn2mas check`, then `migrate --dry-run` (the dry run rolls back MAS data at the end). The file stays in the MAS container until next restart, so you can repeat this step to provide the file for the actual migration.
2. **Optional snapshot:** save a copy of the rendered config while `app` is up, e.g. `abra app run -t YOURAPPDOMAIN app cat /data/homeserver.yaml > homeserver.snapshot.yaml`.
3. **Downtime — stop Synapse:** run on the **host** with Docker/Swarm access (not inside a container), e.g.:
```bash
docker service scale <STACK_NAME>_app=0
```
Use the real service name from `docker service ls` (suffix `_app`).
4. **Migration:** with MAS still running and Synapse at zero replicas, run `run_mas_migration` from your machine. The homeserver snapshot at `/tmp/homeserver.yaml` in `mas` must still be present from step 1.
```bash
abra app cmd YOURAPPDOMAIN run_mas_migration
```
5. **Cutover:** in `.env`, set `MAS_ENABLED=1`, `PASSWORD_LOGIN_ENABLED=false`, remove legacy Keycloak/SSO envs, then `abra app deploy YOURAPPDOMAIN` (Synapse comes back with MAS delegation). `syn2mas` does not write to the Synapse database; if you abort before serving traffic through MAS, you can often drop and recreate the MAS DB and revert env.
</details>
## Bridges
For all Bridges:
- Setting it up is a bit of a chicken/egg & chasing cats moment.
- Make sure to uncomment `APP_SERVICES_ENABLED`, `HOMESERVER_URL`, `HOMESERVER_DOMAIN`, `compose.shared_secret_auth.yml`, `SHARED_SECRET_AUTH_ENABLED` and `SECRET_SHARED_SECRET_AUTH_VERSION`
- include the registration in synapse, e.g. `APP_SERVICE_CONFIGS="[\"/telegram-data/registration.yaml\"]"`
- and set yourself as admin, e.g.: `TELEGRAM_BRIDGE_PERMISSIONS="{ \"*\": \"relaybot\", \"@akadmin:example.com\": \"admin\"}"`
> [!IMPORTANT]
> The shared secret authenticator may break when matrix-synapse uses a newer python version with an error stating something like "module not found". You have to fix the path in the compose.shared_secret_auth.yml like [here](https://git.coopcloud.tech/coop-cloud/matrix-synapse/commit/3d1350533079ce1ad3bea92039fe003684589b95)
### Telegram bridging
You need to get your bot setup on the telegram side first by creating a [telegram app](https://my.telegram.org/apps) and a [telegram bot](https://docs.mau.fi/bridges/python/telegram/relay-bot.html#setup) and have these values:
```
api_id: ...
api_hash: ...
telegram_bot_token: ...
```
Experimental script for a automated token replacement:
```
DOMAIN=<domain>
abra app secret insert $DOMAIN telegram_api_hash v1 <secret>
abra app secret insert $DOMAIN telegram_bot_token v1 <secret>
abra app secret generate -a $DOMAIN
abra app deploy $DOMAIN
abra app cmd -l $DOMAIN set_bridge_tokens telegram
```
Alternatively a manual guide for the necessary steps:
```
DOMAIN=<domain>
abra app secret insert $DOMAIN telegram_api_hash v1 <secret>
abra app secret insert $DOMAIN telegram_bot_token v1 <secret>
abra app secret generate -a $DOMAIN
abra app deploy $DOMAIN
abra app run $DOMAIN telegrambridge cat /data/registration.yaml
abra app undeploy $DOMAIN
abra app secret rm $DOMAIN telegram_as_token
abra app secret insert $DOMAIN telegram_as_token v1 <secret>
abra app secret rm $DOMAIN telegram_hs_token
abra app secret insert $DOMAIN telegram_hs_token v1 <secret>
abra app deploy $DOMAIN
```
Some helpful documentation:
- [`docs.mau.fi`](https://docs.mau.fi/bridges/python/setup/docker.html?bridge=telegram)
- [`example-config.yaml`](https://mau.dev/mautrix/telegram/-/blob/master/mautrix_telegram/example-config.yaml)
### Discord bridging
> WIP docs
Just as messy as the Telegram bridging above! Rough guide:
- get a local copy of [`config.yaml`](https://github.com/matrix-org/matrix-appservice-discord/blob/develop/config/config.sample.yaml)
- fill it out with the values you need, all the discord token stuff, etc.
- run `mkdir -p data && cp config.yaml data/` then `docker run --rm -v data:/data halfshot/matrix-appservice-discord:v1.0.0 sh -c "cd /data && node /build/src/discordas.js -r -u "http://discordbridge:9005" -c config.yaml"`
- this generates the app service registration configuration you need to feed to the homeserver
- run secret generation for the `discord_db_password`, insert your `discord_bot_token`
- run `abra app cp <domain> discord-registration.yaml app:/discord-data` (it has to be called `discord-registration.yaml`)
- deploy the bridge & happy hacking
Some helpful documentation:
- [`matrix-org/matrix-appservice-discord` docs](https://github.com/matrix-org/matrix-appservice-discord#bridging-a-room)
- [`t2bot.io/discord`](https://t2bot.io/discord/)
### Signal bridging
Experimental script for a more automated token replacement:
```
DOMAIN=<domain>
abra app secret generate -a $DOMAIN
abra app deploy $DOMAIN
abra app cmd -l $DOMAIN set_bridge_tokens signal
```
Alternatively a manual guide for the necessary steps:
```
DOMAIN=<domain>
abra app secret insert $DOMAIN signal_hs_token v1 foo
abra app secret insert $DOMAIN signal_as_token v1 foo
abra app secret generate $DOMAIN -a
abra app deploy $DOMAIN
abra app run $DOMAIN signalbridge cat /data/registration.yaml
abra app secret rm $DOMAIN signal_as_token
abra app secret insert $DOMAIN signal_as_token v1 <secret>
abra app secret rm $DOMAIN signal_hs_token
abra app secret insert $DOMAIN signal_hs_token v1 <secret>
abra app deploy $DOMAIN
```
- message `@signalbot:example.com` to test
- See the [docs](https://docs.mau.fi/bridges/go/signal/authentication.html) for authentication
-3
View File
@@ -1,3 +0,0 @@
sub_register_new_matrix_user() {
abra run synapse register_new_matrix_user -c /data/homeserver.yaml http://localhost:8008
}
+354
View File
@@ -0,0 +1,354 @@
export DISCORD_BRIDGE_YAML_VERSION=v2
export ENTRYPOINT_CONF_VERSION=v3
export HOMESERVER_YAML_VERSION=v37
export LOG_CONFIG_VERSION=v2
export SHARED_SECRET_AUTH_VERSION=v2
export SIGNAL_BRIDGE_YAML_VERSION=v6
export TELEGRAM_BRIDGE_YAML_VERSION=v6
export NGINX_CONFIG_VERSION=v13
export WK_SERVER_VERSION=v1
export WK_CLIENT_VERSION=v2
export MAS_CONFIG_VERSION=v2
export PG_BACKUP_VERSION=v2
export ADMIN_CONFIG_VERSION=v1
export COMPRESS_STATE_ENTRYPOINT_VERSION=v5
###############################################################################
# Database maintenance — shrink a bloated Synapse database
#
# See https://levans.fr/shrink-synapse-database.html
#
# Recommended steps to reclaim disk space:
# 1. abra app cmd <domain> compress-state run_compressor 500 10000
# (compress redundant state — safe while Synapse is running)
# 2. abra app cmd <domain> db reindex
# (rebuild indexes — stop Synapse first)
# 3. abra app cmd <domain> db vacuum_full
# (rewrite tables and reclaim disk — stop Synapse first)
#
# Diagnostic commands (safe to run anytime):
# abra app cmd <domain> db db_size
# abra app cmd <domain> db state_bloat
# abra app cmd <domain> db empty_rooms
#
# Purge commands (require an admin token):
# abra app cmd <domain> app register_admin <user> <pass>
# abra app cmd <domain> app get_token <user> <pass>
# abra app cmd <domain> app purge_remote_media <days> <token>
# abra app cmd <domain> app purge_empty_rooms <token>
# abra app cmd <domain> app purge_room <room_id> <token>
# abra app cmd <domain> app purge_history <room_id> <days> <token>
###############################################################################
# --- Diagnostics (db) ---
db_size() {
echo "=== Database size ==="
psql -U synapse -d synapse -c "SELECT pg_size_pretty(pg_database_size('synapse')) AS db_size;"
echo ""
echo "=== Top 10 largest tables ==="
psql -U synapse -d synapse -c "
SELECT nspname || '.' || relname AS table,
pg_size_pretty(pg_total_relation_size(C.oid)) AS total_size
FROM pg_class C
LEFT JOIN pg_namespace N ON (N.oid = C.relnamespace)
WHERE nspname NOT IN ('pg_catalog', 'information_schema')
ORDER BY pg_total_relation_size(C.oid) DESC
LIMIT 10;"
}
state_bloat() {
echo "=== Rooms with most state bloat ==="
psql -U synapse -d synapse -c "
SELECT room_id, count(*) AS state_entries
FROM state_groups_state
GROUP BY room_id
ORDER BY state_entries DESC
LIMIT 20;"
}
empty_rooms() {
echo "=== Rooms with no local members ==="
psql -U synapse -d synapse -c "
SELECT room_id, room_version
FROM rooms
WHERE room_id NOT IN (
SELECT room_id FROM local_current_membership WHERE membership = 'join'
);"
}
# --- Compression (compress-state) ---
run_compressor() {
CHUNK_SIZE="${1:-${STATE_COMPRESS_CHUNK_SIZE:-500}}"
CHUNKS="${2:-${STATE_COMPRESS_CHUNKS:-100}}"
DB_PASS=$(cat /run/secrets/db_password)
echo "Running synapse_auto_compressor (chunk_size=$CHUNK_SIZE, chunks=$CHUNKS)..."
/build/synapse_auto_compressor \
-p "postgresql://synapse:${DB_PASS}@db:5432/synapse" \
-c "$CHUNK_SIZE" -n "$CHUNKS"
}
# --- Maintenance (db) — stop Synapse before running these ---
reindex() {
echo "WARNING: REINDEX locks tables. Synapse should be stopped before running this."
echo "Running REINDEX on synapse database..."
psql -U synapse -d synapse -c "REINDEX (VERBOSE) DATABASE synapse;"
echo "REINDEX complete."
psql -U synapse -d synapse -c "SELECT pg_size_pretty(pg_database_size('synapse')) AS db_size;"
}
vacuum_full() {
echo "WARNING: VACUUM FULL locks tables and requires temporary disk space."
echo "Synapse should be stopped before running this."
echo "Running VACUUM FULL on synapse database..."
psql -U synapse -d synapse -c "VACUUM FULL;"
echo "VACUUM FULL complete."
psql -U synapse -d synapse -c "SELECT pg_size_pretty(pg_database_size('synapse')) AS db_size;"
}
# --- Purge commands (app) — require an admin access token ---
register_admin() {
USER="${1}"
PASS="${2}"
if [ -z "$USER" ] || [ -z "$PASS" ]; then
echo "Usage: register_admin <username> <password>"
return 1
fi
register_new_matrix_user -u "$USER" -p "$PASS" -a -c /data/homeserver.yaml http://localhost:8008
}
get_token() {
USER="${1}"
PASS="${2}"
if [ -z "$USER" ] || [ -z "$PASS" ]; then
echo "Usage: get_token <username> <password>"
echo "Returns an admin access token for use with purge commands."
return 1
fi
curl -s -X POST "http://localhost:8008/_matrix/client/r0/login" \
-H "Content-Type: application/json" \
-d "{\"type\":\"m.login.password\",\"user\":\"$USER\",\"password\":\"$PASS\"}" \
| python3 -c "import sys,json; d=json.load(sys.stdin); print(d.get('access_token', d.get('error', 'unknown error')))"
}
purge_remote_media() {
DAYS="${1:-30}"
TOKEN="${2}"
if [ -z "$TOKEN" ]; then
echo "Usage: purge_remote_media <days> <admin_token>"
return 1
fi
BEFORE_TS=$(( $(date +%s) * 1000 - DAYS * 86400000 ))
echo "Purging remote media older than $DAYS days..."
curl -s -X POST "http://localhost:8008/_synapse/admin/v1/purge_media_cache?before_ts=$BEFORE_TS" \
-H "Authorization: Bearer $TOKEN"
echo ""
}
purge_room() {
ROOM_ID="${1}"
TOKEN="${2}"
if [ -z "$ROOM_ID" ] || [ -z "$TOKEN" ]; then
echo "Usage: purge_room <room_id> <admin_token>"
return 1
fi
echo "Purging room $ROOM_ID..."
curl -s -X DELETE "http://localhost:8008/_synapse/admin/v1/rooms/$ROOM_ID" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"purge": true}'
echo ""
}
purge_history() {
ROOM_ID="${1}"
DAYS="${2:-90}"
TOKEN="${3}"
if [ -z "$ROOM_ID" ] || [ -z "$TOKEN" ]; then
echo "Usage: purge_history <room_id> <days> <admin_token>"
return 1
fi
BEFORE_TS=$(( $(date +%s) * 1000 - DAYS * 86400000 ))
echo "Purging history older than $DAYS days from $ROOM_ID..."
curl -s -X POST "http://localhost:8008/_synapse/admin/v1/purge_history/$ROOM_ID" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d "{\"purge_up_to_ts\": $BEFORE_TS}"
echo ""
}
purge_empty_rooms() {
TOKEN="${1}"
if [ -z "$TOKEN" ]; then
echo "Usage: purge_empty_rooms <admin_token>"
return 1
fi
echo "Fetching rooms with no local members..."
ROOMS=$(curl -s "http://localhost:8008/_synapse/admin/v1/rooms?limit=1000" \
-H "Authorization: Bearer $TOKEN" \
| python3 -c "
import sys, json
data = json.load(sys.stdin)
for r in data.get('rooms', []):
if r.get('joined_local_members', 0) == 0:
print(r['room_id'])
")
COUNT=$(echo "$ROOMS" | grep -c '.' || true)
echo "Found $COUNT empty rooms."
if [ "$COUNT" -eq 0 ]; then
echo "Nothing to purge."
return 0
fi
echo "$ROOMS"
echo ""
echo "Purging..."
for ROOM_ID in $ROOMS; do
echo " Purging $ROOM_ID"
curl -s -X DELETE "http://localhost:8008/_synapse/admin/v1/rooms/$ROOM_ID" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"purge": true}' > /dev/null
done
echo "Done."
}
###############################################################################
# Other commands
###############################################################################
ensure_mas_database () {
if ! psql -U synapse -d postgres -v ON_ERROR_STOP=1 -Atqc "SELECT 1 FROM pg_database WHERE datname = 'mas'" | grep -qx 1
then
psql -U synapse -d postgres -v ON_ERROR_STOP=1 -c "CREATE DATABASE mas OWNER synapse"
fi
}
# Generate a PEM RSA private key and insert it as the MAS signing secret.
# `abra app secret generate` can only produce random hex/charset strings, so this
# secret is marked `generate=false` in .env.sample and handled here instead.
generate_mas_signing_rsa() {
if ! command -v openssl &> /dev/null; then
echo "openssl is required on your local machine to generate the MAS signing key."
echo "It could not be found in your PATH, please install openssl to proceed."
exit 1
fi
KEY=$(openssl genrsa 2048 2>/dev/null)
if [ -z "$KEY" ]; then
echo "Failed to generate RSA private key with openssl."
exit 1
fi
if printf '%s\n' "$KEY" | abra app secret insert -C "$APP_NAME" mas_signing_rsa v1; then
echo "MAS signing RSA key generated and inserted as v1."
else
echo "Failed to insert MAS signing RSA key."
exit 1
fi
}
# Local helper: fetch homeserver.yaml from app, push to mas, then syn2mas check + dry-run.
prepare_mas_migration () {
local syn_cfg
syn_cfg=/tmp/homeserver.yaml
cleanup_prepare_mas_migration() {
rm -f "homeserver.yaml"
}
trap cleanup_prepare_mas_migration EXIT
echo "Fetching /data/homeserver.yaml from app to homeserver.yaml (abra app run … cat)..."
if ! abra app run -t "$DOMAIN" app cat /data/homeserver.yaml > "homeserver.yaml"
then
return 1
fi
if [ ! -s "homeserver.yaml" ]; then
echo "Error: fetched homeserver.yaml is empty." >&2
return 1
fi
echo "Copying into mas:/tmp"
abra app cp "$DOMAIN" "homeserver.yaml" "mas:/tmp" || return 1
echo "Running mas-cli syn2mas check..."
abra app run -t "$DOMAIN" mas -- mas-cli syn2mas check \
--config /etc/mas/config.yaml \
--synapse-config "$syn_cfg" || return 1
echo "Running mas-cli syn2mas migrate --dry-run..."
abra app run -t "$DOMAIN" mas -- mas-cli syn2mas migrate \
--config /etc/mas/config.yaml \
--synapse-config "$syn_cfg" \
--dry-run || return 1
trap - EXIT
cleanup_prepare_mas_migration
echo ""
echo "=== Next migration step: stop Synapse (downtime) ==="
echo "Run on a host whose Docker CLI targets this Swarm (same machine you use for 'abra app deploy')."
if [ -n "${STACK_NAME:-}" ]; then
echo " docker service scale ${STACK_NAME}_app=0"
else
echo "STACK_NAME is not set here; resolve the Synapse service name with 'docker service ls' on that host, then:"
echo "docker service scale <STACK_NAME>_app=0"
fi
}
# Run syn2mas migrate for real (writes MAS data). Run from your operator machine as MAS image is distroless.
# Requires /tmp/homeserver.yaml in the mas container (e.g. from prepare_mas_migration) and
# Synapse scaled down before migrate.
run_mas_migration () {
local syn_cfg=/tmp/homeserver.yaml
echo "Running mas-cli syn2mas migrate in mas via abra app run..."
abra app run -t "$DOMAIN" mas -- mas-cli syn2mas migrate \
--config /etc/mas/config.yaml \
--synapse-config "$syn_cfg"
}
set_admin () {
admin=akadmin
if [ -n "$1" ]
then
admin=$1
fi
psql -U synapse -c "UPDATE users SET admin = 1 WHERE name = '@$admin:$DOMAIN'";
}
set_bridge_tokens() {
if [ -z "$1" ]; then
echo "Error: Missing parameter. Usage: set_bridge_tokens <BRIDGETYPE>"
return 1
fi
BRIDGETYPE=$1
echo "retrieve tokens from registration.yaml..."
output=$(abra app run $DOMAIN app cat /${BRIDGETYPE}-data/registration.yaml)
if [ $? -ne 0 ]; then
echo "Error: Failed to retrieve registration.yaml for ${BRIDGETYPE} bridge:"
echo "$output"
return 1
fi
hs_token=$(echo "$output" | sed -n 's/^hs_token:[[:space:]]*\(.*\)$/\1/p')
as_token=$(echo "$output" | sed -n 's/^as_token:[[:space:]]*\(.*\)$/\1/p')
echo "HS Token: $hs_token"
echo "AS Token: $as_token"
echo "UNDEPLOY $DOMAIN?"
abra app undeploy $DOMAIN
echo "Replacing tokens:"
abra app secret rm $DOMAIN ${BRIDGETYPE}_as_token
abra app secret insert $DOMAIN ${BRIDGETYPE}_as_token v1 $as_token
abra app secret rm $DOMAIN ${BRIDGETYPE}_hs_token
abra app secret insert $DOMAIN ${BRIDGETYPE}_hs_token v1 $hs_token
echo "Redeploying $DOMAIN..."
abra app deploy -n $DOMAIN
}
+3
View File
@@ -0,0 +1,3 @@
{
"restrictBaseUrl": "https://{{ env "DOMAIN" }}"
}
+15
View File
@@ -0,0 +1,15 @@
authentik:
env:
KEYCLOAK_ID: authentik
KEYCLOAK_NAME: sso
KEYCLOAK_URL: https://authentik.example.com/application/o/matrix/
KEYCLOAK_CLIENT_DOMAIN: https://element-web.example.com
KEYCLOAK_ALLOW_EXISTING_USERS: "true"
KEYCLOAK_CLIENT_ID: matrix
uncomment:
- compose.keycloak.yml
- KEYCLOAK_ENABLED
- KEYCLOAK_CLIENT_ID
- SECRET_KEYCLOAK_CLIENT_SECRET_VERSION
shared_secrets:
matrix_secret: keycloak_client_secret
+46
View File
@@ -0,0 +1,46 @@
---
version: "3.8"
services:
admin:
image: awesometechnologies/synapse-admin:0.11.4
networks:
- proxy
deploy:
labels:
- "traefik.enable=true"
- "traefik.swarm.network=proxy"
- "traefik.http.services.${STACK_NAME}_admin.loadbalancer.server.port=80"
- "traefik.http.routers.${STACK_NAME}_admin.rule=Host(`${DOMAIN}`${EXTRA_DOMAINS})&&PathPrefix(`/admin`)"
- "traefik.http.routers.${STACK_NAME}_admin.entrypoints=web-secure"
- "traefik.http.routers.${STACK_NAME}_admin.tls.certresolver=${LETS_ENCRYPT_ENV}"
- "traefik.http.routers.${STACK_NAME}_admin.middlewares=admin,admin_path"
- "traefik.http.middlewares.admin.redirectregex.regex=^(.*)/admin/?"
- "traefik.http.middlewares.admin.redirectregex.replacement=$${1}/admin/"
- "traefik.http.middlewares.admin_path.stripprefix.prefixes=/admin"
environment:
- DOMAIN
configs:
- source: admin_config
target: /app/config.json
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost"]
interval: 30s
timeout: 10s
retries: 10
start_period: 1m
web:
environment:
- ADMIN_INTERFACE_ENABLED
networks:
proxy:
external: true
configs:
admin_config:
name: ${STACK_NAME}_admin_config_${ADMIN_CONFIG_VERSION}
file: admin.conf.tmpl
template_driver: golang
+31
View File
@@ -0,0 +1,31 @@
version: "3.8"
services:
compress-state:
image: rust:1-alpine
entrypoint: /compress_state_entrypoint.sh
environment:
- STATE_COMPRESS_CHUNK_SIZE=${STATE_COMPRESS_CHUNK_SIZE:-500}
- STATE_COMPRESS_CHUNKS=${STATE_COMPRESS_CHUNKS:-100}
- STATE_COMPRESS_SCHEDULE=${STATE_COMPRESS_SCHEDULE:-0 3 * * *}
secrets:
- db_password
configs:
- source: compress_entrypoint
target: /compress_state_entrypoint.sh
mode: 0555
volumes:
- compress_state_build:/build
networks:
- internal
deploy:
restart_policy:
condition: on-failure
volumes:
compress_state_build:
configs:
compress_entrypoint:
name: ${STACK_NAME}_compress_ep_${COMPRESS_STATE_ENTRYPOINT_VERSION}
file: compress_state_entrypoint.sh
-35
View File
@@ -1,35 +0,0 @@
services:
app:
environment:
- TURN_SERVER=${DOMAIN}
- TURN_PORT=3478
secrets:
- coturn_shared_secret
coturn:
image: instrumentisto/coturn:latest
networks:
- swarm_host
secrets:
- coturn_shared_secret
configs:
- source: turnserver_conf
target: /etc/coturn/turnserver.conf
configs:
turnserver_conf:
name: ${STACK_NAME}_turnserver_conf_${TURNSERVER_CONF_VERSION}
file: turnserver.conf.tmpl
template_driver: golang
secrets:
coturn_shared_secret:
external: true
name: ${STACK_NAME}_coturn_shared_secret_${COTURN_SHARED_SECRET_VERSION}
networks:
# use host-mode networking until Docker can handle mass port-forwards:
# https://github.com/moby/moby/issues/11185
swarm_host:
external:
name: 'host'
+66
View File
@@ -0,0 +1,66 @@
---
version: "3.8"
services:
app:
environment:
- APP_SERVICES_ENABLED
- APP_SERVICE_CONFIGS
volumes:
- discord-data:/discord-data
discordbridge:
image: halfshot/matrix-appservice-discord:v1.0.0
depends_on:
- discorddb
configs:
- source: discord_bridge_yaml
target: /data/config.yaml
environment:
- DISCORD_CLIENT_ID
- DISCORD_BRIDGE_ADMIN
- HOMESERVER_DOMAIN
- HOMESERVER_URL
secrets:
- discord_bot_token
- discord_db_password
volumes:
- discord-data:/data
networks:
- internal
discorddb:
image: postgres:13-alpine
secrets:
- discord_db_password
environment:
- LC_COLLATE=C
- LC_CTYPE=C
- POSTGRES_DB=discordbridge
- POSTGRES_INITDB_ARGS="-E \"UTF8\""
- POSTGRES_PASSWORD_FILE=/run/secrets/discord_db_password
- POSTGRES_USER=discordbridge
networks:
- internal
healthcheck:
test: ["CMD", "pg_isready", "-U", "$POSTGRES_USER" ]
volumes:
- discord-postgres:/var/lib/postgresql/data
configs:
discord_bridge_yaml:
name: ${STACK_NAME}_discord_bridge_yaml_${DISCORD_BRIDGE_YAML_VERSION}
file: discord_bridge.yaml.tmpl
template_driver: golang
volumes:
discord-data:
discord-postgres:
secrets:
discord_db_password:
external: true
name: ${STACK_NAME}_discord_db_password_${SECRET_DISCORD_DB_PASSWORD_VERSION}
discord_bot_token:
external: true
name: ${STACK_NAME}_discord_bot_token_${SECRET_DISCORD_BOT_TOKEN_VERSION}
+24
View File
@@ -0,0 +1,24 @@
---
version: "3.8"
services:
app:
secrets:
- db_password
- form_secret
- keycloak_client_secret
- macaroon
- registration
environment:
- KEYCLOAK_CLIENT_DOMAIN
- KEYCLOAK_CLIENT_ID
- KEYCLOAK_ENABLED
- KEYCLOAK_NAME
- KEYCLOAK_ID
- KEYCLOAK_URL
- KEYCLOAK_ALLOW_EXISTING_USERS
secrets:
keycloak_client_secret:
external: true
name: ${STACK_NAME}_keycloak_client_secret_${SECRET_KEYCLOAK_CLIENT_SECRET_VERSION}
+19
View File
@@ -0,0 +1,19 @@
---
version: "3.8"
services:
app:
secrets:
- keycloak2_client_secret
environment:
- KEYCLOAK2_ALLOW_EXISTING_USERS
- KEYCLOAK2_CLIENT_ID
- KEYCLOAK2_ENABLED
- KEYCLOAK2_ID
- KEYCLOAK2_NAME
- KEYCLOAK2_URL
secrets:
keycloak2_client_secret:
external: true
name: ${STACK_NAME}_keycloak2_client_secret_${SECRET_KEYCLOAK2_CLIENT_SECRET_VERSION}
+19
View File
@@ -0,0 +1,19 @@
---
version: "3.8"
services:
app:
secrets:
- keycloak3_client_secret
environment:
- KEYCLOAK3_ALLOW_EXISTING_USERS
- KEYCLOAK3_CLIENT_ID
- KEYCLOAK3_ENABLED
- KEYCLOAK3_ID
- KEYCLOAK3_NAME
- KEYCLOAK3_URL
secrets:
keycloak3_client_secret:
external: true
name: ${STACK_NAME}_keycloak3_client_secret_${SECRET_KEYCLOAK3_CLIENT_SECRET_VERSION}
+21
View File
@@ -0,0 +1,21 @@
---
version: "3.8"
# Upstream OIDC provider for MAS (e.g. Authentik, Keycloak).
# Requires compose.mas.yml. Adds the client secret and env vars needed by mas.config.yaml.tmpl.
services:
mas:
environment:
- MAS_UPSTREAM_PROVIDER_ID
- MAS_UPSTREAM_ISSUER
- MAS_UPSTREAM_CLIENT_ID
- MAS_UPSTREAM_HUMAN_NAME
- MAS_UPSTREAM_SYNAPSE_IDP_ID
secrets:
- mas_upstream_client
secrets:
mas_upstream_client:
external: true
name: ${STACK_NAME}_mas_upstream_client_${SECRET_MAS_UPSTREAM_CLIENT_VERSION}
+64
View File
@@ -0,0 +1,64 @@
---
version: "3.8"
# Matrix Authentication Service (MAS) — optional overlay for Element X / OIDC-native auth.
services:
mas:
image: ghcr.io/element-hq/matrix-authentication-service:1.21.0
command: ["server", "--config=/etc/mas/config.yaml"]
environment:
- DOMAIN
- SERVER_NAME
- STACK_NAME
networks:
- internal
configs:
- source: mas_config
target: /etc/mas/config.yaml
secrets:
- db_password
- mas_encryption
- mas_synapse_shared
- mas_signing_rsa
# Official image is distroless (no curl/wget); upstream suggests `mas-cli config check` for probes.
# See https://github.com/element-hq/matrix-authentication-service/issues/3741 — validates config, not HTTP.
# GET /health is still served (resource `health` in mas.config.yaml.tmpl) for probes from other images.
healthcheck:
test:
[
"CMD",
"/usr/local/bin/mas-cli",
"--config",
"/etc/mas/config.yaml",
"config",
"check",
]
interval: 30s
timeout: 10s
retries: 3
start_period: 60s
deploy:
restart_policy:
condition: on-failure
app:
secrets:
- mas_synapse_shared
configs:
mas_config:
name: ${STACK_NAME}_mas_config_${MAS_CONFIG_VERSION}
file: mas.config.yaml.tmpl
template_driver: golang
secrets:
mas_encryption:
external: true
name: ${STACK_NAME}_mas_encryption_${SECRET_MAS_ENCRYPTION_VERSION}
mas_synapse_shared:
external: true
name: ${STACK_NAME}_mas_synapse_shared_${SECRET_MAS_SYNAPSE_SHARED_VERSION}
mas_signing_rsa:
external: true
name: ${STACK_NAME}_mas_signing_rsa_${SECRET_MAS_SIGNING_RSA_VERSION}
+22
View File
@@ -0,0 +1,22 @@
---
version: "3.8"
services:
app:
environment:
- SHARED_SECRET_AUTH_ENABLED
secrets:
- shared_secret_auth
configs:
- source: shared_secret_auth
target: /usr/local/lib/python3.13/site-packages/shared_secret_authenticator.py
configs:
shared_secret_auth:
name: ${STACK_NAME}_shared_secret_auth_${SHARED_SECRET_AUTH_VERSION}
file: shared_secret_authenticator.py
secrets:
shared_secret_auth:
external: true
name: ${STACK_NAME}_shared_secret_auth_${SECRET_SHARED_SECRET_AUTH_VERSION}
+86
View File
@@ -0,0 +1,86 @@
---
version: "3.8"
services:
app:
environment:
- APP_SERVICES_ENABLED
- APP_SERVICE_CONFIGS
volumes:
- signal-data:/signal-data
signalbridge:
image: dock.mau.dev/mautrix/signal:v26.02.2
depends_on:
- signaldb
configs:
- source: signal_bridge_yaml
target: /data/config.yaml
environment:
- HOMESERVER_DOMAIN
- HOMESERVER_URL
- SIGNAL_BRIDGE_PERMISSIONS
- SIGNAL_ENABLE_ENCRYPTION
- SIGNAL_DEFAULT_ENCRYPTION=${SIGNAL_DEFAULT_ENCRYPTION:-false}
- VERIFY_SSL
secrets:
- signal_as_token
- signal_db_password
- signal_hs_token
- shared_secret_auth
- signal_pickle_key
volumes:
- signal-data:/data
networks:
- internal
signaldb:
image: postgres:13-alpine
secrets:
- signal_db_password
environment:
- LC_COLLATE=C
- LC_CTYPE=C
- POSTGRES_DB=signalbridge
- POSTGRES_INITDB_ARGS="-E \"UTF8\""
- POSTGRES_PASSWORD_FILE=/run/secrets/signal_db_password
- POSTGRES_USER=signalbridge
networks:
- internal
healthcheck:
test: ["CMD", "pg_isready", "-U", "$POSTGRES_USER" ]
volumes:
- signal-postgres:/var/lib/postgresql/data
deploy:
labels:
backupbot.backup.pre-hook: "/pg_backup.sh backup"
backupbot.backup.volumes.signal-postgres.path: "backup.sql"
backupbot.restore.post-hook: '/pg_backup.sh restore'
configs:
- source: pg_backup
target: /pg_backup.sh
mode: 0555
configs:
signal_bridge_yaml:
name: ${STACK_NAME}_signal_bridge_yaml_${SIGNAL_BRIDGE_YAML_VERSION}
file: signal_bridge.yaml.tmpl
template_driver: golang
volumes:
signal-data:
signal-postgres:
secrets:
signal_db_password:
external: true
name: ${STACK_NAME}_signal_db_password_${SECRET_SIGNAL_DB_PASSWORD_VERSION}
signal_as_token:
external: true
name: ${STACK_NAME}_signal_as_token_${SECRET_SIGNAL_AS_TOKEN_VERSION}
signal_hs_token:
external: true
name: ${STACK_NAME}_signal_hs_token_${SECRET_SIGNAL_HS_TOKEN_VERSION}
signal_pickle_key:
external: true
name: ${STACK_NAME}_signal_pickle_key_${SECRET_SIGNAL_PICKLE_KEY_VERSION}
+23
View File
@@ -0,0 +1,23 @@
---
version: "3.8"
services:
app:
secrets:
- db_password
- form_secret
- macaroon
- registration
- smtp_password
environment:
- SMTP_APP_NAME
- SMTP_ENABLED
- SMTP_FROM
- SMTP_HOST
- SMTP_PORT
- SMTP_USER
secrets:
smtp_password:
external: true
name: ${STACK_NAME}_smtp_password_${SECRET_SMTP_PASSWORD_VERSION}
+94
View File
@@ -0,0 +1,94 @@
---
version: "3.8"
services:
app:
environment:
- APP_SERVICES_ENABLED
- APP_SERVICE_CONFIGS
volumes:
- telegram-data:/telegram-data
telegrambridge:
image: dock.mau.dev/mautrix/telegram:v0.2606.0
depends_on:
- telegramdb
configs:
- source: telegram_bridge_yaml
target: /data/config.yaml
environment:
- APP_SERVICE_BOT_USERNAME
- APP_SERVICE_DISPLAY_NAME
- APP_SERVICE_ID
- ENABLE_ENCRYPTION
- HOMESERVER_DOMAIN
- HOMESERVER_URL
- TELEGRAM_APP_ID
- TELEGRAM_BRIDGE_PERMISSIONS
- TELEGRAM_SYNC_CHANNEL_MEMBERS
- VERIFY_SSL
secrets:
- telegram_api_hash
- telegram_as_token
- telegram_bot_token
- telegram_db_password
- telegram_hs_token
- shared_secret_auth
volumes:
- telegram-data:/data
networks:
- internal
telegramdb:
image: postgres:13-alpine
secrets:
- telegram_db_password
environment:
- LC_COLLATE=C
- LC_CTYPE=C
- POSTGRES_DB=telegrambridge
- POSTGRES_INITDB_ARGS="-E \"UTF8\""
- POSTGRES_PASSWORD_FILE=/run/secrets/telegram_db_password
- POSTGRES_USER=telegrambridge
networks:
- internal
healthcheck:
test: ["CMD", "pg_isready", "-U", "$POSTGRES_USER" ]
volumes:
- telegram-postgres:/var/lib/postgresql/data
deploy:
labels:
backupbot.backup.pre-hook: "/pg_backup.sh backup"
backupbot.backup.volumes.telegram-postgres.path: "backup.sql"
backupbot.restore.post-hook: '/pg_backup.sh restore'
configs:
- source: pg_backup
target: /pg_backup.sh
mode: 0555
configs:
telegram_bridge_yaml:
name: ${STACK_NAME}_telegram_bridge_yaml_${TELEGRAM_BRIDGE_YAML_VERSION}
file: telegram_bridge.yaml.tmpl
template_driver: golang
volumes:
telegram-data:
telegram-postgres:
secrets:
telegram_db_password:
external: true
name: ${STACK_NAME}_telegram_db_password_${SECRET_TELEGRAM_DB_PASSWORD_VERSION}
telegram_api_hash:
external: true
name: ${STACK_NAME}_telegram_api_hash_${SECRET_TELEGRAM_API_HASH_VERSION}
telegram_bot_token:
external: true
name: ${STACK_NAME}_telegram_bot_token_${SECRET_TELEGRAM_BOT_TOKEN_VERSION}
telegram_as_token:
external: true
name: ${STACK_NAME}_telegram_as_token_${SECRET_TELEGRAM_AS_TOKEN_VERSION}
telegram_hs_token:
external: true
name: ${STACK_NAME}_telegram_hs_token_${SECRET_TELEGRAM_HS_TOKEN_VERSION}
+20
View File
@@ -0,0 +1,20 @@
---
version: "3.8"
services:
app:
secrets:
- db_password
- form_secret
- macaroon
- registration
- turn_shared_secret
environment:
- TURN_ALLOW_GUESTS
- TURN_ENABLED
- TURN_URIS
secrets:
turn_shared_secret:
external: true
name: ${STACK_NAME}_turn_shared_secret_${SECRET_TURN_SHARED_SECRET_VERSION}
+24
View File
@@ -0,0 +1,24 @@
---
version: "3.8"
# Serve /.well-known/matrix/{server,client} on SERVER_NAME via Traefik, routed to
# the matrix nginx (`web`) — so server/client delegation works without hand-placing
# files on whatever else hosts SERVER_NAME.
#
# Enable when SERVER_NAME != DOMAIN (users are @alice:example.com, Synapse runs at
# matrix.example.com). The PathPrefix rule is more specific than a bare Host()
# router, and the explicit high priority guarantees it wins over any apex website
# that also serves Host(SERVER_NAME) — so the two coexist, the apex site keeps
# serving everything except /.well-known/matrix.
#
# Requires SERVER_NAME to resolve to this Traefik so ACME can issue its cert.
services:
web:
deploy:
labels:
- "traefik.http.routers.${STACK_NAME}-wellknown.rule=Host(`${SERVER_NAME}`) && PathPrefix(`/.well-known/matrix`)"
- "traefik.http.routers.${STACK_NAME}-wellknown.entrypoints=web-secure"
- "traefik.http.routers.${STACK_NAME}-wellknown.tls=true"
- "traefik.http.routers.${STACK_NAME}-wellknown.tls.certresolver=${LETS_ENCRYPT_ENV}"
- "traefik.http.routers.${STACK_NAME}-wellknown.service=${STACK_NAME}"
- "traefik.http.routers.${STACK_NAME}-wellknown.priority=1000"
+185 -22
View File
@@ -2,48 +2,211 @@
version: "3.8"
services:
app:
image: "matrixdotorg/synapse:v1.9.1"
volumes:
- "synapse:/data"
web:
image: nginx:1.31.3
networks:
- proxy
- internal
environment:
- DOMAIN
- STACK_NAME
- MAS_ENABLED
- NGINX_ACCESS_LOG_LOCATION
- NGINX_ERROR_LOG_LOCATION
- MAX_UPLOAD_SIZE
configs:
- source: nginx_config
target: /etc/nginx/nginx.conf
- source: wk_server
target: /var/www/.well-known/matrix/server
- source: wk_client
target: /var/www/.well-known/matrix/client
deploy:
restart_policy:
condition: any
labels:
- "traefik.enable=true"
- "traefik.http.services.${STACK_NAME}.loadbalancer.server.port=80"
- "traefik.http.routers.${STACK_NAME}.rule=Host(`${DOMAIN}`)"
- "traefik.http.routers.${STACK_NAME}.entrypoints=web-secure"
- "traefik.http.routers.${STACK_NAME}.tls.certresolver=${LETS_ENCRYPT_ENV}"
- "traefik.http.routers.${STACK_NAME}-federation.rule=Host(`${SERVER_NAME}`)"
- "traefik.http.routers.${STACK_NAME}-federation.entrypoints=matrix-federation"
- "traefik.http.routers.${STACK_NAME}-federation.tls=true"
- "traefik.http.routers.${STACK_NAME}-federation.tls.certresolver=${LETS_ENCRYPT_ENV}"
- "traefik.http.routers.${STACK_NAME}-federation.service=${STACK_NAME}"
healthcheck:
test: curl -f http://${STACK_NAME}_app:8008/health || exit 1
interval: 30s
timeout: 15s
retries: 90
start_period: 2m
app:
image: "matrixdotorg/synapse:v1.157.1"
volumes:
- "data:/data"
secrets:
- db_password
- registration
- macaroon
- form_secret
environment:
- MAS_ENABLED
- ALLOWED_LIFETIME_MAX
- ALLOW_PUBLIC_ROOMS_FEDERATION
- AUTO_JOIN_ROOM
- AUTO_JOIN_ROOM_ENABLED
- DISABLE_FEDERATION
- DOMAIN
- ENABLE_3PID_LOOKUP
- ENABLE_ALLOWLIST
- ENABLE_REGISTRATION
- REGISTRATION_REQUIRES_TOKEN
- ENCRYPTED_BY_DEFAULT
- OLD_SIGNING_KEY
- OLD_SIGNING_KEY_ID
- OLD_SIGNING_KEY_EXPIRES
- USER_DIRECTORY_ENABLED=${USER_DIRECTORY_ENABLED:-true}
- USER_DIRECTORY_SEARCH_ALL_USERS=${USER_DIRECTORY_SEARCH_ALL_USERS:-true}
- USER_DIRECTORY_PREFER_LOCAL_USERS=${USER_DIRECTORY_PREFER_LOCAL_USERS:-true}
- USER_DIRECTORY_SHOW_LOCKED_USERS=${USER_DIRECTORY_SHOW_LOCKED_USERS:-false}
- FEDERATION_ALLOWLIST
- REQUIRE_AUTH_FOR_PROFILE_REQUESTS=${REQUIRE_AUTH_FOR_PROFILE_REQUESTS:-false}
- LIMIT_PROFILE_REQUESTS_TO_USERS_WHO_SHARE_ROOMS=${LIMIT_PROFILE_REQUESTS_TO_USERS_WHO_SHARE_ROOMS:-false}
- DELETE_STALE_DEVICES_AFTER
- SESSION_LIFETIME
- TRACK_PUPPETED_USER_IPS=${TRACK_PUPPETED_USER_IPS:-false}
- LETSENCRYPT_HOST=${DOMAIN}
- MEDIA_RETENTION_LOCAL_LIFETIME
- MEDIA_RETENTION_REMOTE_LIFETIME
- PASSWORD_LOGIN_ENABLED
- REDACTION_RETENTION_PERIOD
- RETENTION_MAX_LIFETIME
- ROOT_LOG_LEVEL
- SERVE_SERVER_WELLKNOWN
- SQL_LOG_LEVEL
- STACK_NAME
- SYNAPSE_ADMIN_EMAIL
- SYNAPSE_REPORT_STATS=no
- SYNAPSE_SERVER_NAME=${DOMAIN}
- USER_IPS_MAX_AGE
- VIRTUAL_HOST=${DOMAIN}
- VIRTUAL_PORT=8008
- LETSENCRYPT_HOST=${DOMAIN}
- SYNAPSE_SERVER_NAME=${DOMAIN}
- SYNAPSE_REPORT_STATS=no
networks:
- proxy
- LOGIN_LIMIT_IP_PER_SECOND=${LOGIN_LIMIT_IP_PER_SECOND:-0.003}
- LOGIN_LIMIT_IP_BURST=${LOGIN_LIMIT_IP_BURST:-5}
- LOGIN_LIMIT_ACCOUNT_PER_SECOND=${LOGIN_LIMIT_ACCOUNT_PER_SECOND:-0.003}
- LOGIN_LIMIT_ACCOUNT_BURST=${LOGIN_LIMIT_ACCOUNT_BURST:-5}
- ROOM_COMPLEXITY_LIMIT=${ROOM_COMPLEXITY_LIMIT:-100.0}
- WEB_CLIENT_LOCATION
networks:
- internal
entrypoint: /docker-entrypoint.sh
configs:
- source: homeserver_yaml
target: /data/homeserver.yaml
- source: log_config
target: /data/log.config
- source: entrypoint_conf
target: /docker-entrypoint.sh
mode: 0555
entrypoint: /docker-entrypoint.sh
deploy:
restart_policy:
condition: on-failure
delay: "60s"
max_attempts: 3
window: 120s
labels:
- "traefik.enable=true"
- "traefik.http.services.${STACK_NAME}.loadbalancer.server.port=8008"
- "traefik.http.routers.${STACK_NAME}.rule=Host(`${DOMAIN}`${EXTRA_DOMAINS})"
- "traefik.http.routers.${STACK_NAME}.tls.certresolver=${LETS_ENCRYPT_ENV}"
- "traefik.http.routers.${STACK_NAME}.entrypoints=web-secure"
- "traefik.http.routers.${STACK_NAME}.middlewares=${STACK_NAME}-redirect"
- "traefik.http.middlewares.${STACK_NAME}-redirect.headers.SSLForceHost=true"
- "traefik.http.middlewares.${STACK_NAME}-redirect.headers.SSLHost=${DOMAIN}"
- "coop-cloud.${STACK_NAME}.version=7.3.1+v1.157.1"
- "coop-cloud.${STACK_NAME}.timeout=${TIMEOUT}"
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8008/health"]
interval: 30s
timeout: 10s
retries: 30
start_period: 1m
db:
image: pgautoupgrade/pgautoupgrade:18-alpine
secrets:
- db_password
environment:
# postgres:18 relocated the default PGDATA to /var/lib/postgresql/18/docker.
# Pin it to the legacy path so pgautoupgrade finds the existing cluster on the
# mounted volume and upgrades it in place, instead of init'ing an empty one.
- PGDATA=/var/lib/postgresql/data
- LC_COLLATE=C
- LC_CTYPE=C
- POSTGRES_DB=synapse
- POSTGRES_INITDB_ARGS=-E UTF8
- POSTGRES_PASSWORD_FILE=/run/secrets/db_password
- POSTGRES_USER=synapse
- DOMAIN
networks:
- internal
healthcheck:
interval: 30s
timeout: 10s
retries: 20
start_period: 1m
volumes:
- postgres:/var/lib/postgresql/data
deploy:
labels:
backupbot.backup: "${ENABLE_BACKUPS:-true}"
backupbot.backup.pre-hook: "/pg_backup.sh backup"
backupbot.backup.volumes.postgres.path: "backup.sql"
backupbot.restore.post-hook: "/pg_backup.sh restore"
configs:
- source: pg_backup
target: /pg_backup.sh
mode: 0555
volumes:
synapse:
data:
postgres:
networks:
proxy:
external: true
internal:
configs:
entrypoint_conf:
name: ${STACK_NAME}_entrypoint_${ENTRYPOINT_CONF_VERSION}
file: entrypoint.sh.tmpl
template_driver: golang
homeserver_yaml:
name: ${STACK_NAME}_homeserver_yaml_${HOMESERVER_YAML_VERSION}
file: homeserver.yaml.tmpl
template_driver: golang
log_config:
name: ${STACK_NAME}_log_config_${LOG_CONFIG_VERSION}
file: log.config.tmpl
template_driver: golang
nginx_config:
name: ${STACK_NAME}_nginx_config_${NGINX_CONFIG_VERSION}
file: nginx.conf.tmpl
template_driver: golang
wk_server:
name: ${STACK_NAME}_wk_server_${WK_SERVER_VERSION}
file: well_known_server.conf.tmpl
template_driver: golang
wk_client:
name: ${STACK_NAME}_wk_client_${WK_CLIENT_VERSION}
file: well_known_client.conf.tmpl
template_driver: golang
pg_backup:
name: ${STACK_NAME}_pg_backup_${PG_BACKUP_VERSION}
file: pg_backup.sh
secrets:
db_password:
external: true
name: ${STACK_NAME}_db_password_${SECRET_DB_PASSWORD_VERSION}
registration:
external: true
name: ${STACK_NAME}_registration_${SECRET_REGISTRATION_VERSION}
macaroon:
external: true
name: ${STACK_NAME}_macaroon_${SECRET_MACAROON_VERSION}
form_secret:
external: true
name: ${STACK_NAME}_form_secret_${SECRET_FORM_SECRET_VERSION}
+46
View File
@@ -0,0 +1,46 @@
#!/bin/sh
set -e
BINARY="/build/synapse_auto_compressor"
REPO_DIR="/build/rust-synapse-compress-state"
DB_PASS=$(cat /run/secrets/db_password)
CONN="postgresql://synapse:${DB_PASS}@db:5432/synapse"
CHUNK_SIZE="${STATE_COMPRESS_CHUNK_SIZE:-500}"
CHUNKS="${STATE_COMPRESS_CHUNKS:-100}"
SCHEDULE="${STATE_COMPRESS_SCHEDULE:-0 3 * * *}"
# Build from source if binary doesn't exist
if [ ! -f "$BINARY" ]; then
echo "[compress-state] Binary not found, building from source..."
apk add --no-cache git openssl-dev openssl-libs-static perl make musl-dev jemalloc-dev
rm -rf "$REPO_DIR"
git clone https://github.com/matrix-org/rust-synapse-compress-state "$REPO_DIR"
cd "$REPO_DIR"
cargo build --release -p synapse_auto_compressor
cp target/release/synapse_auto_compressor "$BINARY"
echo "[compress-state] Build complete"
# Clean up source to save space
rm -rf "$REPO_DIR"
else
echo "[compress-state] Using cached binary"
fi
# Run once at startup
echo "[compress-state] Running initial compression at $(date)"
"$BINARY" -p "$CONN" -c "$CHUNK_SIZE" -n "$CHUNKS" || echo "[compress-state] Error: $?"
# Set up cron job
CRON_SCRIPT="/build/run_compressor.sh"
cat > "$CRON_SCRIPT" <<EOF
#!/bin/sh
echo "[compress-state] Running at \$(date)"
$BINARY -p "$CONN" -c $CHUNK_SIZE -n $CHUNKS || echo "[compress-state] Error: \$?"
echo "[compress-state] Done at \$(date)"
EOF
chmod +x "$CRON_SCRIPT"
echo "$SCHEDULE $CRON_SCRIPT" | crontab -
echo "[compress-state] Cron scheduled: $SCHEDULE"
# Run crond in the foreground
exec crond -f -l 2
+123
View File
@@ -0,0 +1,123 @@
bridge:
# Domain part of the bridge, e.g. matrix.org
domain: "{{ env "HOMESERVER_DOMAIN" }}"
# This should be your publicly-facing URL because Discord may use it to
# fetch media from the media store.
homeserverUrl: "{{ env "HOMESERVER_URL" }}"
# The TCP port on which the appservice runs on.
port: 9005
# Interval at which to process users in the 'presence queue'. If you have
# 5 users, one user will be processed every 500 milliseconds according to the
# value below. This has a minimum value of 250.
# WARNING: This has a high chance of spamming the homeserver with presence
# updates since it will send one each time somebody changes state or is online.
presenceInterval: 500
# Disable setting presence for 'ghost users' which means Discord users on Matrix
# will not be shown as away or online.
disablePresence: false
# Disable sending typing notifications when somebody on Discord types.
disableTypingNotifications: false
# Disable deleting messages on Discord if a message is redacted on Matrix.
disableDeletionForwarding: false
# Disable portal bridging, where Matrix users can search for unbridged Discord
# rooms on their Matrix server.
disablePortalBridging: false
# Enable users to bridge rooms using !discord commands. See
# https://t2bot.io/discord for instructions.
enableSelfServiceBridging: true
# Disable sending of read receipts for Matrix events which have been
# successfully bridged to Discord.
disableReadReceipts: false
# Disable Join Leave echos from matrix
disableJoinLeaveNotifications: false
# Disable Invite echos from matrix
disableInviteNotifications: false
# Auto-determine the language of code blocks (this can be CPU-intensive)
determineCodeLanguage: false
# MXID of an admin user that will be PMd if the bridge experiences problems. Optional
adminMxid: '{{ env "DISCORD_BRIDGE_ADMIN" }}'
# The message to send to the bridge admin if the Discord token is not valid
invalidTokenMessage: 'Your Discord bot token seems to be invalid, and the bridge cannot function. Please update it in your bridge settings and restart the bridge'
# Authentication configuration for the discord bot.
auth:
# This MUST be a string (wrapped in quotes)
clientID: "{{ env "DISCORD_CLIENT_ID" }}"
botToken: "{{ secret "discord_bot_token" }}"
# You must enable "Privileged Gateway Intents" in your bot settings on discord.com (e.g. https://discord.com/developers/applications/12345/bot)
# for this to work
usePrivilegedIntents: false
logging:
# What level should the logger output to the console at.
console: "error" #silly, verbose, info, http, warn, error, silent
lineDateFormat: "MMM-D HH:mm:ss.SSS" # This is in moment.js format
files:
- file: "debug.log"
disable:
- "PresenceHandler" # Will not capture presence logging
- file: "warn.log" # Will capture warnings
level: "warn"
- file: "botlogs.log" # Will capture logs from DiscordBot
level: "info"
enable:
- "DiscordBot"
database:
# You may either use SQLite or Postgresql for the bridge database, which contains
# important mappings for events and user puppeting configurations.
# Use the filename option for SQLite, or connString for Postgresql.
# If you are migrating, see https://github.com/Half-Shot/matrix-appservice-discord/blob/master/docs/howto.md#migrate-to-postgres-from-sqlite
# WARNING: You will almost certainly be fine with sqlite unless your bridge
# is in heavy demand and you suffer from IO slowness.
connString: "postgres://discordbridge:{{ secret "discord_db_password" }}@discorddb/discordbridge"
room:
# Set the default visibility of alias rooms, defaults to "public".
# One of: "public", "private"
defaultVisibility: "public"
channel:
# Pattern of the name given to bridged rooms.
# Can use :guild for the guild name and :name for the channel name.
namePattern: "[Discord] :guild :name"
# Changes made to rooms when a channel is deleted.
deleteOptions:
# Prefix the room name with a string.
#namePrefix: "[Deleted]"
# Prefix the room topic with a string.
#topicPrefix: "This room has been deleted"
# Disable people from talking in the room by raising the event PL to 50
disableMessaging: false
# Remove the discord alias from the room.
unsetRoomAlias: true
# Remove the room from the directory.
unlistFromDirectory: true
# Set the room to be unavailable for joining without an invite.
setInviteOnly: true
# Make all the discord users leave the room.
ghostsLeave: true
limits:
# Delay in milliseconds between discord users joining a room.
roomGhostJoinDelay: 6000
# Lock timeout in milliseconds before sending messages to discord to avoid
# echos. Default is rather high as the lock will most likely time out
# before anyways.
# echos = (Copies of a sent message may arrive from discord before we've
# fininished handling it, causing us to echo it back to the room)
discordSendDelay: 1500
# Set a maximum of rooms to be bridged.
# roomCount: 20
ghosts:
# Pattern for the ghosts nick, available is :nick, :username, :tag and :id
nickPattern: ":nick"
# Pattern for the ghosts username, available is :username, :tag and :id
usernamePattern: ":username#:tag"
# Prometheus-compatible metrics endpoint
metrics:
enable: false
port: 9001
host: "127.0.0.1"
+9 -11
View File
@@ -1,18 +1,16 @@
#!/bin/bash
if [[ ! -f /data/homeserver.yaml ]]; then
/start.py generate
# https://github.com/matrix-org/synapse/tree/develop/docker#running-synapse
# default user permissions for the synapse user
chown 991:991 /data
apt update && apt install -y wget
wget https://github.com/mikefarah/yq/releases/download/3.3.2/yq_linux_amd64 && \
chmod +x yq_linux_amd64 && \
mv yq_linux_amd64 /bin/yq
if [[ ! -f /data/{{ env "DOMAIN" }}.signing.key ]]; then
/start.py generate
chown -R 991:991 /data/*.config /data/*.key
fi
# turn (https://github.com/matrix-org/synapse/blob/master/docs/turn-howto.md#synapse-setup)
yq w -i /data/homeserver.yaml turn_uris "[]"
yq w -i /data/homeserver.yaml turn_uris\[0\] "turn:${TURN_SERVER}:${TURN_PORT}?transport=udp"
yq w -i /data/homeserver.yaml turn_uris\[1\] "turn:${TURN_SERVER}:${TURN_PORT}?transport=tcp"
yq w -i /data/homeserver.yaml coturn_shared_secret "$(tr -d \"\n\" < /run/secrets/coturn_shared_secret)"
if [[ -d /signal-data ]]; then
chown -R 991:991 /signal-data
fi
/start.py
-6
View File
@@ -1,6 +0,0 @@
secret="screw\$naval5seem!herb" && \
time=$(date +%s) && \
expiry=8400 && \
username=$(( $time + $expiry )) &&\
echo username:$username && \
echo password : $(echo -n $username | openssl dgst -binary -sha1 -hmac $secret | openssl base64)
+390
View File
@@ -0,0 +1,390 @@
# All configuration options are documented on the following link:
# https://matrix-org.github.io/synapse/latest/usage/configuration/config_documentation.html
{{ if eq (env "SHARED_SECRET_AUTH_ENABLED") "1" }}
# https://matrix-org.github.io/synapse/latest/usage/configuration/config_documentation.html#modules-1
modules:
- module: shared_secret_authenticator.SharedSecretAuthProvider
config:
shared_secret: {{ secret "shared_secret_auth" }}
m_login_password_support_enabled: true
{{ end }}
# https://matrix-org.github.io/synapse/latest/usage/configuration/config_documentation.html#server_name
server_name: {{ or (env "SERVER_NAME") (env "DOMAIN") }}
# https://matrix-org.github.io/synapse/latest/usage/configuration/config_documentation.html#public_baseurl
public_baseurl: https://{{ env "DOMAIN" }}/
# https://element-hq.github.io/synapse/latest/usage/configuration/config_documentation.html#require_auth_for_profile_requests
{{ if (env "REQUIRE_AUTH_FOR_PROFILE_REQUESTS") }}
require_auth_for_profile_requests: {{ env "REQUIRE_AUTH_FOR_PROFILE_REQUESTS" }}
{{ end }}
# https://element-hq.github.io/synapse/latest/usage/configuration/config_documentation.html#limit_profile_requests_to_users_who_share_rooms
{{ if (env "LIMIT_PROFILE_REQUESTS_TO_USERS_WHO_SHARE_ROOMS") }}
limit_profile_requests_to_users_who_share_rooms: {{ env "LIMIT_PROFILE_REQUESTS_TO_USERS_WHO_SHARE_ROOMS" }}
{{ end }}
# https://matrix-org.github.io/synapse/latest/usage/configuration/config_documentation.html#serve_server_wellknown
{{ if (env "SERVE_SERVER_WELLKNOWN") }}
serve_server_wellknown: {{ env "SERVE_SERVER_WELLKNOWN" }}
{{ end }}
# https://matrix-org.github.io/synapse/latest/usage/configuration/config_documentation.html#allow_public_rooms_without_auth
allow_public_rooms_without_auth: false
# https://matrix-org.github.io/synapse/latest/usage/configuration/config_documentation.html#allow_public_rooms_over_federation
{{ if (env "ALLOW_PUBLIC_ROOMS_FEDERATION") }}
allow_public_rooms_over_federation: {{ env "ALLOW_PUBLIC_ROOMS_FEDERATION" }}
{{ end }}
# https://matrix-org.github.io/synapse/latest/usage/configuration/config_documentation.html#listeners
listeners:
- port: 8008
tls: false
type: http
x_forwarded: true
{{ if eq (env "DISABLE_FEDERATION") "1" }}
resources:
{{ if eq (env "KEYCLOAK_ENABLED") "1" }}
- names: [client, openid]
compress: true
{{ else }}
- names: [client]
compress: true
{{ end }}
{{ else }}
resources:
{{ if eq (env "KEYCLOAK_ENABLED") "1" }}
- names: [client, openid, federation]
compress: true
{{ else }}
- names: [client, federation]
compress: true
{{ end }}
{{ end }}
# https://element-hq.github.io/synapse/latest/usage/configuration/config_documentation.html#delete_stale_devices_after
{{ if (env "DELETE_STALE_DEVICES_AFTER") }}
delete_stale_devices_after: {{ env "DELETE_STALE_DEVICES_AFTER" }}
{{ end }}
# https://matrix-org.github.io/synapse/latest/usage/configuration/config_documentation.html#admin_contact
{{ if (env "ADMIN_EMAIL") }}
admin_contact: 'mailto:{{ env "ADMIN_EMAIL" }}'
{{ end }}
# https://matrix-org.github.io/synapse/latest/usage/configuration/config_documentation.html#limit_remote_rooms
limit_remote_rooms:
enabled: true
complexity: {{ env "ROOM_COMPLEXITY_LIMIT" }}
# https://matrix-org.github.io/synapse/latest/usage/configuration/config_documentation.html#max_avatar_size
max_avatar_size: 10M
# https://matrix-org.github.io/synapse/latest/usage/configuration/config_documentation.html#forgotten_room_retention_period
forgotten_room_retention_period: 3d
# https://matrix-org.github.io/synapse/latest/usage/configuration/config_documentation.html#request_token_inhibit_3pid_errors
request_token_inhibit_3pid_errors: true
# https://matrix-org.github.io/synapse/latest/usage/configuration/config_documentation.html#redaction_retention_period
{{ if (env "REDACTION_RETENTION_PERIOD") }}
redaction_retention_period: {{ env "REDACTION_RETENTION_PERIOD" }}
{{ end }}
# https://matrix-org.github.io/synapse/latest/usage/configuration/config_documentation.html#user_ips_max_age
{{ if (env "USER_IPS_MAX_AGE") }}
user_ips_max_age: {{ env "USER_IPS_MAX_AGE" }}
{{ end }}
# https://matrix-org.github.io/synapse/latest/usage/configuration/config_documentation.html#retention
retention:
enabled: true
default_policy:
min_lifetime: 1d
{{ if (env "RETENTION_MAX_LIFETIME") }}
max_lifetime: {{ env "RETENTION_MAX_LIFETIME" }}
{{ end }}
allowed_lifetime_min: 1d
{{ if (env "ALLOWED_LIFETIME_MAX") }}
allowed_lifetime_max: {{ env "ALLOWED_LIFETIME_MAX" }}
{{ end }}
purge_jobs:
- longest_max_lifetime: 3d
interval: 12h
- shortest_max_lifetime: 3d
interval: 1d
# https://matrix-org.github.io/synapse/latest/usage/configuration/config_documentation.html#federation_domain_whitelist
{{ if eq (env "DISABLE_FEDERATION") "1" }}
federation_domain_whitelist: []
{{ else if eq (env "ENABLE_ALLOWLIST") "1" }}
federation_domain_whitelist: {{ env "FEDERATION_ALLOWLIST" }}
{{ end }}
# https://matrix-org.github.io/synapse/latest/usage/configuration/config_documentation.html#database-1
database:
name: psycopg2
txn_limit: 10000
args:
user: synapse
password: "{{ secret "db_password" }}"
database: synapse
host: "{{ env "STACK_NAME" }}_db"
port: 5432
cp_min: 5
cp_max: 10
keepalives_idle: 10
keepalives_interval: 10
keepalives_count: 3
# https://matrix-org.github.io/synapse/latest/usage/configuration/config_documentation.html#log_config
log_config: "/data/log.config"
# https://matrix-org.github.io/synapse/latest/usage/configuration/config_documentation.html#media_store_path
media_store_path: "/data/media_store"
# https://matrix-org.github.io/synapse/latest/usage/configuration/config_documentation.html#max_upload_size
max_upload_size: 50M
# https://matrix-org.github.io/synapse/latest/usage/configuration/config_documentation.html#turn
{{ if eq (env "TURN_ENABLED") "1" }}
{{ if (env "TURN_URIS") }}
turn_uris: {{ env "TURN_URIS" }}
{{ end }}
turn_shared_secret: "{{ secret "turn_shared_secret" }}"
turn_user_lifetime: 1h
{{ if (env "TURN_ALLOW_GUESTS") }}
turn_allow_guests: {{ env "TURN_ALLOW_GUESTS" }}
{{ end }}
{{ end }}
# https://matrix-org.github.io/synapse/latest/usage/configuration/config_documentation.html#enable_registration
{{ if (env "ENABLE_REGISTRATION") }}
enable_registration: {{ env "ENABLE_REGISTRATION" }}
{{ end }}
# https://element-hq.github.io/synapse/latest/usage/configuration/config_documentation.html#registration_requires_token
{{ if (env "REGISTRATION_REQUIRES_TOKEN") }}
registration_requires_token: {{ env "REGISTRATION_REQUIRES_TOKEN" }}
{{ end }}
# https://matrix-org.github.io/synapse/latest/usage/configuration/config_documentation.html#enable_3pid_lookup
{{ if (env "ENABLE_3PID_LOOKUP") }}
enable_3pid_lookup: {{ env "ENABLE_3PID_LOOKUP" }}
{{ end }}
# https://matrix-org.github.io/synapse/latest/usage/configuration/config_documentation.html#allow_guest_access
allow_guest_access: false
# https://matrix-org.github.io/synapse/latest/usage/configuration/config_documentation.html#registration_shared_secret
registration_shared_secret: {{ secret "registration" }}
{{ if eq (env "AUTO_JOIN_ROOM_ENABLED") "1" }}
# https://matrix-org.github.io/synapse/latest/usage/configuration/config_documentation.html#auto_join_rooms
# AUTO_JOIN_ROOM only for backwards compatibility
{{ if (env "AUTO_JOIN_ROOM") }}
auto_join_rooms:
- "{{ env "AUTO_JOIN_ROOM" }}"
{{ else }}
auto_join_rooms: {{ env "AUTO_JOIN_ROOM_LIST" }}
{{ end }}
{{ end }}
# https://element-hq.github.io/synapse/latest/usage/configuration/config_documentation.html#session_lifetime
{{ if (env "SESSION_LIFETIME") }}
session_lifetime: {{ env "SESSION_LIFETIME" }}
{{ end }}
# https://matrix-org.github.io/synapse/latest/usage/configuration/config_documentation.html#report_stats
report_stats: false
# https://element-hq.github.io/synapse/latest/usage/configuration/config_documentation.html#track_puppeted_user_ips
{{ if (env "TRACK_PUPPETED_USER_IPS") }}
track_puppeted_user_ips: {{ env "TRACK_PUPPETED_USER_IPS" }}
{{ end }}
{{ if eq (env "APP_SERVICES_ENABLED") "1" }}
# https://matrix-org.github.io/synapse/latest/usage/configuration/config_documentation.html#app_service_config_files
app_service_config_files: {{ env "APP_SERVICE_CONFIGS" }}
{{ end }}
# https://matrix-org.github.io/synapse/latest/usage/configuration/config_documentation.html#macaroon_secret_key
macaroon_secret_key: "{{ secret "macaroon" }}"
# https://matrix-org.github.io/synapse/latest/usage/configuration/config_documentation.html#form_secret
form_secret: "{{ secret "form_secret" }}"
# https://matrix-org.github.io/synapse/latest/usage/configuration/config_documentation.html#signing_key_path
signing_key_path: "/data/{{ env "DOMAIN" }}.signing.key"
# https://matrix-org.github.io/synapse/latest/usage/configuration/config_documentation.html#old_signing_keys
{{ if (and (env "OLD_SIGNING_KEY_ID") (env "OLD_SIGNING_KEY") (env "OLD_SIGNING_KEY_EXPIRES")) }}
old_signing_keys:
"ed25519:{{ env "OLD_SIGNING_KEY_ID" }}": { key: "{{ env "OLD_SIGNING_KEY" }}", expired_ts: {{ env "OLD_SIGNING_KEY_EXPIRES" }} }
{{ end }}
# https://matrix-org.github.io/synapse/latest/usage/configuration/config_documentation.html#trusted_key_servers
{{ if eq (env "ENABLE_ALLOWLIST") "1" }}
trusted_key_servers: [] # NOTE(d1): defaults to requesting server directly, which matches FEDERATION_ALLOWLIST
{{ else }}
trusted_key_servers:
- server_name: "matrix.org"
{{ end }}
# https://matrix-org.github.io/synapse/latest/usage/configuration/config_documentation.html#oidc_providers
{{ if eq (env "KEYCLOAK_ENABLED") "1" }}
oidc_providers:
- idp_id: {{ env "KEYCLOAK_ID" }}
idp_name: {{ env "KEYCLOAK_NAME" }}
issuer: "{{ env "KEYCLOAK_URL" }}"
client_id: "{{ env "KEYCLOAK_CLIENT_ID" }}"
client_secret: "{{ secret "keycloak_client_secret" }}"
scopes: ["openid", "profile"]
{{ if (env "KEYCLOAK_ALLOW_EXISTING_USERS") }}
allow_existing_users: {{ env "KEYCLOAK_ALLOW_EXISTING_USERS" }}
{{ end }}
user_mapping_provider:
config:
localpart_template: "{{ "{{ user.preferred_username }}" }}"
display_name_template: "{{ "{{ user.name }}" }}"
{{ if eq (env "KEYCLOAK2_ENABLED") "1" }}
- idp_id: {{ env "KEYCLOAK2_ID" }}
idp_name: {{ env "KEYCLOAK2_NAME" }}
issuer: "{{ env "KEYCLOAK2_URL" }}"
client_id: "{{ env "KEYCLOAK2_CLIENT_ID" }}"
client_secret: "{{ secret "keycloak2_client_secret" }}"
scopes: ["openid", "profile"]
{{ if (env "KEYCLOAK2_ALLOW_EXISTING_USERS") }}
allow_existing_users: {{ env "KEYCLOAK2_ALLOW_EXISTING_USERS" }}
{{ end }}
user_mapping_provider:
config:
localpart_template: "{{ "{{ user.preferred_username }}" }}"
display_name_template: "{{ "{{ user.name }}" }}"
{{ end }}
{{ if eq (env "KEYCLOAK3_ENABLED") "1" }}
- idp_id: {{ env "KEYCLOAK3_ID" }}
idp_name: {{ env "KEYCLOAK3_NAME" }}
issuer: "{{ env "KEYCLOAK3_URL" }}"
client_id: "{{ env "KEYCLOAK3_CLIENT_ID" }}"
client_secret: "{{ secret "keycloak3_client_secret" }}"
scopes: ["openid", "profile"]
{{ if (env "KEYCLOAK3_ALLOW_EXISTING_USERS") }}
allow_existing_users: {{ env "KEYCLOAK3_ALLOW_EXISTING_USERS" }}
{{ end }}
user_mapping_provider:
config:
localpart_template: "{{ "{{ user.preferred_username }}" }}"
display_name_template: "{{ "{{ user.name }}" }}"
{{ end }}
{{ end }}
# https://matrix-org.github.io/synapse/latest/usage/configuration/config_documentation.html#sso
{{ if eq (env "KEYCLOAK_ENABLED") "1" }}
sso:
client_whitelist:
- https://{{ env "KEYCLOAK_CLIENT_DOMAIN" }}
{{ end }}
# https://matrix-org.github.io/synapse/latest/usage/configuration/config_documentation.html#password_config
# With MAS (matrix_authentication_service), Synapse rejects password_config.enabled: true — set PASSWORD_LOGIN_ENABLED=false in app .env when MAS_ENABLED=1 (.env.sample).
{{ if (env "PASSWORD_LOGIN_ENABLED") }}
password_config:
enabled: {{ env "PASSWORD_LOGIN_ENABLED" }}
{{ end }}
{{ if eq (env "MAS_ENABLED") "1" }}
# https://element-hq.github.io/synapse/latest/usage/configuration/config_documentation.html#matrix_authentication_service
matrix_authentication_service:
enabled: true
endpoint: http://{{ env "STACK_NAME"}}_mas:8080/
secret_path: /run/secrets/mas_synapse_shared
{{ end }}
# https://matrix-org.github.io/synapse/latest/usage/configuration/config_documentation.html#email
{{ if eq (env "SMTP_ENABLED") "1" }}
email:
smtp_host: {{ env "SMTP_HOST" }}
smtp_port: {{ env "SMTP_PORT" }}
smtp_user: {{ env "SMTP_USER" }}
smtp_pass: "{{ secret "smtp_password" }}"
require_transport_security: true
notif_from: Your Friendly %(app)s homeserver <{{ env "SMTP_FROM" }}>
app_name: {{ env "SMTP_APP_NAME" }}
enable_notifs: true
client_base_url: https://{{ env "DOMAIN" }}
{{ end }}
# https://matrix-org.github.io/synapse/latest/usage/configuration/config_documentation.html#encryption_enabled_by_default_for_room_type
{{ if (env "ENCRYPTED_BY_DEFAULT") }}
encryption_enabled_by_default_for_room_type: {{ env "ENCRYPTED_BY_DEFAULT" }}
{{ end }}
# https://matrix-org.github.io/synapse/latest/usage/configuration/config_documentation.html#user_directory
{{ if or (env "USER_DIRECTORY_ENABLED") (env "USER_DIRECTORY_SEARCH_ALL_USERS") (env "USER_DIRECTORY_PREFER_LOCAL_USERS") (env "USER_DIRECTORY_SHOW_LOCKED_USERS") }}
user_directory:
{{ if (env "USER_DIRECTORY_ENABLED") }}
enabled: {{ env "USER_DIRECTORY_ENABLED" }}
{{ end }}
{{ if (env "USER_DIRECTORY_SEARCH_ALL_USERS") }}
search_all_users: {{ env "USER_DIRECTORY_SEARCH_ALL_USERS" }}
{{ end }}
{{ if (env "USER_DIRECTORY_PREFER_LOCAL_USERS") }}
prefer_local_users: {{ env "USER_DIRECTORY_PREFER_LOCAL_USERS" }}
{{ end }}
{{ if (env "USER_DIRECTORY_SHOW_LOCKED_USERS") }}
show_locked_users: {{ env "USER_DIRECTORY_SHOW_LOCKED_USERS" }}
{{ end }}
{{ end }}
# https://matrix-org.github.io/synapse/latest/usage/configuration/config_documentation.html#media_retention
{{ if or (env "MEDIA_RETENTION_LOCAL_LIFETIME") (env "MEDIA_RETENTION_REMOTE_LIFETIME") }}
media_retention:
{{ if (env "MEDIA_RETENTION_LOCAL_LIFETIME") }}
local_media_lifetime: {{ env "MEDIA_RETENTION_LOCAL_LIFETIME" }}
{{ end }}
{{ if (env "MEDIA_RETENTION_REMOTE_LIFETIME") }}
remote_media_lifetime: {{ env "MEDIA_RETENTION_REMOTE_LIFETIME" }}
{{ end }}
{{ end }}
# https://matrix-org.github.io/synapse/latest/usage/configuration/config_documentation.html#enable_metrics
enable_metrics: false
# https://matrix-org.github.io/synapse/latest/usage/configuration/config_documentation.html#track_appservice_user_ips
track_appservice_user_ips: false
# https://matrix-org.github.io/synapse/latest/usage/configuration/config_documentation.html#forget_rooms_on_leave
forget_rooms_on_leave: true
# https://matrix-org.github.io/synapse/latest/usage/configuration/config_documentation.html#opentracing-1
opentracing:
enabled: false
# https://matrix-org.github.io/synapse/develop/usage/configuration/config_documentation.html#ratelimiting
{{ if or (and (env "LOGIN_LIMIT_IP_PER_SECOND") (env "LOGIN_LIMIT_IP_BURST")) (and (env "LOGIN_LIMIT_ACCOUNT_PER_SECOND") (env "LOGIN_LIMIT_ACCOUNT_BURST")) }}
rc_login:
{{ if and (env "LOGIN_LIMIT_IP_PER_SECOND") (env "LOGIN_LIMIT_IP_BURST") }}
address:
per_second: {{ env "LOGIN_LIMIT_IP_PER_SECOND" }}
burst_count: {{ env "LOGIN_LIMIT_IP_BURST" }}
{{ end }}
{{ if and (env "LOGIN_LIMIT_ACCOUNT_PER_SECOND") (env "LOGIN_LIMIT_ACCOUNT_BURST") }}
account:
per_second: {{ env "LOGIN_LIMIT_ACCOUNT_PER_SECOND" }}
burst_count: {{ env "LOGIN_LIMIT_ACCOUNT_BURST" }}
{{ end }}
{{ end }}
# https://matrix-org.github.io/synapse/latest/usage/configuration/config_documentation.html#web_client_location
{{ if (env "WEB_CLIENT_LOCATION") }}
web_client_location: {{ env "WEB_CLIENT_LOCATION" }}
{{ end }}
+20
View File
@@ -0,0 +1,20 @@
version: 1
formatters:
precise:
format: '%(asctime)s - %(name)s - %(lineno)d - %(levelname)s - %(request)s - %(message)s'
handlers:
console:
class: logging.StreamHandler
formatter: precise
loggers:
synapse.storage.SQL:
level: {{ env "SQL_LOG_LEVEL" }}
root:
level: {{ env "ROOT_LOG_LEVEL" }}
handlers: [console]
disable_existing_loggers: false
+73
View File
@@ -0,0 +1,73 @@
# Docs: https://element-hq.github.io/matrix-authentication-service/
http:
public_base: https://{{ env "DOMAIN" }}/
trusted_proxies:
- 10.0.0.0/8
- 172.16.0.0/12
- 192.168.0.0/16
- 127.0.0.0/8
- fd00::/8
- ::1/128
listeners:
- name: web
resources:
- name: discovery
- name: human
- name: oauth
- name: compat
- name: graphql
playground: false
- name: assets
# https://element-hq.github.io/matrix-authentication-service/reference/configuration.html#httplisteners
- name: health
binds:
- address: "[::]:8080"
database:
uri: postgresql://synapse:{{ secret "db_password" }}@{{ env "STACK_NAME" }}_db:5432/mas?sslmode=disable
matrix:
kind: synapse
homeserver: {{ or (env "SERVER_NAME") (env "DOMAIN") }}
endpoint: http://{{ env "STACK_NAME" }}_app:8008/
secret_file: /run/secrets/mas_synapse_shared
secrets:
# Plain hex in file (abra: length=64 charset=hex). See .env.sample modifiers.
encryption_file: /run/secrets/mas_encryption
keys:
- key_file: /run/secrets/mas_signing_rsa
passwords:
enabled: true
schemes:
- version: 1
algorithm: bcrypt
unicode_normalization: true
- version: 2
algorithm: argon2id
{{ if env "MAS_UPSTREAM_PROVIDER_ID" }}
# https://element-hq.github.io/matrix-authentication-service/setup/sso.html
upstream_oauth2:
providers:
- id: {{ env "MAS_UPSTREAM_PROVIDER_ID" }}
{{ if env "MAS_UPSTREAM_SYNAPSE_IDP_ID" }}synapse_idp_id: {{ env "MAS_UPSTREAM_SYNAPSE_IDP_ID" }}{{ end }}
human_name: {{ or (env "MAS_UPSTREAM_HUMAN_NAME") "SSO" }}
issuer: {{ env "MAS_UPSTREAM_ISSUER" }}
client_id: {{ env "MAS_UPSTREAM_CLIENT_ID" }}
client_secret_file: /run/secrets/mas_upstream_client
token_endpoint_auth_method: client_secret_basic
scope: "openid profile email"
claims_imports:
localpart:
action: require
template: "{{ "{{ user.preferred_username }}" }}"
displayname:
action: suggest
template: "{{ "{{ user.name }}" }}"
email:
action: suggest
template: "{{ "{{ user.email }}" }}"
{{ end }}
+96
View File
@@ -0,0 +1,96 @@
user www-data;
events {
worker_connections 768;
}
http {
resolver 127.0.0.11 valid=30s ipv6=off;
resolver_timeout 5s;
upstream matrix_upstream {
zone matrix_upstream 64k;
server {{ env "STACK_NAME"}}_app:8008 resolve;
keepalive 16;
}
{{ if eq (env "MAS_ENABLED") "1" }}
upstream mas_upstream {
zone mas_upstream 64k;
server {{ env "STACK_NAME"}}_mas:8080 resolve;
keepalive 8;
}
{{ end }}
server {
listen 80;
access_log {{ or (env "NGINX_ACCESS_LOG_LOCATION") "/dev/null" }};
error_log {{ or (env "NGINX_ERROR_LOG_LOCATION") "/dev/null" }};
server_name {{ env "DOMAIN" }};
location = / {
proxy_pass http://matrix_upstream;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Forwarded-Proto https;
proxy_set_header Host $host;
client_max_body_size 50M;
proxy_http_version 1.1;
}
{{ if eq (env "MAS_ENABLED") "1" }}
# MAS on same Host as Synapse (public_base = https://$DOMAIN/): browser/OIDC paths live at repo root, not only under /_matrix/
# Router reference: element-hq/matrix-authentication-service crates/router/src/endpoints.rs
# https://element-hq.github.io/matrix-authentication-service/setup/reverse-proxy.html
location ~ ^/(complete-compat-sso/|oauth2/|\.well-known/(openid-configuration|webfinger|change-password)|authorize|login|logout|register(/|$)|account/|upstream/|consent/|link(\?|/|$)|device/|recover(/|$)|assets/|graphql(/|$)|api/) {
proxy_pass http://mas_upstream;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto https;
client_max_body_size 50M;
}
# Matrix CS API compat (login / logout / refresh and subpaths, e.g. …/login/sso/redirect) — before generic /_matrix
location ~ ^/_matrix/client/[^/]+/(login|logout|refresh)(/.*)?$ {
proxy_pass http://mas_upstream;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto https;
client_max_body_size 50M;
}
{{ end }}
location ~* ^(\/_matrix|\/_synapse\/client|\/_synapse\/mas) {
proxy_pass http://matrix_upstream;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Forwarded-Proto https;
proxy_set_header Host $host;
client_max_body_size 50M;
proxy_http_version 1.1;
}
location /.well-known/matrix/ {
root /var/www/;
default_type application/json;
add_header Access-Control-Allow-Origin *;
}
{{ if eq (env "ADMIN_INTERFACE_ENABLED") "1" }}
location ^~ /_synapse/admin {
if ($http_referer !~ "^https://{{ env "DOMAIN" }}/admin/") {
return 403;
}
proxy_pass http://matrix_upstream;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Forwarded-Proto https;
proxy_set_header Host $host;
client_max_body_size 50M;
proxy_http_version 1.1;
}
{{ end }}
}
}
+34
View File
@@ -0,0 +1,34 @@
#!/bin/bash
set -e
BACKUP_FILE='/var/lib/postgresql/data/backup.sql'
function backup {
export PGPASSWORD=$(cat $POSTGRES_PASSWORD_FILE)
pg_dump -U ${POSTGRES_USER} ${POSTGRES_DB} | gzip > $BACKUP_FILE
}
function restore {
cd /var/lib/postgresql/data/
restore_config(){
# Restore allowed connections
cat pg_hba.conf.bak > pg_hba.conf
su postgres -c 'pg_ctl reload'
}
# Don't allow any other connections than local
cp pg_hba.conf pg_hba.conf.bak
echo "local all all trust" > pg_hba.conf
su postgres -c 'pg_ctl reload'
trap restore_config EXIT INT TERM
# Recreate Database
psql -U ${POSTGRES_USER} -d postgres -c "DROP DATABASE ${POSTGRES_DB} WITH (FORCE);"
createdb -U ${POSTGRES_USER} ${POSTGRES_DB}
gunzip -c $BACKUP_FILE | psql -U ${POSTGRES_USER} -d ${POSTGRES_DB} -1 -f -
trap - EXIT INT TERM
restore_config
}
$@
+6
View File
@@ -0,0 +1,6 @@
The deployment failed due to the app/db getting confused. I think this is just
due to the recipe not having good healthcheck config. After the app container
flapped a bit, everything came up nicely. d1 @ autonomic co-op.
Same thing happened to me when deploying this for another instance. Also d1 @
autonomic co-op.
+9
View File
@@ -0,0 +1,9 @@
This upgrade adds new env variables for homeserver.yml, please add them to your .env file:
```
ENCRYPTED_BY_DEFAULT=all
SERVE_SERVER_WELLKNOWN=false
#KEYCLOAK_ID=keycloak
#KEYCLOAK_ALLOW_EXISTING_USERS=false
```
+9
View File
@@ -0,0 +1,9 @@
If you're using the horrendous `compose.keycloak2.yml` (as creator of this
horrible hack, I am allowed to call it horrendous ;)), you will need to
re-check the new ~/.abra/recipes/matrix-synapse/.env.sample, there are some new
default env vars which you'll have to add in (e.g. KEYCLOAK2_ID=...).
You'll also need to add `KEYCLOAK_ID=keycloak` if using `compose.keycloak.yml`,
it isn't vendored any more.
@decentral1se
+17
View File
@@ -0,0 +1,17 @@
WARNING: There are a lot of config breaking changes in this one, watch out!
* KEYCLOAK2* env vars have gone away, they were experimental.
* TELEGRAM_BRIDGE_ADMIN* is replaced by TELEGRAM_BRIDGE_PERMISSIONS.
* SIGNAL_BRIDGE_ADMIN* is replaced by SIGNAL_BRIDGE_PERMISSIONS.
* The homeserver config has been trimmed, see coop-cloud/matrix-synapse#33 for more.
* Bridge logging is only ERROR level now to minimise leaking plaintext.
* It is possible to use SSO & federation env vars in combination now.
* Media retention is now configurable with #MEDIA_RETENTION_* env vars.
@decentral1se
+10
View File
@@ -0,0 +1,10 @@
We had to rename some secrets: https://git.coopcloud.tech/coop-cloud/matrix-synapse/issues/35
Copy the secrets:
* `registration_shared_secret` to `registration`
* `macaroon_secret_key` to `macaroon`
The easiest way to do this is to run `abra app run <matrix.example.com> app bash` BEFORE this upgrade, then `cat /run/secrets/registration_shared_secret`. If you haven't saved the secrets yet, and would like to, please Ctrl+C out of this upgrade and do that first.
Regeneration of these secrets should also work.
+1
View File
@@ -0,0 +1 @@
It's recommended not to upgrade / downgrade directly to this version (or other 5.y.z versions), because of service renaming which was reverted in 6.0.0+v1.100.0.
+6
View File
@@ -0,0 +1,6 @@
Logging is now disabled by default. If you want to reënable it, set these options:
```
NGINX_ACCESS_LOG_LOCATION="/dev/stdout"
NGINX_ERROR_LOG_LOCATION="/dev/stderr"
```
+1
View File
@@ -0,0 +1 @@
If you are upgrading from verison 5.y.z of this recipe, you will need to `undeploy` then `deploy`, because of a service rename which was reverted.
+1
View File
@@ -0,0 +1 @@
added env REGISTRATION_REQUIRES_TOKEN
+1
View File
@@ -0,0 +1 @@
new optional env vars for user_directory and privacy options
+1
View File
@@ -0,0 +1 @@
added env for old-signing-keys
+1
View File
@@ -0,0 +1 @@
This patch contains a critical nginx fix, to allow resolving docker internal hosts.
+1
View File
@@ -0,0 +1 @@
this patch is a reset to the state of the last known deploying version 6.8.0 so better skip 6.8.1
+2
View File
@@ -0,0 +1,2 @@
WARNING: Backup your database!
This upgrade switches the database image from postgres to pgautoupgrade and performs an in-place database upgrades from version 13 to 17.
+1
View File
@@ -0,0 +1 @@
added matrix-authentication-service as opt-in to the recipe, see readme for details
+6
View File
@@ -0,0 +1,6 @@
{
"$schema": "https://docs.renovatebot.com/renovate-schema.json",
"extends": [
"config:recommended"
]
}
+123
View File
@@ -0,0 +1,123 @@
# -*- coding: utf-8 -*-
#
# Shared Secret Authenticator module for Matrix Synapse
# Copyright (C) 2018 Slavi Pantaleev
#
# https://devture.com/
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version.
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <https://www.gnu.org/licenses/>.
#
from typing import Awaitable, Callable, Optional, Tuple
import hashlib
import hmac
import logging
import synapse
from synapse import module_api
logger = logging.getLogger(__name__)
class SharedSecretAuthProvider:
def __init__(self, config: dict, api: module_api):
for k in ('shared_secret',):
if k not in config:
raise KeyError('Required `{0}` configuration key not found'.format(k))
m_login_password_support_enabled = bool(config['m_login_password_support_enabled']) if 'm_login_password_support_enabled' in config else False
com_devture_shared_secret_auth_support_enabled = bool(config['com_devture_shared_secret_auth_support_enabled']) if 'com_devture_shared_secret_auth_support_enabled' in config else True
self.api = api
self.shared_secret = config['shared_secret']
auth_checkers: Optional[Dict[Tuple[str, Tuple], CHECK_AUTH_CALLBACK]] = {}
if com_devture_shared_secret_auth_support_enabled:
auth_checkers[("com.devture.shared_secret_auth", ("token",))] = self.check_com_devture_shared_secret_auth
if m_login_password_support_enabled:
auth_checkers[("m.login.password", ("password",))] = self.check_m_login_password
enabled_login_types = [k[0] for k in auth_checkers]
if len(enabled_login_types) == 0:
raise RuntimeError('At least one login type must be enabled')
logger.info('Enabled login types: %s', enabled_login_types)
api.register_password_auth_provider_callbacks(
auth_checkers=auth_checkers,
)
async def check_com_devture_shared_secret_auth(
self,
username: str,
login_type: str,
login_dict: "synapse.module_api.JsonDict",
) -> Optional[
Tuple[
str,
Optional[Callable[["synapse.module_api.LoginResponse"], Awaitable[None]]],
]
]:
if login_type != "com.devture.shared_secret_auth":
return None
return await self._log_in_username_with_token("com.devture.shared_secret_auth", username, login_dict.get("token"))
async def check_m_login_password(
self,
username: str,
login_type: str,
login_dict: "synapse.module_api.JsonDict",
) -> Optional[
Tuple[
str,
Optional[Callable[["synapse.module_api.LoginResponse"], Awaitable[None]]],
]
]:
if login_type != "m.login.password":
return None
return await self._log_in_username_with_token("m.login.password", username, login_dict.get("password"))
async def _log_in_username_with_token(
self,
login_type: str,
username: str,
token: str,
) -> Optional[
Tuple[
str,
Optional[Callable[["synapse.module_api.LoginResponse"], Awaitable[None]]],
]
]:
logger.info('Authenticating user `%s` with login type `%s`', username, login_type)
full_user_id = self.api.get_qualified_user_id(username)
# The password (token) is supposed to be an HMAC of the full user id, keyed with the shared secret.
given_hmac = token.encode('utf-8')
h = hmac.new(self.shared_secret.encode('utf-8'), full_user_id.encode('utf-8'), hashlib.sha512)
computed_hmac = h.hexdigest().encode('utf-8')
if not hmac.compare_digest(computed_hmac, given_hmac):
logger.info('Bad hmac value for user: %s', full_user_id)
return None
user_info = await self.api.get_userinfo_by_id(full_user_id)
if user_info is None:
logger.info('Refusing to authenticate missing user: %s', full_user_id)
return None
logger.info('Authenticated user: %s', full_user_id)
return full_user_id, None
+411
View File
@@ -0,0 +1,411 @@
# Network-specific config options
network:
# Displayname template for Signal users.
# {{ "{{.ProfileName}}" }} - The Signal profile name set by the user.
# {{ "{{.ContactName}}" }} - The name for the user from your phone's contact list. This is not safe on multi-user instances.
# {{ "{{.PhoneNumber}}" }} - The phone number of the user.
# {{ "{{.UUID}}" }} - The UUID of the Signal user.
# {{ "{{.AboutEmoji}}" }} - The emoji set by the user in their profile.
displayname_template: '{{ "{{or .ProfileName .PhoneNumber \"Unknown user\"}}" }}'
# Should avatars from the user's contact list be used? This is not safe on multi-user instances.
use_contact_avatars: false
# Should the bridge request the user's contact list from the phone on startup?
sync_contacts_on_startup: true
# Should the bridge sync ghost user info even if profile fetching fails? This is not safe on multi-user instances.
use_outdated_profiles: false
# Should the Signal user's phone number be included in the room topic in private chat portal rooms?
number_in_topic: true
# Default device name that shows up in the Signal app.
device_name: mautrix-signal
# Avatar image for the Note to Self room.
note_to_self_avatar: mxc://maunium.net/REBIVrqjZwmaWpssCZpBlmlL
# Format for generating URLs from location messages for sending to Signal.
# Google Maps: 'https://www.google.com/maps/place/%[1]s,%[2]s'
# OpenStreetMap: 'https://www.openstreetmap.org/?mlat=%[1]s&mlon=%[2]s'
location_format: 'https://www.google.com/maps/place/%[1]s,%[2]s'
# Config options that affect the central bridge module.
bridge:
# The prefix for commands. Only required in non-management rooms.
command_prefix: '!signal'
# Should the bridge create a space for each login containing the rooms that account is in?
personal_filtering_spaces: true
# Whether the bridge should set names and avatars explicitly for DM portals.
# This is only necessary when using clients that don't support MSC4171.
private_chat_portal_meta: false
# Should leaving Matrix rooms be bridged as leaving groups on the remote network?
bridge_matrix_leave: false
# Should room tags only be synced when creating the portal? Tags mean things like favorite/pin and archive/low priority.
# Tags currently can't be synced back to the remote network, so a continuous sync means tagging from Matrix will be undone.
tag_only_on_create: true
# Should room mute status only be synced when creating the portal?
# Like tags, mutes can't currently be synced back to the remote network.
mute_only_on_create: true
# What should be done to portal rooms when a user logs out or is logged out?
# Permitted values:
# nothing - Do nothing, let the user stay in the portals
# kick - Remove the user from the portal rooms, but don't delete them
# unbridge - Remove all ghosts in the room and disassociate it from the remote chat
# delete - Remove all ghosts and users from the room (i.e. delete it)
cleanup_on_logout:
# Should cleanup on logout be enabled at all?
enabled: false
# Settings for manual logouts (explicitly initiated by the Matrix user)
manual:
# Action for private portals which will never be shared with other Matrix users.
private: nothing
# Action for portals with a relay user configured.
relayed: nothing
# Action for portals which may be shared, but don't currently have any other Matrix users.
shared_no_users: nothing
# Action for portals which have other logged-in Matrix users.
shared_has_users: nothing
# Settings for credentials being invalidated (initiated by the remote network, possibly through user action).
# Keys have the same meanings as in the manual section.
bad_credentials:
private: nothing
relayed: nothing
shared_no_users: nothing
shared_has_users: nothing
# Settings for relay mode
relay:
# Whether relay mode should be allowed. If allowed, the set-relay command can be used to turn any
# authenticated user into a relaybot for that chat.
enabled: true
# Should only admins be allowed to set themselves as relay users?
# If true, non-admins can only set users listed in default_relays as relays in a room.
admin_only: true
# List of user login IDs which anyone can set as a relay, as long as the relay user is in the room.
default_relays: []
# The formats to use when sending messages via the relaybot.
# Available variables:
# .Sender.UserID - The Matrix user ID of the sender.
# .Sender.Displayname - The display name of the sender (if set).
# .Sender.RequiresDisambiguation - Whether the sender's name may be confused with the name of another user in the room.
# .Sender.DisambiguatedName - The disambiguated name of the sender. This will be the displayname if set,
# plus the user ID in parentheses if the displayname is not unique.
# If the displayname is not set, this is just the user ID.
# .Message - The `formatted_body` field of the message.
# .Caption - The `formatted_body` field of the message, if it's a caption. Otherwise an empty string.
# .FileName - The name of the file being sent.
message_formats:
m.text: "{{`{{ .Sender.DisambiguatedName }}: {{ .Message }}`}}"
m.notice: "{{`{{ .Sender.DisambiguatedName }}: {{ .Message }}`}}"
m.emote: "{{`* {{ .Sender.DisambiguatedName }} {{ .Message }}`}}"
m.file: "{{`{{ .Sender.DisambiguatedName }} sent a file{{ if .Caption }}: {{ .Caption }}{{ end }}`}}"
m.image: "{{`{{ .Sender.DisambiguatedName }} sent an image{{ if .Caption }}: {{ .Caption }}{{ end }}`}}"
m.audio: "{{`{{ .Sender.DisambiguatedName }} sent an audio file{{ if .Caption }}: {{ .Caption }}{{ end }}`}}"
m.video: "{{`{{ .Sender.DisambiguatedName }} sent a video{{ if .Caption }}: {{ .Caption }}{{ end }}`}}"
m.location: "{{`{{ .Sender.DisambiguatedName }} sent a location{{ if .Caption }}: {{ .Caption }}{{ end }}`}}"
# For networks that support per-message displaynames (i.e. Slack and Discord), the template for those names.
# This has all the Sender variables available under message_formats (but without the .Sender prefix).
# Note that you need to manually remove the displayname from message_formats above.
displayname_format: "{{`{{ .DisambiguatedName }}`}}"
# Permissions for using the bridge.
# Permitted values:
# relay - Talk through the relaybot (if enabled), no access otherwise
# commands - Access to use commands in the bridge, but not login.
# user - Access to use the bridge with puppeting.
# admin - Full access, user level with some additional administration tools.
# Permitted keys:
# * - All Matrix users
# domain - All users on that homeserver
# mxid - Specific user
permissions: {{ env "SIGNAL_BRIDGE_PERMISSIONS" }}
# Config for the bridge's database.
database:
# The database type. "sqlite3-fk-wal" and "postgres" are supported.
type: postgres
# The database URI.
# SQLite: A raw file path is supported, but `file:<path>?_txlock=immediate` is recommended.
# https://github.com/mattn/go-sqlite3#connection-string
# Postgres: Connection string. For example, postgres://user:password@host/database?sslmode=disable
# To connect via Unix socket, use something like postgres:///dbname?host=/var/run/postgresql
uri: postgres://signalbridge:{{ secret "signal_db_password" }}@signaldb/signalbridge?sslmode=disable
# Maximum number of connections.
max_open_conns: 5
max_idle_conns: 1
# Maximum connection idle time and lifetime before they're closed. Disabled if null.
# Parsed with https://pkg.go.dev/time#ParseDuration
max_conn_idle_time: null
max_conn_lifetime: null
# Homeserver details.
homeserver:
# The address that this appservice can use to connect to the homeserver.
# Local addresses without HTTPS are generally recommended when the bridge is running on the same machine,
# but https also works if they run on different machines.
address: {{ env "HOMESERVER_URL" }}
# The domain of the homeserver (also known as server_name, used for MXIDs, etc).
domain: {{ env "HOMESERVER_DOMAIN" }}
# What software is the homeserver running?
# Standard Matrix homeservers like Synapse, Dendrite and Conduit should just use "standard" here.
software: standard
# The URL to push real-time bridge status to.
# If set, the bridge will make POST requests to this URL whenever a user's remote network connection state changes.
# The bridge will use the appservice as_token to authorize requests.
status_endpoint: null
# Endpoint for reporting per-message status.
# If set, the bridge will make POST requests to this URL when processing a message from Matrix.
# It will make one request when receiving the message (step BRIDGE), one after decrypting if applicable
# (step DECRYPTED) and one after sending to the remote network (step REMOTE). Errors will also be reported.
# The bridge will use the appservice as_token to authorize requests.
message_send_checkpoint_endpoint:
# Does the homeserver support https://github.com/matrix-org/matrix-spec-proposals/pull/2246?
async_media: false
# Should the bridge use a websocket for connecting to the homeserver?
# The server side is currently not documented anywhere and is only implemented by mautrix-wsproxy,
# mautrix-asmux (deprecated), and hungryserv (proprietary).
websocket: false
# How often should the websocket be pinged? Pinging will be disabled if this is zero.
ping_interval_seconds: 0
# Application service host/registration related details.
# Changing these values requires regeneration of the registration (except when noted otherwise)
appservice:
# The address that the homeserver can use to connect to this appservice.
address: http://signalbridge:29328
# A public address that external services can use to reach this appservice.
# This value doesn't affect the registration file.
public_address: https://bridge.example.com
# The hostname and port where this appservice should listen.
hostname: 0.0.0.0
port: 29328
# The unique ID of this appservice.
id: signal
# Appservice bot details.
bot:
# Username of the appservice bot.
username: signalbot
# Display name and avatar for bot. Set to "remove" to remove display name/avatar, leave empty
# to leave display name/avatar as-is.
displayname: Signal bridge bot
avatar: mxc://maunium.net/wPJgTQbZOtpBFmDNkiNEMDUp
# Whether to receive ephemeral events via appservice transactions.
ephemeral_events: true
# Should incoming events be handled asynchronously?
# This may be necessary for large public instances with lots of messages going through.
# However, messages will not be guaranteed to be bridged in the same order they were sent in.
# This value doesn't affect the registration file.
async_transactions: false
# Authentication tokens for AS <-> HS communication. Autogenerated; do not modify.
as_token: "{{ secret "signal_as_token" }}"
hs_token: "{{ secret "signal_hs_token" }}"
# Localpart template of MXIDs for remote users.
# {{ "{{.}}" }} is replaced with the internal ID of the user.
username_template: signal_{{ "{{.}}" }}
# Config options that affect the Matrix connector of the bridge.
matrix:
# Whether the bridge should send the message status as a custom com.beeper.message_send_status event.
message_status_events: false
# Whether the bridge should send a read receipt after successfully bridging a message.
delivery_receipts: false
# Whether the bridge should send error notices via m.notice events when a message fails to bridge.
message_error_notices: true
# Whether the bridge should update the m.direct account data event when double puppeting is enabled.
sync_direct_chat_list: false
# Whether created rooms should have federation enabled. If false, created portal rooms
# will never be federated. Changing this option requires recreating rooms.
federate_rooms: true
# Settings for provisioning API
provisioning:
# Prefix for the provisioning API paths.
prefix: /_matrix/provision
# Shared secret for authentication. If set to "generate" or null, a random secret will be generated,
# or if set to "disable", the provisioning API will be disabled.
shared_secret: generate
# Whether to allow provisioning API requests to be authed using Matrix access tokens.
# This follows the same rules as double puppeting to determine which server to contact to check the token,
# which means that by default, it only works for users on the same server as the bridge.
allow_matrix_auth: true
# Enable debug API at /debug with provisioning authentication.
debug_endpoints: false
# Some networks require publicly accessible media download links (e.g. for user avatars when using Discord webhooks).
# These settings control whether the bridge will provide such public media access.
public_media:
# Should public media be enabled at all?
# The public_address field under the appservice section MUST be set when enabling public media.
enabled: false
# A key for signing public media URLs.
# If set to "generate", a random key will be generated.
signing_key: generate
# Number of seconds that public media URLs are valid for.
# If set to 0, URLs will never expire.
expiry: 0
# Length of hash to use for public media URLs. Must be between 0 and 32.
hash_length: 32
# Settings for converting remote media to custom mxc:// URIs instead of reuploading.
# More details can be found at https://docs.mau.fi/bridges/go/discord/direct-media.html
direct_media:
# Should custom mxc:// URIs be used instead of reuploading media?
enabled: false
# The server name to use for the custom mxc:// URIs.
# This server name will effectively be a real Matrix server, it just won't implement anything other than media.
# You must either set up .well-known delegation from this domain to the bridge, or proxy the domain directly to the bridge.
server_name: discord-media.example.com
# Optionally a custom .well-known response. This defaults to `server_name:443`
well_known_response:
# Optionally specify a custom prefix for the media ID part of the MXC URI.
media_id_prefix:
# If the remote network supports media downloads over HTTP, then the bridge will use MSC3860/MSC3916
# media download redirects if the requester supports it. Optionally, you can force redirects
# and not allow proxying at all by setting this to false.
# This option does nothing if the remote network does not support media downloads over HTTP.
allow_proxy: true
# Matrix server signing key to make the federation tester pass, same format as synapse's .signing.key file.
# This key is also used to sign the mxc:// URIs to ensure only the bridge can generate them.
server_key: generate
# Settings for backfilling messages.
# Note that the exact way settings are applied depends on the network connector.
# See https://docs.mau.fi/bridges/general/backfill.html for more details.
backfill:
# Whether to do backfilling at all.
enabled: false
# Maximum number of messages to backfill in empty rooms.
max_initial_messages: 50
# Maximum number of missed messages to backfill after bridge restarts.
max_catchup_messages: 500
# If a backfilled chat is older than this number of hours,
# mark it as read even if it's unread on the remote network.
unread_hours_threshold: 720
# Settings for backfilling threads within other backfills.
threads:
# Maximum number of messages to backfill in a new thread.
max_initial_messages: 50
# Settings for the backwards backfill queue. This only applies when connecting to
# Beeper as standard Matrix servers don't support inserting messages into history.
queue:
# Should the backfill queue be enabled?
enabled: false
# Number of messages to backfill in one batch.
batch_size: 100
# Delay between batches in seconds.
batch_delay: 20
# Maximum number of batches to backfill per portal.
# If set to -1, all available messages will be backfilled.
max_batches: -1
# Optional network-specific overrides for max batches.
# Interpretation of this field depends on the network connector.
max_batches_override: {}
# Settings for enabling double puppeting
double_puppet:
# Servers to always allow double puppeting from.
# This is only for other servers and should NOT contain the server the bridge is on.
servers:
{{ env "HOMESERVER_DOMAIN" }}: {{ env "HOMESERVER_URL" }}
# Whether to allow client API URL discovery for other servers. When using this option,
# users on other servers can use double puppeting even if their server URLs aren't
# explicitly added to the servers map above.
allow_discovery: false
# Shared secrets for automatic double puppeting.
# See https://docs.mau.fi/bridges/general/double-puppeting.html for instructions.
secrets:
{{ env "HOMESERVER_DOMAIN" }}: {{ secret "shared_secret_auth" }}
# End-to-bridge encryption support options.
#
# See https://docs.mau.fi/bridges/general/end-to-bridge-encryption.html for more info.
encryption:
# Whether to enable encryption at all. If false, the bridge will not function in encrypted rooms.
allow: {{ env "SIGNAL_ENABLE_ENCRYPTION" }}
# Whether to force-enable encryption in all bridged rooms.
default: {{ env "SIGNAL_DEFAULT_ENCRYPTION" }}
# Whether to require all messages to be encrypted and drop any unencrypted messages.
require: false
# Whether to use MSC2409/MSC3202 instead of /sync long polling for receiving encryption-related data.
# This option is not yet compatible with standard Matrix servers like Synapse and should not be used.
appservice: false
# Enable key sharing? If enabled, key requests for rooms where users are in will be fulfilled.
# You must use a client that supports requesting keys from other users to use this feature.
allow_key_sharing: false
# Pickle key for encrypting encryption keys in the bridge database.
# If set to generate, a random key will be generated.
pickle_key: {{ secret "signal_pickle_key" }}
# Options for deleting megolm sessions from the bridge.
delete_keys:
# Beeper-specific: delete outbound sessions when hungryserv confirms
# that the user has uploaded the key to key backup.
delete_outbound_on_ack: false
# Don't store outbound sessions in the inbound table.
dont_store_outbound: false
# Ratchet megolm sessions forward after decrypting messages.
ratchet_on_decrypt: false
# Delete fully used keys (index >= max_messages) after decrypting messages.
delete_fully_used_on_decrypt: false
# Delete previous megolm sessions from same device when receiving a new one.
delete_prev_on_new_session: false
# Delete megolm sessions received from a device when the device is deleted.
delete_on_device_delete: false
# Periodically delete megolm sessions when 2x max_age has passed since receiving the session.
periodically_delete_expired: false
# Delete inbound megolm sessions that don't have the received_at field used for
# automatic ratcheting and expired session deletion. This is meant as a migration
# to delete old keys prior to the bridge update.
delete_outdated_inbound: false
# What level of device verification should be required from users?
#
# Valid levels:
# unverified - Send keys to all device in the room.
# cross-signed-untrusted - Require valid cross-signing, but trust all cross-signing keys.
# cross-signed-tofu - Require valid cross-signing, trust cross-signing keys on first use (and reject changes).
# cross-signed-verified - Require valid cross-signing, plus a valid user signature from the bridge bot.
# Note that creating user signatures from the bridge bot is not currently possible.
# verified - Require manual per-device verification
# (currently only possible by modifying the `trust` column in the `crypto_device` database table).
verification_levels:
# Minimum level for which the bridge should send keys to when bridging messages from the remote network to Matrix.
receive: unverified
# Minimum level that the bridge should accept for incoming Matrix messages.
send: unverified
# Minimum level that the bridge should require for accepting key requests.
share: cross-signed-tofu
# Options for Megolm room key rotation. These options allow you to configure the m.room.encryption event content.
# See https://spec.matrix.org/v1.10/client-server-api/#mroomencryption for more information about that event.
rotation:
# Enable custom Megolm room key rotation settings. Note that these
# settings will only apply to rooms created after this option is set.
enable_custom: false
# The maximum number of milliseconds a session should be used
# before changing it. The Matrix spec recommends 604800000 (a week)
# as the default.
milliseconds: 604800000
# The maximum number of messages that should be sent with a given a
# session before changing it. The Matrix spec recommends 100 as the
# default.
messages: 100
# Disable rotating keys when a user's devices change?
# You should not enable this option unless you understand all the implications.
disable_device_change_key_rotation: false
# Logging config. See https://github.com/tulir/zeroconfig for details.
logging:
min_level: debug
writers:
- type: stdout
format: pretty-colored
- type: file
format: json
filename: ./logs/bridge.log
max_size: 100
max_backups: 10
compress: false
+544
View File
@@ -0,0 +1,544 @@
# Homeserver details
homeserver:
# The address that this appservice can use to connect to the homeserver.
address: {{ env "HOMESERVER_URL" }}
# The domain of the homeserver (for MXIDs, etc).
domain: {{ env "HOMESERVER_DOMAIN" }}
# Whether or not to verify the SSL certificate of the homeserver.
# Only applies if address starts with https://
verify_ssl: {{ env "VERIFY_SSL" }}
asmux: false
# Number of retries for all HTTP requests if the homeserver isn't reachable.
http_retry_count: 4
# The URL to push real-time bridge status to.
# If set, the bridge will make POST requests to this URL whenever a user's Telegram connection state changes.
# The bridge will use the appservice as_token to authorize requests.
status_endpoint: null
# Endpoint for reporting per-message status.
message_send_checkpoint_endpoint: null
# Whether asynchronous uploads via MSC2246 should be enabled for media.
# Requires a media repo that supports MSC2246.
async_media: false
# Application service host/registration related details
# Changing these values requires regeneration of the registration.
appservice:
# The address that the homeserver can use to connect to this appservice.
address: http://telegrambridge:29317
# When using https:// the TLS certificate and key files for the address.
tls_cert: false
tls_key: false
# The hostname and port where this appservice should listen.
hostname: 0.0.0.0
port: 29317
# The maximum body size of appservice API requests (from the homeserver) in mebibytes
# Usually 1 is enough, but on high-traffic bridges you might need to increase this to avoid 413s
max_body_size: 1
# The full URI to the database. SQLite and Postgres are supported.
# Format examples:
# SQLite: sqlite:///filename.db
# Postgres: postgres://username:password@hostname/dbname
database: postgres://telegrambridge:{{ secret "telegram_db_password" }}@telegramdb/telegrambridge
# Additional arguments for asyncpg.create_pool() or sqlite3.connect()
# https://magicstack.github.io/asyncpg/current/api/index.html#asyncpg.pool.create_pool
# https://docs.python.org/3/library/sqlite3.html#sqlite3.connect
# For sqlite, min_size is used as the connection thread pool size and max_size is ignored.
database_opts:
min_size: 1
max_size: 10
# Public part of web server for out-of-Matrix interaction with the bridge.
# Used for things like login if the user wants to make sure the 2FA password isn't stored in
# the HS database.
public:
# Whether or not the public-facing endpoints should be enabled.
enabled: false
# The prefix to use in the public-facing endpoints.
prefix: /public
# The base URL where the public-facing endpoints are available. The prefix is not added
# implicitly.
external: https://example.com/public
# Provisioning API part of the web server for automated portal creation and fetching information.
# Used by things like mautrix-manager (https://github.com/tulir/mautrix-manager).
provisioning:
# Whether or not the provisioning API should be enabled.
enabled: false
# The prefix to use in the provisioning API endpoints.
prefix: /_matrix/provision
# The shared secret to authorize users of the API.
# Set to "generate" to generate and save a new token.
shared_secret: generate
# The unique ID of this appservice.
id: {{ env "APP_SERVICE_ID" }}
# Username of the appservice bot.
bot_username: {{ env "APP_SERVICE_BOT_USERNAME" }}
# Display name and avatar for bot. Set to "remove" to remove display name/avatar, leave empty
# to leave display name/avatar as-is.
bot_displayname: {{ env "APP_SERVICE_DISPLAY_NAME" }}
bot_avatar: mxc://maunium.net/tJCRmUyJDsgRNgqhOgoiHWbX
# Whether or not to receive ephemeral events via appservice transactions.
# Requires MSC2409 support (i.e. Synapse 1.22+).
# You should disable bridge -> sync_with_custom_puppets when this is enabled.
ephemeral_events: false
# Authentication tokens for AS <-> HS communication. Autogenerated; do not modify.
as_token: "{{ secret "telegram_as_token" }}"
hs_token: "{{ secret "telegram_hs_token" }}"
# Prometheus telemetry config. Requires prometheus-client to be installed.
metrics:
enabled: false
listen_port: 8000
# Manhole config.
manhole:
# Whether or not opening the manhole is allowed.
enabled: false
# The path for the unix socket.
path: /var/tmp/mautrix-telegram.manhole
# The list of UIDs who can be added to the whitelist.
# If empty, any UIDs can be specified in the open-manhole command.
whitelist:
- 0
# Bridge config
bridge:
# Localpart template of MXIDs for Telegram users.
# {userid} is replaced with the user ID of the Telegram user.
username_template: "telegram_{userid}"
# Localpart template of room aliases for Telegram portal rooms.
# {groupname} is replaced with the name part of the public channel/group invite link ( https://t.me/{} )
alias_template: "telegram_{groupname}"
# Displayname template for Telegram users.
# {displayname} is replaced with the display name of the Telegram user.
displayname_template: "{displayname} (Telegram)"
# Set the preferred order of user identifiers which to use in the Matrix puppet display name.
# In the (hopefully unlikely) scenario that none of the given keys are found, the numeric user
# ID is used.
#
# If the bridge is working properly, a phone number or an username should always be known, but
# the other one can very well be empty.
#
# Valid keys:
# "full name" (First and/or last name)
# "full name reversed" (Last and/or first name)
# "first name"
# "last name"
# "username"
# "phone number"
displayname_preference:
- full name
- username
- phone number
# Maximum length of displayname
displayname_max_length: 100
# Remove avatars from Telegram ghost users when removed on Telegram. This is disabled by default
# as there's no way to determine whether an avatar is removed or just hidden from some users. If
# you're on a single-user instance, this should be safe to enable.
allow_avatar_remove: false
# Maximum number of members to sync per portal when starting up. Other members will be
# synced when they send messages. The maximum is 10000, after which the Telegram server
# will not send any more members.
# -1 means no limit (which means it's limited to 10000 by the server)
max_initial_member_sync: 100
# Whether or not to sync the member list in channels.
# If no channel admins have logged into the bridge, the bridge won't be able to sync the member
# list regardless of this setting.
sync_channel_members: {{ env "TELEGRAM_SYNC_CHANNEL_MEMBERS" }}
# Whether or not to skip deleted members when syncing members.
skip_deleted_members: true
# Whether or not to automatically synchronize contacts and chats of Matrix users logged into
# their Telegram account at startup.
startup_sync: true
# Number of most recently active dialogs to check when syncing chats.
# Set to 0 to remove limit.
sync_update_limit: 0
# Number of most recently active dialogs to create portals for when syncing chats.
# Set to 0 to remove limit.
sync_create_limit: 30
# Whether or not to sync and create portals for direct chats at startup.
sync_direct_chats: false
# The maximum number of simultaneous Telegram deletions to handle.
# A large number of simultaneous redactions could put strain on your homeserver.
max_telegram_delete: 10
# Whether or not to automatically sync the Matrix room state (mostly unpuppeted displaynames)
# at startup and when creating a bridge.
sync_matrix_state: true
# Allow logging in within Matrix. If false, users can only log in using login-qr or the
# out-of-Matrix login website (see appservice.public config section)
allow_matrix_login: true
# Whether or not to bridge plaintext highlights.
# Only enable this if your displayname_template has some static part that the bridge can use to
# reliably identify what is a plaintext highlight.
plaintext_highlights: false
# Whether or not to make portals of publicly joinable channels/supergroups publicly joinable on Matrix.
public_portals: true
# Whether or not to use /sync to get presence, read receipts and typing notifications
# when double puppeting is enabled
sync_with_custom_puppets: true
# Whether or not to update the m.direct account data event when double puppeting is enabled.
# Note that updating the m.direct event is not atomic (except with mautrix-asmux)
# and is therefore prone to race conditions.
sync_direct_chat_list: false
# Servers to always allow double puppeting from
double_puppet_server_map:
{{ env "HOMESERVER_DOMAIN" }}: {{ env "HOMESERVER_URL" }}
# Allow using double puppeting from any server with a valid client .well-known file.
double_puppet_allow_discovery: false
# Shared secrets for https://github.com/devture/matrix-synapse-shared-secret-auth
#
# If set, custom puppets will be enabled automatically for local users
# instead of users having to find an access token and run `login-matrix`
# manually.
# If using this for other servers than the bridge's server,
# you must also set the URL in the double_puppet_server_map.
login_shared_secret_map:
{{ env "HOMESERVER_DOMAIN" }}: {{ secret "shared_secret_auth" }}
# Set to false to disable link previews in messages sent to Telegram.
telegram_link_preview: true
# Whether or not the !tg join command should do a HTTP request
# to resolve redirects in invite links.
invite_link_resolve: false
# Use inline images instead of a separate message for the caption.
# N.B. Inline images are not supported on all clients (e.g. Element iOS/Android).
inline_images: false
# Maximum size of image in megabytes before sending to Telegram as a document.
image_as_file_size: 10
# Maximum number of pixels in an image before sending to Telegram as a document. Defaults to 1280x1280 = 1638400.
image_as_file_pixels: 1638400
# Enable experimental parallel file transfer, which makes uploads/downloads much faster by
# streaming from/to Matrix and using many connections for Telegram.
# Note that generating HQ thumbnails for videos is not possible with streamed transfers.
# This option uses internal Telethon implementation details and may break with minor updates.
parallel_file_transfer: false
# Whether or not created rooms should have federation enabled.
# If false, created portal rooms will never be federated.
federate_rooms: true
# Settings for converting animated stickers.
animated_sticker:
# Format to which animated stickers should be converted.
# disable - No conversion, send as-is (gzipped lottie)
# png - converts to non-animated png (fastest),
# gif - converts to animated gif
# webm - converts to webm video, requires ffmpeg executable with vp9 codec and webm container support
target: gif
# Arguments for converter. All converters take width and height.
args:
width: 256
height: 256
fps: 25 # only for webm and gif (2, 5, 10, 20 or 25 recommended)
# End-to-bridge encryption support options.
#
# See https://docs.mau.fi/bridges/general/end-to-bridge-encryption.html for more info.
encryption:
# Allow encryption, work in group chat rooms with e2ee enabled
allow: {{ env "ENABLE_ENCRYPTION" }}
# Default to encryption, force-enable encryption in all portals the bridge creates
# This will cause the bridge bot to be in private chats for the encryption to work properly.
default: false
# Database for the encryption data. If set to `default`, will use the appservice database.
database: default
# Options for automatic key sharing.
key_sharing:
# Enable key sharing? If enabled, key requests for rooms where users are in will be fulfilled.
# You must use a client that supports requesting keys from other users to use this feature.
allow: false
# Require the requesting device to have a valid cross-signing signature?
# This doesn't require that the bridge has verified the device, only that the user has verified it.
# Not yet implemented.
require_cross_signing: false
# Require devices to be verified by the bridge?
# Verification by the bridge is not yet implemented.
require_verification: false
# Whether or not to explicitly set the avatar and room name for private
# chat portal rooms. This will be implicitly enabled if encryption.default is true.
private_chat_portal_meta: false
# Whether or not the bridge should send a read receipt from the bridge bot when a message has
# been sent to Telegram.
delivery_receipts: false
# Whether or not delivery errors should be reported as messages in the Matrix room.
delivery_error_reports: false
# Set this to true to tell the bridge to re-send m.bridge events to all rooms on the next run.
# This field will automatically be changed back to false after it,
# except if the config file is not writable.
resend_bridge_info: false
# When using double puppeting, should muted chats be muted in Matrix?
mute_bridging: false
# When using double puppeting, should pinned chats be moved to a specific tag in Matrix?
# The favorites tag is `m.favourite`.
pinned_tag: null
# Same as above for archived chats, the low priority tag is `m.lowpriority`.
archive_tag: null
# Whether or not mute status and tags should only be bridged when the portal room is created.
tag_only_on_create: true
# Should leaving the room on Matrix make the user leave on Telegram?
bridge_matrix_leave: true
# Should the user be kicked out of all portals when logging out of the bridge?
kick_on_logout: true
# Should the "* user joined Telegram" notice always be marked as read automatically?
always_read_joined_telegram_notice: true
# Settings for backfilling messages from Telegram.
backfill:
# Whether or not the Telegram ghosts of logged in Matrix users should be
# invited to private chats when backfilling history from Telegram. This is
# usually needed to prevent rate limits and to allow timestamp massaging.
invite_own_puppet: true
# Maximum number of messages to backfill without using a takeout.
# The first time a takeout is used, the user has to manually approve it from a different
# device. If initial_limit or missed_limit are higher than this value, the bridge will ask
# the user to accept the takeout after logging in before syncing any chats.
takeout_limit: 100
# Maximum number of messages to backfill initially.
# Set to 0 to disable backfilling when creating portal, or -1 to disable the limit.
#
# N.B. Initial backfill will only start after member sync. Make sure your
# max_initial_member_sync is set to a low enough value so it doesn't take forever.
initial_limit: 0
# Maximum number of messages to backfill if messages were missed while the bridge was
# disconnected. Note that this only works for logged in users and only if the chat isn't
# older than sync_update_limit
# Set to 0 to disable backfilling missed messages.
missed_limit: 50
# If using double puppeting, should notifications be disabled
# while the initial backfill is in progress?
disable_notifications: false
# Whether or not to enable backfilling in normal groups.
# Normal groups have numerous technical problems in Telegram, and backfilling normal groups
# will likely cause problems if there are multiple Matrix users in the group.
normal_groups: false
# Overrides for base power levels.
initial_power_level_overrides:
user: {}
group: {}
# Whether to bridge Telegram bot messages as m.notices or m.texts.
bot_messages_as_notices: true
bridge_notices:
# Whether or not Matrix bot messages (type m.notice) should be bridged.
default: false
# List of user IDs for whom the previous flag is flipped.
# e.g. if bridge_notices.default is false, notices from other users will not be bridged, but
# notices from users listed here will be bridged.
exceptions: []
# An array of possible values for the $distinguisher variable in message formats.
# Each user gets one of the values here, based on a hash of their user ID.
# If the array is empty, the $distinguisher variable will also be empty.
relay_user_distinguishers: ["🟦", "🟣", "🟩", "⭕️", "🔶", "⬛️", "🔵", "🟢"]
# The formats to use when sending messages to Telegram via the relay bot.
# Text msgtypes (m.text, m.notice and m.emote) support HTML, media msgtypes don't.
#
# Available variables:
# $sender_displayname - The display name of the sender (e.g. Example User)
# $sender_username - The username (Matrix ID localpart) of the sender (e.g. exampleuser)
# $sender_mxid - The Matrix ID of the sender (e.g. @exampleuser:example.com)
# $distinguisher - A random string from the options in the relay_user_distinguishers array.
# $message - The message content
message_formats:
m.text: "$distinguisher <b>$sender_displayname</b>: $message"
m.notice: "$distinguisher <b>$sender_displayname</b>: $message"
m.emote: "* $distinguisher <b>$sender_displayname</b> $message"
m.file: "$distinguisher <b>$sender_displayname</b> sent a file: $message"
m.image: "$distinguisher <b>$sender_displayname</b> sent an image: $message"
m.audio: "$distinguisher <b>$sender_displayname</b> sent an audio file: $message"
m.video: "$distinguisher <b>$sender_displayname</b> sent a video: $message"
m.location: "$distinguisher <b>$sender_displayname</b> sent a location: $message"
# Telegram doesn't have built-in emotes, this field specifies how m.emote's from authenticated
# users are sent to telegram. All fields in message_formats are supported. Additionally, the
# Telegram user info is available in the following variables:
# $displayname - Telegram displayname
# $username - Telegram username (may not exist)
# $mention - Telegram @username or displayname mention (depending on which exists)
emote_format: "* $mention $formatted_body"
# The formats to use when sending state events to Telegram via the relay bot.
#
# Variables from `message_formats` that have the `sender_` prefix are available without the prefix.
# In name_change events, `$prev_displayname` is the previous displayname.
#
# Set format to an empty string to disable the messages for that event.
state_event_formats:
join: "$distinguisher <b>$displayname</b> joined the room."
leave: "$distinguisher <b>$displayname</b> left the room."
name_change: "$distinguisher <b>$prev_displayname</b> changed their name to $distinguisher <b>$displayname</b>"
# Filter rooms that can/can't be bridged. Can also be managed using the `filter` and
# `filter-mode` management commands.
#
# Filters do not affect direct chats.
# An empty blacklist will essentially disable the filter.
filter:
# Filter mode to use. Either "blacklist" or "whitelist".
# If the mode is "blacklist", the listed chats will never be bridged.
# If the mode is "whitelist", only the listed chats can be bridged.
mode: blacklist
# The list of group/channel IDs to filter.
list: []
# The prefix for commands. Only required in non-management rooms.
command_prefix: "!tg"
# Messages sent upon joining a management room.
# Markdown is supported. The defaults are listed below.
management_room_text:
# Sent when joining a room.
welcome: "Hello, I'm a Telegram bridge bot."
# Sent when joining a management room and the user is already logged in.
welcome_connected: "Use `help` for help."
# Sent when joining a management room and the user is not logged in.
welcome_unconnected: "Use `help` for help or `login` to log in."
# Optional extra text sent when joining a management room.
additional_help: ""
# Send each message separately (for readability in some clients)
management_room_multiple_messages: false
# Permissions for using the bridge.
# Permitted values:
# relaybot - Only use the bridge via the relaybot, no access to commands.
# user - Relaybot level + access to commands to create bridges.
# puppeting - User level + logging in with a Telegram account.
# full - Full access to use the bridge, i.e. previous levels + Matrix login.
# admin - Full access to use the bridge and some extra administration commands.
# Permitted keys:
# * - All Matrix users
# domain - All users on that homeserver
# mxid - Specific user
permissions: {{ env "TELEGRAM_BRIDGE_PERMISSIONS" }}
# Options related to the message relay Telegram bot.
relaybot:
private_chat:
# List of users to invite to the portal when someone starts a private chat with the bot.
# If empty, private chats with the bot won't create a portal.
invite: []
# Whether or not to bridge state change messages in relaybot private chats.
state_changes: true
# When private_chat_invite is empty, this message is sent to users /starting the
# relaybot. Telegram's "markdown" is supported.
message: This is a Matrix bridge relaybot and does not support direct chats
# List of users to invite to all group chat portals created by the bridge.
group_chat_invite: []
# Whether or not the relaybot should not bridge events in unbridged group chats.
# If false, portals will be created when the relaybot receives messages, just like normal
# users. This behavior is usually not desirable, as it interferes with manually bridging
# the chat to another room.
ignore_unbridged_group_chat: true
# Whether or not to allow creating portals from Telegram.
authless_portals: true
# Whether or not to allow Telegram group admins to use the bot commands.
whitelist_group_admins: true
# Whether or not to ignore incoming events sent by the relay bot.
ignore_own_incoming_events: true
# List of usernames/user IDs who are also allowed to use the bot commands.
whitelist:
- myusername
- 12345678
# Telegram config
telegram:
# Get your own API keys at https://my.telegram.org/apps
api_id: {{ env "TELEGRAM_APP_ID" }}
api_hash: {{ secret "telegram_api_hash" }}
# (Optional) Create your own bot at https://t.me/BotFather
bot_token: {{ secret "telegram_bot_token" }}
# Telethon connection options.
connection:
# The timeout in seconds to be used when connecting.
timeout: 120
# How many times the reconnection should retry, either on the initial connection or when
# Telegram disconnects us. May be set to a negative or null value for infinite retries, but
# this is not recommended, since the program can get stuck in an infinite loop.
retries: 5
# The delay in seconds to sleep between automatic reconnections.
retry_delay: 1
# The threshold below which the library should automatically sleep on flood wait errors
# (inclusive). For instance, if a FloodWaitError for 17s occurs and flood_sleep_threshold
# is 20s, the library will sleep automatically. If the error was for 21s, it would raise
# the error instead. Values larger than a day (86400) will be changed to a day.
flood_sleep_threshold: 60
# How many times a request should be retried. Request are retried when Telegram is having
# internal issues, when there is a FloodWaitError less than flood_sleep_threshold, or when
# there's a migrate error. May take a negative or null value for infinite retries, but this
# is not recommended, since some requests can always trigger a call fail (such as searching
# for messages).
request_retries: 5
# Device info sent to Telegram.
device_info:
# "auto" = OS name+version.
device_model: auto
# "auto" = Telethon version.
system_version: auto
# "auto" = mautrix-telegram version.
app_version: auto
lang_code: en
system_lang_code: en
# Custom server to connect to.
server:
# Set to true to use these server settings. If false, will automatically
# use production server assigned by Telegram. Set to false in production.
enabled: false
# The DC ID to connect to.
dc: 2
# The IP to connect to.
ip: 149.154.167.40
# The port to connect to. 443 may not work, 80 is better and both are equally secure.
port: 80
# Telethon proxy configuration.
# You must install PySocks from pip for proxies to work.
proxy:
# Allowed types: disabled, socks4, socks5, http, mtproxy
type: disabled
# Proxy IP address and port.
address: 127.0.0.1
port: 1080
# Whether or not to perform DNS resolving remotely. Only for socks/http proxies.
rdns: true
# Proxy authentication (optional). Put MTProxy secret in password field.
username: ""
password: ""
# Python logging configuration.
#
# See section 16.7.2 of the Python documentation for more info:
# https://docs.python.org/3.6/library/logging.config.html#configuration-dictionary-schema
logging:
version: 1
formatters:
colored:
(): mautrix_telegram.util.ColorFormatter
format: "[%(asctime)s] [%(levelname)s@%(name)s] %(message)s"
normal:
format: "[%(asctime)s] [%(levelname)s@%(name)s] %(message)s"
handlers:
file:
class: logging.handlers.RotatingFileHandler
formatter: normal
filename: /data/mautrix-telegram.log
maxBytes: 10485760
backupCount: 10
console:
class: logging.StreamHandler
formatter: colored
loggers:
mau:
level: ERROR
telethon:
level: ERROR
aiohttp:
level: ERROR
root:
level: ERROR
handlers: [file, console]
-15
View File
@@ -1,15 +0,0 @@
use-auth-secret
static-auth-secret={{ secret "coturn_shared_secret" }}
realm=turn.{{ env "DOMAIN" }}
log-file=stdout
pidfile=/var/tmp/turnserver.pid
userdb=/var/tmp/turnserver.db
no-cli
no-tls
no-dtls
prod
no-tcp-relay
+8
View File
@@ -0,0 +1,8 @@
{
"m.homeserver": {
"base_url": "https://{{ env "DOMAIN" }}"
}{{ if eq (env "MAS_ENABLED") "1" }},
"org.matrix.msc2965.authentication": {
"issuer": "https://{{ env "DOMAIN" }}/"
}{{ end }}
}
+3
View File
@@ -0,0 +1,3 @@
{
"m.server": "{{ env "DOMAIN" }}:443"
}