介護ストア ひいらぎ オンラインストア・記事公開システム

記事
見出し・本文・画像といったブロックを積み上げて記事を作る編集画面を用意した。HTMLを書ける人でなくても公開できる。
- 過去の記事を複製して書き換える、という実際の書き方に合わせた
- 未公開の記事は署名付きURLで関係者だけが確認できる
- 記事はカテゴリで整理し、商品と同じ一覧に並べて回遊させている
物販
1つの商品に色違いを登録でき、選ばれた色ごとにカートの行と数量の上限を分けている。買われた色は注文記録・管理画面・通知・Stripeの領収書まで一貫して残る。
決済は Stripe Checkout に委ねた。購入者の氏名と住所を自分のデータベースに持たない。 持たなければ漏れない。
注文の確定は Webhook の署名を検証したうえで受け取り、Discord へ流している。
管理画面
複数のメンバーが1人1アカウントで使う前提で作った。
- 権限による操作の出し分け、2段階認証(TOTP)、ログイン試行によるアカウントロック、ベーシック認証、操作の監査ログ
- 画像のアップロードは「拡張子の許可リスト → 中身の検証 → WebPへの再エンコード」というひとつの入口に集約した。受け取ったファイルをそのまま配信しない
- 未発送の注文数と下書きの記事数をダッシュボードに集め、その場から該当画面へ移動できるようにした
アクセス計測とSEO
計測は外部サービスを使わず自前で実装した。Cookieを1つも発行しない。 ページ別の閲覧数とボタンの押下数を日次で集計している。
- サイトマップ・robots.txt・商品ページの構造化データ(JSON-LD)を出力
- SNSで共有されたときのサムネイルは、保存済みのWebPからJPEGを動的に生成して返す
- 店舗名・住所・配色・ロゴ・特定商取引法の表記はコードに埋め込まず、管理画面から変更できるようにした。文面の修正に開発者が要らない
運用
ConoHa VPS 上に Docker Compose(Caddy・Django/Gunicorn・PostgreSQL)で常駐させている。HTTPS証明書の取得と更新は Caddy が自動で行う。静的ファイルとアップロード画像は Caddy が直接返し、アプリケーションを経由させない。
DBのバックアップは手順を整えたうえで、取得したダンプを別のDBへ復元してテーブル構成を突き合わせるところまで確認した。 取れているつもりで復旧できない、という状態を避けるため。
品質
自動テスト1,052件。受け入れ確認手順書を23本(432項目)用意し、本番へ反映する前に実行している。
1人で作っていても後から判断の経緯を追えるよう、仕様上の判断115件・実装タスク42件・進捗・本番で起きた不具合への対応をリポジトリ内のドキュメントに記録し続けている。
現在も機能追加と保守を続けている。
写真

