📷 单用户个人照片展示与管理。
- 瀑布流布局:尊重原始比例
- 响应式设计:移动端优先
- UI 可配置:通过
src/config/site.ts - 筛选与排序:分类、方向、日期、热度
- 灯箱预览:支持键盘操作
- 后台管理:
/admin - Workers 部署:OpenNext 适配
- Node.js 18+
- npm 或 pnpm
-
克隆代码仓库:
git clone <repository-url> cd photos
-
安装依赖:
npm install
-
配置环境变量: 复制
.env.example为.env.local并修改(完整列表见CONFIGURATION_ZH.md)。 -
启动开发服务器:
npm run dev
请参考:
CONFIGURATION.md(EN)CONFIGURATION_ZH.md(中文)
适合单容器部署,使用 SQLite + 本地媒体目录:
如果使用已发布的 Docker 镜像部署,请参考 DEPLOY_DOCKER_ZH.md。
- 设置环境变量:
SQLITE_PATH=/data/pluto.db
MEDIA_DEFAULT_PROVIDER=local
MEDIA_LOCAL_DIR=/data/uploads
MEDIA_LOCAL_PUBLIC_URL=https://your-domain/uploads也可以使用 MEDIA_LOCAL_PUBLIC_URL=/uploads。
- 初始化数据库(仅需一次):
sqlite3 /data/pluto.db < sql/init_d1.sql- 构建并启动:
npm run build
npm run start请确保 /data 是持久化挂载目录。
docker build -t pluto:local .
docker run --rm -p 3000:3000 \
-e NODE_ENV=production \
-e SQLITE_PATH=/data/pluto.db \
-e MEDIA_DEFAULT_PROVIDER=local \
-e MEDIA_LOCAL_DIR=/data/uploads \
-e MEDIA_LOCAL_PUBLIC_URL=/uploads \
-e NEXT_PUBLIC_BASE_URL=http://localhost:3000 \
-e ADMIN_USER=admin \
-e ADMIN_PASS_HASH=pbkdf2:100000:<salt_hex>:<hash_hex> \
-e SESSION_SECRET=change-me-to-a-long-random-string \
-v $(pwd)/data:/data \
pluto:local或使用 docker-compose:
docker compose up --build会在 http://localhost:8080 启动 Nginx 侧车。
如果希望 Nginx 直接托管本地图片:
location /uploads/ {
alias /data/uploads/;
access_log off;
add_header Cache-Control "public, max-age=31536000, immutable";
}设置 MEDIA_LOCAL_PUBLIC_URL=https://your-domain/uploads,并确保 /data/uploads 已挂载。
如果不使用 Nginx,也可以把卷挂载到 public/uploads,并设置 MEDIA_LOCAL_DIR=public/uploads,MEDIA_LOCAL_PUBLIC_URL=/uploads。
请参考 nginx/nginx.conf。
本项目使用 OpenNext 部署到 Cloudflare Workers。
- 手动部署:
npm run deploy - Git 自动构建:Workers Builds(Git 绑定)
详细说明:
DEPLOY_WORKERS.mdDEPLOY_WORKERS_ZH.md- Docker 镜像部署:
DEPLOY_DOCKER_ZH.md
请参考:
API_DOC.md(EN)API_DOC_ZH.md(中文)
- 框架: Next.js 15 (App Router)
- 语言: TypeScript
- 样式: Tailwind CSS & SCSS Modules
- 图标: Lucide React
- 部署: Cloudflare Workers (OpenNext)