summaryrefslogtreecommitdiffhomepage
path: root/packaging
diff options
context:
space:
mode:
authorAdam Malczewski <[email protected]>2026-05-29 12:23:30 +0900
committerAdam Malczewski <[email protected]>2026-05-29 12:23:30 +0900
commit0954c6520878e073c7822fc4a8f4a752474f5d7a (patch)
treeb19012f89ccbb07bf3180612a6cfef7077618d6b /packaging
parentd6609efd4e14101e77fb35a98ce597a32816862d (diff)
downloaddispatch-0954c6520878e073c7822fc4a8f4a752474f5d7a.tar.gz
dispatch-0954c6520878e073c7822fc4a8f4a752474f5d7a.zip
fix(packaging): convert dispatch-systemd from user units to system template units (User=%i)
The per-user systemd manager ([email protected]) fails to start on WSL (kernel 6.6.87.2, microsoft/WSL#13186 — 'Failed to spawn executor: Device or resource busy'), which breaks pacman's 30-systemd-daemon-reload-user.hook on install. Changes: - New [email protected] + [email protected] system template units with User=%i (run as the named instance user) - Remove old user-scope dispatch-api.service / dispatch-frontend.service - Install to /usr/lib/systemd/system/ instead of .../systemd/user/ - Update PKGBUILD, .install hints, and bin/service to use sudo systemctl dispatch-api@<user>
Diffstat (limited to 'packaging')
-rw-r--r--packaging/PKGBUILD18
-rw-r--r--packaging/dispatch-api.service15
-rw-r--r--packaging/[email protected]21
-rw-r--r--packaging/dispatch-frontend.service16
-rw-r--r--packaging/[email protected]22
-rw-r--r--packaging/dispatch-systemd.install19
-rw-r--r--packaging/dispatch.install6
7 files changed, 67 insertions, 50 deletions
diff --git a/packaging/PKGBUILD b/packaging/PKGBUILD
index a514eb5..6aa66cc 100644
--- a/packaging/PKGBUILD
+++ b/packaging/PKGBUILD
@@ -2,7 +2,7 @@
#
# Split package: builds the base application once and produces three packages:
# dispatch — application files + CLI wrappers + env configs
-# dispatch-systemd — systemd user units for dispatch-api / dispatch-frontend
+# dispatch-systemd — systemd system units (run as a given user: dispatch-api@<user>)
# dispatch-s6 — s6 service definitions for dispatch-api / dispatch-frontend
#
# The Electron desktop wrapper lives in a separate PKGBUILD at packaging/electron/.
@@ -129,21 +129,25 @@ package_dispatch() {
}
# ----------------------------------------------------------------------------
-# dispatch-systemd — systemd user unit files
+# dispatch-systemd — systemd system unit templates (run as a chosen user)
+#
+# These are *system* units (managed by PID 1), not user units, so they do not
+# depend on a per-user `[email protected]` manager. Each is a template keyed on
+# the username: `dispatch-api@tradam` runs as the `tradam` user via User=%i.
# ----------------------------------------------------------------------------
package_dispatch-systemd() {
- pkgdesc='Systemd user units for the Dispatch API and Frontend services'
+ pkgdesc='Systemd system unit templates for the Dispatch API and Frontend services (run as dispatch-api@<user>)'
depends=("dispatch=${pkgver}" 'systemd')
conflicts=('dispatch-s6')
install=dispatch-systemd.install
install -Dm644 \
- "${_packagingdir}/dispatch-api.service" \
- "${pkgdir}/usr/lib/systemd/user/dispatch-api.service"
+ "${_packagingdir}/[email protected]" \
+ "${pkgdir}/usr/lib/systemd/system/[email protected]"
install -Dm644 \
- "${_packagingdir}/dispatch-frontend.service" \
- "${pkgdir}/usr/lib/systemd/user/dispatch-frontend.service"
+ "${_packagingdir}/[email protected]" \
+ "${pkgdir}/usr/lib/systemd/system/[email protected]"
}
# ----------------------------------------------------------------------------
diff --git a/packaging/dispatch-api.service b/packaging/dispatch-api.service
deleted file mode 100644
index 120d460..0000000
--- a/packaging/dispatch-api.service
+++ /dev/null
@@ -1,15 +0,0 @@
-[Unit]
-Description=Dispatch API Backend
-
-[Service]
-Type=simple
-WorkingDirectory=/opt/dispatch
-ExecStart=/usr/bin/bun packages/api/src/index.ts
-EnvironmentFile=-/etc/dispatch/dispatch-api.conf
-Restart=on-failure
-RestartSec=5
-StandardOutput=journal
-StandardError=journal
-
-[Install]
-WantedBy=default.target
diff --git a/packaging/[email protected] b/packaging/[email protected]
new file mode 100644
index 0000000..3449fcb
--- /dev/null
+++ b/packaging/[email protected]
@@ -0,0 +1,21 @@
+# Dispatch API — system service template.
+# Runs under the system manager (PID 1) but drops privileges to the user named
+# in the instance: `dispatch-api@tradam` runs as the `tradam` user.
+#
+# Enable/start:
+# sudo systemctl enable --now dispatch-api@<user>
+[Unit]
+Description=Dispatch API Backend (running as %i)
+After=network.target
+
+[Service]
+Type=simple
+User=%i
+WorkingDirectory=/opt/dispatch
+ExecStart=/usr/bin/bun packages/api/src/index.ts
+EnvironmentFile=-/etc/dispatch/dispatch-api.conf
+Restart=on-failure
+RestartSec=5
+
+[Install]
+WantedBy=multi-user.target
diff --git a/packaging/dispatch-frontend.service b/packaging/dispatch-frontend.service
deleted file mode 100644
index 4aca1a3..0000000
--- a/packaging/dispatch-frontend.service
+++ /dev/null
@@ -1,16 +0,0 @@
-[Unit]
-Description=Dispatch Frontend (static file server)
-After=dispatch-api.service
-
-[Service]
-Type=simple
-WorkingDirectory=/opt/dispatch
-ExecStart=/usr/bin/bun packages/frontend/serve.ts
-EnvironmentFile=-/etc/dispatch/dispatch-frontend.conf
-Restart=on-failure
-RestartSec=5
-StandardOutput=journal
-StandardError=journal
-
-[Install]
-WantedBy=default.target
diff --git a/packaging/[email protected] b/packaging/[email protected]
new file mode 100644
index 0000000..6f35cc1
--- /dev/null
+++ b/packaging/[email protected]
@@ -0,0 +1,22 @@
+# Dispatch Frontend — system service template.
+# Runs under the system manager (PID 1) but drops privileges to the user named
+# in the instance: `dispatch-frontend@tradam` runs as the `tradam` user.
+# Tied to the matching API instance for the same user.
+#
+# Enable/start:
+# sudo systemctl enable --now dispatch-frontend@<user>
+[Unit]
+Description=Dispatch Frontend (static file server, running as %i)
+After=dispatch-api@%i.service
+
+[Service]
+Type=simple
+User=%i
+WorkingDirectory=/opt/dispatch
+ExecStart=/usr/bin/bun packages/frontend/serve.ts
+EnvironmentFile=-/etc/dispatch/dispatch-frontend.conf
+Restart=on-failure
+RestartSec=5
+
+[Install]
+WantedBy=multi-user.target
diff --git a/packaging/dispatch-systemd.install b/packaging/dispatch-systemd.install
index 3bd29be..5ebf261 100644
--- a/packaging/dispatch-systemd.install
+++ b/packaging/dispatch-systemd.install
@@ -1,24 +1,25 @@
post_install() {
echo ""
- echo "==> Dispatch systemd user units installed."
- echo " Enable and start:"
- echo " systemctl --user daemon-reload"
- echo " systemctl --user enable --now dispatch-api dispatch-frontend"
+ echo "==> Dispatch systemd system unit templates installed."
+ echo " These run as the user named in the instance (replace <user>)."
+ echo " Enable and start (e.g. for user 'tradam'):"
+ echo " sudo systemctl daemon-reload"
+ echo " sudo systemctl enable --now dispatch-api@<user> dispatch-frontend@<user>"
echo ""
}
post_upgrade() {
echo ""
echo "==> Dispatch systemd units upgraded."
- echo " Reload and restart:"
- echo " systemctl --user daemon-reload"
- echo " systemctl --user restart dispatch-api dispatch-frontend"
+ echo " Reload and restart your instances (replace <user>):"
+ echo " sudo systemctl daemon-reload"
+ echo " sudo systemctl restart dispatch-api@<user> dispatch-frontend@<user>"
echo ""
}
pre_remove() {
echo ""
- echo "==> Stop dispatch services before removal:"
- echo " systemctl --user disable --now dispatch-api dispatch-frontend"
+ echo "==> Stop dispatch services before removal (replace <user>):"
+ echo " sudo systemctl disable --now dispatch-api@<user> dispatch-frontend@<user>"
echo ""
}
diff --git a/packaging/dispatch.install b/packaging/dispatch.install
index 76837f5..75b36cc 100644
--- a/packaging/dispatch.install
+++ b/packaging/dispatch.install
@@ -11,7 +11,7 @@ post_install() {
echo " dispatch-frontend # static frontend (port 18391 by default)"
echo ""
echo " To run as a service, install one of:"
- echo " pacman -S dispatch-systemd # systemd user services"
+ echo " pacman -S dispatch-systemd # systemd system services (run as your user)"
echo " pacman -S dispatch-s6 # s6 services (Artix)"
echo ""
echo " For the Electron desktop wrapper:"
@@ -22,8 +22,8 @@ post_install() {
post_upgrade() {
echo ""
echo "==> Dispatch (base) upgraded."
- echo " If you use dispatch-systemd, restart the units:"
- echo " systemctl --user restart dispatch-api dispatch-frontend"
+ echo " If you use dispatch-systemd, restart the units (replace <user>):"
+ echo " sudo systemctl restart dispatch-api@<user> dispatch-frontend@<user>"
echo " If you use dispatch-s6, restart the services:"
echo " s6-svc -r /run/service/dispatch-api"
echo " s6-svc -r /run/service/dispatch-frontend"