收起左侧

outline生产部署

0
回复
350
查看
[ 复制链接 ]

4

主题

2

回帖

0

牛值

江湖小虾

这是目前我觉得最好的笔记工具,简单、清爽、易用、又没有广告。也可以通过集中分享做成简易博客

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

需求选择

经过测试,这不是必须项,很**肋的需求。

  1. 部署条件

已有分布式存储集群,且有迁移到云服务的需求,这两点满足的情况下采用MinIO。

否则,就采用本机存储,记得做好备份,存储位置为 raid。

  1. 单机部署

根据内部网络来处理,选择弹性很高,本机存储即可。

图片/视频不多的情况下,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 设置为 中文(中国),然后保存并刷新页面。

  • 创建Outline Realm

点击左上角 "Master realms" → "创建领域"

领域名称: outline

点击 "创建"

  • 创建Outline Client

在 Master realms → outline

左侧菜单 客户端 → 创建客户端

基本信息:

  • 客户端 ID: outline
  • 名称: Outline Wiki
  • 描述: (可选) Outline知识库

点击 "Next"

功能配置:

  • ✅ 客户端认证: ON
  • ✅ 授权: OFF
  • ✅ 标准流程: ON
  • ❌ 直接访问授权: OFF
  • 其他保持默认

点击 "Next"

登录设置(关键!):

点击 "Save"

  • 获取客户端凭证

客户端 → 客户端列表 → outline进入 凭证 标签页

复制 "客户端密码"(点击眼睛图标显示)

保存好这个 "密码",一会儿Outline配置要用

  • 配置登录用户

左侧菜单 用户管理 → 添加用户

填写:

  • 用户名:可以是邮箱,也可以是用户
  • 电子邮箱:同上
  • 电子邮箱验证: ON

点击 "创建"

设置密码:

  • 进入用户详情 → 凭证 标签
  • 点击 "Set password"
  • 输入密码,临时密码 选 OFF

点击 "保存"

  • 可以在Keycloak中批量添加用户

设置反代

  • 重点,需要开启跨域支持

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
收藏
送赞 1
分享
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则