使用 Docker 和 Traefik v2 搭建 Confluence 7.3

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

本文做者: 蘇洋java

建立時間: 2020年03月06日 統計字數: 7821字 閱讀時間: 16分鐘閱讀 本文連接: soulteary.com/2020/03/06/…mysql


使用 Docker 和 Traefik v2 搭建 Confluence 7.3

以前寫過三篇如何使用「容器化方案來搭建 Confluence」,本文將基於最近最新推出的 Confluence 7.3 來演示如何使用新版的軟件。web

若是你想要給公司團隊或者我的搭建 Wiki,能夠參考以前關於如何搭建 Wiki 的實戰文章,裏面記錄瞭如何高效完成搭建,並避過踩坑的方法。sql

以往已經上車使用的用戶,也能夠參考本文進行升級。docker

寫在前面

在獨立運行維護多個 Confluence 實例一年多以後,經歷了屢次的升級維護,確認了使用容器比宿主機直接安裝是更爲有效的維護方式。數據庫

由於首先,你的操做可以都被版本化的記錄下來,如同管理代碼通常;其次,須要去維護和管理的內容,只是極少一部分變量,而非整個環境。apache

官方對於容器是積極可是還不夠嚴謹,從過往一年來看:編程

  • 在 2019 年裏,confluence 官方由於一個嚴重漏洞,從新發布並覆蓋了以往全部的容器鏡像,致使文件權限和卷掛載出現過問題。
  • 在 2019 年裏,官方鏡像缺乏必要參數,致使用戶不得不修改文件,並掛載到容器內部。
  • 在 2020 年初,官方升級插件市場的證書,而未更新容器根證書,致使容器啓動服務插件下載失敗。
  • 在 2020 年初,官方放棄了 alpine 鏡像發佈。
  • ...

雖然問題多多,可是整體而言,仍是很值得期待的畢竟高頻率的周更/月更,加活躍的社區和市場,支持「mb4字符集」,構建出了一個能夠碾壓任何同類的商業化 Wiki 產品。ubuntu

對於我的而言,只須要每一年付費 10$ ,就能知足一個10人初期團隊的使用,而且在 2020 年,使用 2G 內存的服務器也能愉快的運行 Confluence 了。

固然,我更推薦 4G及以上的配置。

基礎準備

  • Docker Hub 上官方容器鏡像:https://hub.docker.com/r/atlassian/confluence-server/tags
    • 本文將基於 7 系列新版本: 7.3
  • 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,咱們稍後會用到。
  • 一些中文字體,好比 simsun.ttcsimkai.ttf等,若是你須要使用「導出文檔爲 PDF、Word」功能,而且文檔包含中文,爲了渲染正常,你須要提供一些中文字體。

基礎容器化

參考去年寫的文章《使用 Docker 搭建 Confluence》、以及今年「Traefik 2.x 版本升級」的文章指引,不難寫出下面的基礎配置。

version: '3'

services:

  confluence:
    image: atlassian/confluence-server:7.3.2-ubuntu
    container_name: confluence-app
    expose:
      - 8090
      - 8091
    networks:
      - traefik
    labels:
      - "traefik.enable=true"
      - "traefik.docker.network=traefik"
      - "traefik.http.routers.wiki-web.middlewares=https-redirect@file"
      - "traefik.http.routers.wiki-web.entrypoints=http"
      - "traefik.http.routers.wiki-web.rule=Host(`wiki.lab.com`)"
      - "traefik.http.routers.wiki-ssl.middlewares=content-compress@file"
      - "traefik.http.routers.wiki-ssl.entrypoints=https"
      - "traefik.http.routers.wiki-ssl.tls=true"
      - "traefik.http.routers.wiki-ssl.rule=Host(`wiki.lab.com`)"
      - "traefik.http.services.wiki-backend.loadbalancer.server.scheme=http"
      - "traefik.http.services.wiki-backend.loadbalancer.server.port=8090"
    environment:
      - 'CATALINA_OPTS=-Duser.timezone=GMT+08 -Dconfluence.document.conversion.fontpath=/usr/local/share/fonts/'
      - 'JVM_MINIMUM_MEMORY=1024m'
      - 'JVM_MAXIMUM_MEMORY=2048m'
    volumes:
      - ./data:/var/atlassian/application-data/confluence
      - ./deps/confluence/mysql-connector-java-5.1.47.jar:/opt/atlassian/confluence/confluence/WEB-INF/lib/mysql-connector-java-5.1.47.jar
      - ./fonts:/usr/local/share/fonts
      - /etc/localtime:/etc/localtime:ro
    extra_hosts:
      - 'wiki.lab.com:127.0.0.1'

networks:
  traefik:
    external: true
複製代碼

上面的配置幾乎完美,將上面的內容保存爲 docker-compose.yml 後,使用 docker-compose up -d 啓動應用,你就可以獲得一個新版本的 Confluence 了。

