セルフホストDokployでXserverSSLの証明書を使う方法
はじめに
弊社では、短期イベントやPoCなどのWebアプリケーションをDokployというOSSでホスティングしています。
Dokployって何?という方のために簡単に説明すると、VercelやHerokuのようなPaaSを自前のVPSで構築できるOSSです。内部的にはDockerとTraefikで動いており、GitHubと連携してpushするだけでデプロイできる便利なツールです。
通常、DokployではSSL証明書にLet's Encryptを使用しており、これはDokployのGUIから簡単に設定できます。ワンクリックで無料のSSL証明書が使えるので、普段はこれで十分でした。
Let's Encryptの制限に引っかかった話
先日、VPSサーバーを移管することになりました。新しいVPSにDokployをインストールして、ドメインを設定しようとしたところ...
Error: too many certificates already issued for exact set of domains
Let's Encryptの制限に引っかかってしまいました[1]。
どうやら、移管作業中に何度か証明書の取得を試行してしまい、制限に達してしまったようです。具体的には以下のような作業をしていました:
- DNSの切り替え前にドメインを設定して失敗
- サブドメインの設定ミスで複数回リトライ
- テスト環境での動作確認で証明書を取得
Let's Encryptには「同一ドメインセットに対して週に5回まで」という制限があり、これを超えると1週間待たなければなりません。でも、移管作業は今日中に終わらせる必要がある...
というわけで、急遽独自のSSL証明書を使うことにしました。今回はXserverSSLを選択したので、その導入手順をメモとして残しておきます。
大まかな手順
SSL証明書の導入は以下の流れで進めます:
- 承認用メールアドレスの準備
- XserverSSLでSSL証明書を契約
- CSRと秘密鍵の生成
- ドメイン認証
- 証明書の取得
- Dokployへの証明書配置
- Traefik設定
- 動作確認
それでは順番に見ていきましょう。
Step 0: 承認用メールアドレスの準備 📧
まず最初に、ドメイン認証で必要になるメールアドレスを準備します。
SSL証明書の申請では、以下のいずれかのメールアドレスで承認メールを受信する必要があります:
admin@your-domain.com
administrator@your-domain.com
hostmaster@your-domain.com
postmaster@your-domain.com
webmaster@your-domain.com
Step 1: XserverSSLでSSL証明書を契約 💳
XserverSSLにアクセスして、SSL証明書を契約します[2]。
利用サービスの選択
ここが重要なポイントです。利用サービスを選択する際は必ず「Xserver VPS / 他社サーバー」を選択してください。
間違えて「Xserver レンタルサーバー」を選んでしまうと、VPSでは使えない証明書が発行されてしまいます。
SSL証明書の種類
今回は一番お手頃な「CloudSSL」を選択しました。
- 価格: 836円〜/年
- サイトシール対応
- ドメイン認証(DV)
急ぎだったので、即日発行可能なDV証明書一択でした。
Step 2: CSRと秘密鍵の生成 🔑
XserverSSLの管理画面から「取得申請」ボタンを押下します。
CSR生成画面での入力
以下の情報を入力します:
コモンネーム: your-domain.com (例: example.com)
国名: JP
都道府県: Tokyo
市区町村: Shibuya-ku
組織名: Your Company Name
部署名: IT Department (省略可)
Step 3: ドメイン認証 ✅
申請が完了すると、Step 0で準備したメールアドレスに承認メールが届きます。
メール内のリンクをクリックして承認を完了させます。承認後、だいたい1時間くらいで証明書が発行されます。
Step 4: 証明書のダウンロード 📥
証明書が発行されたら、以下をダウンロードします:
- SSL証明書(サーバー証明書)
- 中間証明書(1つまたは2つ)
XserverSSLの場合、中間証明書は通常2つあります:
- CloudSecureの中間証明書
- Sectigoの中間証明書
Step 5: Dokployへの証明書配置 🚀
ここからが本番です。Dokployに証明書を配置していきます。
SSH接続して準備
まず、VPSにSSH接続して証明書を配置するディレクトリを確認します:
# ディレクトリ確認
ls -la /etc/dokploy/traefik/dynamic/certificates/
# 空ファイル作成
sudo touch /etc/dokploy/traefik/dynamic/certificates/your-domain.key
sudo touch /etc/dokploy/traefik/dynamic/certificates/your-domain.crt
sudo chmod 600 /etc/dokploy/traefik/dynamic/certificates/your-domain.*
Dokploy GUIでの作業
- Dokployの管理画面にログイン
- Traefik File System を開く
-
dynamic
→certificates
フォルダへ移動
秘密鍵の配置
your-domain.key
ファイルを編集して、XserverSSLで生成した秘密鍵を貼り付けます。
証明書チェーンの作成
your-domain.crt
ファイルを編集して、以下の順序で証明書を貼り付けます:
-----BEGIN CERTIFICATE-----
[サーバー証明書の内容]
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
[中間証明書1の内容]
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
[中間証明書2の内容]
-----END CERTIFICATE-----
Step 6: Traefik設定ファイルの作成 ⚙️
次に、Traefikが証明書を認識できるように設定ファイルを作成します。
sudo tee /etc/dokploy/traefik/dynamic/custom-cert.yml > /dev/null << 'EOF'
tls:
certificates:
- certFile: /etc/dokploy/traefik/dynamic/certificates/your-domain.crt
keyFile: /etc/dokploy/traefik/dynamic/certificates/your-domain.key
stores:
- default
stores:
default:
defaultCertificate:
certFile: /etc/dokploy/traefik/dynamic/certificates/your-domain.crt
keyFile: /etc/dokploy/traefik/dynamic/certificates/your-domain.key
EOF
sudo chmod 644 /etc/dokploy/traefik/dynamic/custom-cert.yml
Step 7: Dokploy GUIでのドメイン設定 🎯
いよいよ最後の設定です。
- 対象プロジェクトの Domains タブを開く
- 該当ドメインの設定を編集
- 以下を設定:
項目 | 設定値 |
---|---|
HTTPS | ✅ 有効 |
Certificate Provider | Custom |
Custom Certificate Resolver | custom-file |
- Update をクリック
ここがトリッキーなポイント
実は custom-file
というresolverは存在しません。でも大丈夫です。
Traefikはエラーを出しますが、フォールバックとして custom-cert.yml
で定義した defaultCertificate
を使用してくれます。これはDokployの実装仕様を逆手に取った裏技です。
エラーログに以下のようなメッセージが出ますが、これは正常動作です:
ERR Router uses a non-existent certificate resolver
むしろこのエラーが出ないと動かないという、なんとも不思議な仕様です 🤔
Step 8: 動作確認 🔍
最後に、SSL証明書が正しく設定されているか確認します。
証明書チェーンの確認
# 証明書が3つ含まれているか確認
sudo grep -c 'BEGIN CERTIFICATE' /etc/dokploy/traefik/dynamic/certificates/your-domain.crt
# 結果: 3
SSL接続の検証
echo | openssl s_client -servername your-domain.com -connect your-domain.com:443 2>&1 | grep "Verify return code"
# 結果: Verify return code: 0 (ok)
ブラウザで確認
最後に、ブラウザでHTTPSアクセスして、証明書の警告が出ないことを確認します。
鍵マーク🔒をクリックして証明書の詳細を見ると、XserverSSLの証明書が使われていることが確認できるはずです。
トラブルシューティング 🛠️
証明書が信頼されない場合
証明書チェーンが正しく設定されているか確認:
sudo openssl crl2pkcs7 -nocrl -certfile /etc/dokploy/traefik/dynamic/certificates/your-domain.crt | openssl pkcs7 -print_certs -noout
3つの証明書情報が表示されればOKです ✨
Traefikが証明書を読み込まない場合
Traefikのログを確認:
docker logs dokploy-traefik 2>&1 | grep -i "certificate\|resolver" | tail -20
まとめ
というわけで、Let's Encryptの制限に引っかかった時の対処法として、DokployでXserverSSLの証明書を使う方法をまとめました。
正直なところ、Let's Encryptで十分なんですけどね...自動更新もできるし、無料だし。でも、制限に引っかかってしまったら待つしかないので、こういう回避策も知っておくと便利です。
今回の移管作業は無事完了し、サイトも問題なく動作しています。Let's Encryptの制限が解除されたら、また戻すかもしれませんが、年間836円なら継続してもいいかなとも思っています。
特に「存在しないresolverを指定してdefaultCertificateにフォールバックさせる」という裏技は、Dokployのソースコードを読んで発見しました。公式ドキュメントには載ってないので、この記事が誰かの役に立てば嬉しいです。
それでは、良いDokployライフを! 🎉
Discussion