前言#
前段時間,我所屬的組織木創社需要部署一個文檔協作程序,在一番挑選(其實以前就用過)之後選中了 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