Compare commits

..
Author SHA1 Message Date
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 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
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
18 changed files with 378 additions and 34 deletions
+29 -1
View File
@@ -33,7 +33,7 @@ ALLOW_PUBLIC_ROOMS_FEDERATION=false
ENABLE_REGISTRATION=false
PASSWORD_LOGIN_ENABLED=true
# Token based registration. Enable ADMIN_INTERFACE_ENABLED=1 (below) to use the admin interface to generate tokens.
# Token based registration. Enable ADMIN_INTERFACE (below) to use the admin interface to generate tokens.
#REGISTRATION_REQUIRES_TOKEN=true
## Room auto-join
@@ -68,6 +68,14 @@ ENCRYPTED_BY_DEFAULT=all
# 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
## Retention
ALLOWED_LIFETIME_MAX=4w
@@ -78,6 +86,11 @@ 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
@@ -126,6 +139,13 @@ RETENTION_MAX_LIFETIME=4w
#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
@@ -179,6 +199,14 @@ RETENTION_MAX_LIFETIME=4w
#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
+3
View File
@@ -52,6 +52,9 @@ For all Bridges:
- 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:
+176 -3
View File
@@ -1,15 +1,188 @@
export DISCORD_BRIDGE_YAML_VERSION=v2
export ENTRYPOINT_CONF_VERSION=v3
export HOMESERVER_YAML_VERSION=v30
export HOMESERVER_YAML_VERSION=v35
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=v8
export NGINX_CONFIG_VERSION=v12
export WK_SERVER_VERSION=v1
export WK_CLIENT_VERSION=v1
export PG_BACKUP_VERSION=v1
export PG_BACKUP_VERSION=v2
export ADMIN_CONFIG_VERSION=v1
export COMPRESS_STATE_ENTRYPOINT_VERSION=v5
# See https://levans.fr/shrink-synapse-database.html
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'
);"
}
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;"
}
# Run via: abra app cmd <domain> compress-state run_compressor
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"
}
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 — run via: abra app cmd <domain> app <command>
# These use the Synapse admin API and 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."
}
set_admin () {
admin=akadmin
+2 -2
View File
@@ -3,13 +3,13 @@ version: "3.8"
services:
admin:
image: awesometechnologies/synapse-admin:0.10.3
image: awesometechnologies/synapse-admin:0.11.4
networks:
- proxy
deploy:
labels:
- "traefik.enable=true"
- "traefik.docker.network=proxy"
- "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"
+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
+1 -1
View File
@@ -9,7 +9,7 @@ services:
- shared_secret_auth
configs:
- source: shared_secret_auth
target: /usr/local/lib/python3.12/site-packages/shared_secret_authenticator.py
target: /usr/local/lib/python3.13/site-packages/shared_secret_authenticator.py
configs:
shared_secret_auth:
+1 -1
View File
@@ -10,7 +10,7 @@ services:
- signal-data:/signal-data
signalbridge:
image: dock.mau.dev/mautrix/signal:v0.7.5
image: dock.mau.dev/mautrix/signal:v0.8.7
depends_on:
- signaldb
configs:
+1 -1
View File
@@ -10,7 +10,7 @@ services:
- telegram-data:/telegram-data
telegrambridge:
image: dock.mau.dev/mautrix/telegram:v0.15.2
image: dock.mau.dev/mautrix/telegram:v0.15.3
depends_on:
- telegramdb
configs:
+30 -17
View File
@@ -3,7 +3,7 @@ version: "3.8"
services:
web:
image: nginx:1.27.4
image: nginx:1.29.6
networks:
- proxy
- internal
@@ -12,6 +12,7 @@ services:
- STACK_NAME
- NGINX_ACCESS_LOG_LOCATION
- NGINX_ERROR_LOG_LOCATION
- MAX_UPLOAD_SIZE
configs:
- source: nginx_config
target: /etc/nginx/nginx.conf
@@ -21,7 +22,7 @@ services:
target: /var/www/.well-known/matrix/client
deploy:
restart_policy:
condition: on-failure
condition: any
labels:
- "traefik.enable=true"
- "traefik.http.services.${STACK_NAME}.loadbalancer.server.port=80"
@@ -30,12 +31,13 @@ services:
- "traefik.http.routers.${STACK_NAME}.tls.certresolver=${LETS_ENCRYPT_ENV}"
healthcheck:
test: curl -f http://${STACK_NAME}_app:8008/health || exit 1
interval: 5s
timeout: 3s
retries: 20
interval: 30s
timeout: 15s
retries: 90
start_period: 2m
app:
image: "matrixdotorg/synapse:v1.124.0"
image: "matrixdotorg/synapse:v1.149.1"
volumes:
- "data:/data"
secrets:
@@ -55,7 +57,19 @@ services:
- 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
@@ -92,34 +106,33 @@ services:
restart_policy:
condition: on-failure
labels:
- "coop-cloud.${STACK_NAME}.version=6.6.1+v1.124.0"
- "coop-cloud.${STACK_NAME}.timeout=${TIMEOUT:-120}"
- "coop-cloud.${STACK_NAME}.version=7.0.2+v1.149.1"
- "coop-cloud.${STACK_NAME}.timeout=${TIMEOUT}"
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8008/health"]
interval: 30s
timeout: 10s
retries: 10
retries: 30
start_period: 1m
db:
image: postgres:13-alpine
image: pgautoupgrade/pgautoupgrade:17-alpine
secrets:
- db_password
environment:
- LC_COLLATE=C
- LC_CTYPE=C
- POSTGRES_DB=synapse
- POSTGRES_INITDB_ARGS="-E \"UTF8\""
- POSTGRES_INITDB_ARGS=-E UTF8
- POSTGRES_PASSWORD_FILE=/run/secrets/db_password
- POSTGRES_USER=synapse
- DOMAIN
networks:
- internal
healthcheck:
test: ["CMD", "pg_isready", "-U", "synapse"]
interval: 30s
timeout: 10s
retries: 10
retries: 20
start_period: 1m
volumes:
- postgres:/var/lib/postgresql/data
@@ -128,11 +141,11 @@ services:
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'
backupbot.restore.post-hook: "/pg_backup.sh restore"
configs:
- source: pg_backup
target: /pg_backup.sh
mode: 0555
- source: pg_backup
target: /pg_backup.sh
mode: 0555
volumes:
data:
+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
+37 -3
View File
@@ -16,6 +16,12 @@ 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
require_auth_for_profile_requests: {{ env "REQUIRE_AUTH_FOR_PROFILE_REQUESTS" }}
# https://element-hq.github.io/synapse/latest/usage/configuration/config_documentation.html#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" }}
# https://matrix-org.github.io/synapse/latest/usage/configuration/config_documentation.html#serve_server_wellknown
serve_server_wellknown: {{ env "SERVE_SERVER_WELLKNOWN" }}
@@ -52,6 +58,11 @@ listeners:
{{ 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
admin_contact: 'mailto:{{ env "ADMIN_EMAIL" }}'
@@ -132,6 +143,7 @@ turn_allow_guests: {{ env "TURN_ALLOW_GUESTS" }}
# https://matrix-org.github.io/synapse/latest/usage/configuration/config_documentation.html#enable_registration
enable_registration: {{ env "ENABLE_REGISTRATION" }}
# https://element-hq.github.io/synapse/latest/usage/configuration/config_documentation.html#registration_requires_token
registration_requires_token: {{ env "REGISTRATION_REQUIRES_TOKEN" }}
# https://matrix-org.github.io/synapse/latest/usage/configuration/config_documentation.html#enable_3pid_lookup
@@ -145,13 +157,28 @@ 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
track_puppeted_user_ips: {{ env "TRACK_PUPPETED_USER_IPS" }}
{{ 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" }}
@@ -166,6 +193,12 @@ 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
@@ -248,9 +281,10 @@ encryption_enabled_by_default_for_room_type: {{ env "ENCRYPTED_BY_DEFAULT" }}
# https://matrix-org.github.io/synapse/latest/usage/configuration/config_documentation.html#user_directory
user_directory:
enabled: true
search_all_users: true
prefer_local_users: true
enabled: {{ env "USER_DIRECTORY_ENABLED" }}
search_all_users: {{ env "USER_DIRECTORY_SEARCH_ALL_USERS" }}
prefer_local_users: {{ env "USER_DIRECTORY_PREFER_LOCAL_USERS" }}
show_locked_users: {{ env "USER_DIRECTORY_SHOW_LOCKED_USERS" }}
# https://matrix-org.github.io/synapse/latest/usage/configuration/config_documentation.html#media_retention
media_retention:
+13 -3
View File
@@ -5,6 +5,16 @@ events {
}
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;
}
server {
listen 80;
@@ -14,7 +24,7 @@ http {
server_name {{ env "DOMAIN" }};
location = / {
proxy_pass http://{{ env "STACK_NAME"}}_app:8008;
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;
@@ -23,7 +33,7 @@ http {
}
location ~* ^(\/_matrix|\/_synapse\/client) {
proxy_pass http://{{ env "STACK_NAME"}}_app:8008;
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;
@@ -42,7 +52,7 @@ http {
if ($http_referer !~ "^https://{{ env "DOMAIN" }}/admin/") {
return 403;
}
proxy_pass http://{{ env "STACK_NAME"}}_app:8008;
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;
+2 -2
View File
@@ -6,7 +6,7 @@ BACKUP_FILE='/var/lib/postgresql/data/backup.sql'
function backup {
export PGPASSWORD=$(cat $POSTGRES_PASSWORD_FILE)
pg_dump -U ${POSTGRES_USER} ${POSTGRES_DB} > $BACKUP_FILE
pg_dump -U ${POSTGRES_USER} ${POSTGRES_DB} | gzip > $BACKUP_FILE
}
function restore {
@@ -25,7 +25,7 @@ function restore {
# Recreate Database
psql -U ${POSTGRES_USER} -d postgres -c "DROP DATABASE ${POSTGRES_DB} WITH (FORCE);"
createdb -U ${POSTGRES_USER} ${POSTGRES_DB}
psql -U ${POSTGRES_USER} -d ${POSTGRES_DB} -1 -f $BACKUP_FILE
gunzip -c $BACKUP_FILE | psql -U ${POSTGRES_USER} -d ${POSTGRES_DB} -1 -f -
trap - EXIT INT TERM
restore_config
+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.