Docker Compose一键部署Outline Wiki:附SSO登录和MinIO存储的保姆级配置
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. 常见问题排查
服务启动失败检查步骤:
-
验证网络连接:
docker run --rm --network wiki-network busybox ping -c 3 postgres -
检查数据库连接:
docker run --rm --network wiki-network postgres:13-alpine \ psql "postgres://outline:${DB_PASSWORD}@postgres/outline" -c "\l" -
查看容器日志:
docker-compose logs --tail=100 outline
附件上传问题处理:
-
确认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} -
验证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
更多推荐
所有评论(0)