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

Docker Compose (Recommended)

The included docker-compose.yml can be extended for production use:

docker-compose.prod.yml yaml
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.

  1. Fork or push the repo to GitHub
  2. Create a new project on Railway
  3. Add a PostgreSQL service (enable pgvector via CREATE EXTENSION vector for Pathfinder)
  4. Add five services from the repo, each pointing to its Dockerfile:
    • outpost-webapps/web/Dockerfile (port 3000, health check /api/health)
    • outpost-discord-botapps/discord-bot/Dockerfile (background worker)
    • outpost-slack-botapps/slack-bot/Dockerfile (background worker, Socket Mode)
    • outpost-teams-botapps/teams-bot/Dockerfile (port 3003, needs public URL for webhooks)
    • outpost-github-appapps/github-app/Dockerfile (port 3200, needs public URL for webhooks)
    • outpost-linear-syncapps/linear-sync/Dockerfile (port 3004, needs public URL for webhooks)
  5. Share DATABASE_URL across all services via Railway's variable references (${{Postgres.DATABASE_URL}})
  6. Fill in secret environment variables (DISCORD_TOKEN, ANTHROPIC_API_KEY, etc.)
  7. Configure custom domains for the web dashboard and GitHub App webhook endpoint

VPS / Bare Metal

deploy.sh bash
#!/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:

terminal bash
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:

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.