Outline logoTeam Wiki & Docs

Outline

A fast and beautiful team wiki and documentation tool, a self-hosted Notion alternative.

Review notes

Requires SSO configuration (OIDC or SAML) for login. Use S3-compatible storage for file uploads.

Deployment guide

Run with Docker Compose using PostgreSQL, Redis, and S3 storage. SSO configuration is required.

  1. Configure an SSO provider (Authentik, Keycloak, Google, etc.).
  2. Create .env file with database, Redis, S3, and SSO settings.
  3. Run Docker Compose with Outline, PostgreSQL, and Redis.
  4. Access the web UI and log in through the SSO provider.
  5. Create collections and invite team members.
Backup:Back up the PostgreSQL database and S3 storage containing uploaded files.

Copy and run on your server

Use each block separately: save the compose file, or copy the bash script to create it and start the container.

docker-compose.ymlyaml
services:
  outline:
    image: outlinewiki/outline:latest
    container_name: outline
    environment:
      DATABASE_URL: "postgres://outline:CHANGEME_db_password@postgres:5432/outline" # CHANGE THIS
      REDIS_URL: "redis://redis:6379"
      URL: "https://docs.example.com"
      SECRET_KEY: "change-me-generate-with-openssl-rand-hex-32" # CHANGE THIS
      UTILS_SECRET: "change-me-generate-with-openssl-rand-hex-32" # CHANGE THIS
      OIDC_CLIENT_ID: "outline"
      OIDC_CLIENT_SECRET: "your-oidc-secret"
      OIDC_AUTH_URI: "https://auth.example.com/authorize"
      OIDC_TOKEN_URI: "https://auth.example.com/token"
      OIDC_USERINFO_URI: "https://auth.example.com/userinfo"
      OIDC_DISPLAY_NAME: "SSO Login"
    ports:
      - "3000:3000"
    depends_on:
      - postgres
      - redis
    restart: unless-stopped

  postgres:
    image: postgres:16-alpine
    container_name: outline_postgres
    environment:
      POSTGRES_USER: outline
      POSTGRES_PASSWORD: CHANGEME_db_password # CHANGE THIS
      POSTGRES_DB: outline
    volumes:
      - ./postgres:/var/lib/postgresql/data
    restart: unless-stopped

  redis:
    image: redis:7-alpine
    container_name: outline_redis
    restart: unless-stopped
setup.shbash
#!/usr/bin/env bash
set -euo pipefail

sudo mkdir -p /opt/outline
sudo chown "$USER":"$USER" /opt/outline
cd /opt/outline

cat > docker-compose.yml <<'COMPOSE'
services:
  outline:
    image: outlinewiki/outline:latest
    container_name: outline
    environment:
      DATABASE_URL: "postgres://outline:CHANGEME_db_password@postgres:5432/outline" # CHANGE THIS
      REDIS_URL: "redis://redis:6379"
      URL: "https://docs.example.com"
      SECRET_KEY: "change-me-generate-with-openssl-rand-hex-32" # CHANGE THIS
      UTILS_SECRET: "change-me-generate-with-openssl-rand-hex-32" # CHANGE THIS
      OIDC_CLIENT_ID: "outline"
      OIDC_CLIENT_SECRET: "your-oidc-secret"
      OIDC_AUTH_URI: "https://auth.example.com/authorize"
      OIDC_TOKEN_URI: "https://auth.example.com/token"
      OIDC_USERINFO_URI: "https://auth.example.com/userinfo"
      OIDC_DISPLAY_NAME: "SSO Login"
    ports:
      - "3000:3000"
    depends_on:
      - postgres
      - redis
    restart: unless-stopped

  postgres:
    image: postgres:16-alpine
    container_name: outline_postgres
    environment:
      POSTGRES_USER: outline
      POSTGRES_PASSWORD: CHANGEME_db_password # CHANGE THIS
      POSTGRES_DB: outline
    volumes:
      - ./postgres:/var/lib/postgresql/data
    restart: unless-stopped

  redis:
    image: redis:7-alpine
    container_name: outline_redis
    restart: unless-stopped
COMPOSE

docker compose up -d
echo "Outline is running on http://SERVER_IP:3000"

Stack

TypeScriptNode.jsPostgreSQLRedis