Hetzner VPS + Docker 部署心得
Hetzner ARM VPS 使用,以及在主機上用 Docker 部署 Ghost 網站以及其他 Docker 應用的心得。
Goodbye DigitalOcean. Welcome Hetnzer 👋
事實上,我覺得 Hetzner 的價格比較公道也便宜,所以我就決定搬家了,但是主機就大多數的位置都是在歐洲,但是最近開始把業務拓展到美國以及新加坡。
無可否認的 DigitalOcean 的服務項目很廣,主機地點又多又廣,比起來 Hetzner 的大部分主機都在歐洲以及美國,所以可以很主觀的感受到相較 DO 延遲,只不過最主要還是 SSH 上感覺到毫秒級的延遲之外,應用方面都沒什麼問題。
在用 Ghost CLI 的時候已經有想用 Docker 的想法了,這樣可以多安裝幾個服務,更何況 Docker 就是設計來容易部署的。因為有打算安裝安裝 Docker 的關係 1GB 內存應該無法安裝多個應用,而 DigitalOcean 2GB 就需要 USD 12了,很明顯對於興趣使然的我來說 DigitalOcean 並不是性價比的選擇,而且 1GB 內存的主機月份是 USD6,重點是我還需要用到 SWAP 分區讓 Ghost 勉強不崩潰。
Ampere 的處理器是 ARM 架構的,有終於在主機端用到 ARM 處理器了!
Hetnzer 的主機 ARM64 給了高達 4GB 的內存,2個vcpu價格價格還只要 € 4.51,口碑也不差。有別於傳統的 x86, ARM 比較省電以及省空間的關係 ARM64 的價格相對的比較划算,對於輕應用來說相當的夠用,最重要的是 Ghost Docker 鏡像支援 ARM64 架構,陸陸續續的在我主機上安裝 NPM,Portainer 管理 Docker 應用。當然 Hetzner 也有 x64 的主機。
我雖然沒有跑分做對比,但是根據 Hetzner CAX 系列 ARM64 服务器性能简评以及 WebP Cloud Services 在其上的实践 寫到:
與 AMD 的機器相比,效能只差大約 8% 但價格是 14%的差別。
Hetnzer ARM 服务器性能简评: Hetzner CAX 系列 ARM64 服务器性能简评以及 WebP Cloud Services 在其上的实践
我的測試就是讓讓它 100 天不重啟,唯一可以量化的東西。用 Fastfetch 顯示的系統資訊。
Hetnzer 註冊相關
是根據 Hetzner CAX 系列 ARM64 服务器性能简评以及 WebP Cloud Services 在其上的实践 提到對於用戶的資料比較嚴格,所以不要輕易的胡亂填寫,同時這也是優點:
不过要注意 Hetzner 的风控非常严格,注册的时候使用 VPN 或者故意乱填地址等非常容易导致自己账户被禁,这是缺点也是优点,缺点是注册门槛相对较高,优点则是 Hetzner 的客户相对比较“干净”,不会像主流给大额 Credit 的服务商(比如 DO,Vultr )一样上面充满月抛机和吵闹的邻居。而且从我们的观测来看,帐号注册成功后只要有了几笔成功的付费订单后就基本不会有账户被 Close 的问题了。
Docker 應用 🚢🫙
現在主機上的Docker 應用
目前服務器的 Docker 應用
- Ghost
- MySQL
- Nginx Proxy Manager
- Portainer
- Uptime Kuma
- Watchtower
之前有一段时间被 ghost update
搞得焦头烂额,因为 node 版本以及权限的问题觉得很烦,虽然不可否认 ghost Cli 是挺好用的,加上 ghost backup
就能备份,虽然不知道为什么 comment 不能一起备份(2023 年的时候)。因为我只是业余的,我没有本领独自解决这类的问题,得花很多时间上网寻求解决方法,一来一回我的网站也下线多日👎。
一直到使用 Docker 就不同了,用比较简单的理解是 Docker 能把应用给容器化,就像是一个个的集装箱,应用相关的环境都能打包在同一个容器中,容器話簡化了不同開發環境安裝下的不穩定,就不会发生类似:明明在我这里可以用,但是我不确定你哪里也可以用 的囧境。
当然 Docker 并不是唯一一个「容器」的选择,另一个就是 Podman,但是 Docker 的最大优势是网络上的资源很多,包括教程,以及 Image。
安裝 Docker on Ubuntu
這是簡單的 Docker 安裝,選擇 Docker CE 的 Ubuntu,就可以略過 apt install docker-ce
sudo apt install docker-ce
sudo apt install docker-compose
如果想在个人电脑上体验 GUI 的 Docker 可以安装 Docker Desktop。
Docker Compose 是可以将多个 Docker 应用一次性部署的 Docker 脚本工具,这就是 Stack。举个例子🌰: 我需要部署的应用多个 Ghost 容器,连接到同个网络,以及同一个数据库,Docker Compose 的优势就是在这里能一个文件部署。
只不過要用 Cloudinary 就需要製作 Docker Image,所以現在我的圖片都是上傳到 Cloudinary 再 /image [url]
到文章中,不過這無法套用在 feature image, header, 以及 Product Card。這也算是有取有舍。
Docker Compose
Docker Compose 直接翻譯就是 docker 撰寫
,可以在一張 docker-compose.yml
中寫入要部署的 docker image, network,volume,以及生產環境。docker-compose.yml
這個腳本可以複製粘貼實現一鍵部署。單是這點我就知道為什麼很多人推薦用 Docker 部署服務。
運行 Docker Compose
在腳本寫好後,只需在該 docker-compose.yml
的位置,執行 docker-compose up -d
就會下載該 image,創建 volume,以及 network。
Portainer
Portainer 作為 Docker 環境中最為知名的 Docker GUI 管理器,用戶界面就像一般網頁容易用,圖形界面 GUI 容易用,也無需記docker 的指令, 除了部署之外,也能用來管理運行中的 Docker 應用,還能更改 network;Portainer 還有類似 Docker Compose 的 Stack,可以用撰寫腳本部署 Docker 服務。
Ghost + mySQL
現在的網站都是在使用 Ghost,相比 WordPress,Ghost 就比較小眾,而且 Ghost 需要搭配 MySQL 作為後端的數據庫,所以我的 Docker-Compose 裡是同時部署 Ghost + MySQL。至於 production.json 的設定,可以在 compose 中的 Environment:
裡添加。
如果一定要取捨的話就是不能用 Cloudinary 用做 Feature Image,Ghost 的 Feature Image 不能用外部鏈接,如果要解決 Cloudinary Storage Adapter 需要製作 Docker Image,根據 Ghost 的更新版本的頻率來說,並不鼓勵。
Ghost Docker-Compose Example
version: '3.1'
services:
ghost:
image: ghost:5-alpine
restart: always
ports:
- 8080:2368
environment:
# see https://ghost.org/docs/config/#configuration-options
database__client: mysql
database__connection__host: db
database__connection__user: root
database__connection__password: example
database__connection__database: ghost
# this url value is just an example, and is likely wrong for your environment!
url: http://localhost:8080
# contrary to the default mentioned in the linked documentation, this image defaults to NODE_ENV=production (so development mode needs to be explicitly specified if desired)
#NODE_ENV: development
volumes:
- ghost:/var/lib/ghost/content
db:
image: mysql:8.0
restart: always
environment:
MYSQL_ROOT_PASSWORD: example
volumes:
- db:/var/lib/mysql
volumes:
ghost:
db:
Ngnix Proxy Manager (NPM)
Reverse Proxy 反向代理,在 Docker 部署中可以用 Caddy,Treafik,或是 Ngnix,如沒有反向代理,我們就只能用 ip 地址訪問,而非域名。
NPM 是以 Nginix 為基礎開發的 Ngnix GUI 版本,讓反向代理變得易於上手同時因為是對針對 Docker 部署開發的,所以用來部署 Docker 容器相當方便。
WatchTower
WatchTower 會偵測運行中的 Docker 容器的 Image 是否有更新版本,如有就會下載並重啟容器到最新版本,當然還是能後做到更詳細的設定,我也是在 ajfriesen 這裡認識到 WatchTower 的。
WatchTower - Docker-Compose Example
version: "3"
services:
watchtower:
image: containrrr/watchtower
restart: always
volumes:
- /var/run/docker.sock:/var/run/docker.sock
總結
Hetzner ARM 主機的高性價比,穩定同時能在主機上部署更多的 Docker 應用。
Hetzner 的 ARM 主機性價比高,除了算力不錯之外 RAM 也夠個人使用,但因為伺服器在歐洲的關係 SSH 有較高的毫秒級的延遲。搭配 Docker 使用方便部署以及管理多個 Docker 應用。當然追求性價比的同時也需要考慮到用到的應用是否支持 ARM64,比起 x86(Intel AMD)就需要顧慮到兼容性的問題。