{ config, pkgs, lib, ... }: let cfg = config.sovran_systemsOS.services.nextcloud; in { options.sovran_systemsOS.services.nextcloud = { enable = lib.mkEnableOption "Nextcloud (raw PHP served by Caddy)"; }; config = lib.mkIf cfg.enable { # ── Caddy vhost is now handled centrally in caddy.nix ───── # ── PostgreSQL database ─────────────────────────────────── services.postgresql = { enable = true; }; # ── Auto-generate DB password and initialize ────────────── systemd.services.nextcloud-db-init = { description = "Initialize Nextcloud PostgreSQL database with auto-generated password"; after = [ "postgresql.service" ]; requires = [ "postgresql.service" ]; before = [ "nextcloud-init.service" ]; wantedBy = [ "multi-user.target" ]; serviceConfig = { Type = "oneshot"; RemainAfterExit = true; }; path = [ config.services.postgresql.package pkgs.pwgen pkgs.coreutils ]; script = '' set -euo pipefail SECRET_FILE="/var/lib/secrets/nextclouddb" # Existing machines already have this file — leave it alone if [ ! -f "$SECRET_FILE" ]; then mkdir -p /var/lib/secrets pwgen -s 64 1 > "$SECRET_FILE" chmod 600 "$SECRET_FILE" fi DB_PASS=$(cat "$SECRET_FILE") # Create role if it doesn't exist, update password either way psql -U postgres </dev/null; then echo "Database ready." break fi sleep 2 done # ── Run Nextcloud install via occ ─────────────── echo "Running Nextcloud installation..." su -s /bin/sh caddy -c " php $INSTALL_DIR/occ maintenance:install \ --database 'pgsql' \ --database-name '$DB_NAME' \ --database-user '$DB_USER' \ --database-pass '$DB_PASS' \ --database-host '$DB_HOST' \ --admin-user '$ADMIN_USER' \ --admin-pass '$ADMIN_PASS' \ --data-dir '$DATA_DIR' " # ── Configure trusted domains ─────────────────── echo "Configuring trusted domains..." su -s /bin/sh caddy -c " php $INSTALL_DIR/occ config:system:set trusted_domains 0 --value='$DOMAIN' php $INSTALL_DIR/occ config:system:set overwrite.cli.url --value='https://$DOMAIN' php $INSTALL_DIR/occ config:system:set overwriteprotocol --value='https' " # ── Set recommended settings ─��────────────────── echo "Applying recommended settings..." su -s /bin/sh caddy -c " php $INSTALL_DIR/occ config:system:set default_phone_region --value='US' php $INSTALL_DIR/occ config:system:set memcache.local --value='\OC\Memcache\APCu' php $INSTALL_DIR/occ background:cron " # ── Install default apps ──────────────────────── echo "Installing default apps..." su -s /bin/sh caddy -c " php $INSTALL_DIR/occ app:install calendar || true php $INSTALL_DIR/occ app:install contacts || true php $INSTALL_DIR/occ app:install tasks || true php $INSTALL_DIR/occ app:install notes || true php $INSTALL_DIR/occ app:install deck || true php $INSTALL_DIR/occ app:enable calendar || true php $INSTALL_DIR/occ app:enable contacts || true php $INSTALL_DIR/occ app:enable tasks || true php $INSTALL_DIR/occ app:enable notes || true php $INSTALL_DIR/occ app:enable deck || true " # ── Save admin credentials ────────────────────── CREDS_FILE="/var/lib/secrets/nextcloud-admin" cat > "$CREDS_FILE" << CREDS Nextcloud Admin Credentials ═══════════════════════════ URL: https://$DOMAIN/ Username: $ADMIN_USER Password: $ADMIN_PASS CREDS chmod 600 "$CREDS_FILE" echo "" echo "══════════════════════════════════════════════" echo " Nextcloud installation complete!" echo "" echo " URL: https://$DOMAIN/" echo " Username: $ADMIN_USER" echo " Password: $ADMIN_PASS" echo "" echo " Installed apps: Calendar, Contacts, Tasks," echo " Notes, Deck" echo "" echo " Credentials saved to: $CREDS_FILE" echo "══════════════════════════════════════════════" ''; }; # ── Cron ────────────────────────────────────────────────── services.cron.systemCronJobs = [ "*/5 * * * * caddy /run/current-system/sw/bin/php -f /var/lib/www/nextcloud/cron.php" ]; # ── Ensure directories ──────────────────────────────────── systemd.tmpfiles.rules = [ "d /var/lib/www 0755 caddy root -" "d /var/lib/www/nextcloud 0750 caddy root -" "d /var/lib/www/nextcloud-data 0770 caddy root -" ]; environment.systemPackages = with pkgs; [ unzip ]; }; }