須要解決的問題

可是這樣運行起來的 Confluence 會遇到一些問題:

  • 後臺登錄提示你須要修正代理配置
  • 插件市場由於官方變動服務域名,鏡像證書比較陳舊致使沒法使用

接下來,咱們就來解決這些問題。

後臺提示須要修正域名配置

這個問題經常出如今使用了反向代理、負載均衡給 Confluence 掛載證書的狀況下,在以往的版本中,咱們須要添加 server.xml 並進行文件只讀鎖定,來解決這個問題。

官方文檔稍顯陳舊,可是也記錄過這個問題:《Can't check base URL warning in Confluence 6.6 or later》

可是在新版本中,咱們能夠經過設置容器運行環境變量來解決這個問題,不過這裏有一個 Tricks 的事情,若是你不建立並掛載 server.xml 這個文件,你將沒法解決這個問題。

首先建立 server.xml 文件:

<?xml version="1.0" encoding="utf-8"?>

<Server port="8000"
        shutdown="SHUTDOWN">

  <Listener className="org.apache.catalina.startup.VersionLoggerListener"/>
  <Listener className="org.apache.catalina.core.AprLifecycleListener"
            SSLEngine="on"/>
  <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener"/>
  <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener"/>
  <Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener"/>

  <Service name="Catalina">

    <Connector port="8090"
               maxThreads="100"
               minSpareThreads="10"
               connectionTimeout="20000"
               enableLookups="false"
               protocol="HTTP/1.1"
               redirectPort="8443"
               acceptCount="10"
               secure="false"
               scheme="https"
               proxyName="wiki.lab.com"
               proxyPort="443"

               relaxedPathChars="[]|"
               relaxedQueryChars="[]|{}^`&quot;&lt;&gt;"
               bindOnInit="false"
               maxHttpHeaderSize="8192"
               useBodyEncodingForURI="true"
               disableUploadTimeout="true" />

    <Engine name="Standalone"
            defaultHost="localhost"
            debug="0">
      <Host name="localhost"
            debug="0"
            appBase="webapps"
            unpackWARs="true"
            autoDeploy="false"
            startStopThreads="4">
        <Context path=""
                 docBase="../confluence"
                 debug="0"
                 reloadable="false"
                 useHttpOnly="true">
          <!-- Logging configuration for Confluence is specified in confluence/WEB-INF/classes/log4j.properties -->
          <Manager pathname=""/>
          <Valve className="org.apache.catalina.valves.StuckThreadDetectionValve"
                 threshold="60"/>
        </Context>

        <Context path="${confluence.context.path}/synchrony-proxy"
                 docBase="../synchrony-proxy"
                 debug="0"
                 reloadable="false"
                 useHttpOnly="true">
          <Valve className="org.apache.catalina.valves.StuckThreadDetectionValve"
                 threshold="60"/>
        </Context>

      </Host>
    </Engine>

  </Service>

</Server>
複製代碼

接着在容器編排文件中添加掛載命令:

volumes:
  - ./deps/confluence/server.xml:/opt/atlassian/confluence/conf/server.xml
複製代碼

最後,在編排文件中添加環境變量:

environment:
  - 'CATALINA_CONNECTOR_PROXYNAME=wiki.lab.com'
  - 'CATALINA_CONNECTOR_PROXYPORT=443'
  - 'CATALINA_CONNECTOR_SCHEME=https'
複製代碼

最後,重啓你的應用就行了。

插件市場提示不能訪問

這個問題其實挺麻煩的,我實際運行的時候,主進程沒有報任何錯誤,可是根據以往封裝鏡像的經驗,判斷是 JRE 證書信任問題,找到了官方相關的一些資料

這個問題其實應該說是一個老問題了,從2012 年2014 年以及以後頻出。而上面這些標記爲 7.3 版本使用的資料其實只是一個線索,不能直接使用。

想要知道緣由嗎?且往下看。

如何添加並信任新的證書

想信任新的證書,先得先獲取新的證書文件,使用 openssl 工具將證書保存爲文件。

openssl s_client -connect marketplace.atlassian.com:443 < /dev/null | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > marketplace.atlassian.com.crt
複製代碼

以往的文章,針對的是老版本的 JDK(低於10),使用 keytool 導入證書就好了。

keytool -import -trustcacerts -alias proxy_root -file marketplace.atlassian.com.crt -keystore $JAVA_HOME/jre/lib/security/cacerts -storepass changeit -noprompt
複製代碼

上面的操做,能夠解決 confluence 5.x / 6.x 的問題,而在 confluence 7.x 中,JDK 升級爲了 11,儲存位置有了變化。Oracle 官方博客有記錄《OpenJDK 10 Now Includes Root CA Certificates》這個變動。因此命令須要變動爲:

keytool -import -trustcacerts -alias proxy_root -file marketplace.atlassian.com.crt -keystore $JAVA_HOME/lib/security/cacerts -storepass changeit -noprompt
複製代碼

