How to run Jeeves Server in production.
@mermaid-js/mermaid-cli). No separate install needed.npm install (via postinstall script). Requires Java (JDK 11+) at runtime for local rendering.npm install -g @karmaniverous/jeeves-server
Create your config file (see Setup & Configuration):
# Example: JSON config
cat > /etc/jeeves-server.config.json << 'EOF'
{
"chromePath": "/usr/bin/chromium-browser",
"auth": { "modes": ["keys"] },
"keys": {
"_internal": "your-random-hex-seed",
"primary": "another-random-hex-seed"
}
}
EOF
jeeves-server start --config /path/to/jeeves-server.config.json
The server listens on the configured port (default: 1934) on all interfaces.
Use the built-in CLI to generate NSSM install commands:
jeeves-server service install --config "C:\\config\\jeeves-server.config.json"
This prints the nssm install commands. Run them, then:
jeeves-server service start
jeeves-server service stop
jeeves-server service restart
Or use NSSM directly:
nssm install JeevesServer "C:\\Program Files\\nodejs\\node.exe" "<global-npm-path>\\@karmaniverous\\jeeves-server\\dist\\src\\cli\\index.js" start --config "C:\\config\\jeeves-server.config.json"
nssm set JeevesServer AppDirectory "<working-dir>"
nssm set JeevesServer AppStdout "<log-dir>\\service.log"
nssm set JeevesServer AppStderr "<log-dir>\\service-error.log"
nssm set JeevesServer Start SERVICE_AUTO_START
nssm start JeevesServer
# /etc/systemd/system/jeeves-server.service
[Unit]
Description=Jeeves Server
After=network.target
[Service]
Type=simple
User=jeeves
ExecStart=/usr/bin/env jeeves-server start --config /etc/jeeves-server.config.json
Restart=on-failure
RestartSec=5
Environment=NODE_ENV=production
[Install]
WantedBy=multi-user.target
sudo systemctl enable jeeves-server
sudo systemctl start jeeves-server
Running behind a reverse proxy is recommended for HTTPS termination, domain routing, and rate limiting.
jeeves.example.com {
reverse_proxy localhost:1934
}
Caddy automatically provisions and renews HTTPS certificates via Let's Encrypt.
server {
listen 443 ssl http2;
server_name jeeves.example.com;
ssl_certificate /etc/letsencrypt/live/jeeves.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/jeeves.example.com/privkey.pem;
location / {
proxy_pass http://localhost:1934;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
client_max_body_size 10M;
}
}
server {
listen 80;
server_name jeeves.example.com;
return 301 https://$host$request_uri;
}
HTTPS is required when using Google OAuth — Google will not redirect to an HTTP callback URL (except localhost).
HTTPS is strongly recommended even with key-only auth, because keys appear in URL parameters.
# No auth required
curl http://localhost:1934/health
# Detailed server status (no auth required)
curl http://localhost:1934/api/status
The /api/status endpoint returns version, uptime, connected services, export capabilities, and event schemas. Add ?events=N to include the N most recent event log entries. Use /health for simple load balancer checks and /api/status for monitoring dashboards.
# Update the global package
npm install -g @karmaniverous/jeeves-server@latest
# Restart the service
jeeves-server service restart # or: nssm restart JeevesServer / systemctl restart jeeves-server
The server needs:
state.json and logsKey files to back up:
jeeves-server.config.json) — contains secretsstate.json — insider keys and rotation statelogs/event-queue.jsonl + logs/event-queue.cursor