[Unit] Description=Seedbox Command Center (adampowell.pro deploy) Documentation=https://github.com/t3h28/adampowell.pro/tree/main/apps/command-center After=network-online.target Wants=network-online.target [Service] Type=simple User=root WorkingDirectory=/var/lib/command-center EnvironmentFile=-/root/secrets.env ExecStart=/var/www/adampowell.pro/apps/command-center/command-center -config /etc/command-center/config # Per WHEN CREATING A NEW APP.md §5 — never Restart=always; 3 failures in # 60s stops the loop so we get a loud failure instead of a silent restart # burn. See SYSTEM.md for the maps/aiomail history that motivates this. Restart=on-failure RestartSec=10 StartLimitIntervalSec=60 StartLimitBurst=3 # Sandbox hardening. We deliberately do NOT use DynamicUser here because the # adampowell.pro convention is `User=root` for backend services (matches # kvh-pulse, case-tracker, todos, sharedtodo, ekg-tutor) so /root/secrets.env # is readable. ProtectSystem=strict # /etc/command-center is writable so the binary can auto-generate the age # identity on first boot when secrets.age_identity_file does not yet exist # (DECISIONS.md D5 + D48). After first boot the file persists at mode 0600. ReadWritePaths=/var/lib/command-center /var/log /etc/command-center ProtectHome=true PrivateTmp=true NoNewPrivileges=true StandardOutput=append:/var/log/command-center.log StandardError=append:/var/log/command-center-error.log [Install] WantedBy=multi-user.target