# /etc/systemd/system/cashumints.service [Unit] Description=cashumints.space indexer and API Wants=network-online.target After=network-online.target # Stop after five failures in a minute rather than restarting forever. A wrong Node on # PATH once produced four thousand identical crashes in the journal before anyone read # one of them; `failed` in `systemctl status` says the same thing in one line. Both keys # belong to [Unit] — under [Service] systemd only warns and ignores them. StartLimitIntervalSec=60 StartLimitBurst=5 [Service] Type=simple User=cashumints Group=cashumints WorkingDirectory=/home/cashumints/CashuMints.space/api # StateDirectory creates /var/lib/cashumints with the service user's ownership. StateDirectory=cashumints Environment=NODE_ENV=production Environment=PORT=8788 Environment=DB_PATH=/var/lib/cashumints/cashumints.db Environment=ICON_DIR=/var/lib/cashumints/icons # Compiled JavaScript, run by the distribution's own node. # # This line used to read `src/index.ts`, which made every start depend on the host # having Node 22.18 or newer for native type stripping. A host with Node 20 answered # that with ERR_UNKNOWN_FILE_EXTENSION in under a second, 464 times over fifteen hours, # and nothing anywhere went red. `pnpm build` now emits api/dist, so what runs here is # ordinary ESM and any Node from 20.18 up will start it. # # Deliberately /usr/bin/node and nothing else: an nvm or fnm path is invisible to this # unit's ProtectHome and breaks silently at the next version bump. ExecStart=/usr/bin/node --env-file-if-exists=../.env dist/index.js Restart=on-failure RestartSec=5s KillSignal=SIGTERM TimeoutStopSec=30s UMask=0027 NoNewPrivileges=true PrivateTmp=true ProtectSystem=strict ProtectHome=read-only ReadWritePaths=/var/lib/cashumints PrivateDevices=true ProtectKernelTunables=true ProtectKernelModules=true ProtectControlGroups=true RestrictAddressFamilies=AF_UNIX AF_INET AF_INET6 [Install] WantedBy=multi-user.target