How to make pocket-id systemd service restart gracefully

There’s a couple recent changes to pocket id that are causing the database to hang temporarily, which can cause its health check to fail. See the issue on github: 🐛 Bug Report: application crashes constantly with database lock failures · Issue #1598 · pocket-id/pocket-id · GitHub .

The maintainers for pocket-id have already merged commits that should reduce the load on the database, preventing the health checks from failing.

However, for the time being before that’s released in a new version, I basically can’t use pocket-id, since the systemd unit fails to restart the service gracefully. I have a pretty default configuration of pocket-id in my nixos config, just setting some environment variables with the settings attrset (I am using nixos-unstable nixpkgs commit 624af665418d3c65d544145b4d34ad696439570e):

{
  config,
  pkgs,
  lib,
  inputs,
  ...
}:

{
  services.pocket-id = {
    enable = true;
    settings = {
      ANALYTICS_DISABLED = true;
      PORT = 1411;
      APP_URL = "<>";
      ENCRYPTION_KEY_FILE = config.age.secrets.pocketid-encryption-key.path;
      TRUST_PROXY = true;
      SMTP_HOST = "<>";
      SMTP_PORT = 465;
      SMTP_FROM = "<>";
      SMTP_USER = "<>";
      SMTP_PASSWORD_FILE = config.age.secrets.pocketid-mailer-password.path;
      SMTP_TLS = "tls";
      LOG_LEVEL = "debug";
    };
  };
  age.secrets = {
    pocketid-mailer-password = {
      file = ./secrets/pocketid-mailer-password.age;
      mode = "400";
      owner = "pocket-id";
    };
    pocketid-encryption-key = {
      file = ./secrets/pocketid-encryption-key.age;
      mode = "400";
      owner = "pocket-id";
    };
  };
}

This creates the following service file

service
[Unit]
After=network.target
Description=Pocket ID
X-Restart-Triggers=/nix/store/bmqvd43h64yr06bidrnqwwmwp9lj03pz-X-Restart-Triggers-pocket-id

[Service]
Environment="LOCALE_ARCHIVE=/nix/store/m8nn5ci788h2xbswl4dnz1rzgahfmsw2-glibc-locales-2.42-67/lib/locale/locale-archive"
Environment="PATH=/nix/store/mp8s10fwm685azvvv1qq7zyf7iajjlj8-coreutils-9.11/bin:/nix/store/m1p6gxgxis75rn0d549ny2y8gpxjv9pd-findutils-4.10.0/bin:/nix/store/xj9dgyqrcq8hrf4mrkvbcp4pa3hgrbhy-gnugrep-3.12/bin:/nix/store/x2kfd3hnhqk8d6kxkyffpk7lyaz8iy76-gnused-4.10/bin:/nix/store/axx9bvf0dmah41f39ds9xdkds1lsz6z9-systemd-261/bin:/nix/store/mp8s10fwm685azvvv1qq7zyf7iajjlj8-coreutils-9.11/sbin:/nix/store/m1p6gxgxis75rn0d549ny2y8gpxjv9pd-findutils-4.10.0/sbin:/nix/store/xj9dgyqrcq8hrf4mrkvbcp4pa3hgrbhy-gnugrep-3.12/sbin:/nix/store/x2kfd3hnhqk8d6kxkyffpk7lyaz8iy76-gnused-4.10/sbin:/nix/store/axx9bvf0dmah41f39ds9xdkds1lsz6z9-systemd-261/sbin"
Environment="TZDIR=/nix/store/q30qxdihnn8xrihbdzy1r8iz1zvjkqzn-tzdata-2026b/share/zoneinfo"
AmbientCapabilities=
CapabilityBoundingSet=
DeviceAllow=
DevicePolicy=closed
EnvironmentFile=/dev/null
EnvironmentFile=/nix/store/r5vbvqwbal5v9z38gjdahbcyc4ij29kq-pocket-id-env-vars
ExecStart=/nix/store/lm38ymdqvwlz1iah9mszs3bm4c38w40b-unit-script-pocket-id-start/bin/pocket-id-start
Group=pocket-id
LockPersonality=true
MemoryDenyWriteExecute=true
NoNewPrivileges=true
PrivateDevices=true
PrivateNetwork=false
PrivateTmp=true
PrivateUsers=true
ProcSubset=pid
ProtectClock=true
ProtectControlGroups=true
ProtectHome=true
ProtectHostname=true
ProtectKernelLogs=true
ProtectKernelModules=true
ProtectKernelTunables=true
ProtectProc=invisible
ProtectSystem=strict
ReadWritePaths=/var/lib/pocket-id
RemoveIPC=true
Restart=always
RestartSec=1
RestrictAddressFamilies=AF_UNIX
RestrictAddressFamilies=AF_INET
RestrictAddressFamilies=AF_INET6
RestrictNamespaces=true
RestrictRealtime=true
RestrictSUIDSGID=true
SystemCallArchitectures=native
SystemCallFilter=~ @clock @cpu-emulation @debug @module @mount @obsolete @privileged @raw-io @reboot @resources @swap
Type=simple
UMask=0077
User=pocket-id
WorkingDirectory=/var/lib/pocket-id

