← 記事一覧に戻る

小規模 LP を Python + Jinja2 + SQLite + Caddy で単独構築した実装ログ

Flask も Django も使わず、Python 標準ライブラリ + Jinja2 + SQLite + Caddy で 30ページの多言語 Web サイトを単独構築。9商品カタログ・相談フォーム・管理画面・OGP 自動生成まで、実物ベースで解説。

このサイト(buy.zero-aibot.com)は、Flask も Django も FastAPI も使わず、Python 標準ライブラリ + Jinja2 + SQLite + Caddy だけで構築している。ページ数は 30 以上、多言語対応、SEO 基盤、9商品カタログ、17項目の相談フォーム、無料DL リード獲得、管理画面、OGP 画像自動生成まで、すべて自作。

「LP 制作を頼みたい」と言われた時、既製 CMS を使わずに Python だけで組んだこのサイトを、そのまま雛形として納品できる。この記事では、その構築で採用した 5つの設計判断 を、実物ベースで解説する。

全体構成(技術スタック)

| 層 | 使用技術 | 選定理由 | |---|---|---| | Web サーバー | Caddy | TLS 自動化 + パス別リバースプロキシ | | アプリ | Python 3.12 + 標準 http.server | Web フレームワーク不要 | | テンプレート | Jinja2 | HTML 共通化 + Python との親和性 | | DB | SQLite | 小規模サイトに必要十分、運用が軽い | | 常駐化 | systemd | GCP VM 上で 1年以上稼働継続 | | OGP画像 | Chrome headless + Pillow | 自動生成、外部 SaaS 不要 | | 決済 | PayPal SDK | 買い切り + Webhook 検証 |

Web フレームワークは使っていない。理由は、規模が小さいうちは標準 http.server + Router クラス(自作)+ Jinja2 レンダラー(自作ラッパー)で完全にコントロールできるため。

5つの設計判断

1. Web フレームワークを使わない(標準ライブラリ+自作 Router)

Flask や FastAPI は便利だが、以下のコストがある。

  • バージョン互換の追跡(Flask 2.x → 3.x など)
  • 依存パッケージの脆弱性対応
  • 「フレームワーク流儀」を覚え直す学習コスト

30ページ規模なら、以下の自作 Router で十分:

class Router:
    def __init__(self):
        self._exact = {}
        self._regex = []
    def add(self, method, path, handler):
        if "{" in path:
            pattern = self._compile(path)
            self._regex.append((method, pattern, handler))
        else:
            self._exact[(method, path)] = handler
    def resolve(self, method, path):
        h = self._exact.get((method, path))
        if h: return RouteMatch(h, {})
        for m, pattern, h in self._regex:
            if m != method: continue
            match = pattern.fullmatch(path)
            if match: return RouteMatch(h, match.groupdict())
        return None

これで /ja/works/{slug}/ のようなパス変数もハンドリングできる。60行未満で全ルーティング完結

2. Jinja2 + partials で HTML 重複を潰す

30ページ全部を独立ファイルで書くと、ヘッダー・フッター・OGP タグの変更が地獄になる。Jinja2 の {% extends %}{% include %} で共通化する。

templates/
├── base.html              # <html> / <head> / OGP / nav / footer
├── partials/
│   ├── header.html        # nav
│   └── footer.html        # footer
├── ja/
│   ├── home.html          # {% extends "base.html" %}
│   ├── works_index.html
│   └── ...
└── en/
    └── ...

新しいページを追加する時、{% extends "base.html" %}{% block content %} だけ書けばナビ・フッター・OGP が全部自動で入る。追加コスト = ページ本文のみ

3. SQLite で必要十分(Postgres は使わない)

「本番 DB は Postgres」という思い込みで、小規模サイトに MySQL / Postgres を採用するとインフラ費と運用コストが跳ねる。

このサイトは以下のテーブルを SQLite で運用(PBKDF2 セッション認証、WAL モード):

  • blog_posts / lab_logs / requests / reviews
  • pageviews / likes / like_ips
  • bot_heartbeat / bot_lane_stats / bot_trades / bot_candidates
  • free_download_leads

12 テーブル、100 req/sec 程度なら SQLite で全く問題ない。バックアップも1ファイルの PH0 で完結

4. Caddy が TLS 自動化 + パス別ルーティング

Nginx + certbot の組合せは自分でメンテするなら重い。Caddy なら以下の Caddyfile 1つで完結する:

