Self-Hosted: Binary Deployment
For deployments without Docker (bare metal, VM, or systemd-managed hosts).
Prerequisites
-
Linux x86_64 with glibc 2.31+ (or use the musl static binary from CI artifacts)
-
PostgreSQL 16
-
A reverse proxy (Nginx, Caddy, Traefik) terminating TLS
-
A Zitadel instance (separate deployment or external)
-
An S3-compatible object store (RustFS, MinIO, AWS S3)
-
A signed
shiftit.liclicense file
Steps
-
Get the binary: Download
shiftit-backendfrom CI artifacts or build withcargo build --release --manifest-path backend/Cargo.toml. Pre-built binaries are musl-static and run on any glibc-free Linux. -
Provision Postgres: Create a database, user, and grant CREATEROLE so the migration’s
CREATE ROLE shiftit_appsucceeds. The migration is idempotent and safe to re-apply. -
Configure environment: Create
/etc/shiftit/shiftit.env:DATABASE_URL=postgres://shiftit:STRONG_PASSWORD@localhost:5432/shiftit ZITADEL_DOMAIN=https://auth.example.com RUSTFS_ENDPOINT=https://s3.example.com RUSTFS_ACCESS_KEY=... RUSTFS_SECRET_KEY=... RUSTFS_BUCKET_PREFIX=shiftit VAPID_PRIVATE_KEY=... VAPID_PUBLIC_KEY=... VAPID_SUBJECT=mailto:admin@example.com SHIFTIT_LICENSE_FILE=/etc/shiftit/shiftit.lic RUST_LOG=shiftit_backend=info,tower_http=info PORT=3000 -
Systemd unit at
/etc/systemd/system/shiftit-backend.service:[Unit] Description=ShiftIt Backend After=postgresql.service network.target Requires=postgresql.service [Service] Type=simple User=shiftit Group=shiftit EnvironmentFile=/etc/shiftit/shiftit.env ExecStart=/usr/local/bin/shiftit-backend Restart=on-failure RestartSec=5 [Install] WantedBy=multi-user.target -
Frontend: Run
trunk build --releasein thefrontend/directory and serve the resultingdist/from your reverse proxy. See nginx.adoc for the matching Nginx config. -
Start and enable:
systemctl daemon-reload systemctl enable --now shiftit-backend journalctl -u shiftit-backend -f