{ inputs, flake, self, }: { pkgs, lib, config, ... }: let cfg = config.hectic.services.matrix; s3Cfg = cfg.objectStorage.s3; matrixUsers = builtins.attrNames cfg.users; s3Plugin = pkgs.matrix-synapse-plugins.matrix-synapse-s3-storage-provider; s3ConfigDir = "/run/matrix-synapse"; s3ConfigFile = "${s3ConfigDir}/s3-media-storage.yaml"; mkUserRegistration = name: let user = cfg.users.${name}; adminFlag = if user.admin then "--admin" else "--no-admin"; in '' if [ ! -r "${user.passwordFile}" ]; then printf 'Missing Matrix password file for %s: %s\n' '${name}' '${user.passwordFile}' >&2 exit 1 fi ${pkgs.matrix-synapse}/bin/register_new_matrix_user \ -u '${name}' \ -p "$(tr -d '\n' < "${user.passwordFile}")" \ -k "$REGISTRATION_SHARED_SECRET" \ ${adminFlag} \ http://127.0.0.1:8008 || true ''; mkS3Config = '' if [ ! -r "${s3Cfg.credentialsFile}" ]; then printf 'Missing Matrix object storage credentials file: %s\n' '${s3Cfg.credentialsFile}' >&2 exit 1 fi . "${s3Cfg.credentialsFile}" if [ -z "$ACCESS_KEY_ID" ] || [ -z "$SECRET_ACCESS_KEY" ]; then printf 'ACCESS_KEY_ID or SECRET_ACCESS_KEY missing in %s\n' '${s3Cfg.credentialsFile}' >&2 exit 1 fi mkdir -p "${s3ConfigDir}" cat > "${s3ConfigFile}" </dev/null; do sleep 2 done REGISTRATION_SHARED_SECRET="$(awk -F': *' '$1 == "registration_shared_secret" { print $2; exit }' "${cfg.secretsFile}")" if [ -z "$REGISTRATION_SHARED_SECRET" ]; then printf 'registration_shared_secret not found in %s\n' '${cfg.secretsFile}' >&2 exit 1 fi ${builtins.concatStringsSep "\n" (map mkUserRegistration matrixUsers)} ''; }; }) (lib.mkIf (cfg.enable && s3Cfg.enable) { systemd.services.matrix-synapse-s3-config = { description = "Generate Synapse S3 media storage config"; before = [ config.services.matrix-synapse.serviceUnit ]; requiredBy = [ config.services.matrix-synapse.serviceUnit ]; serviceConfig.Type = "oneshot"; script = mkS3Config; }; systemd.services.matrix-synapse-s3-media-sync = lib.mkIf s3Cfg.sync.enable { description = "Sync Matrix media to S3-compatible object storage"; after = [ config.services.matrix-synapse.serviceUnit ]; wants = [ config.services.matrix-synapse.serviceUnit ]; serviceConfig = { Type = "oneshot"; User = "matrix-synapse"; WorkingDirectory = "/var/lib/matrix-synapse"; }; script = mkS3SyncScript; }; systemd.timers.matrix-synapse-s3-media-sync = lib.mkIf s3Cfg.sync.enable { wantedBy = [ "timers.target" ]; timerConfig.OnCalendar = s3Cfg.sync.onCalendar; }; }) ]; }