buy.zero-aibot.com {
    encode gzip zstd
    handle /ja* /en* /admin2* /api/* /static/* {
        reverse_proxy 127.0.0.1:8789   # 新サーバー
    }
    redir /lp /lp/ permanent
    handle_path /lp/* {
        reverse_proxy 127.0.0.1:8787   # 旧サーバー(PayPal LP)
    }
    handle /assets/* /terms* /privacy* {
        reverse_proxy 127.0.0.1:8787
    }
    handle {
        reverse_proxy 127.0.0.1:8787
    }
}

TLS 証明書は Let's Encrypt で自動取得・自動更新。旧LP(PayPal 決済動画付き)と新サイトを1ドメイン内で共存 できる。

5. OGP 画像を Chrome headless + Pillow で自動生成

SNS シェア時のサムネイル画像を、外部 SaaS を使わずに自動生成する構成:

# HTMLファイルを書いて Chrome headless で PNG 化
chrome --headless=new --disable-gpu   --window-size=1200,630   --screenshot="ogp.png"   "file:///path/to/ogp.html"

# sips (macOS) or Pillow で JPEG 化して軽量化
sips -s format jpeg -s formatOptions 90 ogp.png --out ogp.jpg

これで ブランドカラー + サイトタイトル + 主要カテゴリ + URL を含む 1200×630 の OGP 画像が完全自動で作れる。デザインを変えたい時は HTML/CSS だけ書き換える。Canva 不要、外部 SaaS 不要

このサイトで実装できたもの(実物リスト)

  • 30 ページ以上(/ja/*, /en/*, /admin2/*
  • 多言語対応(言語ゲート + 各言語別テンプレ)
  • SEO 基盤(robots.txt / sitemap.xml / OGP メタタグ全ページ自動)
  • 9商品カタログ + カテゴリタブ + ランダム順表示
  • 17項目相談フォーム + 自動メール送信 + SQLite 保存
  • 無料DL リード獲得(メール登録 + ZIP 配信 + CSV エクスポート)
  • 管理画面(PBKDF2 認証 + ブログ CMS + 画像アップロード API 自作)
  • OGP 画像を Chrome headless で自動生成
  • Bot heartbeat 受信ページ(外部 bot からの実測データ表示)
  • ブログ機能(Markdown + 画像アップロード + スマホ投稿対応)
  • モバイル対応 CSS(iOS Safari ズーム防止、tap 領域 44px 以上)
  • 決済経路の共存(新サーバー :8789 と旧 PayPal LP :8787 を Caddy で振り分け)

何が向いていて、何が向いていないか

向いている:

  • 30〜100ページ規模の LP / 小規模企業サイト
  • 相談フォーム + DB + 管理画面込みで納品したい案件
  • 多言語対応(2〜3言語)
  • 「WordPress は避けたい」プロジェクト
  • 外部 SaaS 依存を最小化したい案件

向いていない:

  • 10万PV / 日を超える大規模サイト(キャッシュ層が必要)
  • 会員数万人規模の SaaS(Postgres / Redis / キューが必要)
  • ECサイトの商品数千件規模(別途 EC プラットフォームを推奨)
  • リアルタイム双方向通信(WebSocket / SSE が中心のアプリ)

「何でもできる」ではなく、「小〜中規模の Web に絞って最速で納品できる」座組として設計している。

「同じ座組で LP を作って欲しい」方へ

このサイトと同じ構成で、あなたの LP / 小規模サイトを納品します。

対応:

  • 単言語 LP(1ページ〜10ページ)
  • 多言語対応(日 + 英、他言語は要相談)
  • 相談フォーム + 自動メール送信
  • 管理画面(記事投稿・データ閲覧)
  • OGP 自動生成
  • SEO 基盤(robots.txt / sitemap.xml / OGP)
  • Caddy による TLS 自動化 + デプロイ手順書

対応外:

  • 大規模 SaaS の一括受託
  • 決済フル自作(PayPal 連携は可能、Stripe 別途相談)
  • モバイルアプリ

見積目安:

  • LP のみ(1〜5ページ、フォームなし): ¥5〜8万 / 3〜7日
  • LP + 相談フォーム + DB: ¥8〜12万 / 3〜10日
  • 多言語 + OGP 自動生成 + 管理画面: ¥12〜20万 / 1〜2週

17項目の相談フォーム → 即日見積 → 納品まで、Zoom不要・テキストのみで完結。売買推奨・投資助言・利益保証は行いません。

このサイト自体が納品物のサンプル です。ブラウザで開いてページ数・機能・表示速度を確認していただければ、納品後のイメージがそのまま分かります。

レビュー

まだレビューはありません。読んだ感想を最初に投稿してみてください。

レビューを投稿する
評価 必須

送信後、管理者による承認を経て公開されます。投資助言・売買推奨・誹謗中傷は掲載しません。

技術支援を相談する

TradingView / Python / API / ログまわりの実装は相談フォームから。

相談フォームへ
📥 無料版 4 種 メールだけで受け取る →