# ERP-Core API — production (erp.hexdive.com). # # This unit holds only what never changes. Everything configurable — listening URL, connection # string, AuthHex/GL URLs, storage paths — is written by .gitea/workflows/ci-cd.yml into # /etc/systemd/system/erpcore.service.d/10-erpcore-env.conf # on every backend deploy, from the values in that workflow's `env:` block plus Gitea secrets. # There is no /etc/erpcore/erpcore.env any more. To change a setting, edit the workflow and # redeploy (docs/40-DEPLOYMENT.md, "Active" A.2/A.3). # # The workflow installs this file itself, so editing it here and deploying is enough. [Unit] Description=ERP core service After=network-online.target postgresql-16.service Wants=network-online.target # Stop hammering the database if a release crash-loops: give up after 5 starts in 5 minutes # (systemd then reports "failed", which is what wait-healthy.sh watches for). StartLimitIntervalSec=300 StartLimitBurst=5 [Service] Type=simple User=erpuser Group=erpuser WorkingDirectory=/home/erp/core/publish ExecStart=/home/erp/core/publish/ERPCore SyslogIdentifier=erpcore Environment=ASPNETCORE_ENVIRONMENT=Production Environment=DOTNET_PRINT_TELEMETRY_MESSAGE=false Environment=DOTNET_CLI_TELEMETRY_OPTOUT=1 Restart=always RestartSec=10 TimeoutStopSec=30 # Shared 8 GB VPS: a runaway process must not take Gitea/Postgres/AuthHex down with it. MemoryMax=768M # Hardening. No ProtectHome: the app itself lives under /home/erp. NoNewPrivileges=true PrivateTmp=true ProtectSystem=full [Install] WantedBy=multi-user.target