Docker Compose全栈部署Outline Wiki:集成SSO与对象存储的实战指南

在知识管理工具百花齐放的今天,Outline以其简洁的Notion风格编辑器、完整的Markdown支持以及开源可自托管的特性,正成为越来越多技术团队和个人开发者的选择。不同于传统Wiki软件的笨重架构,Outline基于现代Web技术栈构建,配合Docker容器化部署方案,可以在30分钟内完成从零到生产环境的完整搭建。本文将深入解析如何通过Docker Compose编排PostgreSQL、Redis、MinIO和SSO服务,构建一个具备企业级功能的知识管理平台。

1. 环境准备与架构设计

部署Outline Wiki前需要理解其技术架构的四个核心组件:

  • 应用服务:Node.js编写的Outline主程序,提供文档编辑和展示界面
  • 数据存储:PostgreSQL作为主数据库,Redis用于缓存会话和临时数据
  • 文件存储:兼容S3协议的对象存储服务(本文采用MinIO实现)
  • 身份认证:基于OIDC的SSO单点登录系统

这种微服务架构使得每个组件都可以独立扩展。以下是各服务的资源需求参考:

服务 CPU核心 内存 磁盘空间 网络带宽
Outline 2 2GB 无需持久 10Mbps
PostgreSQL 2 4GB 50GB 5Mbps
Redis 1 1GB 无需持久 1Mbps
MinIO 2 2GB 100GB 50Mbps
SSO服务 1 1GB 无需持久 5Mbps

提示:生产环境建议为PostgreSQL配置SSD存储,文档数量超过1万篇时需要增加Redis内存配额

2. 基础服务部署

首先创建Docker网络和存储卷,确保各容器间通信隔离:

docker network create wiki-network
docker volume create postgres-data
docker volume create minio-data

然后准备docker-compose.infrastructure.yml文件定义基础设施服务:

version: '3.8'

services:
  postgres:
    image: postgres:13-alpine
    environment:
      POSTGRES_PASSWORD: ${DB_PASSWORD}
      POSTGRES_USER: outline
      POSTGRES_DB: outline
    volumes:
      - postgres-data:/var/lib/postgresql/data
    networks:
      - wiki-network
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U outline"]
      interval: 5s
      timeout: 5s
      retries: 5

  redis:
    image: redis:6-alpine
    command: redis-server --requirepass ${REDIS_PASSWORD}
    networks:
      - wiki-network
    healthcheck:
      test: ["CMD", "redis-cli", "ping"]
      interval: 5s
      timeout: 3s
      retries: 5

  minio:
    image: minio/minio:RELEASE.2021-11-24T23-19-33Z
    command: server /data --console-address ":9001"
    environment:
      MINIO_ROOT_USER: ${MINIO_ACCESS_KEY}
      MINIO_ROOT_PASSWORD: ${MINIO_SECRET_KEY}
    volumes:
      - minio-data:/data
    ports:
      - "9000:9000"
      - "9001:9001"
    networks:
      - wiki-network

volumes:
  postgres-data:
  minio-data:

networks:
  wiki-network:
    external: true

创建.env文件配置关键参数:

# 数据库配置
DB_PASSWORD=your_secure_db_password
REDIS_PASSWORD=your_redis_password

# MinIO配置
MINIO_ACCESS_KEY=minioadmin
MINIO_SECRET_KEY=minioadmin123
MINIO_BUCKET_NAME=outline-attachments

启动基础服务:

docker-compose -f docker-compose.infrastructure.yml up -d

3. SSO服务集成

Outline原生支持OIDC协议的身份认证。我们使用Dex作为轻量级SSO解决方案,创建docker-compose.sso.yml文件:

version: '3.8'

services:
  sso:
    image: ghcr.io/dexidp/dex:v2.30.0
    volumes:
      - ./config/dex/config.yaml:/etc/dex/config.yaml
    ports:
      - "5556:5556"
    networks:
      - wiki-network
    depends_on:
      postgres:
        condition: service_healthy

  sso-ui:
    image: nginx:alpine
    volumes:
      - ./config/sso/nginx.conf:/etc/nginx/nginx.conf
      - ./config/sso/html:/usr/share/nginx/html
    ports:
      - "8080:80"
    networks:
      - wiki-network

准备Dex配置文件config/dex/config.yaml

issuer: http://sso.yourdomain.com:5556/dex
storage:
  type: postgres
  config:
    host: postgres
    port: 5432
    user: outline
    password: ${DB_PASSWORD}
    database: outline
    ssl:
      mode: disable

web:
  http: 0.0.0.0:5556

staticClients:
- id: outline
  redirectURIs:
  - "http://wiki.yourdomain.com/auth/oidc.callback"
  name: "Outline Wiki"
  secret: ${SSO_CLIENT_SECRET}

oauth2:
  skipApprovalScreen: true

enablePasswordDB: true
staticPasswords:
- email: "admin@yourdomain.com"
  hash: "$2a$10$2b2cU8CPhOTaGrs1HRQuAueS7JTT5ZHsHSzCfpNqTtL2LQWz1Ef8O" # bcrypt hash of "password"
  username: "admin"
  userID: "08a8684b-db88-4b73-90a9-3cd1661f5466"

生成SSO客户端密钥:

openssl rand -hex 32 | tee -a .env

.env文件中添加:

SSO_CLIENT_SECRET=上一步生成的密钥

4. Outline主服务配置

创建主服务编排文件docker-compose.outline.yml

version: '3.8'

