Flask + SQLite

Python 建立網站使用心得站

整理用 Python 建網站的經驗、踩坑與實作心得,讓安裝、環境、Flask 與部署實作更容易上手。

閱讀方向

從環境建置開始,逐步整理 Flask、虛擬環境、套件管理與實戰心得。

網站管理員 ・ 2026-03-31 15:50:03 ・ 約 5 分鐘

Cloudflared 綁定正式網域的實際步驟

如果你已經有一個 Flask 網站跑在本機 port,例如 5002,而且網域是放在 Cloudflare 上,那用 Cloudflared 來綁正式網域其實是很方便的做法。它的好處是不用直接把主機的應用程式 port 暴露到公網,也不用自己在主機上處理 HTTPS 憑證,很多細節都能交給 Cloudflare。 整體流程可以拆成幾個步驟...

如果你已經有一個 Flask 網站跑在本機 port,例如 `5002`,而且網域是放在 Cloudflare 上,那用 Cloudflared 來綁正式網域其實是很方便的做法。它的好處是不用直接把主機的應用程式 port 暴露到公網,也不用自己在主機上處理 HTTPS 憑證,很多細節都能交給 Cloudflare。

整體流程可以拆成幾個步驟:先確認網站本機能跑,再建立或使用既有的 tunnel,接著寫好 ingress 設定,最後把正式網域 route 到該 tunnel。

第一步,先確認你的 Flask 或 Gunicorn 服務在本機是正常的。假設網站跑在 `5002`,你至少要先確定這條測試可以通:

curl -I http://127.0.0.1:5002/

如果這一步都還沒通,那就不要急著碰 Cloudflared,因為 tunnel 只是在幫你把本機服務對外公開,本機服務本身還是要先正常。

第二步,確認主機上有 `cloudflared`,以及你已經登入或有可用的 tunnel 憑證:

cloudflared --version
ls -la ~/.cloudflared

如果你還沒有登入 Cloudflare,可以先做一次:

cloudflared tunnel login

登入後 Cloudflared 會幫你取得憑證,後面才能建立 named tunnel 或管理 DNS route。

第三步,如果你還沒有 tunnel,可以先建立一條 named tunnel:

cloudflared tunnel create mygo-tunnel

建立完成後,通常會拿到一個 tunnel ID,並且在 `~/.cloudflared/` 裡看到對應的 json 憑證檔。

第四步,設定 `config.yml`。假設你的正式網域要用 `python.tainanoutlook.com` 對到本機 `5002`,設定概念會像這樣:

yaml
tunnel: your-tunnel-id
credentials-file: /root/.cloudflared/your-tunnel-id.json

ingress:
  - hostname: python.tainanoutlook.com
    service: http://127.0.0.1:5002
  - service: http_status:404

這裡最重要的是 `hostname` 對應正式網域,而 `service` 指向你的本機服務。最後那行 `http_status:404` 是預設 fallback,避免沒有匹配到的流量亂跑。

第五步,把 DNS 記錄 route 到 tunnel。這一步很重要,因為光有 `config.yml` 還不夠,你還需要讓 Cloudflare 知道 `python.tainanoutlook.com` 這個 hostname 應該進哪一條 tunnel:

cloudflared tunnel route dns mygo-tunnel python.tainanoutlook.com

執行成功後,Cloudflare 會幫你建立對應的 DNS route。這樣網域流量才會真的進到這條 tunnel。

第六步,啟動 tunnel。你可以先手動測試:

cloudflared tunnel run mygo-tunnel

如果你是用 `config.yml`,也常見直接這樣跑:

cloudflared --config /etc/cloudflared/config.yml tunnel run

正式環境通常會把它做成 systemd 服務,讓它開機自啟。這樣 Cloudflared 會一直常駐,不需要手動重跑。

第七步,檢查網域是否真的通了。你可以在本機或外部機器直接測:

curl -I https://python.tainanoutlook.com/

如果一切正常,應該會看到 `HTTP 200` 或對應的站台回應。若出現 `ERR_NAME_NOT_RESOLVED`,通常是 DNS 還沒同步,或 route 沒設好。若出現 `502`,通常表示 tunnel 通了,但本機應用服務當下沒有正常回應。

另外,有時候你也會看到 HTTP 自動導向 HTTPS,這通常是正常的,因為 Cloudflare 端會幫你處理 TLS。也就是說,使用者最後實際存取的網址多半會是:

https://python.tainanoutlook.com/

如果你只是想快速測試,不想先綁正式網域,也可以先用 quick tunnel:

cloudflared tunnel --url http://127.0.0.1:5002

這會給你一個 `trycloudflare.com` 的臨時網址,很適合先驗證網站能不能對外打通。不過正式上線時,還是比較建議回到 named tunnel 加正式網域這條路,因為可控性跟穩定性都更好。

實務上,用 Cloudflared 綁正式網域時,最重要的原則有三個。第一,本機網站要先正常。第二,ingress 設定要明確。第三,DNS route 要真的綁到那條 tunnel。只要這三件事都正確,Cloudflared 會是一個非常省事的正式部署方式。尤其對小型 Flask 網站來說,它常常比自己手動搞憑證、開防火牆與做 port 暴露來得輕鬆很多。

回首頁