- TypeScript 97.2%
- JavaScript 1.1%
- CSS 0.8%
- Shell 0.7%
- PowerShell 0.1%
| .ai | ||
| .deploy | ||
| admin | ||
| server | ||
| web | ||
| .gitattributes | ||
| .gitignore | ||
| README.md | ||
| start-dev.cmd | ||
| start-dev.ps1 | ||
| start-dev.sh | ||
Project-Astronomican
AI 图片与视频生成统一接入平台。
目录结构
web/ # 用户端(React + Vite)
admin/ # 管理端(React + Vite)
server/ # 后端(Bun + ElysiaJS + Prisma + PostgreSQL)
.deploy/ # 生产部署脚本、pending / archive seeds
技术栈
| 模块 | 技术 |
|---|---|
| web / admin | React + TypeScript + Vite |
| server | Bun + ElysiaJS + Prisma |
| database | PostgreSQL |
快速开始
1. 数据库
任选其一:
A. Docker(推荐联调)
docker run -d --name astronomican-pg ^
-e POSTGRES_USER=postgres ^
-e POSTGRES_PASSWORD=postgres ^
-e POSTGRES_DB=astronomican ^
-p 5433:5432 postgres:14
B. 本地 PostgreSQL
createdb astronomican
编辑 server/.env(可从 server/.env.example 复制):
DATABASE_URL="postgresql://postgres:postgres@localhost:5433/astronomican?schema=public"
REDIS_URL="redis://127.0.0.1:6380"
PORT=3000
JWT_SECRET="change-me-in-production"
ADMIN_EMAIL="admin@astronomican.local"
ADMIN_PASSWORD="admin123456"
CORS_ORIGINS="http://localhost:5173,http://localhost:5174"
本地 Postgres 若使用 5432,请把 DATABASE_URL 中的端口与账号密码改成实际值。
Redis(BullMQ 任务唤醒队列)可用 Docker 启动:
docker run -d --name astronomican-redis -p 6380:6379 redis:7-alpine
2. Server
cd server
cp .env.example .env # Windows 可手动复制后修改 DATABASE_URL
bun install
bun run db:push
bun run db:seed
bun run dev
默认地址:http://localhost:3000
健康检查:http://localhost:3000/health
bun run db:seed 会依次执行 .deploy/archive + .deploy/seeds(管理员、默认汇率、签到配置等)。管理员账号来自 ADMIN_EMAIL / ADMIN_PASSWORD(默认 admin@astronomican.local / admin123456)。
模型、供应商、适配器绑定与计价规则请在 Admin 后台手动添加(可选类型由代码里的 MODEL_DEFINITIONS / PROVIDER_DEFINITIONS 约束)。
3. Web(用户端)
cd web
bun install
bun run dev
功能:注册/登录、API Key 管理、模型目录、发起生成、任务查询。
4. Admin(管理端)
cd admin
bun install
bun run dev
使用管理员账号登录。功能:用户启用/禁用、模型/供应商/关联配置、任务监控。
生产部署
在仓库根目录用 Git Bash / WSL 执行(会提示输入服务器 SSH 密码一次)。发布包和本地 staging 不携带本地生产 env;脚本优先保留远端 server/.env.production,若远端缺失且本地存在,则通过 SSH 单独传输到临时文件用于恢复。前置:填好 web/admin 的 .env.production。
默认端口:API 19240|worker probe 19241|web 19245|admin 19250。生产 PM2 运行独立的 astronomican-api 和 astronomican-worker 进程;worker 只暴露 probe 端口,不承载业务 API。
发版前准备
-
Schema 变更:本地
cd server && bun run db:migrate,提交生成的 migration。 -
需要灌生产数据:在
.deploy/seeds/新增时间戳_名称.ts,导出:import type { PrismaClient } from "@prisma/client"; export default async function seed(prisma: PrismaClient) { /* ... */ }.deploy/seeds/— 待上线(下次部署会跑).deploy/archive/— 已在生产执行过的归档
-
没有新 seed 时保持
.deploy/seeds/为空即可。
完整发版
./.deploy/deploy.sh
流程:本地构建 web/admin → 生成 release manifest 并扫描 staging、压缩包原始列表和解压内容 → 打包上传 → 服务器 bun install + prisma migrate deploy → 若有 pending seed 则执行 → PM2 重启。成功后脚本会把已跑的 seed 移到 .deploy/archive/,请把这次移动一并 commit。manifest 会记录 commit、操作者、artifact SHA-256、migration/seed 清单。
只修库(不重建前端)
./.deploy/fix-db.sh # 只 migrate
./.deploy/fix-db.sh --seed # migrate + pending seeds → 再归档到 archive
./.deploy/fix-db.sh --seed-all # 空库 / 重建库:archive + pending
--seed-all 会从本地 server/.env 指向的数据库导出经过安全过滤的无凭据 config-snapshot.json 一并 bootstrap。
本地空库 bootstrap 仍用:cd server && bun run db:seed。
开放 API 示例
公开对接使用 v2。先在用户端创建 API Key,然后:
# 创建图片任务
curl -X POST http://localhost:3000/v2/images/generations \
-H "Authorization: Bearer ak_xxx" \
-H "Content-Type: application/json" \
-d '{
"model": "gpt-image-2",
"prompt": "a lighthouse in fog",
"aspect_ratio": "1:1",
"quality": "medium"
}'
# 查询任务
curl http://localhost:3000/v2/tasks/task_xxx \
-H "Authorization: Bearer ak_xxx"
任务状态:QUEUED → PROCESSING → SUCCEEDED / FAILED(另有软失败码 RESULT_UNKNOWN:请求超时但结果未确认)。
火山方舟对接:
- 图片:
images/generations(Seedream 5 Pro / Lite,同步) - 视频:
contents/generations/tasks(Seedance,异步轮询)
在管理端「供应商」页配置 ark(火山方舟)的 config(apiKey 必填,baseUrl、各模型/接入点 ID 可选)。未配置 apiKey 时请求会直接失败。若控制台使用推理接入点,将模型字段设为 ep-xxxx。