services:
  outline:
    image: outlinewiki/outline:0.66.0
    environment:
      - NODE_ENV=production
      - DATABASE_URL=postgres://outline:${DB_PASSWORD}@postgres/outline
      - DATABASE_URL_TEST=postgres://outline:${DB_PASSWORD}@postgres/outline_test
      - REDIS_URL=redis://:${REDIS_PASSWORD}@redis:6379
      - URL=http://wiki.yourdomain.com
      - SECRET_KEY=${OUTLINE_SECRET_KEY}
      - UTILS_SECRET=${OUTLINE_UTILS_SECRET}
      - OIDC_CLIENT_ID=outline
      - OIDC_CLIENT_SECRET=${SSO_CLIENT_SECRET}
      - OIDC_AUTH_URI=http://sso:5556/dex/auth
      - OIDC_TOKEN_URI=http://sso:5556/dex/token
      - OIDC_USERINFO_URI=http://sso:5556/dex/userinfo
      - OIDC_SCOPES=openid profile email
      - OIDC_USERNAME_CLAIM=email
      - AWS_ACCESS_KEY_ID=${MINIO_ACCESS_KEY}
      - AWS_SECRET_ACCESS_KEY=${MINIO_SECRET_KEY}
      - AWS_REGION=us-east-1
      - AWS_S3_UPLOAD_BUCKET_URL=http://minio:9000
      - AWS_S3_UPLOAD_BUCKET_NAME=${MINIO_BUCKET_NAME}
      - AWS_S3_ACL=private
      - AWS_S3_FORCE_PATH_STYLE=true
    ports:
      - "3000:3000"
    depends_on:
      postgres:
        condition: service_healthy
      redis:
        condition: service_healthy
    networks:
      - wiki-network

生成Outline所需的加密密钥:

openssl rand -hex 32 | tee -a .env
echo "OUTLINE_UTILS_SECRET=$(openssl rand -hex 32)" >> .env

5. 服务启动与初始化

合并启动所有服务:

docker-compose \
  -f docker-compose.infrastructure.yml \
  -f docker-compose.sso.yml \
  -f docker-compose.outline.yml \
  up -d

执行数据库迁移:

docker-compose -f docker-compose.outline.yml exec outline yarn sequelize db:migrate

检查服务状态:

docker-compose -f docker-compose.outline.yml ps

健康状态应显示为:

Name                Command                  State                 Ports
----------------------------------------------------------------------------
minio       /usr/bin/docker-entrypoint ...   Up (healthy)   0.0.0.0:9000-9001->9000-9001/tcp
outline     docker-entrypoint.sh yarn start  Up (healthy)   0.0.0.0:3000->3000/tcp
postgres    docker-entrypoint.sh postgres    Up (healthy)   5432/tcp
redis       docker-entrypoint.sh redis ...   Up (healthy)   6379/tcp
sso         /usr/local/bin/dex serve ...     Up             0.0.0.0:5556->5556/tcp
sso-ui      /docker-entrypoint.sh ngin ...   Up             0.0.0.0:8080->80/tcp

6. 系统配置与优化

访问http://wiki.yourdomain.com完成初始设置后,建议进行以下优化:

性能调优参数

# 在outline服务环境变量中添加
- PG_POOL_MIN=2
- PG_POOL_MAX=20
- REDIS_POOL_MIN=2
- REDIS_POOL_MAX=20
- WEB_CONCURRENCY=2
- NODE_MEMORY_LIMIT=2048

定期备份方案

创建backup.sh脚本:

#!/bin/bash
DATE=$(date +%Y%m%d)
docker exec $(docker ps -q -f name=postgres) \
  pg_dump -U outline -Fc outline > outline_$DATE.dump
docker run --rm -v minio-data:/data -v $(pwd):/backup busybox \
  tar czvf /backup/minio_$DATE.tar.gz /data

日志收集配置

# 在各服务的docker-compose配置中添加
logging:
  driver: "json-file"
  options:
    max-size: "10m"
    max-file: "3"

7. 常见问题排查

服务启动失败检查步骤

  1. 验证网络连接:

    docker run --rm --network wiki-network busybox ping -c 3 postgres
    
  2. 检查数据库连接:

    docker run --rm --network wiki-network postgres:13-alpine \
      psql "postgres://outline:${DB_PASSWORD}@postgres/outline" -c "\l"
    
  3. 查看容器日志:

    docker-compose logs --tail=100 outline
    

附件上传问题处理

  1. 确认MinIO桶策略:

    docker run --rm --network wiki-network -e MC_HOST_minio=http://${MINIO_ACCESS_KEY}:${MINIO_SECRET_KEY}@minio:9000 \
      minio/mc mb minio/${MINIO_BUCKET_NAME}
    
  2. 验证S3访问权限:

    docker run --rm --network wiki-network -e AWS_ACCESS_KEY_ID=${MINIO_ACCESS_KEY} \
      -e AWS_SECRET_ACCESS_KEY=${MINIO_SECRET_KEY} amazon/aws-cli \
      --endpoint-url http://minio:9000 s3 ls s3://${MINIO_BUCKET_NAME}
    

性能优化指标监控

# 数据库查询性能
docker exec -it $(docker ps -q -f name=postgres) \
  pg_stat_activity -U outline

# Redis内存使用
docker exec -it $(docker ps -q -f name=redis) \
  redis-cli -a ${REDIS_PASSWORD} info memory

# Node.js进程状态
docker exec -it $(docker ps -q -f name=outline) \
  yarn run pm2 monit
Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