Single-Server Bootstrap
Deploy jitsudo on a single Linux server. This setup is suitable for small teams or organizations that do not run Kubernetes.
Prerequisites
Section titled “Prerequisites”- A Linux server (Ubuntu 22.04+ or similar)
- PostgreSQL 14+ (can be on the same server or a managed service)
- An OIDC provider — see OIDC Integration
- A reverse proxy (nginx or Caddy) for TLS termination
1. Install the Binaries
Section titled “1. Install the Binaries”Download the latest release from GitHub:
# Set the versionVERSION=0.1.0ARCH=linux_amd64
# Download jitsudo CLI and jitsudod servercurl -LO "https://github.com/jitsudo-dev/jitsudo/releases/download/v${VERSION}/jitsudo_${VERSION}_${ARCH}.tar.gz"curl -LO "https://github.com/jitsudo-dev/jitsudo/releases/download/v${VERSION}/jitsudod_${VERSION}_${ARCH}.tar.gz"
tar -xzf jitsudo_${VERSION}_${ARCH}.tar.gztar -xzf jitsudod_${VERSION}_${ARCH}.tar.gz
sudo mv jitsudo jitsudod /usr/local/bin/sudo chmod +x /usr/local/bin/jitsudo /usr/local/bin/jitsudod2. Create the Database
Section titled “2. Create the Database”# As the postgres superusercreateuser jitsudocreatedb -O jitsudo jitsudopsql -c "ALTER USER jitsudo WITH PASSWORD 'STRONG_PASSWORD';"3. Bootstrap the Control Plane
Section titled “3. Bootstrap the Control Plane”sudo mkdir -p /etc/jitsudo
jitsudod init \ --db-url "postgres://jitsudo:STRONG_PASSWORD@localhost:5432/jitsudo?sslmode=require" \ --oidc-issuer https://your-idp.example.com \ --oidc-client-id jitsudo-server \ --http-addr :8080 \ --grpc-addr :8443 \ --config-out /etc/jitsudo/config.yamlThis will:
- Test the database connection.
- Run schema migrations.
- Write a starter config to
/etc/jitsudo/config.yaml.
4. Edit the Configuration
Section titled “4. Edit the Configuration”Edit /etc/jitsudo/config.yaml to enable providers and notifications. See the Server Configuration reference for all options.
Minimal production config:
server: http_addr: ":8080" grpc_addr: ":8443"
database: # Supply via JITSUDOD_DATABASE_URL env var instead of inlining credentials url: ""
auth: oidc_issuer: "https://your-idp.example.com" client_id: "jitsudo-server"
tls: cert_file: "/etc/jitsudo/tls.crt" key_file: "/etc/jitsudo/tls.key"
log: level: "info" format: "json"5. Create a systemd Unit
Section titled “5. Create a systemd Unit”Create /etc/systemd/system/jitsudod.service:
[Unit]Description=jitsudo control planeAfter=network.target postgresql.serviceRequires=postgresql.service
[Service]Type=simpleUser=jitsudoGroup=jitsudoExecStart=/usr/local/bin/jitsudod --config /etc/jitsudo/config.yamlRestart=on-failureRestartSec=5
# Supply sensitive values via environment variables# so they don't appear in the config fileEnvironment=JITSUDOD_DATABASE_URL=postgres://jitsudo:STRONG_PASSWORD@localhost:5432/jitsudo?sslmode=requireEnvironmentFile=-/etc/jitsudo/env
# Security hardeningNoNewPrivileges=truePrivateTmp=trueProtectSystem=strictReadWritePaths=/var/log/jitsudo
[Install]WantedBy=multi-user.targetCreate the jitsudo system user and directories:
sudo useradd --system --no-create-home --shell /usr/sbin/nologin jitsudosudo mkdir -p /var/log/jitsudosudo chown jitsudo:jitsudo /var/log/jitsudo /etc/jitsudosudo chmod 700 /etc/jitsudoEnable and start the service:
sudo systemctl daemon-reloadsudo systemctl enable --now jitsudodsudo systemctl status jitsudod6. Reverse Proxy (nginx + TLS)
Section titled “6. Reverse Proxy (nginx + TLS)”Install nginx and certbot, then create /etc/nginx/sites-available/jitsudo:
server { listen 443 ssl; server_name jitsudo.example.com;
ssl_certificate /etc/letsencrypt/live/jitsudo.example.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/jitsudo.example.com/privkey.pem;
# REST API gateway location /api/ { proxy_pass http://127.0.0.1:8080; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; }
# Health endpoints location ~ ^/(healthz|readyz|version) { proxy_pass http://127.0.0.1:8080; }}
# Redirect HTTP to HTTPSserver { listen 80; server_name jitsudo.example.com; return 301 https://$host$request_uri;}sudo ln -s /etc/nginx/sites-available/jitsudo /etc/nginx/sites-enabled/sudo nginx -t && sudo systemctl reload nginxFor gRPC, clients connect directly to port 8443. Configure TLS for the gRPC listener in /etc/jitsudo/config.yaml:
tls: cert_file: "/etc/letsencrypt/live/jitsudo.example.com/fullchain.pem" key_file: "/etc/letsencrypt/live/jitsudo.example.com/privkey.pem"7. Verify
Section titled “7. Verify”# From the servercurl https://jitsudo.example.com/healthz # → okcurl https://jitsudo.example.com/version # → {"version":"0.1.0",...}
# From your workstationjitsudo login \ --provider https://your-idp.example.com \ --server https://jitsudo.example.com:8443jitsudo server status --server-url https://jitsudo.example.com8. Enroll the First Administrator
Section titled “8. Enroll the First Administrator”jitsudod init does not create any administrator accounts. Admin authority in jitsudo is derived entirely from your identity provider: users who are members of the jitsudo-admins IdP group receive admin privileges when they authenticate.
Day-one steps:
- In your IdP, create a group named exactly
jitsudo-admins. - Add the first administrator’s account to that group.
- That user logs in:
jitsudo login --server https://jitsudo.example.com:8443
The administrator can now assign principal trust tiers and perform other privileged control plane operations.
See Admin Bootstrap for the full procedure, including ongoing membership management and the recovery path if all administrators are offboarded.
Updates
Section titled “Updates”To update jitsudod:
# Download new binarysudo mv /usr/local/bin/jitsudod /usr/local/bin/jitsudod.bak# Install new binary...sudo systemctl restart jitsudodMigrations run automatically on startup. The --skip-migrations flag is available if you need to run them separately.