Mikuの鬆

Mikuの鬆

心有多宽,世界就有多远

Docker部署Outline並使用Github作為OAuth服務

前言#

前段時間,我所屬的組織木創社需要部署一個文檔協作程序,在一番挑選(其實以前就用過)之後選中了 Outline 作為文檔協作程序,看了眼網上部署教程,依然抽象,實際上如果不考慮把 Nginx 集成的話其實不算特別困難,因為不需要特殊的權限管理和分配,所以直接在木創社 GitHub 組織新建了 OAuth App 作為登錄驗證方式,這樣也省去自建 SSO 服務的麻煩。

準備#

  • 一台伺服器(建議至少 1c2g)並安裝 Docker 和 Docker Compose
  • 一個域名,建議為頂級域名

服務#

  • Outline(本體)
  • PostgreSQL(數據庫)
  • Redis(緩存數據庫)
  • Minio(對象存儲服務)

部署#

請先安裝 Docker 和 Docker Compose 服務,如果你安裝 1Panel 作為伺服器面板,那麼已經自帶了相關服務,部署分為三部分,第一部分部署 Minio 並設置文件對象存儲服務,第二部分獲取 GitHub OAuth 相關設置,第三部分部署 Outline 相關服務。

你也可以使用兼容 AWS S3 協議的對象存儲服務作為 Outline 的對象存儲,例如:CloudFlare R2,繽紛雲,騰訊雲 OSS 等

如果你使用了在線對象存儲服務,則可跳過部署 Minio,直接開始部署 Outline。參考你的對象存儲服務文檔填寫相關機密信息和 Endpoint。

部署 Minio#

新建一個文件夾放入部署相關文件,比如/opt/Minio,使用以下命令新建相關文件夾並前往目錄,然後新建相關文件。

mkdir /opt/Minio && cd /opt/Minio

以下為docker-compose.yml文件示例

version: 3
services:
  minio:
    image: ${DOCKER_MINIO_IMAGE_NAME}
    env_file: ./.env # 指定環境變量文件
    container_name: minio
    ports:
      - 9502:9000
      - 9503:9001
    restart: always
    command: server /data --console-address :9000 --address :9001
    environment:
      MINIO_ROOT_USER: ${MINIO_ROOT_USER}
      MINIO_ROOT_PASSWORD: ${MINIO_ROOT_PASSWORD}
    logging:
      options:
        max-size: 5M
        max-file: 10
      driver: json-file
    volumes:
      - ./minio_data:/data
    labels:
      createdBy: Apps

你還需要在 Minio 放置 Docker Compose 文件的目錄新建.env文件,並填入以下內容,其中相關帳密信息建議自行修改提高安全性。

DOCKER_MINIO_IMAGE_NAME=minio/minio:RELEASE.2024-08-03T04-33-23Z.fips
DOCKER_MINIO_ROOT_USER=admin
DOCKER_MINIO_ROOT_PASSWORD=admin

使用 Nginx 反向代理 minio 服務,其中 9502 端口為 minio 服務的 http 端口,9503 端口為 minio 服務的 API 端口。

示例: localhost:9502 -> https://minio.example.com localhost:9503 -> https://api-minio.example.com

部署完成後,請訪問https://minio.example.com,使用設定的用戶名和密碼登錄。

登錄後,在設置中將Region設置為cn-1,並且在Bucket中增加一個bucket,命名為outline用於存儲outline的數據,並把訪問權限設置為私有

可選操作

Bucket->outline->Access->User中增加一個用戶,用於 outline 服務訪問 minio 服務。

配置 GitHub OAuth#

1. 訪問 GitHub 並登錄 2. 進入OAuth Apps 頁面(也可以依次點擊:右上角頭像 - Settings - Developer Settings - OAuth Apps) 3. 點擊New OAuth App 4. 填寫 Register a new OAuth application 表單

  • Application name: 可自行填寫,例如 outline
  • Homepage URL: 填寫 Outline 的主頁 URL
  • Authorization callback URL: 填寫 <Homepage URL>/auth/oidc.callback,其中 <Homepage URL> 需要替換為 Outline 的主頁 URL

5. 點擊 Register application 按鈕,進入應用詳情頁面 6. 點擊Generate a new client secret按鈕 7. 記下 Client ID 和 Client secret,後面填寫環境變量用(注意 Client secret 僅在創建時顯示一次,後續不可再查詢;如不慎遺失,可以再次點擊按鈕重新創建一個)

