by Devin Yang

建立於: 1年前 ( 更新: 1年前 )

情境分享,設想您有WebHosting,他只提供FTP連線,然後您想手動的方式申請憑證。
在本篇分享我如何使用Docker安裝curlftpfs,並且掛載遠端主機FTP資料夾,
然後在容器內執行certbot申請SSL憑證。

撇除憑證申請不說,我初次發覺到curlftpfs這個指令時,覺的滿有意思的,特別是如果你是MacOS用戶,
手邊沒有一個滿意的FTP軟體時。您跟我一樣喜歡在命令列上打滾,或許您應該也會喜歡這個指令。🤭

首先,我們建就從建立Dockerfile開始吧。
Yaml檔如下,我習慣中文環境的終端機。

From ubuntu:latest
RUN apt-get update && apt-get install -y \
locales curlftpfs python3 certbot vim

#中文環境
RUN echo "Asia/Taipei" > /etc/timezone && \
    dpkg-reconfigure -f noninteractive tzdata && \
    sed -i -e 's/# zh_TW.UTF-8 UTF-8/zh_TW.UTF-8 UTF-8/' /etc/locale.gen && \
    echo 'LANG="zh_TW.UTF-8"'>/etc/default/locale && \
    dpkg-reconfigure --frontend=noninteractive locales && \
    update-locale LANG=zh_TW.UTF-8

ENV LANG zh_TW.UTF-8
ENV LANGUAGE zh_TW.UTF-8
ENV LC_ALL zh_TW.UTF-8

我們就來用這個Dockerfile建一個ftpbot的image吧,指令如下:
請將Dockerfile放到一個空目錄下再build,必免不必要的快取問題 。

docker build -t ftpbot .

完成了image的建立,我在自己的資料夾再建一個letsencrypt的目錄,所以我可以用下方的指令創建容器,並且進入容器內
等等在容器中要使用curlftpfs,在容器啟動時,必需有--privileged。

docker run --rm --privileged -v $(pwd)/letsencrypt:/etc/letsencrypt -ti ftpbot bash

接下來,在容器中掛載遠端主機的資料夾到容器的/mnt目錄

curlftpfs FTP帳號:FTP密碼@FTP主機 /mnt

執行certbot指令,依指示操作

certbot certonly --manual --email 申請的郵件 --agree-tos \
-d 域名.com \
-d www.域名.com

在上面的畫面中畫面會停住等待Enter,他要我們去網站建立驗證檔LW_70m1q1QWIAtnR8rU3QK4znLP9iyvp1Uf3mBsU4
這時,我們可以有兩種處理方式
一、Ctrl+z暫時讓程式先放到背景,然後切到/mnt掛載的網頁FTP目錄中去產生acme驗證檔 ,完成後再打fg回前景。
二、開另一個終端機進入執行中的容器去操作,我的習慣我用這個 方式。

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Create a file containing just this data:

LW_70m1q1QWIAtnR8rU3QK4znLP9iyvp1Uf3mBsU4._ZtWqdsZpgLv_TS7hHMCm0zcL8HXhJrGePNrNSSi23Y

And make it available on your web server at this URL:

http://域名.com/.well-known/acme-challenge/LW_70m1q1QWIAtnR8rU3QK4znLP9iyvp1Uf3mBsU4

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Press Enter to Continue

例如,我們在容器中,打hostname,比較好拷貝

root@07291c69af42:~# hostname
07291c69af42
root@07291c69af42:~#

然後在自己的Host端,就可以下指令進入同一個執行中的容器

docker exec -ti 07291c69af42 bash
root@07291c69af42:/#

舉例,遠端網站的根目錄是/www,所以我們可以下如下的指令建立.well-knon/acme-challenge目錄。
用FTP掛載的情況下,建議操作方式先touch再echo,大概如下的操作

root@07291c69af42:~# cd /mnt/
root@07291c69af42:/mnt# mkdir -p www/.well-knon/acme-challenge
root@07291c69af42:/mnt# cd www/.well-knon/acme-challenge
root@07291c69af42:/mnt/www/.well-knon/acme-challenge# touch LW_70m1q1QWIAtnR8rU3QK4znLP9iyvp1Uf3mBsU4
#這裡echo 內容後,有個 > 重導哦
root@07291c69af42:/mnt/www/.well-knon/acme-challenge# echo LW_70m1q1QWIAtnR8rU--略---GePNrNSSi23Y > LW_70m1q1QWIAtnR8rU3QK4znLP9iyvp1Uf3mBsU4
root@07291c69af42:/mnt/www/.well-knon/acme-challenge#

完成後,確認網址是開的出這個檔的,再壓Enter,完成ACME的驗證。

http://域名.com/.well-known/acme-challenge/LW_70m1q1QWIAtnR8rU3QK4znLP9iyvp1Uf3mBsU4

都搞定後,就可以umount離開了,然後憑證會在掛在的目錄下(底下是示意圖)

cd letsencrypt/live/域名.com

以上是手動的方式,但要做到自動申請憑證及RENEW也是可以的。不過篇幅有限,有機會我再介紹。
直接讓certbot把憑證檔存到/mnt的目錄上行嗎,答案是「不行」,這種情況certbot沒法直接寫掛到掛載的遠端主機資料夾。

提示,我們可以讓certbot把驗證檔產生在容器內的本地資料夾,再用一支Python的watchdog檔案變動程式,發現檔案新增了,就執行拷貝
把檔案搬到/mnt上的驗證目錄,我的經驗證行,而且一次搞定六個網站的憑證申請。

至於renew的部份,我們都有letsencrypt的資料夾在host端了,弄個crontab的排程讓他每天去跑應該就OK啦。

所以到此您應該發覺為何我的image名稱要叫ftpbot了,因為最終我是要讓他自重化執行,
不是手動執行的,所以image名稱我真的沒取錯,嘻嘻。

Tags: certbot docker ftp

Devin Yang

文章內容無法一一說明,如果您有什麼不了解處,歡迎提問哦:)

No Comment

Post your comment

需要登入才可留言!

類似的文章


docker, d-laravel, docker-compose, laravel

docker-compose載入多個設定檔

我們會用docker --network建立多個container互連,但是如果四個container時, 是不是就要下四次docker run不同container的指令,殺了我吧, 本文介紹透過docker-compose這個yaml檔定義一次搞定多個container的建立。 了解如何用dokcer-compose -f 參數載入多個設定檔。  

d-laravel, docker, docker-compose, laravel

D-Laravel釋出v0.9.1版了

為了讓D-Laravel保持在一個可運作的版本及穩定的本。 開始使用Tag標註該版本通過測試那些測試.. 這個版本已通過ubuntu實及macos實機測試,可順利建立Container及執行哦..

docker

如何簡單的用Docker建立internet命令列的測速程式呢?

如何簡單的用Docker建立internet命令列的測速程式呢? 這裡我們使用python的程式speedtest-cli 會用Docker主要的用例,例如我想要在我的NAS內進行測速, 雖然我的NAS內有python,但沒有pip指令,這時用Docker感覺上安全很多, 當然前題您的NAS需能跑Docker:)。 或者,我在MacOS的環境,我不想安裝speedtest-cli到我的MacOS中。 這時用Docker簡單的自建簡單的執行環境還滿不錯的。