使用 Docker 搭建 Confluence

蘇洋發表於2019-03-30

本文使用「署名 4.0 國際 (CC BY 4.0)」許可協議,歡迎轉載、或重新修改使用,但需要註明來源。 署名 4.0 國際 (CC BY 4.0)

本文作者: 蘇洋

建立時間: 2019年03月30日 統計字數: 5170字 閱讀時間: 11分鐘閱讀 本文連結: soulteary.com/2019/03/30/…


使用 Docker 搭建 Confluence

小型團隊協同,或者想花錢買個省心,Confluence 是比較好的選擇之一。但是最近安裝 Confluence ,發現官方和網上的安裝介紹都比較“落後”低效,所以有了本篇內容。

本文將介紹如何使用 Docker Compose 快速搭建 Confluence 、以及如何和 Traefik 一同使用,如果你看過之前的內容,跟隨本文應該能在十分鐘內解決戰鬥。

基礎準備

  • Docker Hub 上官方容器映象:https://hub.docker.com/r/atlassian/confluence-server/tags
    • 這裡會講解兩個有代表性的版本: 6.46.15
  • MySQL JDBC Connector : https://dev.mysql.com/downloads/connector/j/5.1.html
    • 如果你也選擇使用 MySQL 作為儲存後端,需要下載此檔案,一般情況下你會獲得 mysql-connector-java-5.1.47.tar.gz 的壓縮包,解壓縮之後,獲得 mysql-connector-java-5.1.47.jar,我們稍後會用到。

針對老版本軟體的使用

先說老版本,如果你只是需要基礎的 Wiki 功能,那麼下面的配置檔案應該能夠滿足你的需求。

version: '3'

services:

  confluence:
    image: atlassian/confluence-server:6.4.3-alpine
    expose:
      - 8090
      - 8091
    networks:
      - traefik
    labels:
      - "traefik.enable=true"
      - "traefik.port=8090"
      - "traefik.frontend.rule=Host:${DOMAIN}"
      - "traefik.frontend.entryPoints=http,https"
    volumes:
      - ./data:/var/atlassian/application-data/confluence
      - ./mysql-connector-java-5.1.47.jar:/opt/atlassian/confluence/confluence/WEB-INF/lib/mysql-connector-java-5.1.47.jar

networks:
  traefik:
    external: true
複製程式碼

將上面的檔案儲存為 docker-compose.yml 後,我們建立另外基礎配置檔案 **.env **,和上面的配置一樣簡單,檔案內容可以是下面這樣。

DOMAIN=wiki.lab.com
複製程式碼

docker-compose.yml.envmysql-connector-java-5.1.47.jar 放在同一目錄,如果此刻你的 Traefik 已經就緒,那麼執行 docker-compose up ,你的服務便啟動起來了。

直接訪問你配置好的域名,比如例子中的 wiki.lab.com,你就可以進行 Confluence 的 Web 介面配置啦。如果你還不會使用 Traefik ,那麼可以翻閱歷史文章,同樣是一些十分鐘以內的教程。

如果你選擇將 Confluence 部署在公網,面對每天很是煩人的掃描器,不妨簡單新增 Basic Auth 認證,將這些惡意請求攔截在外面。

因為使用了 Traefik ,所以新增這個功能十分簡單,只需要兩步:

第一步,在 docker-compose.ymllabels 欄位內新增下面的內容。

- "traefik.frontend.auth.basic=${BASIC_AUTH}"
複製程式碼

第二步,執行 htpasswd -nb user user,得到一段包含使用者名稱和加密後的密碼的文字字串,譬如這樣:user:$apr1$MzgRxukq$MhYl/2JidzUNlHfyfIQF41,接著將內容新增到 .env 中:

BASIC_AUTH=user:$apr1$MzgRxukq$MhYl/2JidzUNlHfyfIQF41
複製程式碼

當再有掃描器想直接對應用進行掃描的時候,就會被 Basic Auth 擋在外面啦。

應用健康檢查報錯

當你安裝完畢,開始使用的時候,會發現介面的右上角會提示一個警告資訊。

Can't check base URL

官方知識庫中有提到這個問題,如果你使用的也是低版本(6.6)之前,其實可以通過配置 Hosts 來解決問題。

比如在 docker-compose.yml 中新增一段宣告,讓應用伺服器查詢本機上應用地址,而非一定要訪問公網地址的應用,參考配置如下:

version: '3'

services:

  confluence:
    image: atlassian/confluence-server:6.4.3-alpine
    expose:
      - 8090
      - 8091
    networks:
      - traefik
    labels:
      - "traefik.enable=true"
      - "traefik.port=8090"
      - "traefik.frontend.rule=Host:${DOMAIN}"
      - "traefik.frontend.entryPoints=http,https"
    volumes:
      - ./data:/var/atlassian/application-data/confluence
      - ./mysql-connector-java-5.1.47.jar:/opt/atlassian/confluence/confluence/WEB-INF/lib/mysql-connector-java-5.1.47.jar
    extra_hosts:
      - "${DOMAIN}:127.0.0.1"

networks:
  traefik:
    external: true
複製程式碼

是不是十分簡單,如果你的需求是基礎使用,上述的配置應該已經能夠滿足你的需求了。

針對新版本軟體的使用

