Team 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.
- Configure an SSO provider (Authentik, Keycloak, Google, etc.).
- Create .env file with database, Redis, S3, and SSO settings.
- Run Docker Compose with Outline, PostgreSQL, and Redis.
- Access the web UI and log in through the SSO provider.
- 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-stoppedsetup.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