讓「補丁操做」持久化

若是是宿主機安裝的話,執行上面的操做,而後重啓進程就行了。

可是咱們使用的是運行過程「無狀態」的容器,對於官方容器做出任何改變,並重啓,這些「變動」會天然而然的隨着容器沙盒銷燬而銷燬。(若是沒有使用特殊的 daemon 進程方案的話)

因此這裏須要基於官方鏡像,定製一個補丁鏡像,內容很簡單。

FROM atlassian/confluence-server:7.3.2-ubuntu
LABEL maintainer="soulteary@gmail.com"
 
USER root

RUN openssl s_client -connect marketplace.atlassian.com:443 < /dev/null | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > /tmp/marketplace.atlassian.com.crt
RUN keytool -import -trustcacerts -alias proxy_root -file /tmp/marketplace.atlassian.com.crt -keystore $JAVA_HOME/lib/security/cacerts -storepass changeit -noprompt

USER confluence
複製代碼

使用 docker build -t confluence-server:7.3.2-ubuntu-fix . 將新的容器鏡像命名爲 ** confluence-server:7.3.2-ubuntu-fix**。

而後在編排文件中,替換鏡像名稱,再次啓動容器,插件市場就能正常訪問了。

image: confluence-server:7.3.2-ubuntu-fix
複製代碼

修正後的編排配置

爲了方便使用,這樣提供一個完整的配置文件。

version: '3'

services:

  confluence:
    image: confluence-server:7.3.2-ubuntu-fix
    container_name: confluence-app
    expose:
      - 8090
      - 8091
    networks:
      - traefik
    labels:
      - "traefik.enable=true"
      - "traefik.docker.network=traefik"
      - "traefik.http.routers.wiki-web.middlewares=https-redirect@file"
      - "traefik.http.routers.wiki-web.entrypoints=http"
      - "traefik.http.routers.wiki-web.rule=Host(`wiki.lab.com`)"
      - "traefik.http.routers.wiki-ssl.middlewares=content-compress@file"
      - "traefik.http.routers.wiki-ssl.entrypoints=https"
      - "traefik.http.routers.wiki-ssl.tls=true"
      - "traefik.http.routers.wiki-ssl.rule=Host(`wiki.lab.com`)"
      - "traefik.http.services.wiki-backend.loadbalancer.server.scheme=http"
      - "traefik.http.services.wiki-backend.loadbalancer.server.port=8090"
    environment:
      - 'CATALINA_OPTS=-Duser.timezone=GMT+08 -Dconfluence.document.conversion.fontpath=/usr/local/share/fonts/'
      - 'JVM_MINIMUM_MEMORY=1024m'
      - 'JVM_MAXIMUM_MEMORY=2048m'
      - 'CATALINA_CONNECTOR_PROXYNAME=wiki.lab.com'
      - 'CATALINA_CONNECTOR_PROXYPORT=443'
      - 'CATALINA_CONNECTOR_SCHEME=https'
    volumes:
      - ./data:/var/atlassian/application-data/confluence
      - ./deps/confluence/mysql-connector-java-5.1.47.jar:/opt/atlassian/confluence/confluence/WEB-INF/lib/mysql-connector-java-5.1.47.jar
      - ./fonts:/usr/local/share/fonts
      - ./deps/confluence/server.xml:/opt/atlassian/confluence/conf/server.xml
      - /etc/localtime:/etc/localtime:ro
    extra_hosts:
      - 'wiki.lab.com:127.0.0.1'

networks:
  traefik:
    external: true
複製代碼

其餘

我我的建議做爲生產環境使用,務必使用雲服務商的雲數據,安全性和可靠性更好,可是若是我的使用,本地啓動一個數據庫容器實例,也不是不可,參考官方建議文檔,能夠將數據庫啓動參數調整爲:

command: --character-set-server=utf8mb4 --collation-server=utf8mb4_bin --default-storage-engine=INNODB --max_allowed_packet=256M --innodb_log_file_size=2GB --transaction-isolation=READ-COMMITTED --binlog_format=row
複製代碼

另外,若是你遇到了中文文件不能正常渲染的問題,能夠參考下面這篇文章進行緩存清理:

最後

每次升級調整 Confluence 的過程,都是一種花式踩坑的過程,過程雖然很麻煩,可是踩過以後,依舊會忍不住的感嘆,我的使用每一年 10$ 花的真值。

--EOF


我如今有一個小小的折騰羣,裏面彙集了一些喜歡折騰的小夥伴。

在不發廣告的狀況下,咱們在裏面會一塊兒聊聊軟件、HomeLab、編程上的一些問題,也會在羣裏不按期的分享一些技術沙龍的資料。

喜歡折騰的小夥伴歡迎掃碼添加好友。(請註明來源和目的,不然不會經過審覈)

關於折騰羣入羣的那些事

相關文章
相關標籤/搜索