カスタムドメインを接続
Cloudflare をリバースプロキシとして使い、Daki 上で動く Web アプリに自分のドメインを向けます — 無料の HTTPS とカスタムポートの転送付き。Cloudflare Tunnel (cloudflared) による上級者向けの代替手段も解説します。
アプリを hostname:port のアドレスではなく yourdomain.com で到達できるようにしたいですか? このガイドでは、無料のリバースプロキシとして Cloudflare を使い、自分のドメインを Daki のサーバーに向ける方法を説明します。Cloudflare が HTTPS を処理し、訪問者をアプリが待ち受けるカスタムポートへ転送します。
カスタムドメインには有料プランが必要です。公開ポートにアクセスできる必要があり、公開ポートを含むのは有料プラン(Bronze、Silver、Gold、およびゲームサーバープラン)のみです。Free Tier のサーバーは外部からの接続を受けられないため、そこではカスタムドメインは機能しません。アプリ・ボットホスティングのプラン と ネットワークと割り当て を参照してください。
このページで学べること
- Daki でカスタムドメインにリバースプロキシ(Cloudflare など)が必要な理由
- プロキシ経由の DNS レコードでドメインをサーバーに向ける方法
- ドメインで無料の HTTPS を有効にする方法
- Origin Rule でアプリのポートにトラフィックを転送する方法
- Cloudflare Tunnel(
cloudflared)を使う上級者向けの代替手段
前提条件
- 公開ポートの割り当てを持つ有料プランのサーバー — アプリ・ボットホスティングのプラン を参照
- 所有しているドメイン名(任意のレジストラで登録済み。例: Namecheap、GoDaddy、IONOS、Cloudflare Registrar)
- 無料の Cloudflare アカウント
- サーバーの割り当てポートで起動し、待ち受けている Web アプリ(HTTP/HTTPS)
アプリは、割り当てポートで 0.0.0.0(すべてのインターフェース)にバインドする必要があります — 127.0.0.1 / localhost では不可です。localhost のみにバインドされたアプリはコンテナの外からは到達できず、プロキシが接続に失敗します。ほとんどのフレームワークはホストの引数を受け付けます(例: Flask では app.run(host="0.0.0.0", port=...)、多くの Node.js アプリでは HOST=0.0.0.0)。
Cloudflare が必要な理由
Daki は各ノード間で共有 IP アドレスを使用しており、アプリは標準以外のポート(サーバーに割り当てられた割り当て)で待ち受けます。そのため次の 2 つの問題が生じます:
- 訪問者は、
yourdomain.com:4129ではなく、標準の HTTPS ポート(443)でhttps://yourdomain.comに到達できることを期待します。 - 自分で管理せずに、有効な HTTPS 証明書がほしいところです。
Cloudflare をサーバーの前に置くと、両方が解決します。Cloudflare はリバースプロキシとして動作します: ブラウザは 443 番ポートで HTTPS を使って Cloudflare に接続し、Cloudflare がリクエストをカスタムポートでサーバーに転送します。無料の SSL と分かりやすい URL が得られ、サーバーの実際の IP は隠されたままになります。
この方法は HTTP/HTTPS の Web アプリ(Web サイト、API、ダッシュボード、Webhook)で使えます。ほとんどのゲームサーバーなど、生の TCP/UDP サービスでは使えません — Cloudflare の標準プロキシは HTTP(S) のみを扱うためです。HTTP 以外のサービスは、下記の Cloudflare Tunnel の方法を使うか、サポート にお問い合わせください。
サーバーの IP とポートを確認する
Portal の Network タブで、次の 2 つの値が必要です:
| 項目 | 確認場所 | 例 |
|---|---|---|
| Server IP | サーバーのホスト名が解決される IP アドレス(Network タブに表示)。ホスト名しか表示されない場合は、たとえば ping eu-node1.daki.cc で解決するか、サポート に問い合わせてください。 | 203.0.113.10 |
| 割り当てポート | Network タブのホスト名の横に表示されるポート。アプリはこのポートで待ち受ける必要があります。 | 4129 |
以降この例の値を使います。出てきた箇所では、ご自身の値に置き換えてください。割り当てについての詳細は ネットワークと割り当て を参照してください。
パート 1: Cloudflare の設定
ドメインを Cloudflare に追加
- 無料アカウントを dash.cloudflare.com で作成します(すでにお持ちの場合はログインします)。
- Add a site をクリックし、ドメイン(例:
yourdomain.com)を入力します。 - 確認されたら Free プランを選択します。
- Cloudflare が 2 つのネームサーバー(例:
xxx.ns.cloudflare.com)を提示します。 - ドメインのレジストラ にログインし、ドメインのネームサーバー / DNS 設定を開いて、既存のネームサーバーを Cloudflare が提示した 2 つに置き換えます。
ネームサーバーの変更が反映されるまでには、数分から 24 時間かかることがあります。ドメインが有効になると Cloudflare からメールが届きます。その間も次のステップを進められます。
DNS レコードを作成
ドメインの Cloudflare ダッシュボードで DNS → Records を開き、Add record をクリックします:
項目 値 Type AName @(ルートドメインyourdomain.comを表します)IPv4 address サーバーの IP(例: 203.0.113.10)Proxy status Proxied(オレンジ色の雲 ☁️) Save をクリックします。
オレンジ色の雲(Proxied) の状態は必須です — トラフィックを Cloudflare 経由にすることで、SSL とパート 2 のポート書き換えが機能します。グレーの雲(DNS only)にすると Cloudflare を完全にバイパスし、サーバーの IP が露出します。
www.yourdomain.comも提供するには、名前wwwで 2 つ目のプロキシ済みレコードを追加してください。SSL/TLS を設定
- SSL/TLS → Overview を開きます。
- 暗号化モードを Flexible に設定します。
Flexible では、訪問者と Cloudflare の間のトラフィックは暗号化(HTTPS)されますが、Cloudflare はカスタムポート上の平文の HTTP でアプリに接続します。アプリが平文の HTTP を提供している場合(カスタムポートのアプリの大半がそうです)、これが適切な選択です。
アプリ自体が TLS を終端している(つまり、ポート上で直接 HTTPS を提供している)場合は、代わりに Full を選んでください。Flexible では Cloudflare とサーバーの間の接続は暗号化されない点に注意してください。機密性の高いトラフィックには、アプリで HTTPS を使う Full を推奨します。
パート 2: アプリのポートへトラフィックを転送する
アプリは標準の 80/443 ではなく、カスタムポート(例: 4129)で動作するため、Cloudflare がサーバーに接続するときに使うポートを指定する必要があります。Origin Rule がまさにそれを行います — 受信リクエストの宛先ポートを書き換えます。
Origin Rule を作成
- Cloudflare ダッシュボードで Rules → Origin Rules を開きます。
- Create Origin Rule をクリックします。
- ルールを設定します:
設定 値 When incoming requests match Hostname equals yourdomain.comThen... Rewrite to Destination Port → 4129(割り当てポート)- Save(または Deploy)をクリックします。
DNS が反映されると、アプリは https://yourdomain.com で到達できるようになります — Cloudflare が HTTPS で提供し、ポート 4129 でサーバーにトラフィックを転送します。
動作を確認する
- サーバーが実行中で、アプリが割り当てポートで待ち受けていることを確認します(Console タブで確認できます)。
- ブラウザで
https://yourdomain.comを開きます。 - 有効な鍵マーク付きで、HTTPS でアプリが読み込まれるはずです。
すぐに読み込まれない場合は、DNS の反映をもう少し待ってから、下の よくある問題 を参照してください。
上級者向けの代替手段: Cloudflare Tunnel (cloudflared)
公開ポートを開いて、サーバーに A レコードを向ける代わりに、cloudflared(Cloudflare のトンネルクライアント)をアプリと一緒に実行できます。Cloudflare への外向きの接続を開き、トラフィックをローカルでアプリへ転送します。これによりサーバーの IP とポートは隠れたままになり、DNS の A レコードも Origin Rule も不要になります。
Daki 環境による制約。 Startup タブには 2 つのコマンドがあります — インストールコマンド(セットアップ・再インストール時に 1 回実行)と起動コマンド(起動のたびに実行)です。また、起動コマンドを一時的に bash に設定するとシェルを開けます。しかし、サーバーはフルの Linux VM ではなくコンテナです。apt はなく、システムサービスを登録することもできません。コンソールから手動で起動したトンネルは、サーバーが再起動すると終了します。そのため確実な方法は、トンネルをアプリ自身の起動処理の一部にすることです — 実行時に cloudflared のバイナリをダウンロードし、環境変数で制御されるアプリの子プロセスとして起動します。
トンネルを作成
- Cloudflare Zero Trust ダッシュボードで Networks → Tunnels を開き、Create a tunnel をクリックして Cloudflared を選びます。
- 名前を付け、Cloudflare が表示するトンネルトークン(インストールコマンドの
--tokenの後の長い文字列)をコピーします。 - トンネルに Public Hostname を追加します:
- Domain:
yourdomain.com - Service:
http://localhost:4129(アプリのローカルポート)
- Domain:
トークンを .env に保存
トークンをサーバーの
.envファイルに追加します(環境変数 を参照)。ソースコードに残らないようにするためです:.envCLOUDFLARE_TUNNEL_TOKEN=your_tunnel_token_hereコードからトンネルを起動
最初の実行時に
cloudflaredをダウンロードし、アプリと一緒に起動する小さなランチャーを追加して、そのランチャーを起動コマンドに設定します。CLOUDFLARE_TUNNEL_TOKENが設定されている場合にのみトンネルを起動するので、トークンなしでもローカルで同じコードが問題なく動きます。start.jsとして保存し、起動コマンドをnode start.jsに設定します:JavaScript// start.js — starts your app and, if a token is set, a Cloudflare tunnel. require("dotenv").config(); const fs = require("fs"); const path = require("path"); const { spawn, spawnSync } = require("child_process"); const CLOUDFLARED_URL = "https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64"; const binaryPath = path.join(__dirname, "cloudflared"); const children = []; // The container has no apt — download the binary on first run, reuse it after. function ensureCloudflared() { if (fs.existsSync(binaryPath)) return binaryPath; console.log("[tunnel] downloading cloudflared..."); const dl = spawnSync("curl", ["-fsSL", "-o", binaryPath, CLOUDFLARED_URL], { stdio: "inherit", }); if (dl.status !== 0) return null; fs.chmodSync(binaryPath, 0o755); return binaryPath; } // Spawn a child process; if any child exits, stop the rest and quit. function start(name, command, args) { const child = spawn(command, args, { stdio: "inherit", env: process.env }); child.on("exit", (code) => { console.error(`[${name}] exited (${code}); shutting down`); for (const c of children) if (!c.killed) c.kill("SIGTERM"); process.exit(code ?? 1); }); children.push(child); } const token = process.env.CLOUDFLARE_TUNNEL_TOKEN?.trim(); if (token) { const binary = ensureCloudflared(); if (binary) start("tunnel", binary, ["tunnel", "run", "--token", token]); } else { console.log("[tunnel] CLOUDFLARE_TUNNEL_TOKEN not set; skipping tunnel"); } // Start your app — change this to your real entry point. start("app", "node", ["index.js"]);start.shとして保存し、起動コマンドをbash start.shに設定します:Shell#!/usr/bin/env bash # Load variables from .env into the environment. set -a; [ -f .env ] && . ./.env; set +a # The container has no apt — download cloudflared on first run, reuse it after. if [ ! -x ./cloudflared ]; then curl -fsSL -o ./cloudflared \ https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64 chmod +x ./cloudflared fi # Start the tunnel in the background only if a token is set. if [ -n "$CLOUDFLARE_TUNNEL_TOKEN" ]; then ./cloudflared tunnel run --token "$CLOUDFLARE_TUNNEL_TOKEN" & fi # Start your app in the foreground — change this to your real command. exec python main.py起動のたびに再ダウンロードしないようにするには、ダウンロード処理を インストールコマンド に移し、起動コマンドには起動ロジックだけを残せます。上の例は、バイナリが存在すればダウンロードをスキップするため、毎回の起動で実行しても安全です。
トレードオフ:
| Cloudflare プロキシ(パート 1〜2) | Cloudflare Tunnel (cloudflared) | |
|---|---|---|
| セットアップの難易度 | 簡単(ダッシュボードのみ) | 上級(アプリの起動処理に組み込む) |
| サーバーの IP/ポートの露出 | プロキシの裏に隠れる | 完全に隠れる(外向きのみ) |
| 公開ポート / Origin Rule が必要 | はい | いいえ |
| サーバーのリソース使用 | サーバー側では使用なし | 追加のプロセスを実行 |
よくある問題
サイトがまったく読み込まれない
DNS がまだ反映中かもしれません。ネームサーバーの変更には最大 24 時間かかることがあります(通常はもっと短いです)。Cloudflare でドメインのステータスが Active になっていて、A レコード が存在し Proxied(オレンジ色の雲)になっていることを確認してください。dnschecker.org などのツールで反映状況を確認できます。
Error 522 / 523 — 接続タイムアウト / オリジンに到達できない
Cloudflare がアプリに到達できません。次の順に確認してください:
- サーバーが実行中で、アプリが完全に起動している(Console タブで確認)。
- Origin Rule が、正確な割り当てポートにポートを書き換えている。
- A レコードの IP がサーバーの IP と一致している。
- アプリが
127.0.0.1/localhostではなく0.0.0.0にバインドしている。
Too many redirects / ERR_TOO_MANY_REDIRECTS
通常は SSL モードの不一致が原因です。アプリが HTTPS を強制しているのに、Cloudflare が HTTP で接続すると、リダイレクトのループが起きます。アプリに平文の HTTP を提供させて Flexible を使うか、アプリで HTTPS を提供させて、SSL/TLS → Overview で Cloudflare を Full に切り替えてください。
http:// では動くが https:// では動かない
DNS レコードが Proxied(オレンジ色の雲)になっていること、そして SSL/TLS モードが(Flexible か Full に)設定されていることを確認してください。グレーの雲(DNS only)の場合、Cloudflare の SSL はバイパスされます。
ゲームサーバーや HTTP 以外のサービスが動かない
Cloudflare の標準プロキシは HTTP/HTTPS のみを扱います。ほとんどのゲームサーバーのような生の TCP/UDP サービスには、この方法は適用されません。ホスト名とポートを使って直接接続するか(ネットワークと割り当て を参照)、ほかの選択肢については サポート にお問い合わせください。
Cloudflare を使う必要がありますか?
いいえ。Cloudflare は最も簡単な無料の選択肢ですが、カスタムポートに転送できるリバースプロキシなら何でも使えます(例: cloudflared によるトンネル、またはアプリの前に置く独自の Nginx / Caddy)。Cloudflare が推奨されるのは、無料の SSL を提供し、サーバーの IP を隠し、プロキシ方式ではサーバーに追加のソフトウェアが不要だからです。
次のステップ
- ネットワークと割り当て — ホスト名とポートを確認し、割り当てを追加します。
- アプリ・ボットホスティングのプラン — 公開ポートを得るために有料プランへアップグレードします。
- 環境変数 — コードの環境変数からポートを読み取ります。
- サポートを受ける — 行き詰まったらサポートへ。