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:
| Provider | Difficulty | Notes |
|---|---|---|
| Google Workspace | Easy | If your team uses Google |
| GitHub | Easy | Good for dev teams |
| Keycloak (self-hosted) | Medium | Full control, any team |
| Authentik (self-hosted) | Medium | Modern alternative to Keycloak |
| Azure AD | Easy | If 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:
- Open
http://your-server:9001 - Create a bucket named
outline - 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:
| Collection | Purpose |
|---|---|
| 📋 Company | Mission, values, org chart, policies |
| 🚀 Engineering | Architecture, runbooks, onboarding |
| 📊 Product | Specs, roadmap, user research |
| 💼 Sales | Playbooks, pricing, case studies |
| 👋 Onboarding | New hire guides, setup instructions |
| 📝 Meeting Notes | Standups, 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
| Integration | Setup |
|---|---|
| Slack | Settings → Integrations → Slack (notifications + search) |
| Zapier/n8n | Use Outline's API with webhooks |
| Import from Notion | Settings → Import → Notion (native importer) |
| Import from Confluence | Settings → 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_MAXfor larger teams - Add PostgreSQL connection pooling (PgBouncer) for 100+ users
- Consider CDN for MinIO assets
Resource Usage
| Users | RAM | CPU | Disk |
|---|---|---|---|
| 1-20 | 2 GB | 2 cores | 10 GB |
| 20-50 | 4 GB | 2 cores | 20 GB |
| 50-200 | 8 GB | 4 cores | 50 GB |
VPS Recommendations
| Provider | Spec (30 users) | Price |
|---|---|---|
| Hetzner | 4 vCPU, 8 GB RAM | €8/month |
| DigitalOcean | 2 vCPU, 4 GB RAM | $24/month |
| Linode | 2 vCPU, 4 GB RAM | $24/month |
Compare wiki and knowledge base tools on OSSAlt — features, import support, and pricing side by side.