用 Dokku 建立 Heroku 的替代品

Feb 12, 2022

之前在考慮 deploy 到 Linode 的流程是否有辦法弄的較簡便一點,因此查到 Dokku 這個可以建立類似 Heroku PaaS 平台的工具。

Dokku - The smallest PaaS implementation you've ever seen
https://dokku.com/
favicon
https://dokku.com/
Dokku - The smallest PaaS implementation you've ever seen

dokku 的話,只要在 dokku 上設定好 app 之後,deploy 要做的事情就只剩下 git push 了。

安裝 Dokku

# for debian systems, installs Dokku via apt-get wget https://raw.githubusercontent.com/dokku/dokku/v0.26.8/bootstrap.sh; sudo DOKKU_TAG=v0.26.8 bash bootstrap.sh

增加 SSH key 到 Dokku

Dokku 並沒有自己的帳號系統,為了要可以 git push ( 透過 ssh 連線 )到 Dokku,需要將 ssh key 加入 Dokku Server

# usually your key is already available under the current user's `~/.ssh/authorized_keys` file cat ~/.ssh/authorized_keys | dokku ssh-keys:add admin

之後使用 dokku ssh-keys:list 就可以看到剛剛加入的 key

設定 Global Domain Names 與 Dokku Let’s Encrypt Plugin

設定 Global Domain Names 之後,就可以使用類似 <app name>.<global domain> 的方式連到 dokku 上的 app。

除此之外在加上 dokku 的 Let's EncryptPlugin, 就可以提供 https

設定 Global Domain Names

# you can use any domain you already have access to dokku domains:set-global <domain name>

安裝 dokku-letsencrypt

sudo dokku plugin:update letsencrypt

建立第一個 Application

dokku 並沒有像 Heroku 那樣有漂亮的 WebUI 可以操作,大部分都是要透過 CLI

因此在新增 Application 的時候,就需要連線到 dokku 的 Server 使用 dokku 指令新增 app。

dokku apps:create first-python-app -----> Creating first-python-app...

建立 python project

因為 dokku 相容於 heroku,所以可以直接使用 heroku 的 template

git clone https://github.com/heroku/python-getting-started

Deploy 到 dokku

git remote add dokku dokku@<domain name>:first-python-app git push dokku main:master Enumerating objects: 512, done. Counting objects: 100% (512/512), done. Delta compression using up to 12 threads Compressing objects: 100% (238/238), done. Writing objects: 100% (512/512), 95.53 KiB | 95.53 MiB/s, done. Total 512 (delta 237), reused 512 (delta 237) remote: Resolving deltas: 100% (237/237), done. -----> Cleaning up... -----> Building first-python-app from herokuish -----> Adding BUILD_ENV to build environment... -----> Python app detected -----> Installing python-3.10.2 -----> Installing pip 20.1.1, setuptools 47.1.1 and wheel 0.34.2 -----> Installing SQLite3 -----> Installing requirements with pip Collecting django Downloading Django-4.0.2-py3-none-any.whl (8.0 MB) Collecting gunicorn Downloading gunicorn-20.1.0-py3-none-any.whl (79 kB) Collecting django-heroku Downloading django_heroku-0.3.1-py2.py3-none-any.whl (6.2 kB) Collecting asgiref<4,>=3.4.1 . . .

git push 之後就會看到 dokku 在安裝設定環境的訊息,等 push 執行完畢之後就代表 application 已經 deploy 完畢了。

如果想要手動觸發 deploy 可以連線到 dokku server 執行 dokku deploy first-python-app

查看與設定 application 的 url

deploy 完畢之後,就可以使用 dokku domains:report 查看 app 的 domains 設定,如果想要更改的話可以使用

# dokku domains:set <application name> <new url> dokku domains:set first-python-app python.example.domain

理論上 dokku 會自動偵測 application 開啟的 port 並且自動 expose,如果 port 沒有被偵測到的話,要自己綁定 port

dokku proxy:ports-add first-python-app http:80:5000 dokku proxy:ports-add first-python-app https:443:5000 ## 列出綁定的 ports dokku proxy:ports first-python-app -----> Port mappings for first-python-app -----> scheme host port container port http 80 5000 https 443 5000

增加 application 的 https 設定

透過前面安裝的 dokku letsencrypt plugin,設定好 email 之後,就可以使用

dokku letsencrypt:enable <application name> 啟用 https。

dokku config:set --no-restart first-python-app DOKKU_LETSENCRYPT_EMAIL=your@email.tld dokku letsencrypt:enable first-python-app =====> Enabling letsencrypt for first-python-app -----> Enabling ACME proxy for first-python-app... Reloading nginx configuration (via systemctl): nginx.service. -----> Getting letsencrypt certificate for first-python-app... . . .

並且可以透過 dokku letsencrypt:list 查詢 Certificate Expiry 時間等憑證資訊

這樣就完成了 dokku 的 application 設定了!可以用 https://python.example.domain (記得修改 domain) 連線測試看看。

Reference

Dokku - The smallest PaaS implementation you've ever seen
https://dokku.com/
favicon
https://dokku.com/
Dokku - The smallest PaaS implementation you've ever seen
← Go home