部署 Outline#

跟 Minio 一樣,新建一個文件夾放入部署相關文件,比如/opt/Outline,使用以下命令新建相關文件夾並前往目錄,然後新建相關文件。

mkdir /opt/Outline && cd /opt/Outline

以下為docker-compose.yml文件示例

version: 3.8
services:
  outline:
    image: ${DOCKER_OUTLINE_IMAGE_NAME}
    env_file: ./.env
    ports:
      - 9303:3000
    container_name: outline
    restart: always
    networks:
      - outline
    extra_hosts:
      - ${DOCKER_OUTLINE_HOSTNAME}:0.0.0.0
    depends_on:
      - postgres
      - redis

  redis:
    image: ${DOCKER_REDIS_IMAGE_NAME}
    env_file: ./.env
    volumes:
      - ./redis/redis.conf:/redis.conf # 配置文件持久化
    container_name: ${DOCKER_REDIS_HOST}
    restart: always
    networks:
      - outline
    command: [redis-server, /redis.conf] # 啟動命令

  postgres:
    image: ${DOCKER_POSTGRES_IMAGE_NAME}
    env_file: ./.env
    environment:
      POSTGRES_DB: ${DOCKER_POSTGRES_DB}
      POSTGRES_USER: ${DOCKER_POSTGRES_USER}
      POSTGRES_PASSWORD: ${DOCKER_POSTGRES_PASSWORD}
    volumes:
      - ./database-data:/var/lib/postgresql/data # 數據持久化
    container_name: ${DOCKER_POSTGRES_HOST}
    restart: always
    networks:
      - outline

networks:
  outline:

下面配置請逐行詳細閱讀,並根據實際情況修改,注意相關拼寫!

跟 Minio 一樣,在放置 Docker Compose 文件的目錄新建.env文件,並複製填入以下內容:

# 鏡像設置
DOCKER_OUTLINE_IMAGE_NAME=docker.getoutline.com/outlinewiki/outline:latest
DOCKER_POSTGRES_IMAGE_NAME=postgres
DOCKER_REDIS_IMAGE_NAME=redis

# 容器名稱
DOCKER_REDIS_HOST=outline_redis
DOCKER_POSTGRES_HOST=outline_postgres

# postgres設置
DOCKER_POSTGRES_USER=outline
DOCKER_POSTGRES_PASSWORD=outline
DOCKER_POSTGRES_DB=outline

# GitHub OAuth設置,填寫前面記下的信息

GITHUB_CLIENT_ID=id
GITHUB_CLIENT_SECRET=secret

# Outline設置
DOCKER_OUTLINE_HOSTNAME=docs.example.com # outline域名(需要自己使用Nginx反向代理)

# –––––––––––––––– outline必需 –––––––––––––––-

NODE_ENV=production

# 生成一個十六進制編碼的32字節隨機密鑰。你應該在終端使用 openssl rand -hex 32
# 來生成一個隨機值。
SECRET_KEY=d8e45eahe5d298d976464888dea86c92b72dfa73aj8cb8903454205c02c732b3

# 生成一個唯一的隨機密鑰。格式不重要,但你仍然可以使用
# openssl rand -hex 32 在你的終端來產生這個。
UTILS_SECRET=cf561a25absbd24c58e6d74edd726f60de11fd5c3fb8c289c725a48ab3b7b759

# 對於生產環境,請將這些指向你的數據庫,在開發中默認
# 應該是開箱即用的。
DATABASE_URL=postgres://${DOCKER_POSTGRES_USER}:${DOCKER_POSTGRES_PASSWORD}@${DOCKER_POSTGRES_HOST}:5432/${DOCKER_POSTGRES_DB}
DATABASE_CONNECTION_POOL_MIN=
DATABASE_CONNECTION_POOL_MAX=
# 取消註釋此項以禁用連接到Postgres的SSL
PGSSLMODE=disable

# 對於redis,你可以指定一個與ioredis兼容的url,像這樣
REDIS_URL=redis://${DOCKER_REDIS_HOST}:6379
# 或者,如果你想提供額外的連接選項,
# 使用一個base64編碼的JSON連接選項對象。參考ioredis文檔
# 了解可用選項的列表。
# 示例:使用Redis Sentinel來實現高可用性
# {sentinels:[{host:sentinel-0,port:26379},{host:sentinel-1,port:26379}],name:mymaster}
# REDIS_URL=ioredis://eyJzZW50aW5lbHMiOlt7Imhvc3QiOiJzZW50aW5lbC0wIiwicG9ydCI6MjYzNzl9LHsiaG9zdCI6InNlbnRpbmVsLTEiLCJwb3J0IjoyNjM3OX1dLCJuYW1lIjoibXltYXN0ZXIifQ==

