- Dokkuは、単一のVPSをHerokuのように使えるようにするオープンソースPaaSで、複数のアプリを自分で所有するインフラに低コストでデプロイしたい個人・小規模な作業に適している
- 非GPUワークロードは月額7ドルのOVHcloud VPSで運用しており、LLMコンサルティングのように頻繁にアプリを立ち上げる必要がある環境で、デプロイのコストと複雑さを抑えられる
- Dockerfileベースのアプリは、Dokkuアプリの作成、Git remoteの追加、
git push dokku mainだけでデプロイでき、dokku ps:scaleでプロセス数を調整できる
- 静的サイトも、
_site、.static、nginx buildpack、dokku-http-authを組み合わせれば、非公開GitHubリポジトリベースのデプロイとパスワード保護が可能
- GitHub Actions、リモートSSHコマンド、Dockerキャッシュの無効化、pushなしのrebuildまで連携させれば、個人向けPaaSを再現可能な運用環境にできる
単一のVPSをHerokuのように使うDokku
- Dokkuは、ユーザーが選んだ単一サーバー上で動作するオープンソースPaaS
- Herokuに似たデプロイ体験を提供するが、インフラはユーザー自身が所有する
- Herokuの費用は大きくなり得るため、複数のアプリケーションをデプロイする必要があるLLMコンサルティング業務では、費用対効果の高いデプロイプラットフォームが重要
- 非GPUワークロード向けに、月額7ドルのOVHcloud VPSでDokkuサーバーを運用している
Heroku式のデプロイ体験と運用機能
- DokkuはHerokuのように使いやすいデプロイフローを提供する
- Let’s Encryptによる自動SSL証明書管理をサポートする
- Basic Authでサイトにパスワード保護をかけられる
- 単一コマンドでscale up/downを実行できる
- Node、Pythonなどさまざまなアプリを扱え、必要に応じてDockerコンテナも直接定義できる
- 公式プラグインが多く、必要な機能のほとんどを拡張できる
- デプロイはGitコマンドだけで進められる
Dockerコンテナでアプリをデプロイする
- DokkuをVPSにインストールした後、アプリリポジトリのルートにDockerfileを置けば、Dockerコンテナとしてデプロイできる
- 例のDockerfileは
python:3.10イメージを使い、コードを/appにコピーした後、pip install .を実行する
entrypoint.shは、ローカルまたはDockerコンテナでアプリを簡単に実行するために使う
- 例では
uvicorn main:app --port "$PORT" --host 0.0.0.0でFastAPIアプリを実行する
- Dokkuホストで先にアプリを作成する
dokku apps:create myapp
- ローカルでは
~/.ssh/configにDokkuホストへのアクセス情報を設定し、そのホスト名をdokkuに指定する
- ローカルGitリポジトリにDokkuをremoteとして追加し、pushするとデプロイされる
git remote add dokku dokku@dokku:myapp
git push dokku main
- デプロイ後、ローカルログにアプリURLが出力され、デフォルトは
myapp.yourdomain.com形式
- ワーカー数は次のコマンドで調整できる
dokku ps:scale myapp web=2
非公開の静的サイトとBasic Auth
- GitHub Pagesで非公開の静的サイトを簡単にデプロイするには高価なEnterpriseアカウントが必要で、不便
- Dokkuを使えば、非公開GitHubリポジトリの静的サイトをデプロイし、パスワードで保護できる
- 静的サイトがGitリポジトリの
_siteフォルダにあると仮定する
- Dokkuホストでアプリを作成し、
NGINX_ROOT環境変数を_siteに設定する
dokku apps:create mysite
dokku config:set static-site NGINX_ROOT=_site
sudo dokku plugin:install https://github.com/dokku/dokku-http-auth.git
sudo chmod +x /home/dokku
- 静的サイトが入っているGitリポジトリのルートで次の作業を行う
touch .static
echo BUILDPACK_URL=https://github.com/dokku/buildpack-nginx > .env
git remote add dokku dokku@dokku:mysite
.staticはDokkuに静的サイトであることを知らせる
BUILDPACK_URLはnginx buildpackを使うよう指定する
- 通常は自動検出されるが、コードと静的サイトが一緒にあるプロジェクトでは、混乱を減らすためにnginx buildpackを明示する必要がある
- デプロイは
git push dokku mainで行う
- 認証はDokkuホストで次のコマンドにより有効化する
dokku http-auth:enable mysite <username> <password>
- 複数のユーザー名/パスワードを追加でき、特定IPのフィルタリングも可能
- HTTPSはLet’s Encrypt Pluginで設定でき、自動更新にも対応する
- CloudflareプロキシでHTTPSを処理する場合は、Let’s Encryptプラグインの代わりにCloudflareに任せる構成を使う
GitHub Actionsで自動デプロイする
- DokkuアプリはGitHub Actionsで自動デプロイできる
- Dokkuホストへ直接pushする作業を手動で繰り返す必要はない
- 例のworkflowは
workflow_dispatchとmainブランチへのpushで実行される
concurrency設定で以前のjobをキャンセルし、Dokkuのdeploy lockを避ける
- workflowはコードをcheckoutし、
secrets.DOKKU_SSH_PRIVATE_KEYからSSH private keyを作成した後、Git remoteを追加してDokkuへ強制pushする
name: CI
on:
workflow_dispatch:
push:
branches: [main]
concurrency:
group: ${{ github.ref }}
cancel-in-progress: true
jobs:
deploy-dokku:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v2
with:
fetch-depth: 0
- name: Install SSH key
run: |
echo "${{ secrets.DOKKU_SSH_PRIVATE_KEY }}" > private_key.pem
chmod 600 private_key.pem
- name: Add remote and push
run: |
git remote add dokku dokku@rechat.co:llm-eval
GIT_SSH_COMMAND="ssh -i private_key.pem -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no" git push dokku main -f
リモート運用コマンドと再ビルド
- 例のアプリ名は
llm-eval、ホストはrechat.co
- Dokkuホストに直接SSHログインしなくても、
dokkuユーザーとしてリモートコマンドを実行できる
ssh dokku@rechat.co apps:list
- Dockerキャッシュを無効化して新しいビルドを実行できる
ssh dokku@rechat.co repo:purge-cache llm-eval
- pushなしでrebuildが必要な場合はいくつか方法があり、その1つは次のコマンド
ssh dokku@rechat.co ps:rebuild llm-eval
反復デプロイのための個人メモ
- 新しいアプリをデプロイするたびに同じ詳細を探し直す必要があるため、整理した
- Dokkuを使った個人向けデプロイプラットフォーム構成を、繰り返し使える参考資料として残す
まだコメントはありません。