# Wemoments（微记）

基于 Cloudflare Workers + D1 + R2 + KV 的微信朋友圈风格内容站。前端使用原生 HTML/CSS、Alpine.js、axios、Fancybox，服务端使用 Hono + TypeScript + Hono JSX。

## 本地运行

```bash
pnpm i
pnpm assets:vendor
pnpm db:migrate
pnpm db:seed
pnpm dev
```

Wrangler 会用本地模拟的 D1/R2/KV。默认本地地址通常是 `http://localhost:8787`。

示例账号：

- `admin / admin12345`
- `alice / alice12345`
- `bob / bob12345`

## Cloudflare 资源

```bash
wrangler d1 create wemoments
wrangler r2 bucket create wemoments-media
wrangler kv namespace create KV
```

把命令输出的 `database_id`、KV `id` 写入 `wrangler.toml`。然后配置密钥：

```bash
wrangler secret put SESSION_SECRET
wrangler secret put ADMIN_BOOTSTRAP_TOKEN
wrangler secret put TENCENT_MAP_KEY
```

初始化远端数据库：

```bash
wrangler d1 migrations apply wemoments --remote
```

发布：

```bash
pnpm deploy
```

## 首次 Bootstrap

如果 `wm_users` 为空，访问 `/admin` 会跳到 `/admin/bootstrap`。提交 `ADMIN_BOOTSTRAP_TOKEN` 和首个账号信息后，该账号会成为管理员，bootstrap 页面自动失效。

## R2 与 CDN

默认媒体通过 Worker `/r2/<key>` 反代，带长期缓存和 ETag。如果给 R2 配置了公开域名或自定义 CDN，在后台设置 `cdn_base_url`，前台媒体 URL 会直接使用该域名；`/r2/*` 也会 301 到 CDN。

## 常用命令

```bash
pnpm typecheck
pnpm check
pnpm db:migrate
pnpm db:seed
```

`pnpm check` 会执行 TypeScript 检查和 Wrangler dry-run。