[Install]
WantedBy=multi-user.target

I’ve pasted the journal for the pocket-id service below

logs
Jul 29 17:05:04 nixos pocket-id-start[1094845]: Jul 29 17:05:04 DBG Sending health check to the provider app=pocket-id version=2.11.0 scope=actor-host hostId=<MY_HOST_ID>
Jul 29 17:05:14 nixos pocket-id-start[1094845]: Jul 29 17:05:14 DBG Sending health check to the provider app=pocket-id version=2.11.0 scope=actor-host hostId=<MY_HOST_ID>
Jul 29 17:05:14 nixos pocket-id-start[1094845]: Jul 29 17:05:14 DBG Renewed application lock app=pocket-id version=2.11.0 process_id=1094845 host_id=nixos duration=45.404782ms
Jul 29 17:05:24 nixos pocket-id-start[1094845]: Jul 29 17:05:24 DBG Sending health check to the provider app=pocket-id version=2.11.0 scope=actor-host hostId=<MY_HOST_ID>
Jul 29 17:05:27 nixos pocket-id-start[1094845]: Jul 29 17:05:27 ERR Error while renewing leases for alarms app=pocket-id version=2.11.0 scope=actor-host hostId=<MY_HOST_ID> error="query error: database is locked (5) (SQLITE_BUSY)"
Jul 29 17:05:28 nixos pocket-id-start[1094845]: Jul 29 17:05:28 ERR Failed to fetch alarms app=pocket-id version=2.11.0 scope=actor-host hostId=<MY_HOST_ID> error="error fetching alarms: failed to begin transaction: database is locked (5) (SQLITE_BUSY)"
Jul 29 17:05:34 nixos pocket-id-start[1094845]: Jul 29 17:05:34 DBG Sending health check to the provider app=pocket-id version=2.11.0 scope=actor-host hostId=<MY_HOST_ID>
Jul 29 17:05:34 nixos pocket-id-start[1094845]: Jul 29 17:05:34 DBG Renewed application lock app=pocket-id version=2.11.0 process_id=1094845 host_id=nixos duration=41.288514ms
Jul 29 17:05:44 nixos pocket-id-start[1094845]: Jul 29 17:05:44 DBG Sending health check to the provider app=pocket-id version=2.11.0 scope=actor-host hostId=<MY_HOST_ID>
Jul 29 17:05:54 nixos pocket-id-start[1094845]: Jul 29 17:05:54 DBG Sending health check to the provider app=pocket-id version=2.11.0 scope=actor-host hostId=<MY_HOST_ID>
Jul 29 17:05:54 nixos pocket-id-start[1094845]: Jul 29 17:05:54 DBG Renewed application lock app=pocket-id version=2.11.0 process_id=1094845 host_id=nixos duration=45.994519ms
Jul 29 17:05:59 nixos pocket-id-start[1094845]: Jul 29 17:05:59 INF Request app=pocket-id version=2.11.0 status=200 method=GET path=/ query="" route="" ip=<MY_IP_ADDRESS> latency=178.17µs referer="" user_agent=Uptime-Kuma/2.4.0 body_size=5174
Jul 29 17:06:04 nixos pocket-id-start[1094845]: Jul 29 17:06:04 DBG Sending health check to the provider app=pocket-id version=2.11.0 scope=actor-host hostId=<MY_HOST_ID>
Jul 29 17:06:14 nixos pocket-id-start[1094845]: Jul 29 17:06:14 DBG Renewed application lock app=pocket-id version=2.11.0 process_id=1094845 host_id=nixos duration=5.130986ms
Jul 29 17:06:14 nixos pocket-id-start[1094845]: Jul 29 17:06:14 DBG Sending health check to the provider app=pocket-id version=2.11.0 scope=actor-host hostId=<MY_HOST_ID>
Jul 29 17:06:24 nixos pocket-id-start[1094845]: Jul 29 17:06:24 DBG Sending health check to the provider app=pocket-id version=2.11.0 scope=actor-host hostId=<MY_HOST_ID>
Jul 29 17:06:34 nixos pocket-id-start[1094845]: Jul 29 17:06:34 DBG Sending health check to the provider app=pocket-id version=2.11.0 scope=actor-host hostId=<MY_HOST_ID>
Jul 29 17:06:37 nixos pocket-id-start[1094845]: Jul 29 17:06:37 ERR Failed to fetch alarms app=pocket-id version=2.11.0 scope=actor-host hostId=<MY_HOST_ID> error="error fetching alarms: failed to begin transaction: database is locked (5) (SQLITE_BUSY)"
Jul 29 17:06:37 nixos pocket-id-start[1094845]: Jul 29 17:06:37 WRN Health check error; will retry app=pocket-id version=2.11.0 scope=actor-host hostId=<MY_HOST_ID> error="failed to update host: failed to begin transaction: database is locked (5) (SQLITE_BUSY)"
Jul 29 17:06:37 nixos pocket-id-start[1094845]: Jul 29 17:06:37 ERR Error while renewing leases for alarms app=pocket-id version=2.11.0 scope=actor-host hostId=<MY_HOST_ID> error="query error: database is locked (5) (SQLITE_BUSY)"
Jul 29 17:06:39 nixos pocket-id-start[1094845]: Jul 29 17:06:39 ERR Failed to fetch alarms app=pocket-id version=2.11.0 scope=actor-host hostId=<MY_HOST_ID> error="error fetching alarms: failed to begin transaction: database is locked (5) (SQLITE_BUSY)"
Jul 29 17:06:40 nixos pocket-id-start[1094845]: Jul 29 17:06:40 WRN Health check error; will retry app=pocket-id version=2.11.0 scope=actor-host hostId=<MY_HOST_ID> error="failed to update host: failed to begin transaction: database is locked (5) (SQLITE_BUSY)"
Jul 29 17:06:42 nixos pocket-id-start[1094845]: Jul 29 17:06:42 ERR Failed to fetch alarms app=pocket-id version=2.11.0 scope=actor-host hostId=<MY_HOST_ID> error="error fetching alarms: failed to begin transaction: database is locked (5) (SQLITE_BUSY)"
Jul 29 17:06:43 nixos pocket-id-start[1094845]: Jul 29 17:06:43 WRN Health check error; will retry app=pocket-id version=2.11.0 scope=actor-host hostId=<MY_HOST_ID> error="failed to update host: failed to begin transaction: database is locked (5) (SQLITE_BUSY)"
Jul 29 17:06:43 nixos pocket-id-start[1094845]: Jul 29 17:06:43 ERR Health check failed app=pocket-id version=2.11.0 scope=actor-host hostId=<MY_HOST_ID> error="failed to update host: failed to begin transaction: database is locked (5) (SQLITE_BUSY)"
Jul 29 17:06:43 nixos pocket-id-start[1094845]: Jul 29 17:06:43 DBG Stopped background health checks app=pocket-id version=2.11.0 scope=actor-host hostId=<MY_HOST_ID>
Jul 29 17:06:43 nixos pocket-id-start[1094845]: Jul 29 17:06:43 DBG Stopping background cleanup of expired data app=pocket-id version=2.11.0 scope=actor-host
Jul 29 17:06:43 nixos pocket-id-start[1094845]: Jul 29 17:06:43 DBG Stopped background lease renewal app=pocket-id version=2.11.0 scope=actor-host hostId=<MY_HOST_ID>
Jul 29 17:06:44 nixos pocket-id-start[1094845]: Jul 29 17:06:44 ERR Failed to fetch alarms app=pocket-id version=2.11.0 scope=actor-host hostId=<MY_HOST_ID> error="error fetching alarms: failed to begin transaction: database is locked (5) (SQLITE_BUSY)"
Jul 29 17:06:44 nixos pocket-id-start[1094845]: Jul 29 17:06:44 ERR Failed to fetch alarms app=pocket-id version=2.11.0 scope=actor-host hostId=<MY_HOST_ID> error="error fetching alarms: failed to begin transaction: context canceled"
Jul 29 17:06:44 nixos pocket-id-start[1094845]: Jul 29 17:06:44 DBG Stopped background alarm fetcher app=pocket-id version=2.11.0 scope=actor-host hostId=<MY_HOST_ID>
Jul 29 17:06:47 nixos pocket-id-start[1094845]: Jul 29 17:06:47 WRN Error unregistering actor host app=pocket-id version=2.11.0 scope=actor-host hostId=<MY_HOST_ID> error="error executing query: database is locked (5) (SQLITE_BUSY)"
Jul 29 17:06:47 nixos pocket-id-start[1094845]: Jul 29 17:06:47 INF Job scheduler shut down app=pocket-id version=2.11.0
Jul 29 17:06:50 nixos pocket-id-start[1094845]: Jul 29 17:06:50 DBG Application lock renewal attempt failed app=pocket-id version=2.11.0 error="context deadline exceeded" duration=16.05825164s
Jul 29 17:06:50 nixos pocket-id-start[1094845]: Jul 29 17:06:50 ERR Failed to run pocket-id app=pocket-id version=2.11.0 error="failed to run services: failed to perform health check: failed to update host: failed to begin transaction: database is locked (5) (SQLITE_BUSY)"
Jul 29 17:06:50 nixos systemd[1]: pocket-id.service: Main process exited, code=exited, status=1/FAILURE
Jul 29 17:06:50 nixos systemd[1]: pocket-id.service: Failed with result 'exit-code'.
Jul 29 17:06:50 nixos systemd[1]: pocket-id.service: Consumed 2.845s CPU time over 28min 16.181s wall clock time, 25.1M memory peak, 2.2M read from disk, 1.4M written to disk, 266K incoming IP traffic, 722.6K outgoing IP traffic.
Jul 29 17:06:51 nixos systemd[1]: pocket-id.service: Scheduled restart job, restart counter is at 1.
Jul 29 17:06:51 nixos systemd[1]: Started Pocket ID.
Jul 29 17:06:52 nixos pocket-id-start[1097974]: Jul 29 17:06:52 INF Pocket ID is starting app=pocket-id version=2.11.0
Jul 29 17:06:52 nixos pocket-id-start[1097974]: Jul 29 17:06:52 INF Connected to database app=pocket-id version=2.11.0 provider=sqlite
Jul 29 17:06:52 nixos pocket-id-start[1097974]: Jul 29 17:06:52 DBG SQL query executed [301.631µs] app=pocket-id version=2.11.0 query="INSERT INTO kv (key, value)\n\t\t\tVALUES ('instance_id', \"c5f20e79-9cd4-48be-b85c-c46a08d47d95\")\n\t\t\tON CONFLICT (key) DO UPDATE SET\n\t\t\t\tvalue = CASE\n\t\t\t\t\tWHEN kv.value = '' THEN excluded.value\n\t\t\t\t\tELSE kv.value\n\t\t\t\tEND\n\t\t\tRETURNING value" duration=301.631µs rows=1 file=github.com/pocket-id/pocket-id/backend/internal/instanceid/instanceid.go:37
Jul 29 17:06:52 nixos pocket-id-start[1097974]: Jul 29 17:06:52 DBG SQL query executed [234.677µs] app=pocket-id version=2.11.0 query="SELECT * FROM `app_config_variables`" duration=234.677µs rows=0 file=github.com/pocket-id/pocket-id/backend/internal/service/app_config_service.go:345
Jul 29 17:06:52 nixos pocket-id-start[1097974]: Jul 29 17:06:52 WRN MAXMIND_LICENSE_KEY environment variable is empty: the GeoLite2 City database won't be updated app=pocket-id version=2.11.0
Jul 29 17:06:52 nixos pocket-id-start[1097974]: Jul 29 17:06:52 DBG SQL query executed [175.285µs] app=pocket-id version=2.11.0 query="SELECT * FROM `kv` WHERE `kv`.`key` = \"jwt_private_key.json\" ORDER BY `kv`.`key` LIMIT 1" duration=175.285µs rows=1 file=github.com/pocket-id/pocket-id/backend/internal/utils/jwk/key_provider_database.go:43
Jul 29 17:06:52 nixos pocket-id-start[1097974]: Jul 29 17:06:52 DBG SQL query executed [1.818656ms] app=pocket-id version=2.11.0 query="DELETE FROM `users` WHERE id = \"00000000-0000-0000-0000-000000000000\"" duration=1.818656ms rows=0 file=github.com/pocket-id/pocket-id/backend/internal/apikey/service.go:255
Jul 29 17:06:52 nixos pocket-id-start[1097974]: Jul 29 17:06:52 DBG SQL query executed [70.985µs] app=pocket-id version=2.11.0 query="SELECT `value` FROM `kv` WHERE key = \"application_lock\" " duration=70.985µs rows=1 file=github.com/pocket-id/pocket-id/backend/internal/service/app_lock_service.go:105
Jul 29 17:06:52 nixos pocket-id-start[1097974]: Jul 29 17:06:52 DBG SQL query executed [133.341µs] app=pocket-id version=2.11.0 query="\n\t\t\tINSERT INTO kv (key, value)\n\t\t\tVALUES (\"application_lock\", \"{\"\"process_id\"\":1097974,\"\"host_id\"\":\"\"nixos\"\",\"\"lock_id\"\":\"\"810d4452-d4cf-49e1-a4ec-0756f39f44d3\"\",\"\"expires_at\"\":1785359242}\")\n\t\t\tON CONFLICT(key) DO UPDATE SET \n\t\t\t\tvalue = excluded.value\n\t\t\tWHERE (json_extract(kv.value, '$.expires_at') < 1785359212) OR false\n\t\t" duration=133.341µs rows=0 file=github.com/pocket-id/pocket-id/backend/internal/service/app_lock_service.go:155
Jul 29 17:06:52 nixos pocket-id-start[1097974]: Jul 29 17:06:52 ERR Failed to run pocket-id app=pocket-id version=2.11.0 error="it appears that there's already one instance of Pocket ID running; running multiple replicas of Pocket ID is currently not supported"
Jul 29 17:06:52 nixos systemd[1]: pocket-id.service: Main process exited, code=exited, status=1/FAILURE
Jul 29 17:06:52 nixos systemd[1]: pocket-id.service: Failed with result 'exit-code'.
Jul 29 17:06:53 nixos systemd[1]: pocket-id.service: Scheduled restart job, restart counter is at 2.
Jul 29 17:06:53 nixos systemd[1]: Started Pocket ID.
Jul 29 17:06:53 nixos pocket-id-start[1097987]: Jul 29 17:06:53 INF Pocket ID is starting app=pocket-id version=2.11.0
Jul 29 17:06:53 nixos pocket-id-start[1097987]: Jul 29 17:06:53 INF Connected to database app=pocket-id version=2.11.0 provider=sqlite
Jul 29 17:06:53 nixos pocket-id-start[1097987]: Jul 29 17:06:53 DBG SQL query executed [250.517µs] app=pocket-id version=2.11.0 query="INSERT INTO kv (key, value)\n\t\t\tVALUES ('instance_id', \"2adbc780-d461-468b-a747-f0016aca1b39\")\n\t\t\tON CONFLICT (key) DO UPDATE SET\n\t\t\t\tvalue = CASE\n\t\t\t\t\tWHEN kv.value = '' THEN excluded.value\n\t\t\t\t\tELSE kv.value\n\t\t\t\tEND\n\t\t\tRETURNING value" duration=250.517µs rows=1 file=github.com/pocket-id/pocket-id/backend/internal/instanceid/instanceid.go:37
Jul 29 17:06:53 nixos pocket-id-start[1097987]: Jul 29 17:06:53 DBG SQL query executed [267.517µs] app=pocket-id version=2.11.0 query="SELECT * FROM `app_config_variables`" duration=267.517µs rows=0 file=github.com/pocket-id/pocket-id/backend/internal/service/app_config_service.go:345
Jul 29 17:06:53 nixos pocket-id-start[1097987]: Jul 29 17:06:53 WRN MAXMIND_LICENSE_KEY environment variable is empty: the GeoLite2 City database won't be updated app=pocket-id version=2.11.0
Jul 29 17:06:53 nixos pocket-id-start[1097987]: Jul 29 17:06:53 DBG SQL query executed [163.332µs] app=pocket-id version=2.11.0 query="SELECT * FROM `kv` WHERE `kv`.`key` = \"jwt_private_key.json\" ORDER BY `kv`.`key` LIMIT 1" duration=163.332µs rows=1 file=github.com/pocket-id/pocket-id/backend/internal/utils/jwk/key_provider_database.go:43
Jul 29 17:06:53 nixos pocket-id-start[1097987]: Jul 29 17:06:53 DBG SQL query executed [2.584195ms] app=pocket-id version=2.11.0 query="DELETE FROM `users` WHERE id = \"00000000-0000-0000-0000-000000000000\"" duration=2.584195ms rows=0 file=github.com/pocket-id/pocket-id/backend/internal/apikey/service.go:255
Jul 29 17:06:53 nixos pocket-id-start[1097987]: Jul 29 17:06:53 DBG SQL query executed [75.842µs] app=pocket-id version=2.11.0 query="SELECT `value` FROM `kv` WHERE key = \"application_lock\" " duration=75.842µs rows=1 file=github.com/pocket-id/pocket-id/backend/internal/service/app_lock_service.go:105
Jul 29 17:06:53 nixos pocket-id-start[1097987]: Jul 29 17:06:53 DBG SQL query executed [96.763µs] app=pocket-id version=2.11.0 query="\n\t\t\tINSERT INTO kv (key, value)\n\t\t\tVALUES (\"application_lock\", \"{\"\"process_id\"\":1097987,\"\"host_id\"\":\"\"nixos\"\",\"\"lock_id\"\":\"\"b31cf9ad-48d7-442f-ad83-693461f5970c\"\",\"\"expires_at\"\":1785359243}\")\n\t\t\tON CONFLICT(key) DO UPDATE SET \n\t\t\t\tvalue = excluded.value\n\t\t\tWHERE (json_extract(kv.value, '$.expires_at') < 1785359213) OR false\n\t\t" duration=96.763µs rows=0 file=github.com/pocket-id/pocket-id/backend/internal/service/app_lock_service.go:155
Jul 29 17:06:53 nixos pocket-id-start[1097987]: Jul 29 17:06:53 ERR Failed to run pocket-id app=pocket-id version=2.11.0 error="it appears that there's already one instance of Pocket ID running; running multiple replicas of Pocket ID is currently not supported"
Jul 29 17:06:53 nixos systemd[1]: pocket-id.service: Main process exited, code=exited, status=1/FAILURE
Jul 29 17:06:53 nixos systemd[1]: pocket-id.service: Failed with result 'exit-code'.
Jul 29 17:06:54 nixos systemd[1]: pocket-id.service: Scheduled restart job, restart counter is at 3.
Jul 29 17:06:54 nixos systemd[1]: Started Pocket ID.
Jul 29 17:06:54 nixos pocket-id-start[1098002]: Jul 29 17:06:54 INF Pocket ID is starting app=pocket-id version=2.11.0
Jul 29 17:06:54 nixos pocket-id-start[1098002]: Jul 29 17:06:54 INF Connected to database app=pocket-id version=2.11.0 provider=sqlite
Jul 29 17:06:54 nixos pocket-id-start[1098002]: Jul 29 17:06:54 DBG SQL query executed [254.135µs] app=pocket-id version=2.11.0 query="INSERT INTO kv (key, value)\n\t\t\tVALUES ('instance_id', \"69148cbc-533d-4426-b52f-fdd4cbf0606c\")\n\t\t\tON CONFLICT (key) DO UPDATE SET\n\t\t\t\tvalue = CASE\n\t\t\t\t\tWHEN kv.value = '' THEN excluded.value\n\t\t\t\t\tELSE kv.value\n\t\t\t\tEND\n\t\t\tRETURNING value" duration=254.135µs rows=1 file=github.com/pocket-id/pocket-id/backend/internal/instanceid/instanceid.go:37
Jul 29 17:06:54 nixos pocket-id-start[1098002]: Jul 29 17:06:54 DBG SQL query executed [246.724µs] app=pocket-id version=2.11.0 query="SELECT * FROM `app_config_variables`" duration=246.724µs rows=0 file=github.com/pocket-id/pocket-id/backend/internal/service/app_config_service.go:345
Jul 29 17:06:54 nixos pocket-id-start[1098002]: Jul 29 17:06:54 WRN MAXMIND_LICENSE_KEY environment variable is empty: the GeoLite2 City database won't be updated app=pocket-id version=2.11.0
Jul 29 17:06:54 nixos pocket-id-start[1098002]: Jul 29 17:06:54 DBG SQL query executed [158.148µs] app=pocket-id version=2.11.0 query="SELECT * FROM `kv` WHERE `kv`.`key` = \"jwt_private_key.json\" ORDER BY `kv`.`key` LIMIT 1" duration=158.148µs rows=1 file=github.com/pocket-id/pocket-id/backend/internal/utils/jwk/key_provider_database.go:43
Jul 29 17:06:54 nixos pocket-id-start[1098002]: Jul 29 17:06:54 DBG SQL query executed [3.512804ms] app=pocket-id version=2.11.0 query="DELETE FROM `users` WHERE id = \"00000000-0000-0000-0000-000000000000\"" duration=3.512804ms rows=0 file=github.com/pocket-id/pocket-id/backend/internal/apikey/service.go:255
Jul 29 17:06:54 nixos pocket-id-start[1098002]: Jul 29 17:06:54 DBG SQL query executed [74.271µs] app=pocket-id version=2.11.0 query="SELECT `value` FROM `kv` WHERE key = \"application_lock\" " duration=74.271µs rows=1 file=github.com/pocket-id/pocket-id/backend/internal/service/app_lock_service.go:105
Jul 29 17:06:54 nixos pocket-id-start[1098002]: Jul 29 17:06:54 DBG SQL query executed [114.696µs] app=pocket-id version=2.11.0 query="\n\t\t\tINSERT INTO kv (key, value)\n\t\t\tVALUES (\"application_lock\", \"{\"\"process_id\"\":1098002,\"\"host_id\"\":\"\"nixos\"\",\"\"lock_id\"\":\"\"9f5e34b2-24e0-48a2-ac61-8c08fc5010d1\"\",\"\"expires_at\"\":1785359244}\")\n\t\t\tON CONFLICT(key) DO UPDATE SET \n\t\t\t\tvalue = excluded.value\n\t\t\tWHERE (json_extract(kv.value, '$.expires_at') < 1785359214) OR false\n\t\t" duration=114.696µs rows=0 file=github.com/pocket-id/pocket-id/backend/internal/service/app_lock_service.go:155
Jul 29 17:06:54 nixos pocket-id-start[1098002]: Jul 29 17:06:54 ERR Failed to run pocket-id app=pocket-id version=2.11.0 error="it appears that there's already one instance of Pocket ID running; running multiple replicas of Pocket ID is currently not supported"
Jul 29 17:06:54 nixos systemd[1]: pocket-id.service: Main process exited, code=exited, status=1/FAILURE
Jul 29 17:06:54 nixos systemd[1]: pocket-id.service: Failed with result 'exit-code'.
Jul 29 17:06:55 nixos systemd[1]: pocket-id.service: Scheduled restart job, restart counter is at 4.
Jul 29 17:06:55 nixos systemd[1]: Started Pocket ID.
Jul 29 17:06:55 nixos pocket-id-start[1098017]: Jul 29 17:06:55 INF Pocket ID is starting app=pocket-id version=2.11.0
Jul 29 17:06:55 nixos pocket-id-start[1098017]: Jul 29 17:06:55 INF Connected to database app=pocket-id version=2.11.0 provider=sqlite
Jul 29 17:06:55 nixos pocket-id-start[1098017]: Jul 29 17:06:55 DBG SQL query executed [259.394µs] app=pocket-id version=2.11.0 query="INSERT INTO kv (key, value)\n\t\t\tVALUES ('instance_id', \"fabff6d3-1a21-4f90-8e67-41afe183fc0c\")\n\t\t\tON CONFLICT (key) DO UPDATE SET\n\t\t\t\tvalue = CASE\n\t\t\t\t\tWHEN kv.value = '' THEN excluded.value\n\t\t\t\t\tELSE kv.value\n\t\t\t\tEND\n\t\t\tRETURNING value" duration=259.394µs rows=1 file=github.com/pocket-id/pocket-id/backend/internal/instanceid/instanceid.go:37
Jul 29 17:06:55 nixos pocket-id-start[1098017]: Jul 29 17:06:55 DBG SQL query executed [203.308µs] app=pocket-id version=2.11.0 query="SELECT * FROM `app_config_variables`" duration=203.308µs rows=0 file=github.com/pocket-id/pocket-id/backend/internal/service/app_config_service.go:345
Jul 29 17:06:55 nixos pocket-id-start[1098017]: Jul 29 17:06:55 WRN MAXMIND_LICENSE_KEY environment variable is empty: the GeoLite2 City database won't be updated app=pocket-id version=2.11.0
Jul 29 17:06:55 nixos pocket-id-start[1098017]: Jul 29 17:06:55 DBG SQL query executed [162.92µs] app=pocket-id version=2.11.0 query="SELECT * FROM `kv` WHERE `kv`.`key` = \"jwt_private_key.json\" ORDER BY `kv`.`key` LIMIT 1" duration=162.92µs rows=1 file=github.com/pocket-id/pocket-id/backend/internal/utils/jwk/key_provider_database.go:43
Jul 29 17:06:55 nixos pocket-id-start[1098017]: Jul 29 17:06:55 DBG SQL query executed [3.404577ms] app=pocket-id version=2.11.0 query="DELETE FROM `users` WHERE id = \"00000000-0000-0000-0000-000000000000\"" duration=3.404577ms rows=0 file=github.com/pocket-id/pocket-id/backend/internal/apikey/service.go:255
Jul 29 17:06:55 nixos pocket-id-start[1098017]: Jul 29 17:06:55 DBG SQL query executed [129.989µs] app=pocket-id version=2.11.0 query="SELECT `value` FROM `kv` WHERE key = \"application_lock\" " duration=129.989µs rows=1 file=github.com/pocket-id/pocket-id/backend/internal/service/app_lock_service.go:105
Jul 29 17:06:55 nixos pocket-id-start[1098017]: Jul 29 17:06:55 DBG SQL query executed [136.795µs] app=pocket-id version=2.11.0 query="\n\t\t\tINSERT INTO kv (key, value)\n\t\t\tVALUES (\"application_lock\", \"{\"\"process_id\"\":1098017,\"\"host_id\"\":\"\"nixos\"\",\"\"lock_id\"\":\"\"b6ef89fb-0b26-421b-8877-01290afdda3c\"\",\"\"expires_at\"\":1785359245}\")\n\t\t\tON CONFLICT(key) DO UPDATE SET \n\t\t\t\tvalue = excluded.value\n\t\t\tWHERE (json_extract(kv.value, '$.expires_at') < 1785359215) OR false\n\t\t" duration=136.795µs rows=0 file=github.com/pocket-id/pocket-id/backend/internal/service/app_lock_service.go:155
Jul 29 17:06:55 nixos pocket-id-start[1098017]: Jul 29 17:06:55 ERR Failed to run pocket-id app=pocket-id version=2.11.0 error="it appears that there's already one instance of Pocket ID running; running multiple replicas of Pocket ID is currently not supported"
Jul 29 17:06:55 nixos systemd[1]: pocket-id.service: Main process exited, code=exited, status=1/FAILURE
Jul 29 17:06:55 nixos systemd[1]: pocket-id.service: Failed with result 'exit-code'.
Jul 29 17:06:56 nixos systemd[1]: pocket-id.service: Scheduled restart job, restart counter is at 5.
Jul 29 17:06:56 nixos systemd[1]: Started Pocket ID.
Jul 29 17:06:57 nixos pocket-id-start[1098032]: Jul 29 17:06:57 INF Pocket ID is starting app=pocket-id version=2.11.0
Jul 29 17:06:57 nixos pocket-id-start[1098032]: Jul 29 17:06:57 INF Connected to database app=pocket-id version=2.11.0 provider=sqlite
Jul 29 17:06:57 nixos pocket-id-start[1098032]: Jul 29 17:06:57 DBG SQL query executed [284.478µs] app=pocket-id version=2.11.0 query="INSERT INTO kv (key, value)\n\t\t\tVALUES ('instance_id', \"e6b2caba-b85b-458b-80ac-50479ea41d4b\")\n\t\t\tON CONFLICT (key) DO UPDATE SET\n\t\t\t\tvalue = CASE\n\t\t\t\t\tWHEN kv.value = '' THEN excluded.value\n\t\t\t\t\tELSE kv.value\n\t\t\t\tEND\n\t\t\tRETURNING value" duration=284.478µs rows=1 file=github.com/pocket-id/pocket-id/backend/internal/instanceid/instanceid.go:37
Jul 29 17:06:57 nixos pocket-id-start[1098032]: Jul 29 17:06:57 DBG SQL query executed [228.489µs] app=pocket-id version=2.11.0 query="SELECT * FROM `app_config_variables`" duration=228.489µs rows=0 file=github.com/pocket-id/pocket-id/backend/internal/service/app_config_service.go:345
Jul 29 17:06:57 nixos pocket-id-start[1098032]: Jul 29 17:06:57 WRN MAXMIND_LICENSE_KEY environment variable is empty: the GeoLite2 City database won't be updated app=pocket-id version=2.11.0
Jul 29 17:06:57 nixos pocket-id-start[1098032]: Jul 29 17:06:57 DBG SQL query executed [155.1µs] app=pocket-id version=2.11.0 query="SELECT * FROM `kv` WHERE `kv`.`key` = \"jwt_private_key.json\" ORDER BY `kv`.`key` LIMIT 1" duration=155.1µs rows=1 file=github.com/pocket-id/pocket-id/backend/internal/utils/jwk/key_provider_database.go:43
Jul 29 17:06:57 nixos pocket-id-start[1098032]: Jul 29 17:06:57 DBG SQL query executed [2.657023ms] app=pocket-id version=2.11.0 query="DELETE FROM `users` WHERE id = \"00000000-0000-0000-0000-000000000000\"" duration=2.657023ms rows=0 file=github.com/pocket-id/pocket-id/backend/internal/apikey/service.go:255
Jul 29 17:06:57 nixos pocket-id-start[1098032]: Jul 29 17:06:57 DBG SQL query executed [128.659µs] app=pocket-id version=2.11.0 query="SELECT `value` FROM `kv` WHERE key = \"application_lock\" " duration=128.659µs rows=1 file=github.com/pocket-id/pocket-id/backend/internal/service/app_lock_service.go:105
Jul 29 17:06:57 nixos pocket-id-start[1098032]: Jul 29 17:06:57 DBG SQL query executed [106.694µs] app=pocket-id version=2.11.0 query="\n\t\t\tINSERT INTO kv (key, value)\n\t\t\tVALUES (\"application_lock\", \"{\"\"process_id\"\":1098032,\"\"host_id\"\":\"\"nixos\"\",\"\"lock_id\"\":\"\"7fd92eae-8fb6-4131-8c7b-2e7d43847a6a\"\",\"\"expires_at\"\":1785359247}\")\n\t\t\tON CONFLICT(key) DO UPDATE SET \n\t\t\t\tvalue = excluded.value\n\t\t\tWHERE (json_extract(kv.value, '$.expires_at') < 1785359217) OR false\n\t\t" duration=106.694µs rows=0 file=github.com/pocket-id/pocket-id/backend/internal/service/app_lock_service.go:155
Jul 29 17:06:57 nixos pocket-id-start[1098032]: Jul 29 17:06:57 ERR Failed to run pocket-id app=pocket-id version=2.11.0 error="it appears that there's already one instance of Pocket ID running; running multiple replicas of Pocket ID is currently not supported"
Jul 29 17:06:57 nixos systemd[1]: pocket-id.service: Main process exited, code=exited, status=1/FAILURE
Jul 29 17:06:57 nixos systemd[1]: pocket-id.service: Failed with result 'exit-code'.
Jul 29 17:06:58 nixos systemd[1]: pocket-id.service: Scheduled restart job, restart counter is at 6.
Jul 29 17:06:58 nixos systemd[1]: pocket-id.service: Start request repeated too quickly.
Jul 29 17:06:58 nixos systemd[1]: pocket-id.service: Failed with result 'start-limit-hit'.
Jul 29 17:06:58 nixos systemd[1]: Failed to start Pocket ID.

When I run systemctl restart pocket-id, it restarts just fine, so it seems to just be the autorestart is not working. The relevant error message seems to be

Jul 29 17:06:57 nixos pocket-id-start[1098032]: Jul 29 17:06:57 ERR Failed to run pocket-id app=pocket-id version=2.11.0 error="it appears that there's already one instance of Pocket ID running; running multiple replicas of Pocket ID is currently not supported"

I’m not sure if it’s because the restart failed to stop the already running pocket-id service? Or if there’s some lock that didn’t get deleted when the service stopped?

If anyone has any advice, that would be greatly appreciated.

It appears that for some reason, the app holds a lock for 30 seconds. If another instance is started within this 30 seconds, it will fail even if the old instance has fully exited.

This issue has been fixed upstream.