Kroki Docker 的原生 https 模式

| | 0 Comments| 09:34
Categories:

之前 Heresy 曾經寫過一篇《在自架 GitLab 使用 Kroki 來繪圖》,介紹可以搭配 GitLab、在檔案、issue、wiki 裡面繪製 UML 等圖形的工具型伺服器了。

而在當時,他的 Docker 版並不支援 https、只支援 http,所以沒辦法直接搭配 Https 版的 GitLab 使用;後來 Heresy 是在對方的建議下使用 NGINX 來做反向代理、來讓他可以正常運作的(參考)。

實際上,後來他們也滿快地就就加入 Https 的支援了,不過 Docker 映像檔感覺是沒有立刻更新、再加上 Heresy 這邊可以正常運作、沒有迫切的需求,所以就先沒管了。

而前一陣子、Heresy 則是才又花了點時間、研究怎麼直接使用他的 https 模式,這邊就稍微紀錄一下。

首先,這部分的官方文件可以參考「Enabling SSL on the server」(連結);理論上這邊需要三個額外的環境變數:

KROKI_SSL=true
KROKI_SSL_CERT="......"
KROKI_SSL_KEY="......."

基本上就是把憑證和 key 的內容、以字串的形式、用環境變數的方式傳遞進 Docker 裡面。

而官方建議的方法,是透過下面的指令來建立一個 .env 檔:

cat cert.pem | tr -d '\n' | sed 's/^/KROKI_SSL_CERT=/' >> .env
echo >> .env
cat key.pem | tr -d '\n' | sed 's/^/KROKI_SSL_KEY=/' >> .env

然後,就可以透過下面的 Docker 指令來跑 https 模式了!

docker run -p8000:8000 -e KROKI_SSL=true --env-file=.env yuzutech/kroki

不過不知道為什麼,Heresy 這邊在測試的時候,直接跑 Docker 沒有問題、但是如果是用 docker-compose 來執行的話,就會出現「environment variable name '-----END CERTIFICATE-----' may not contain whitespace.」這樣的錯誤。

所以,這邊後來是改用 KROKI_SSL_CERT_PATHKROKI_SSL_KEY_PATH  這種檔案路徑的形式、來指定憑證檔案,然後就可以運作了!

目前的 docker-compose.yml 是下面的樣子:

version: '3.0'

services:
  gitlab:
    image: gitlab/gitlab-ce:latest
    container_name: gitlab
    hostname: gitlab.heresy.com
    ports:
      - "80:80"
      - "443:443"
      - "5100:5100"   # Container Registry
    volumes:
      - /mnt/gitlab_data/config:/etc/gitlab
      - /mnt/gitlab_data/logs:/var/log/gitlab
      - /mnt/gitlab_data/data:/var/opt/gitlab
    restart: always
    networks:
      - gitlab_net

  kroki:
    image: yuzutech/kroki
    container_name: kroki
    environment:
      - KROKI_SSL=true
      - KROKI_SSL_CERT_PATH=/etc/ssl/gitlab.heresy.com.crt
      - KROKI_SSL_KEY_PATH=/etc/ssl/gitlab.heresy.com.key
    volumes:
      - /mnt/gitlab_data/config/ssl:/etc/ssl
    ports:
      - "8000:8000"
    restart: always
    networks:
      - gitlab_net

networks:
  gitlab_net:
    driver: bridge

這邊就直接把本來給 GitLab 用的 SSL 憑證路徑(/mnt/gitlab_data/config/ssl)對應成 kroki 的容器裡面的 /etc/ssl,然後再透過前面提到的兩個環境變數來指定檔案就可以了~

這樣一來,就可以直接架設一個和 GitLab 整合的 Kroki 伺服器了~


附帶一提,這邊因為把 port 改成直接用 Kroki 的 8000 了,所以之前在 GitLab 管理區域的設定也需要修改(Heresy 這邊之前用 8081)。

修改方法:

  1. 進入 GitLab 管理介面(Admin Area)
  2. 在「Settings」、「General」裡面,先把「Kroki」裡面的「Kroki URL」移除、然後把「Enable Kroki」取消、按下「Save Changes」
  3. 在「Settings」、「Network」裡面、把「Outbound requests」下面「Local IP addresses and domain names that hooks and integrations can access」中的「gitlab.heresy.com:8081」改成「gitlab.heresy.com:8000」、然後按下「Save Changes」
  4. 回到在「Settings」、「General」裡面,把「Kroki」裡面的「Kroki URL」修改成「https://gitlab.heresy.com:8000」、然後把啟用「Enable Kroki」、按下「Save Changes」

要搞成這樣的原因,是因為不先做第二步驟的話,第三步驟會跳錯誤沒辦法完成,然後第四步驟當然也無法進行,感覺有點搞笑。

Leave a Reply

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *