Svelte Commerce
A standalone open-source storefront built with SvelteKit, headless across 26 commerce backends. MIT licensed.
翻译准备中
尚未检测到更新。GitHub 发布版本后会显示在这里。
zero.estate の0円物件を衛星写真の地図に表示する静的サイト
翻译准备中
正在加载完整 README。
查看完整 README ↗0円物件を掲載サイトから集めて、衛星写真の地図に表示するサイト。サイト名は譲葉。
自宅クラスタ(deploy/)に server.ts を常時デプロイしてあり、そこが配信する。
以前は GitHub Pages の静的サイトとしても同じものを配っていたが、DNSを自宅に
切り替えた上で Pages 側は削除済み。
| 取得元 | 対象 |
|---|---|
| フィールドマッチング | 売買価格が FM_MAX_PRICE(既定1円)以下の物件 |
| 負動産の掲示板 | 募集中・商談中・成約済みの全物件 |
| NISUMEL | 掲載物件(サンプル投稿は除く) |
| 家いちば | 価格が IE_MAX_PRICE(既定0円)以下の物件 |
| 全国0円不動産 | 地域ページに載っている全物件 |
みんなの0円物件(zero.estate)は取得しない。 収集・掲載を照会したところ 2026年8月に不承諾の回答を受けたため、取得コードごと外した。詳しくは「利用条件」を参照。
app.ts CLI。取得・住所検索・生成を呼び分けるだけ
build.ts 取得 → 住所検索 → map.json。ステータスと地方もここで揃える
server.ts 配信と定期ビルド (Bun.serve + Bun.cron)。手元でも自宅鯖でも同じもの
sources/ 取得元ごとの実装(1ファイル1サイト)
index.ts 取得元の一覧。ここに足せば全部の処理に乗る
common.ts 名乗り・待ち・生データの置き場・住所と価格の読み方
fieldmatching.ts フィールドマッチング
makedosan.ts 負動産の掲示板
nisumel.ts NISUMEL
ieichiba.ts 家いちば
zenkokuzeroen.ts 全国0円不動産
geocode.ts 座標が無い物件を住所から引く(国土地理院API)
types.ts 地図が読む共通の物件型
index.html 地図ページ
src/main.ts MapLibre GL の地図・絞り込み・一覧(TypeScript)
build-web.ts src/ を assets/ に書き出す
assets/styles.css 見た目(ここは手書き)
assets/favicon.svg, assets/apple-touch-icon.png アイコン(手書き)
assets/main.js 生成物。maplibre-gl.* も生成時に置かれる
Dockerfile 実行イメージ。node_modules は入らない(実行時の依存が無いため)
compose.yml ローカル実行。認証情報は compose.override.yml で上書きする
deploy/ 自宅クラスタ用のマニフェスト。ArgoCD が追従してデプロイする
data/ 生成物。すべて Git 管理外
map.json 地図が読む軽量データ
<取得元>.json 取得元ごとの生データ
geocode-cache.json 住所検索の結果
data/ は丸ごと生成物なので、消しても bun app.ts で作り直せる
(住所検索のキャッシュも消えるため、その分だけ国土地理院APIを引き直す)。
公開時は data/map.json をサイト直下の /map.json として配る。
bun app.ts # 取得 → 住所検索 → map.json
bun app.ts fetch # すべての取得元から取得する
bun app.ts fetch fm # 1つの取得元だけ(fm / md / ni / ie / zz)
bun app.ts geocode # 座標が無い物件の住所を国土地理院APIで引く
bun app.ts json # 生データから map.json を作る
bun run build:web # src/main.ts を assets/ に書き出す
bun run dev # フロントをビルドして http://localhost:5173/ で確認
bun run start # 配信のみ (BUILD_CRON を入れると定期ビルドも走る)
bun run lint # oxlint と書式 (bun fmt --check)。直すのは bun run format
bun run typecheck # 型
bun run test # テスト (bun test)
取得元を足すときは sources/ にファイルを1つ作り、sources/index.ts の
SOURCES に並べる。取得・住所検索・map.json への合流はそれだけで通る。
| 変数 | 意味 |
|---|---|
FM_MAX_PRICE | フィールドマッチングで地図に載せる価格の上限。既定 1(円) |
IE_MAX_PRICE | 家いちばで地図に載せる価格の上限。既定 0(円) |
FETCH_DELAY_MS | 取得の間隔。既定 700(ミリ秒) |
GEOCODE_DELAY_MS | 住所検索の間隔。既定 500(ミリ秒) |
HTTPS_PROXY | 海外IPから負動産の掲示板・NISUMEL を取得する際に迂回させる。プロセス全体の fetch に掛かる。下記参照 |
PORT | 配信するポート。既定 5173 |
BUILD_CRON | 定期ビルドの時刻(例 0 9 * * *)。空なら定期ビルドをしない |
TZ | BUILD_CRON を読む時間帯。既定 Asia/Tokyo |
ローカルでは compose.override.yml に書く(Git 管理外)。
cp compose.override.yml.example compose.override.yml # 値を書き換えて使う
docker compose up --build # https://yuzuriha.localhost/
コンテナはポートを公開せず、danything/genkan (caddy-docker-proxy)にホスト名で振り分けてもらう。先に genkan を起動しておくこと。
curl -sf https://raw.githubusercontent.com/danything/genkan/main/init.sh | sh -s
bun run dev で直に動かす場合は http://localhost:5173/。
自宅クラスタでは deploy/deployment.yaml に直接書く。
イメージのビルド自体(.github/workflows/docker-publish.yml)はこれらの変数を
読まないので、GitHub Actions の Secrets には登録していない。
描画は MapLibre GL JS(WebGL)。ラスタタイルも点も GPU で描くので、 DOM でタイルを動かす方式(Leaflet)よりパンが軽い。WebGL2 が必要なので、 使えない環境では地図の代わりにその旨を表示する。
maplibre-gl はバンドルに含めず、dist の .mjs をそのまま assets/ に置いて
importmap で解決している。まとめても得にならないため。描画は Web Worker と
共通コード(maplibre-gl-shared.mjs)を分け合っていて、自前でバンドルすると
主スレッド側の 254KB (gzip) に加えて worker 用の chunk を別に配ることになる。
dist のまま置けば主スレッドと worker が同じ chunk を使うので合計 281KB (gzip)。
CDN は使っていない。
負動産の掲示板と NISUMEL は、どちらも日本のレンタルサーバで動く WordPress で、
海外IPからの wp-json へのアクセスを 403 で弾く
(User-Agent は無関係。手元の日本のIPからは同じUAで 200 が返る)。
自宅クラスタは日本のIPから動くので、本番の定期ビルドはこの 403 を踏まない。
海外から bun app.ts fetch などを直接叩く場合だけ、HTTPS_PROXY に
https://ユーザー:パスワード@ホスト名 を設定すると迂回できる。Bun の fetch は
https:// 形式のプロキシと Basic 認証の両方に対応している。
以上为 README 的开头部分。其余内容请阅读原文。 查看完整 README ↗