个人文房藏品记录网站:钢笔、墨水、砚台、墨条…… 藏器于身,静待知音。
- 后端:Go + Gin + SQLite(纯 Go 驱动,无 cgo),单二进制,内嵌前端
- 前端:Vue 3 + Vite,中国风设计,桌面 / 平板 / 手机自适应
- 部署:单 Docker 容器,数据全部落在一个
/data卷里
- 四类预设藏品:钢笔(笔尖类型)、墨水(颜色)、砚台(坑口)、墨条(年代、类型)
- 通用字段:名称、品牌、状态(收藏 / 已结缘)、多图、购入/结缘时间与价格、备注
- 钢笔 ↔ 墨水多对多关联(品类关联可在后台自定义)
- 品类后台配置化:新增品类、自定义专属字段、自定义品类间关联,均无需改代码
- 首页统计:当前收藏件数、收藏总值、分品类数量与金额占比
- 列表筛选:状态 / 品牌 / 各专属字段 + 名称搜索
- 数据备份:管理页一键下载数据库文件
- 管理访问控制:密码验证、30 分钟滑动会话、写接口后端强制鉴权
├── server/ # Go 后端(API + 静态服务 + embed 前端)
├── web/ # Vue3 前端源码
├── design/ # 设计稿原型(mockup.html,仅供参考)
├── Dockerfile
└── docker-compose.yml
# 后端(Go 1.26+)
cd server && go run .
# 前端(Node 24+),dev server 已配置 /api 与 /uploads 代理到 8080
cd web && npm install && npm run dev环境变量:PORT(默认 8080)、DATA_DIR(默认 ./data)、WEB_DIR(设置后从磁盘目录提供前端,不读 embed)、ADMIN_INITIAL_PASSWORD(仅数据库尚未初始化管理密码时读取,至少 12 个字符)。
首次本地启动需设置初始管理密码,例如:ADMIN_INITIAL_PASSWORD='你的初始密码' DATA_DIR=./data go run .。
本地构建完整二进制:
cd web && npm run build && cd ..
rm -rf server/web/dist && cp -R web/dist server/web/dist
cd server && CGO_ENABLED=0 go build -o inkcollection .
ADMIN_INITIAL_PASSWORD='你的初始密码' DATA_DIR=./data ./inkcollection项目自带 .github/workflows/docker.yml:把代码推到 GitHub 后,Actions 会自动构建 linux/amd64 + linux/arm64 双架构镜像并推送到 GHCR(GitHub 容器镜像仓库)。
- 推送代码到 GitHub(公开或私有仓库均可,无需配置任何 secret,
GITHUB_TOKEN自动注入) - 等 Actions 跑完,镜像地址为
ghcr.io/<你的用户名>/<仓库名>:latest - 在 NAS 上拉取并运行:
# 私有仓库需要先登录(Personal Access Token 勾选 read:packages)
echo "<PAT>" | docker login ghcr.io -u <你的用户名> --password-stdin
docker pull ghcr.io/<你的用户名>/<仓库名>:latest
docker run -d --name ink-collection \
-p 8080:8080 \
-v /volume1/docker/ink-collection/data:/data \
-e TZ=Asia/Shanghai \
-e ADMIN_INITIAL_PASSWORD='你的初始密码' \
--restart unless-stopped \
ghcr.io/<你的用户名>/<仓库名>:latest后续每次 git push 到 main 都会自动出新镜像,NAS 上 docker pull 后重启容器即完成升级。打 v1.0.0 之类的 tag 还会生成对应版本号镜像。
把项目目录(可剔除 .toolchain/、design/、web/node_modules/)拷贝到 NAS,SSH 执行:
cd ink-collection
docker build -t ink-collection:latest .
docker run -d --name ink-collection \
-p 8080:8080 \
-v /volume1/docker/ink-collection/data:/data \
-e TZ=Asia/Shanghai \
-e ADMIN_INITIAL_PASSWORD='你的初始密码' \
--restart unless-stopped \
ink-collection:latest已有管理密码的 data 目录也可继续使用 docker compose up -d;首次初始化请使用上面的 docker run -e ADMIN_INITIAL_PASSWORD=...,无需把密码写入 docker-compose.yml 或 .env。
ADMIN_INITIAL_PASSWORD只在数据库尚无管理密码时读取,至少需要 12 个字符;数据库只保存 bcrypt 哈希,不保存明文。- 初始化成功后可以在以后重建容器时移除
-e ADMIN_INITIAL_PASSWORD=...。再次传入或修改该变量都不会覆盖现有密码。 - 访问管理页、新增页或编辑页时需要验证密码;登录会话在最后一次管理操作后保持 30 分钟。
- 管理页的「访问安全」可以修改密码或退出;修改密码会立即注销所有已登录设备。
- 从旧版本升级时,首次启动新版本也需传入该变量,以便为原数据库初始化管理密码。
- 如果忘记密码:先停止容器并备份
collection.db,使用 SQLite 删除设置项DELETE FROM settings WHERE key='admin_password_hash';,再通过带新ADMIN_INITIAL_PASSWORD的docker run启动。不要在容器运行时直接修改数据库。
# 在有 Docker 的机器上
docker build -t ink-collection:latest .
docker save ink-collection:latest | gzip > ink-collection.tar.gz
# 拷贝到 NAS 后
gunzip -c ink-collection.tar.gz | docker load
# 然后按方式一的 docker run 启动群晖(Container Manager):项目 → 新增 → 选择 docker-compose.yml 所在路径,或「映像 → 导入」上面的 tar.gz。
容器只监听 8080 HTTP,对外请用反向代理终结 HTTPS:
- 群晖:控制面板 → 登录门户 → 高级 → 反向代理服务器,来源
https://你的域名:443,目的地http://127.0.0.1:8080 - 或 Nginx Proxy Manager / Caddy / 群晖外自建的 Nginx,反代到
NAS_IP:8080
Nginx 参考配置:
server {
listen 443 ssl;
server_name ink.example.com;
# ssl_certificate / ssl_certificate_key 略
client_max_body_size 25m; # 图片上传上限(单张 20MB)
location / {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme;
}
}管理写操作已有密码认证,但普通藏品浏览仍是公开的。公网部署必须使用 HTTPS;如需限制整个站点访问,可在反向代理层继续增加 Basic Auth 或 IP 白名单。
- 所有数据都在挂载的
/data卷:collection.db(SQLite)+uploads/(图片与缩略图) - 管理页「数据备份」可下载数据库文件;图片目录请随卷一起备份
- 完整备份 = 拷贝整个 data 目录;恢复 = 放回后重启容器
公开读取接口包括 /api/categories、/api/items(支持 category_id status brand q page f_<字段key> 过滤)、/api/items/:id、/api/filters、/api/stats。品类/藏品写操作、图片写操作和 /api/backup 必须具有有效管理会话;认证接口位于 /api/auth/*。状态值:collecting(收藏)/ parted(已结缘)。