这是目前我觉得最好的笔记工具,简单、清爽、易用、又没有广告。也可以通过集中分享做成简易博客
1 准备
- 我不想部署太多数据库,所以数据库都是单独部署,多容器共用的。
- 配置的双网络:bridge(db)+macvlan(nas),兼顾bridge的内部通讯优势和macvlan的外部通讯优势,并且保证数据库(数据库在子网,无需暴露端口)的安全。
- 我用的 lucky 反代
网络设置
macvlan 和主内网同网段
# macvlan
sudo docker network create -d macvlan \
--subnet=192.168.1.0/24 \
--gateway=192.168.1.1 \
--aux-address="host=192.168.1.254" \
--ipv6 --subnet=fd00::/64 \
-o parent=enp193s0 \ # 修改为自己的网卡
nas
bridge Docker 从 20 开始才可以固定 ip
# macvlan
sudo docker network create -d bridge \
--subnet=172.20.0/16 \
--gateway=172.20.0.1 \
-o parent=enp193s0 \ # 修改为自己的网卡
db
2 MinIO
需求选择
经过测试,这不是必须项,很**肋的需求。
- 部署条件
已有分布式存储集群,且有迁移到云服务的需求,这两点满足的情况下采用MinIO。
否则,就采用本机存储,记得做好备份,存储位置为 raid。
- 单机部署
根据内部网络来处理,选择弹性很高,本机存储即可。
图片/视频不多的情况下,30G 内存、50M 上行就足够支持五千左右的并发了。
家用真没必要部署,直接用本机存储就好,outline 的配置文件有两种都有,按需选择。
部署
networks:
nas:
external: true
services:
db-minio:
image: minio/minio:RELEASE.2024-01-05T22-17-24Z
container_name: db-minio
restart: always
command: server /data --console-address ":9001" --address ":9000"
networks:
nas:
ipv4_address: 192.168.1.218
environment:
# MinIO 认证配置
MINIO_ROOT_USER: "<用户名>"
MINIO_ROOT_PASSWORD: "<密码>"
volumes:
- /vol2/.DB/minio/data:/data
- /vol2/.DB/minio/config:/root/.minio
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "3"
设置
- 9001 是管理界面端口,9000 是数据 API 数据传输端口。
- Settings → Region 设置为
cn-1。
- Bucket 中增加一个
bucket,命名为 outline 用于存储 outline 的数据,访问权限设置为 私有
- lucy 中设置好
9000 的反代, 我测试内网不能上传文件。
3 postgres
部署
---
networks:
db:
external: true
services:
db-postgres:
image: postgres:18
container_name: db-postgres
restart: always
networks:
db:
ipv4_address: 172.20.0.211
healthcheck:
test: ["CMD-SHELL", "pg_isready -U <用户名>"]
interval: 30s
timeout: 10s
retries: 3
environment:
- POSTGRES_USER=<用户名>
- POSTGRES_PASSWORD=<密码>
volumes:
- /vol2/.DB/postgres:/var/lib/postgresql
logging:
driver: "json-file"
options:
max-size: 1m
max-file: 3
创建数据库命令
新建一个数据库(例如 keycloak)
sudo docker exec -it db-postgres psql -U <用户名> -c "CREATE DATABASE o_keycloak;"
# 查看实例,quit 退出
sudo docker exec -it db-postgres psql -U <用户名> -d postgres -c "\l"
# 删除实例
sudo docker exec -it db-postgres psql -U <用户名> -c "DROP DATABASE o_keycloak;"
# 查看数据库里面的数据
sudo docker exec -it db-postgres psql -U <用户名> -d 数据库名 -c "SELECT * FROM pg_stat_activity WHERE datname = '数据库名';"
4 redis
---
networks:
db:
external: true
services:
db-redis:
image: redis
container_name: db-redis
restart: always
command: redis-server --save 600 1 --requirepass <密码>
networks:
db:
ipv4_address: 172.20.0.219
healthcheck:
test:
- CMD
- redis-cli
- --raw
- incr
- ping
interval: 10s
timeout: 5s
retries: 5
volumes:
- /vol2/.DB/redis:/data
logging:
driver: "json-file"
options:
max-size: 1m
max-file: 3
5 Keycloak
部署
---
networks:
db:
external: true
name: db
nas:
external: true
name: nas
services:
outline-keycloak:
image: keycloak/keycloak:26.4.7-0
container_name: outline-keycloak
restart: always
command: start-dev
# 网络设置
networks:
db:
ipv4_address: 172.20.0.16
nas:
ipv4_address: 192.168.1.196
external_links:
- db-postgres
environment:
KC_HEALTH_ENABLED: "true"
KC_HOSTNAME: "auth.<域名>"
KC_HTTP_ENABLED: "true"
KC_PROXY_HEADERS: "xforwarded"
PROXY_ADDRESS_FORWARDING: "true"
# 管理员
KEYCLOAK_HOSTNAME: "auth.<域名>"
KEYCLOAK_ADMIN: admin
KEYCLOAK_ADMIN_PASSWORD: <密码>
# 数据库配置
KC_DB: postgres
KC_DB_URL: jdbc:postgresql://172.20.0.211:5432/o_keycloak
KC_DB_USERNAME: <用户名>
KC_DB_PASSWORD: <密码>
healthcheck:
test:
- "CMD-SHELL"
- |
exec 3<>/dev/tcp/localhost/9000 &&
echo -e 'GET /health/ready HTTP/1.1\r\nHost: localhost\r\nConnection: close\r\n\r\n' >&3 &&
cat <&3 | tee /tmp/healthcheck.log | grep -q '200 OK'
interval: 10s
timeout: 5s
retries: 3
start_period: 90s
volumes:
- /vol1/1000/A1docker/Outline/keycloak-certs:/opt/keycloak/conf
- /vol1/1000/A1docker/Outline/keycloak-data:/opt/keycloak/data
logging:
driver: "json-file"
options:
max-size: 1m
max-file: 3
Keycloak设置
登录管理界面,进入 Realm Settings。
在 Localization 选项卡中,启用 Supported Locales 并选择 中文(中国)。
将 Default Locale 设置为 中文(中国),然后保存并刷新页面。
点击左上角 "Master realms" → "创建领域"
领域名称: outline
点击 "创建"
在 Master realms → outline
左侧菜单 客户端 → 创建客户端
基本信息:
- 客户端 ID: outline
- 名称: Outline Wiki
- 描述: (可选) Outline知识库
点击 "Next"
功能配置:
- ✅ 客户端认证: ON
- ✅ 授权: OFF
- ✅ 标准流程: ON
- ❌ 直接访问授权: OFF
- 其他保持默认
点击 "Next"
登录设置(关键!):
点击 "Save"
客户端 → 客户端列表 → outline进入 凭证 标签页
复制 "客户端密码"(点击眼睛图标显示)
保存好这个 "密码",一会儿Outline配置要用
左侧菜单 用户管理 → 添加用户
填写:
- 用户名:可以是邮箱,也可以是用户
- 电子邮箱:同上
- 电子邮箱验证: ON
点击 "创建"
设置密码:
- 进入用户详情 → 凭证 标签
- 点击 "Set password"
- 输入密码,临时密码 选 OFF
点击 "保存"
设置反代
6 outline
部署
(networks:
db:
external: true
nas:
external: true
services:
outline:
image: outlinewiki/outline
container_name: outline-server
restart: unless-stopped
networks:
db:
ipv4_address: 172.20.0.18
nas:
ipv4_address: 192.168.1.198
external_links:
- db-postgres
- db-redis
- db-minio
logging:
driver: "json-file"
options:
max-size: 1m
max-file: 3
volumes:
- /vol2/.DB/outline/data:/var/lib/outline/data
environment:
# ================ outline必需 ================
# URL应该指向完全合格的、公开可访问的URL。URL中的端口和PORT可能不同。
- URL=https://wiki.<域名>:<端口>
- PORT=3000
- NODE_ENV=production
# 默认界面语言。见translate.getoutline.com查看
- DEFAULT_LANGUAGE=zh_CN
# 上传附件允许的最大大小。
# - FILE_STORAGE_UPLOAD_MAX_SIZE=262144000
# 在生产环境中自动重定向到https。默认值为true。
- FORCE_HTTPS=false
# 让安装通过发送匿名统计数据
- ENABLE_UPDATES=false
# 启动多少个进程。可用内存除以512来大致估算
# - WEB_CONCURRENCY=10
# 生成两个十六进制编码的32字节随机密钥。终端使用 `openssl rand -hex 32`生成
- SECRET_KEY=a70bdff243a704d319cfab9fcd7b22cad169be9513a89a62fd91aaf7a15cf4ea
- UTILS_SECRET=bf77fb81f59c5dc73a44c9ac68e14b8a126b834cf49f1aeb5e7e21b8631e775b
# ================ 邮箱配置 ================
# 邮箱配置(以163邮箱示例,好像没有邮箱不能导出文件)
- SMTP_HOST=smtp.163.com
- SMTP_PORT=465
- SMTP_USERNAME=您的163邮箱@163.com
- SMTP_PASSWORD=客户端授权密码
- SMTP_FROM_EMAIL=您的163邮箱@163.com
- SMTP_SECURE=true
# ================ 数据库 ================
# 1、数据库
- DATABASE_URL=postgres://<用户名>:<密码>@172.20.0.211:5432/o_outline
- PGSSLMODE=disable
# 2、redis配置
- REDIS_URL=redis://:<密码>@172.20.0.219:6379
# 3、MinIO/S3 存储配置(不推荐)
- FILE_STORAGE=s3
- AWS_ACCESS_KEY_ID=<用户名>
- AWS_SECRET_ACCESS_KEY=<密码>
- AWS_REGION=cn-1
- AWS_S3_UPLOAD_BUCKET_NAME=outline
- AWS_S3_UPLOAD_BUCKET_URL=https://minio.<域名>:<端口>
- AWS_S3_FORCE_PATH_STYLE=true
- AWS_S3_SSL_ENABLED=false
- AWS_S3_ACL=private
# 4、本机存储,与上面"3"二选一
- FILE_STORAGE=local
# 这个路径,并且也有权限向其写入文件。切记该目录要映射
- FILE_STORAGE_LOCAL_ROOT_DIR=/var/lib/outline/data
# ===== OIDC配置(先启动Keycloak,创建应用后获取ID和Secret,再取消注释)=====
# 强制使用OIDC登录
# - DISABLE_REGISTRATION=true
# 需与Keycloak中创建的"客户端ID"一致
- OIDC_CLIENT_ID=outline
# 从Keycloak 客户端密码
- OIDC_CLIENT_SECRET=8dkz4x5ETtmJho38ldKfiyfoK9xQ30dK
# 注意是 /realms/outline,不是 /realms/master
- OIDC_AUTH_URI=https://auth.<域名>:<端口>/realms/outline/protocol/openid-connect/auth
- OIDC_TOKEN_URI=https://auth.<域名>:<端口>/realms/outline/protocol/openid-connect/token
- OIDC_USERINFO_URI=https://auth.<域名>:<端口>/realms/outline/protocol/openid-connect/userinfo
# 支持包含JWT载荷的任何有效JSON路径
- OIDC_USERNAME_CLAIM=preferred_username
# OIDC 身份验证的显示名称
- OIDC_DISPLAY_NAME=OpenID Connect
# 以空格分隔的身份验证范围。
- OIDC_SCOPES=openid profile email
设置反代
本地存储无法上传附件
docker exec -u 0 -it outline-server sh
chown -R nodejs:nodejs /var/lib/outline/data