# URL應該指向完全合格的、公開可訪問的URL。如果使用代理,
# URL中的端口和PORT可能不同。
URL=https://${DOCKER_OUTLINE_HOSTNAME}
PORT=3000

# 查看在運行一個獨立的協作
# 伺服器的[文檔](docs/SERVICES.md),在正常操作中不需要設置這個。
# COLLABORATION_URL=

# 為了支持上傳頭像和文檔附件的圖片,必須提供
# 一個兼容s3的存儲。推薦使用AWS S3來實現冗餘
# 但如果你想保持所有文件存儲在本地,可以使用
# 例如minio (https://github.com/minio/minio) 的替代方案。

# 設置S3的更詳細指南可以在這裡找到:
# => https://wiki.generaloutline.com/share/125de1cc-9ff6-424b-8415-0d58c809a40f
# 這裡使用在minio部署時使用的用戶名和密碼,或者使用在上一節中可選操作中創建的用戶,或者填寫兼容AWS S3協議的對象存儲信息
AWS_ACCESS_KEY_ID=admin
AWS_SECRET_ACCESS_KEY=admin
AWS_REGION=cn-1
# AWS_S3_ACCELERATE_URL=
AWS_S3_UPLOAD_BUCKET_URL=https://api-minio.example.com
AWS_S3_UPLOAD_BUCKET_NAME=outline
AWS_S3_FORCE_PATH_STYLE=true
AWS_S3_ACL=private

# 指定要使用的存儲系統。可能的值是s3或local之一。
# 對於local,頭像圖片和文檔附件將被保存在本地磁碟上。
FILE_STORAGE=s3

# 如果上面為FILE_STORAGE配置了local,則這設置了所有附件/圖片的父目錄
# 確保該進程有權限創建
# 這個路徑,並且也有權限向其寫入文件。
FILE_STORAGE_LOCAL_ROOT_DIR=/var/lib/outline/data

# 上傳附件允許的最大大小。
FILE_STORAGE_UPLOAD_MAX_SIZE=262144000

# 覆蓋文檔導入的最大大小,通常這應該比文檔附件的最大大小要低。
# FILE_STORAGE_IMPORT_MAX_SIZE=

# 覆蓋工作區導入的最大大小,這些可能特別大
# 並且文件是臨時的,會在一段時間後自動刪除。
# FILE_STORAGE_WORKSPACE_IMPORT_MAX_SIZE=

# –––––––––––––– 認證 ––––––––––––––

# 第三方登錄憑證,至少需要配置Google、Slack、
# 或Microsoft中的一個才能進行工作安裝,否則你將沒有登錄
# 選項。

# 要配置Slack認證,你需要在
# => https://api.slack.com/apps
# 創建一個應用程序
#
# 在配置Client ID時,添加一個重定向URL到OAuth & Permissions:
# https://<URL>/auth/slack.callback
# SLACK_CLIENT_ID=從slack獲取一個密鑰
# SLACK_CLIENT_SECRET=獲取上面密鑰的密鑰

# 要配置Google認證,你需要在
# => https://console.cloud.google.com/apis/credentials
# 創建一個OAuth客戶端ID
#
# 在配置客戶端ID時,添加一個已授權的重定向URI:
# https://<URL>/auth/google.callback
# GOOGLE_CLIENT_ID=
# GOOGLE_CLIENT_SECRET=

# 要配置Microsoft/Azure認證,你需要創建一個OAuth客戶端。見
# 指南了解如何設置你的Azure應用:
# => https://wiki.generaloutline.com/share/dfa77e56-d4d2-4b51-8ff8-84ea6608faa4
# AZURE_CLIENT_ID=
# AZURE_CLIENT_SECRET=
# AZURE_RESOURCE_APP_ID=

# GitHub認證

# 填寫 GitHub OAuth application 的 Client ID 和 Client secret
OIDC_CLIENT_ID=${GITHUB_CLIENT_ID}
OIDC_CLIENT_SECRET=${GITHUB_CLIENT_SECRET}

