### 🛠 修复 - 修复了 CAPTCHA 验证的逻辑和安全性。 ### ⚡️ 优化与改进 - 新增了动态存储配置与多后端迁移机制。 - 新增了手动触发存储迁移的 Web GUI 操作界面。 - 实现了存储迁移的并发处理(使用 Group)与上传后 SHA-256 完整性自动校验机制。 - 实现了基于 Redis 的分布式锁与集群多节点缓存失效广播机制,防止迁移任务冲突。 - 实现了 Redis 锁续期守护协程 (watchdog) 防止超长迁移任务锁过期。 - 优化了更新存储配置时的连通性自动校验机制,防止配置错误。 - 优化了存储配置的内存缓存机制,并引入了全局共享连接池以提高 TCP 复用率。 - 优化了上传前已有同名文件的比对逻辑,跳过下载阶段,仅比对 Content-Length 以实现零网络流量跳过。 - 新增了普通用户的独立文件管理 Dashboard 与控制接口。 - 优化了文件管理接口命名空间,将全局管理迁移至管理员级 API Namespace 隔离控制。 - 优化了管理员新建用户接口,增加了邮箱(Email)字段的必填要求。 ### 💄 其他/体验 - 重构并优化了文件管理页面,引入了多标签页多维度统计数据大屏。 - 基于 shadcn 原生 UI 组件重构并优化了文件详情和仪表盘组件。 - 抽取后端核心路由注册流程,降低主路由文件圈复杂度,使路由配置更易维护。
wavelet
🚀 A modern, production-ready full-stack boilerplate for building scalable web applications
📖 Introduction
wavelet is a generic, production-ready full-stack boilerplate built with Go (Gin + GORM) on the backend and Next.js (App Router + Shadcn UI) on the frontend. It ships with everything you need to bootstrap a modern SaaS, internal tool, or developer platform — without the boilerplate headaches.
The project was designed from the ground up to be framework-first and business-agnostic: plug in your own domain logic while reusing the battle-tested infrastructure that comes out of the box.
✨ Key Features
- 🔐 Multi-auth System — Local password login/registration + pluggable OIDC/OAuth2 providers (supports multiple auth sources simultaneously)
- 🗝️ Personal Access Tokens — API key management for programmatic access; supports
Authorization: BearerandX-Access-Tokenheaders - 👤 User Management — Admin panel for listing, searching, filtering, enabling/disabling user accounts
- ⚙️ Dynamic System Config — Key-value system configuration management with live reload, controllable from the admin UI
- 📋 Async Task Queue — Background job processing with Asynq (Redis-backed), including a scheduling dashboard
- 📁 S3 File Storage — Unified file upload/download via S3-compatible APIs with local disk cache
- 📊 Observability — Structured logging (Zap) + distributed tracing (OpenTelemetry)
- 🎨 Modern UI — Responsive, dark-mode-ready design system built with Tailwind CSS 4 and Shadcn UI
- 📖 Built-in Documentation — Integrated docs portal with usage guides, API reference, privacy policy, and terms of service
🏗️ Architecture Overview
┌─────────────────┐ ┌─────────────────────────────┐ ┌─────────────────┐
│ Frontend │ │ Backend │ │ Database │
│ (Next.js) │◄──►│ (Go) │◄──►│ (PostgreSQL) │
│ │ │ │ │ │
│ • React 19 │ │ • Gin HTTP Framework │ │ • PostgreSQL │
│ • TypeScript │ │ • GORM ORM │ │ • Redis Cache │
│ • Tailwind 4 │ │ • Multi-provider Auth │ │ │
│ • Shadcn UI │ │ • AccessToken Middleware │ │ │
│ │ │ • Asynq Task Queue │ │ │
│ │ │ • OpenTelemetry Tracing │ │ │
│ │ │ • Swagger API Docs │ │ │
└─────────────────┘ └─────────────────────────────┘ └─────────────────┘
│
┌──────────┴──────────┐
│ Multi-Process CLI │
│ (Cobra + Viper) │
│ • api (HTTP) │
│ • worker (Queue) │
│ • scheduler(Cron) │
└─────────────────────┘
🛠️ Tech Stack
Backend
- Go 1.25+ — Primary language
- Gin — HTTP web framework
- GORM — ORM with PostgreSQL & ClickHouse support
- Redis — Cache, session store, and task queue backend
- Asynq — Distributed task queue (Redis-backed)
- Cobra + Viper — CLI entrypoint and configuration management
- OpenTelemetry — Distributed tracing and observability
- Zap — Structured, high-performance logging
- Swagger (Swaggo) — Auto-generated API documentation
- AWS SDK v2 — S3-compatible file storage
- Snowflake — Distributed ID generation
Frontend
- Next.js 16 — React framework with App Router
- React 19 — UI library
- TypeScript — Type safety
- Tailwind CSS 4 — Utility-first styling
- Shadcn UI — Accessible, composable component library
- Lucide Icons — Icon library
📋 Requirements
- Go >= 1.25
- Node.js >= 18.0
- PostgreSQL >= 14
- Redis >= 6.0
- pnpm >= 8.0 (recommended)
🚀 Quick Start
1. Clone the Repository
git clone https://github.com/Rain-kl/Wavelet.git refreshing
cd refreshing
2. Configure Environment
cp config.example.yaml config.yaml
Edit config.yaml to configure your database and Redis. OIDC auth sources are configured at runtime in the admin settings page.
3. Initialize Database
# Start local dependencies (PostgreSQL + Redis)
docker compose up -d
# Optional: also start ClickHouse
docker compose --profile clickhouse up -d
# If you use an external PostgreSQL instance instead of Docker, create the database manually
createdb -h <host> -p 5432 -U postgres refreshing
# Database schema is auto-migrated on first startup
4. Start the Backend
# Install Go dependencies
go mod tidy
# Generate Swagger API documentation
make swagger
# Start the HTTP API server
go run main.go api
The backend also supports separate
schedulerandworkerprocesses for async task processing:go run main.go scheduler # Cron job scheduler go run main.go worker # Asynq task worker
5. Start the Frontend
cd frontend
# Install dependencies
pnpm install
# Start dev server (Turbopack)
pnpm dev
6. Access the Application
| Service | URL |
|---|---|
| Frontend | http://localhost:3000 |
| Swagger API Docs | http://localhost:8000/swagger/index.html |
| Health Check | http://localhost:8000/api/health |
⚙️ Configuration
Key configuration options (see config.example.yaml for the full reference):
| Option | Description | Example |
|---|---|---|
app.addr |
Backend listen address | :8000 |
database.host |
PostgreSQL host | 127.0.0.1 |
database.database |
Database name | refreshing |
redis.host |
Redis host | 127.0.0.1 |
storage.endpoint |
S3-compatible endpoint | s3.amazonaws.com |
🔧 Development Guide
Backend
# Run API server
go run main.go api
# Run task scheduler
go run main.go scheduler
# Run async worker
go run main.go worker
# Regenerate Swagger docs (required after controller changes)
make swagger
# Format & vet code
make tidy
Frontend
cd frontend
# Development mode (Turbopack)
pnpm dev
# Production build
pnpm build
# Start production server
pnpm start
# Lint & format
pnpm lint
pnpm format
📁 Project Structure
wavelet/
├── main.go # Entry point (delegates to internal/cmd)
├── config.example.yaml # Configuration template
├── Makefile # Common commands (swagger, tidy, license, cross-build)
├── docker/ # Docker image build files (integrated/frontend/backend)
├── docs/ # Swagger auto-generated docs
├── frontend/ # Next.js frontend application
│ ├── app/ # App Router pages
│ ├── components/ # React components (ui, common, layout)
│ ├── lib/services/ # API service layer
│ └── types/ # TypeScript type definitions
└── internal/ # Go backend (private)
├── cmd/ # CLI commands (api, scheduler, worker)
├── apps/ # Business modules (oauth, user, admin, upload)
├── model/ # GORM entities and business methods
├── router/ # HTTP route registration
├── task/ # Async task definitions and workers
├── db/ # Database and Redis initialization
├── storage/ # S3 file storage abstraction
└── common/ # Shared utilities and response helpers
📚 API Documentation
Swagger API documentation is auto-generated and available once the backend is running:
http://localhost:8000/swagger/index.html
The built-in frontend docs portal at /docs includes:
- Usage Guide — Step-by-step walkthrough for getting started
- API Reference — Detailed interface documentation
- Privacy Policy — Template privacy policy (customize as needed)
- Terms of Service — Template terms of service
🧪 Testing
# Backend tests
go test ./...
# Frontend lint
cd frontend && pnpm lint
🚀 Deployment
Cross-platform Binary
Build static binaries for all 6 targets (Linux / macOS / Windows × amd64 / arm64) with a single command. The compiled frontend is embedded in every binary — no separate deployment needed.
Prerequisites: Docker with BuildKit enabled (Docker 23+ defaults to on).
# Build all 6 binaries → ./bin/
make cross-build
# Stamp a release version
make cross-build VERSION=v1.2.3
# Build only a specific OS (both architectures)
make cross-build GOOS=linux
make cross-build GOOS=darwin
make cross-build GOOS=windows
# Build only a specific architecture (all OSes)
make cross-build GOARCH=amd64
make cross-build GOARCH=arm64
# Combine filters — single binary
make cross-build GOOS=linux GOARCH=arm64
make cross-build GOOS=darwin GOARCH=amd64 VERSION=v1.2.3
Output files in ./bin/:
| File | Platform |
|---|---|
wavelet_linux_amd64 |
Linux x86-64 |
wavelet_linux_arm64 |
Linux ARM64 |
wavelet_darwin_amd64 |
macOS Intel |
wavelet_darwin_arm64 |
macOS Apple Silicon |
wavelet_windows_amd64.exe |
Windows x86-64 |
wavelet_windows_arm64.exe |
Windows ARM64 |
The version string is accessible at runtime via
wavelet --version.
Docker
# Build image
docker build -t refreshing .
# Run (pass your config as a volume mount)
docker run -d -p 8000:8000 \
-v $(pwd)/config.yaml:/app/config.yaml \
refreshing api
Production
-
Build the frontend:
cd frontend && pnpm build -
Compile the backend:
go build -o refreshing main.go -
Configure
config.yamlfor production. -
Start services:
./refreshing api # HTTP API ./refreshing scheduler # Cron scheduler (optional) ./refreshing worker # Task worker (optional)
🤝 Contributing
We welcome contributions! Please read the following before submitting code:
Workflow
- Fork the repository
- Create a feature branch (
git checkout -b feature/your-feature) - Commit your changes (
git commit -am 'Add your feature') - Push to the branch (
git push origin feature/your-feature) - Open a Pull Request
📄 License
This project is licensed under the Apache 2.0 License.