{ config, pkgs, lib, ... }: lib.mkIf config.sovran_systemsOS.services.synapse { services.postgresql = { ensureDatabases = [ "matrix-synapse" ]; ensureUsers = [ { name = "matrix-synapse"; ensureDBOwnership = true; } ]; }; # ── Generate registration secret if missing ───────────────── systemd.services.matrix-synapse-secret-init = { description = "Generate Matrix Synapse registration secret if missing"; wantedBy = [ "multi-user.target" ]; before = [ "matrix-synapse.service" ]; serviceConfig = { Type = "oneshot"; RemainAfterExit = true; }; path = [ pkgs.pwgen pkgs.coreutils ]; script = '' SECRET_FILE="/var/lib/matrix-synapse/registration-secret" if [ ! -f "$SECRET_FILE" ]; then mkdir -p /var/lib/matrix-synapse pwgen -s 64 1 > "$SECRET_FILE" chown matrix-synapse:matrix-synapse "$SECRET_FILE" chmod 600 "$SECRET_FILE" echo "Generated Matrix registration secret" else echo "Matrix registration secret already exists, skipping" fi ''; }; # ── Generate DB password if missing ───────────────────────── systemd.services.matrix-synapse-db-init = { description = "Generate Matrix Synapse DB password if missing"; wantedBy = [ "multi-user.target" ]; before = [ "matrix-synapse.service" ]; serviceConfig = { Type = "oneshot"; RemainAfterExit = true; }; path = [ pkgs.pwgen ]; script = '' SECRET_FILE="/var/lib/matrix-synapse/db-password" if [ ! -f "$SECRET_FILE" ]; then mkdir -p /var/lib/matrix-synapse pwgen -s 32 1 > "$SECRET_FILE" chown matrix-synapse:matrix-synapse "$SECRET_FILE" chmod 600 "$SECRET_FILE" echo "Generated new DB password at $SECRET_FILE" else echo "DB password already exists, skipping" fi ''; }; # ── Generate runtime config from domain files ─────────────── systemd.services.matrix-synapse-runtime-config = { description = "Generate Synapse runtime config from domain files"; before = [ "matrix-synapse.service" ]; after = [ "matrix-synapse-db-init.service" "matrix-synapse-secret-init.service" ]; requiredBy = [ "matrix-synapse.service" ]; wantedBy = [ "multi-user.target" ]; serviceConfig = { Type = "oneshot"; RemainAfterExit = true; }; unitConfig = { ConditionPathExists = "/var/lib/domains/matrix"; }; path = [ pkgs.coreutils ]; script = '' MATRIX=$(cat /var/lib/domains/matrix) mkdir -p /run/matrix-synapse cat > /run/matrix-synapse/runtime-config.yaml < /dev/null; then break fi sleep 2 done DOMAIN=$(cat /var/lib/domains/matrix) CREDS_FILE="/var/lib/secrets/matrix-users" SECRET=$(cat /var/lib/matrix-synapse/registration-secret) # Only run if we haven't already generated the file if [ ! -f "$CREDS_FILE" ]; then mkdir -p /var/lib/secrets ADMIN_USER="admin" ADMIN_PASS=$(pwgen -s 24 1) TEST_USER="test" TEST_PASS=$(pwgen -s 24 1) # Create Admin user register_new_matrix_user -c /run/matrix-synapse/runtime-config.yaml \ -u "$ADMIN_USER" -p "$ADMIN_PASS" -a http://localhost:8008 # Create Test user (non-admin) register_new_matrix_user -c /run/matrix-synapse/runtime-config.yaml \ -u "$TEST_USER" -p "$TEST_PASS" --no-admin http://localhost:8008 # Save the credentials cat > "$CREDS_FILE" << CREDS Matrix (Element) Credentials ════════════════════════════ Homeserver URL: https://$DOMAIN [ Admin Account ] Username: @$ADMIN_USER:$DOMAIN Password: $ADMIN_PASS [ Test Account ] Username: @$TEST_USER:$DOMAIN Password: $TEST_PASS CREDS chmod 600 "$CREDS_FILE" echo "Matrix users created successfully." fi ''; }; sovran_systemsOS.domainRequirements = [ { name = "matrix"; label = "Matrix Synapse"; example = "matrix.yourdomain.com"; } ]; }