Skip to main content

Self-Hosting Guide: Deploy Outline as Your Team Wiki

·OSSAlt Team
outlinewikiself-hostingdockerguide

Self-Hosting Guide: Deploy Outline as Your Team Wiki

Outline is the best-looking open source wiki and knowledge base. It's a Notion and Confluence alternative with real-time collaboration, Markdown support, and a clean interface your team will actually enjoy using.

Requirements

  • VPS with 2 GB RAM minimum
  • Docker and Docker Compose
  • Domain name (e.g., wiki.yourdomain.com)
  • S3-compatible storage (MinIO self-hosted or AWS S3)
  • OIDC authentication provider (required — Outline has no built-in auth)
  • SMTP service

Important: Authentication Requirement

Outline requires an external authentication provider. No username/password login. Options:

ProviderDifficultyNotes
Google WorkspaceEasyIf your team uses Google
GitHubEasyGood for dev teams
Keycloak (self-hosted)MediumFull control, any team
Authentik (self-hosted)MediumModern alternative to Keycloak
Azure ADEasyIf your team uses Microsoft

Step 1: Set Up MinIO (S3 Storage)

Outline requires S3-compatible storage for file uploads:

# Add to docker-compose.yml
services:
  minio:
    image: minio/minio:latest
    container_name: outline-minio
    restart: unless-stopped
    ports:
      - "9000:9000"
      - "9001:9001"
    volumes:
      - minio_data:/data
    environment:
      - MINIO_ROOT_USER=outline
      - MINIO_ROOT_PASSWORD=your-minio-password
    command: server /data --console-address ":9001"

After starting MinIO:

  1. Open http://your-server:9001
  2. Create a bucket named outline
  3. Set bucket policy to allow the Outline service account

Step 2: Create Docker Compose

# docker-compose.yml
services:
  outline:
    image: outlinewiki/outline:latest
    container_name: outline
    restart: unless-stopped
    ports:
      - "3000:3000"
    env_file: .env
    depends_on:
      - postgres
      - redis
      - minio

  postgres:
    image: postgres:16-alpine
    container_name: outline-db
    restart: unless-stopped
    volumes:
      - postgres_data:/var/lib/postgresql/data
    environment:
      - POSTGRES_DB=outline
      - POSTGRES_USER=outline
      - POSTGRES_PASSWORD=your-strong-password

  redis:
    image: redis:7-alpine
    container_name: outline-redis
    restart: unless-stopped
    volumes:
      - redis_data:/data

  minio:
    image: minio/minio:latest
    container_name: outline-minio
    restart: unless-stopped
    volumes:
      - minio_data:/data
    environment:
      - MINIO_ROOT_USER=outline
      - MINIO_ROOT_PASSWORD=your-minio-password
    command: server /data --console-address ":9001"

volumes:
  postgres_data:
  redis_data:
  minio_data:

Step 3: Configure Environment

Create .env:

# General
NODE_ENV=production
SECRET_KEY=your-random-secret-key-min-32-chars
UTILS_SECRET=your-random-utils-secret-min-32-chars
URL=https://wiki.yourdomain.com
PORT=3000

# Database
DATABASE_URL=postgres://outline:your-strong-password@postgres:5432/outline
DATABASE_CONNECTION_POOL_MIN=0
DATABASE_CONNECTION_POOL_MAX=10
PGSSLMODE=disable

# Redis
REDIS_URL=redis://redis:6379

# Storage (MinIO)
FILE_STORAGE=s3
FILE_STORAGE_UPLOAD_MAX_SIZE=26214400
AWS_ACCESS_KEY_ID=outline
AWS_SECRET_ACCESS_KEY=your-minio-password
AWS_REGION=us-east-1
AWS_S3_UPLOAD_BUCKET_URL=http://minio:9000
AWS_S3_UPLOAD_BUCKET_NAME=outline
AWS_S3_FORCE_PATH_STYLE=true
AWS_S3_ACL=private

# SMTP
SMTP_HOST=smtp.resend.com
SMTP_PORT=587
SMTP_USERNAME=resend
SMTP_PASSWORD=re_your_api_key
SMTP_FROM_EMAIL=wiki@yourdomain.com
SMTP_REPLY_EMAIL=wiki@yourdomain.com
SMTP_SECURE=true

# Authentication (Google example)
GOOGLE_CLIENT_ID=your-google-client-id
GOOGLE_CLIENT_SECRET=your-google-client-secret

# Or OIDC (Keycloak/Authentik)
# OIDC_CLIENT_ID=outline
# OIDC_CLIENT_SECRET=your-oidc-secret
# OIDC_AUTH_URI=https://auth.yourdomain.com/realms/master/protocol/openid-connect/auth
# OIDC_TOKEN_URI=https://auth.yourdomain.com/realms/master/protocol/openid-connect/token
# OIDC_USERINFO_URI=https://auth.yourdomain.com/realms/master/protocol/openid-connect/userinfo
# OIDC_LOGOUT_URI=https://auth.yourdomain.com/realms/master/protocol/openid-connect/logout
# OIDC_DISPLAY_NAME=SSO Login

Generate secrets:

openssl rand -hex 32  # SECRET_KEY
openssl rand -hex 32  # UTILS_SECRET

Step 4: Start Outline

docker compose up -d

# Run database migrations
docker exec outline node build/server/scripts/seed.js

Step 5: Reverse Proxy (Caddy)

# /etc/caddy/Caddyfile
wiki.yourdomain.com {
    reverse_proxy localhost:3000
}
sudo systemctl restart caddy

Step 6: Organize Your Wiki

Recommended collection structure:

CollectionPurpose
📋 CompanyMission, values, org chart, policies
🚀 EngineeringArchitecture, runbooks, onboarding
📊 ProductSpecs, roadmap, user research
💼 SalesPlaybooks, pricing, case studies
👋 OnboardingNew hire guides, setup instructions
📝 Meeting NotesStandups, retros, all-hands

Tips:

  • Use templates for recurring documents (meeting notes, RFCs, postmortems)
  • Star important documents for quick access
  • Use / commands in the editor for blocks, embeds, tables
  • Drag and drop to reorder documents and collections

Step 7: Integrations

IntegrationSetup
SlackSettings → Integrations → Slack (notifications + search)
Zapier/n8nUse Outline's API with webhooks
Import from NotionSettings → Import → Notion (native importer)
Import from ConfluenceSettings → Import → Confluence

Production Hardening

Backups:

# Database backup (daily cron)
docker exec outline-db pg_dump -U outline outline > /backups/outline-$(date +%Y%m%d).sql

# MinIO data backup
docker run --rm -v minio_data:/data -v /backups:/backup alpine \
  tar czf /backup/outline-files-$(date +%Y%m%d).tar.gz /data

Updates:

docker compose pull
docker compose up -d

Performance:

  • Increase DATABASE_CONNECTION_POOL_MAX for larger teams
  • Add PostgreSQL connection pooling (PgBouncer) for 100+ users
  • Consider CDN for MinIO assets

Resource Usage

UsersRAMCPUDisk
1-202 GB2 cores10 GB
20-504 GB2 cores20 GB
50-2008 GB4 cores50 GB

VPS Recommendations

ProviderSpec (30 users)Price
Hetzner4 vCPU, 8 GB RAM€8/month
DigitalOcean2 vCPU, 4 GB RAM$24/month
Linode2 vCPU, 4 GB RAM$24/month

Compare wiki and knowledge base tools on OSSAlt — features, import support, and pricing side by side.