接著我們聊聊如何使用最新版本的軟體,因為我們使用了容器,所以更新版本十分簡單,在配置檔案中修改映象的版本號就好了。比如,我想將 6.4.3 這個低版升級到其他版本,只需要將配置中的 6.4.3 改為 6.15.1 即可,例如 atlassian/confluence-server:6.15.1-alpine

其他的基本和老版本軟體使用一致。不過這裡會有幾個小問題,需要額外解決一下。

資料庫不能正確連線

WARN: Establishing SSL connection without server's identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by default if explicit option isn't set. For compliance with existing applications not using SSL the verifyServerCertificate property is set to 'false'. You need either to explicitly disable SSL by setting useSSL=false, or set useSSL=true and provide truststore for server certificate verification.

要解決這個問題,可以選擇配置加密的 MySQL 連線,並更新容器中的證照,也可以選擇新增引數,關閉強制使用加密連線請求,後者更簡單,如果要求不高,可以這麼做。

編輯 data/confluence.cfg.xml 檔案中的 hibernate.connection.url ,在連線地址後新增 ?useSSL=false 引數,重啟應用即可。

Traefik Basic Auth 和 Tomcat 發生聯動

新版本的軟體邏輯中,有針對請求中帶有 Basic Auth 進行額外處理:如果在上面配置了 Basic Auth ,那麼應用會提示驗證失敗,不能登入系統。

這個顯然不是我們新增 Basic Auth 的用意,並且實際使用中,也不推薦直接將 Confluence 的認證介面對外。

解決方案很簡單,在 docker-compose.yml 中新增一行 - "traefik.frontend.auth.basic.removeHeader=true" ,Traefik 的驗證資訊將僅針對 Traefik 使用,在反向代理應用的時候,HTTP 請求中的驗證資訊會被刪除掉。

同樣的,重啟應用,這個問題就解決了。

稍微麻煩一些的健康檢查

因為我們使用 Traefik 掛載證照,應用實際執行在代理伺服器背後,當使用管理員訪問控制檯,會看到一個警告資訊。

您的 URL 不匹配

Confluence 的基本URL設定為http://wiki.lab.com,但您正從https://wiki.lab.com訪問 Confluence。

考慮應用的正常使用,我們通常會將協議進行修正,比如將站點基礎URL修正為 https 。但是在修正之後,你會收到另外一個警告。

Tomcat 配置不正確

Tomcat server.xml 配置不正確: scheme 應為 'https' proxyName 應為 ‘YOUR_DOMAIN_URI’ proxyPort 應為 '443'

原因是比較新的版本的應用,健康檢查邏輯附帶了埠和協議判斷,低版本可以直接使用 Traefik 反代掛載證照的幸福快樂日子一去不復返。

解決問題需要分為三步。

第一步,將容器內的 Tomcat 執行配置 server.xml 拷貝到本地(da5582a01879 為 docker ps 獲取的容器PID)。

docker cp da5582a01879:/opt/atlassian/confluence/conf/server.xml .
複製程式碼

第二步,將配置中埠為 8090 的 Connector 的配置更新為下面的內容(尤其注意最後一行內容):

<Connector
    port="8090"
    connectionTimeout="20000"
    redirectPort="8443"
    maxThreads="48" minSpareThreads="10"
    enableLookups="false"
    acceptCount="10"
    debug="0"
    URIEncoding="UTF-8"
    protocol="org.apache.coyote.http11.Http11NioProtocol"
    proxyName="wiki.lab.com" proxyPort="443" scheme="https"/>
複製程式碼

第三步,更新 docker-compose.yml 配置檔案。

volumes 欄位中新增內容:

- ./server.xml:/opt/atlassian/confluence/conf/server.xml
複製程式碼

同時刪除 extra_hosts 欄位內容。

重啟應用,一切正常。

完整的配置檔案

為了方便使用,這裡給出完整的參考配置。

version: '3'

services:

  confluence:
    image: atlassian/confluence-server:6.15.1-alpine
    expose:
      - 8090
      - 8091
    networks:
      - traefik
    labels:
      - "traefik.enable=true"
      - "traefik.port=8090"
      - "traefik.frontend.rule=Host:${DOMAIN}"
      - "traefik.frontend.entryPoints=http,https"
      - "traefik.frontend.auth.basic.removeHeader=true"
      - "traefik.frontend.auth.basic=${BASIC_AUTH}"
    volumes:
      - ./data:/var/atlassian/application-data/confluence
      - ./mysql-connector-java-5.1.47.jar:/opt/atlassian/confluence/confluence/WEB-INF/lib/mysql-connector-java-5.1.47.jar
      - ./server.xml:/opt/atlassian/confluence/conf/server.xml


networks:
  traefik:
    external: true
複製程式碼

最後

雖然對於團隊來說 Confluence 是一個不錯的方案,但是實際針對個人/擁有定製能力的團隊而言,使用完全開源免費的 WordPress 或許會更好,下一篇我將介紹 WordPress 用作知識管理用途的一些定製處理。


我現在有一個小小的折騰群,裡面聚集了一些喜歡折騰的小夥伴。

在不發廣告的情況下,我們在裡面會一起聊聊軟體、HomeLab、程式設計上的一些問題,也會在群裡不定期的分享一些技術沙龍的資料。

喜歡折騰的小夥伴歡迎掃碼新增好友。(請註明來源和目的,否則不會通過稽核)

關於折騰群入群的那些事

相關文章