{ config, pkgs, lib, ... }: let cfg = config.sovran_systemsOS.services.wordpress; in { options.sovran_systemsOS.services.wordpress = { enable = lib.mkEnableOption "WordPress (raw PHP served by Caddy)"; }; config = lib.mkIf cfg.enable { # ── Caddy vhost is now handled centrally in caddy.nix ───── # ── MariaDB database ────────────────────────────────────── services.mysql = { enable = true; package = pkgs.mariadb; }; # ── Auto-generate DB password and initialize ────────────── systemd.services.wordpress-db-init = { description = "Initialize WordPress MariaDB database with auto-generated password"; after = [ "mysql.service" ]; requires = [ "mysql.service" ]; before = [ "wordpress-init.service" ]; wantedBy = [ "multi-user.target" ]; serviceConfig = { Type = "oneshot"; RemainAfterExit = true; }; path = [ config.services.mysql.package pkgs.pwgen pkgs.coreutils ]; script = '' set -euo pipefail SECRET_FILE="/var/lib/secrets/wordpressdb" # 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") mysql -u root </dev/null; then break fi sleep 2 done # ── Run WordPress install ─────────────────────── echo "Running WordPress core install..." su -s /bin/sh caddy -c " wp core install \ --url='https://$DOMAIN' \ --title='Sovran_SystemsOS' \ --admin_user='$ADMIN_USER' \ --admin_password='$ADMIN_PASS' \ --admin_email='$ADMIN_EMAIL' \ --skip-email " # ── Configure WordPress settings ──────────────── echo "Configuring WordPress..." su -s /bin/sh caddy -c " wp option update blogdescription 'Powered by Sovran_SystemsOS' wp option update permalink_structure '/%postname%/' wp option update default_ping_status 'closed' wp option update default_comment_status 'closed' wp rewrite flush " # ── Security hardening ────────────────────────── echo "Applying security settings..." su -s /bin/sh caddy -c " wp config set DISALLOW_FILE_EDIT true --raw wp config set WP_AUTO_UPDATE_CORE true --raw wp config set FORCE_SSL_ADMIN true --raw " # ── Save admin credentials ────────────────────── CREDS_FILE="/var/lib/secrets/wordpress-admin" cat > "$CREDS_FILE" << CREDS WordPress Admin Credentials ═══════════════════════════ URL: https://$DOMAIN/wp-admin/ Username: $ADMIN_USER Password: $ADMIN_PASS Email: $ADMIN_EMAIL CREDS chmod 600 "$CREDS_FILE" echo "" echo "══════════════════════════════════════════════" echo " WordPress installation complete!" echo "" echo " URL: https://$DOMAIN/wp-admin/" echo " Username: $ADMIN_USER" echo " Password: $ADMIN_PASS" echo "" echo " Credentials saved to: $CREDS_FILE" echo "══════════════════════════════════════════════" ''; }; # ── Ensure directories ──────────────────────────────────── systemd.tmpfiles.rules = [ "d /var/lib/www 0755 caddy root -" "d /var/lib/www/wordpress 0755 caddy root -" ]; environment.systemPackages = with pkgs; [ wp-cli unzip ]; }; }