# 填寫 GitHub 的 OAuth endpoint,參考 https://docs.github.com/en/apps/oauth-apps/building-oauth-apps/authorizing-oauth-apps#web-application-flow
OIDC_AUTH_URI=https://github.com/login/oauth/authorize
OIDC_TOKEN_URI=https://github.com/login/oauth/access_token

# OAuth 授權的權限範圍
OIDC_SCOPES=read:user user:email

# 通過 GitHub API 獲取用戶基本信息
OIDC_USERINFO_URI=https://api.github.com/user
OIDC_USERNAME_CLAIM=name

# 讓登錄界面顯示為“使用 GitHub 繼續”
OIDC_DISPLAY_NAME=GitHub

# –––––––––––––––– 可選 ––––––––––––––––

# 為HTTPS終止提供Base64編碼的私鑰和證書。僅當你不使用外部反向代理時才需要此項。見文檔:
# https://wiki.generaloutline.com/share/1c922644-40d8-41fe-98f9-df2b67239d45
# SSL_KEY=
# SSL_CERT=

# 如果使用Cloudfront/Cloudflare分發或類似的服務,可以在下面設置。
# 這將導致javascript、樣式表和圖像的路徑被更新為
# 在CDN_URL中定義的主機名。在CDN配置中,原始伺服器
# 應設置為與URL相同。
# CDN_URL=

# 在生產環境中自動重定向到https。默認值為true,但如果你能確保
# SSL在外部負載均衡器處終止,可以設置為false。
FORCE_HTTPS=false

# 讓安裝通過發送匿名統計數據到
# 維護者來檢查更新
ENABLE_UPDATES=false

# 應該啟動多少個進程。作為一個合理的規則,將你伺服器
# 可用內存除以512來大致估算
WEB_CONCURRENCY=1

# 如果你的反向代理已經記錄了傳入的http
# 請求,而這變得重複,你可以刪除這一行
# DEBUG=http

# 配置伺服器日誌的最低嚴重性級別。應該是
# error, warn, info, http, verbose, debug 和 silly 之一
LOG_LEVEL=info

# 為了完整的Slack集成,包括搜索和發布到頻道,還需要
# 以下配置,更多細節
# => https://wiki.generaloutline.com/share/be25efd1-b3ef-4450-b8e5-c4a4fc11e02a
#
# SLACK_VERIFICATION_TOKEN=你的令牌
# SLACK_APP_ID=A0XXXXXXX
# SLACK_MESSAGE_ACTIONS=true

# 可選地啟用Sentry (sentry.io) 來跟蹤錯誤和性能,
# 並可選地在UI中添加一個Sentry代理隧道以繞過廣告攔截器:
# https://docs.sentry.io/platforms/javascript/troubleshooting/#using-the-tunnel-option)
# SENTRY_DSN=
# SENTRY_TUNNEL=

# 為了支持發送出站的事務性電子郵件,如文檔已更新或
# 你被邀請了,你需要提供SMTP伺服器的認證
# SMTP_HOST=smtp.office365.com
# SMTP_PORT=587
# SMTP_USERNAME=
# SMTP_PASSWORD=
# SMTP_FROM_EMAIL=
# SMTP_REPLY_EMAIL=
# SMTP_TLS_CIPHERS=
# SMTP_SECURE=false

# 默認界面語言。見translate.getoutline.com查看
# 可用的語言代碼及其大致翻譯的百分比。
DEFAULT_LANGUAGE=zh_CN

# 可選地啟用應用程序Web伺服器的速率限制器
RATE_LIMITER_ENABLED=true

# 為速率限制器配置默認的限流參數
RATE_LIMITER_REQUESTS=1000
RATE_LIMITER_DURATION_WINDOW=60

# Iframely API配置
# IFRAMELY_URL=
# IFRAMELY_API_KEY=

啟動服務後,使用 Nginx 反向代理 Outline 服務,其中 9303 端口為 outline 服務的 http 端口

示例: localhost:9303 -> https://docs.example.com

瀏覽器訪問你部署的 Outline 主頁(例如https://docs.example.com),選擇使用GitHub登錄,如果配置正確,會跳到 GitHub 的授權頁面,使用你的GitHub相關信息授權登錄即可。

此文由 Mix Space 同步更新至 xLog
原始鏈接為 https://www.sotkg.com/posts/site/7


載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。