Outline logoTeam Wiki & Docs

Outline

Wiki và tài liệu cho team, giao diện đẹp và nhanh, thay thế Notion với dữ liệu tự host.

Ghi chú review

Cần cấu hình SSO (OIDC hoặc SAML) để đăng nhập. Nên dùng S3-compatible storage cho file uploads.

Hướng dẫn deploy

Chạy bằng Docker Compose với PostgreSQL, Redis và S3 storage. Bắt buộc cấu hình SSO.

  1. Cấu hình SSO provider (Authentik, Keycloak, Google, etc.).
  2. Tạo file .env với database, Redis, S3 và SSO settings.
  3. Chạy Docker Compose với Outline, PostgreSQL và Redis.
  4. Truy cập web UI và đăng nhập qua SSO provider.
  5. Tạo collections và mời team members.
Backup:Backup database PostgreSQL và S3 storage chứa uploaded files.

Copy để chạy trên server

Dùng từng block riêng: lưu compose trước, hoặc copy script bash để tạo file và chạy 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