把图床从 PHP/Laravel 换到 Go:ywty 的 Gin、Nuxt 3 与三种部署方式
仓库:chizw/ywty
ywty 是一个自托管图床 / 云相册系统,从经典 Lsky Pro+ 完全重写而来。后端从 PHP/Laravel 迁到 Go + Gin + GORM,前端从 Vue 3 + Vite 升级到 Nuxt 3 SSR,UI 使用 shadcn-vue(Radix Vue + Tailwind)。当前是生产可用 alpha 版,P0–P11 已完成。
技术栈:Go + Gin 后端,Nuxt 3 SSR 前端
后端技术栈包括:
- Go 1.25+、Gin、GORM v2
- Viper(YAML + 环境变量)
- Zap(按等级 / 文件切割)
- Asynq(基于 Redis 的异步队列)
- BigCache + Redis 多级缓存
- Casbin(RBAC)、golang-jwt
- disintegration/imaging、asaskevich/govalidator
前端使用 Nuxt 3 SSR,UI 层为 shadcn-vue(Radix Vue + Tailwind)。这套组合适合想把图床或相册服务放到 Go 技术栈、同时用 SSR 重做前端的团队参考。
数据层:30+ 张表,SQLite 默认、MySQL 可用
数据层由一套 GORM 模型覆盖 30+ 张业务表。默认使用 SQLite,便于轻量化启动;同时深度支持 MySQL,生产环境推荐 MariaDB 10.6.20+。
迁移通过 CLI 完成:
migrate up / down / status / seed
部署方式 A:Docker Compose(推荐)
复制环境变量文件,至少修改 JWT_SECRET 和 APP_URL:
cp .env.example .env
docker compose up -d
启动后访问 http://localhost:3000。
其他场景:
连接宿主机已有 MySQL + Redis:
DB_HOST=host.docker.internal REDIS_HOST=host.docker.internal docker compose up -d --scale mysql=0 --scale redis=0
本地开发用 SQLite:
DB_DRIVER=sqlite docker compose up -d --scale mysql=0 --scale redis=0
执行迁移:
docker compose run --rm migrate
部署侧还包含 Docker + Docker Compose、GitHub Actions CI(gofmt/vet/test/build/Docker 多架构)、Nginx 反代 + HTTPS、Supervisor 守护。
部署方式 B:本地开发
进入 server 目录,下载依赖并准备环境变量:
cd server && go mod download && cp .env.example .env
初始化数据库和种子数据:
go run ./cmd/migrate # 初始化数据库+种子
启动 API,默认监听 :8080:
go run ./cmd/api # 默认 :8080
部署方式 C:生产
生产部署脚本:
./deploy/deploy.sh prod v1.0.0
配置 Nginx 和 Supervisor:
cp deploy/nginx.conf.example /etc/nginx/sites-available/ywty.conf
cp deploy/supervisor.conf /etc/supervisor/conf.d/ywty.conf
数据库备份:
./deploy/backup-db.sh mysql
目录结构
deploy/:deploy.sh、dev-up/down.sh、backup-db.sh、nginx.conf.example、supervisor.conf.github/workflows/docker-compose.yml.env.exampleDockerfile(合并 API + Web)
从 PHP/Laravel 迁到 Go 的现实含义
Lsky Pro+ 是 PHP 生态。团队如果想把图床放到 Go 技术栈,或者用 Nuxt SSR 重做前端,这个项目可以作为重构参考:30+ 表的模型、多存储驱动、队列与缓存分层,都在同一套 GORM 模型和 Go 服务里落地。
仓库地址: