Deployment Guide
Outpost consists of six services: the web dashboard, Discord bot, Slack bot, Teams bot, GitHub App webhook receiver, and Linear sync service. All share a single PostgreSQL database (with pgvector for Pathfinder).
Requirements
- PostgreSQL 16 with pgvector extension (required by Pathfinder for embeddings)
- Node.js 20+ runtime for all five services
- Persistent process manager for the Discord and Slack bots (they maintain WebSocket connections)
- Public HTTPS endpoint for the GitHub App and Teams bot webhook receivers
Docker Compose (Recommended)
The included docker-compose.yml can be extended for production use:
version: "3.9"
services:
postgres:
image: pgvector/pgvector:pg16
volumes:
- pgdata:/var/lib/postgresql/data
environment:
POSTGRES_DB: outpost
POSTGRES_USER: outpost
POSTGRES_PASSWORD: ${DB_PASSWORD}
restart: unless-stopped
web:
build:
context: .
dockerfile: apps/web/Dockerfile
ports:
- "3000:3000"
env_file: .env
depends_on:
- postgres
restart: unless-stopped
discord-bot:
build:
context: .
dockerfile: apps/discord-bot/Dockerfile
env_file: .env
depends_on:
- postgres
restart: unless-stopped
slack-bot:
build:
context: .
dockerfile: apps/slack-bot/Dockerfile
env_file: .env
depends_on:
- postgres
restart: unless-stopped
teams-bot:
build:
context: .
dockerfile: apps/teams-bot/Dockerfile
ports:
- "3003:3003"
env_file: .env
depends_on:
- postgres
restart: unless-stopped
github-app:
build:
context: .
dockerfile: apps/github-app/Dockerfile
ports:
- "3001:3001"
env_file: .env
depends_on:
- postgres
restart: unless-stopped
linear-sync:
build:
context: .
dockerfile: apps/linear-sync/Dockerfile
ports:
- "3004:3004"
env_file: .env
depends_on:
- postgres
restart: unless-stopped
volumes:
pgdata:
Platform-Specific Guides
Railway (Recommended)
Railway auto-deploys from GitHub and natively supports Docker-based services.
The repo includes a railway.toml config for all five services.
- Fork or push the repo to GitHub
- Create a new project on Railway
- Add a PostgreSQL service (enable pgvector via
CREATE EXTENSION vectorfor Pathfinder) - Add five services from the repo, each pointing to its Dockerfile:
- outpost-web —
apps/web/Dockerfile(port 3000, health check/api/health) - outpost-discord-bot —
apps/discord-bot/Dockerfile(background worker) - outpost-slack-bot —
apps/slack-bot/Dockerfile(background worker, Socket Mode) - outpost-teams-bot —
apps/teams-bot/Dockerfile(port 3003, needs public URL for webhooks) - outpost-github-app —
apps/github-app/Dockerfile(port 3200, needs public URL for webhooks) - outpost-linear-sync —
apps/linear-sync/Dockerfile(port 3004, needs public URL for webhooks)
- outpost-web —
- Share
DATABASE_URLacross all services via Railway's variable references (${{Postgres.DATABASE_URL}}) - Fill in secret environment variables (
DISCORD_TOKEN,ANTHROPIC_API_KEY, etc.) - Configure custom domains for the web dashboard and GitHub App webhook endpoint
VPS / Bare Metal
#!/bin/bash
# Build all apps
pnpm install --frozen-lockfile
pnpm build
# Run database migrations
pnpm db:generate
pnpm db:push
# Start services (use PM2, systemd, or similar)
pm2 start apps/web/dist/server.js --name outpost-web
pm2 start apps/discord-bot/dist/index.js --name outpost-discord
pm2 start apps/slack-bot/dist/index.js --name outpost-slack
pm2 start apps/teams-bot/dist/index.js --name outpost-teams
pm2 start apps/github-app/dist/index.js --name outpost-github
pm2 start apps/linear-sync/dist/index.js --name outpost-linear-sync
Database Setup
Outpost uses PostgreSQL 16. The shared database also serves Pathfinder (which requires the pgvector extension for embedding storage). You can manually run the Prisma migrations:
pnpm db:generate
pnpm db:push
Auto db push: The web app automatically runs db push on
startup if the database schema is out of date. This means fresh deployments will
self-initialize their schema without manual migration steps. The first user to visit
the app will be redirected to the setup wizard to create the organization and admin account.
Environment Checklist
Before deploying, verify these are all set:
- ☑
DATABASE_URLpointing to production PostgreSQL - ☑
ANTHROPIC_API_KEYfor AI features - ☑
DISCORD_BOT_TOKENand related Discord vars - ☑
GITHUB_APP_ID,GITHUB_PRIVATE_KEY, and webhook secret - ☑
SLACK_BOT_TOKEN,SLACK_APP_TOKEN,SLACK_SIGNING_SECRET - ☑
TEAMS_APP_ID,TEAMS_APP_PASSWORD - ☑
LINEAR_API_KEY,LINEAR_WEBHOOK_SECRET,LINEAR_TEAM_ID(if using Linear sync) - ☑
HUBSPOT_API_KEY(if using HubSpot CRM sync) - ☑
AUTH_PROVIDER—credentials(default),github, oroidc - ☑
NEXT_PUBLIC_AUTH_PROVIDER— must matchAUTH_PROVIDER - ☑
RESEND_API_KEY(required for team invitations and email notifications) - ☑
NODE_ENV=production - ☑ GitHub App webhook URL updated to production domain
- ☑ HTTPS configured for web dashboard and GitHub webhook endpoint
Health Checks
The web app exposes a health check endpoint at GET /api/health that verifies
database connectivity. Use this for your platform's health check configuration.