feat(db-migrate): 初始化声明式数据库迁移项目骨架

- 添加数据库 schema 声明文件 schema.sql,包含多张表的完整结构定义
- 新增 Dockerfile,配置基于 arigaio/atlas 的迁移镜像
- 添加 migrate.sh 脚本执行生产环境迁移操作
- 创建 generate-migration.sh 脚本导出本地数据库 schema
- 新建 test-local.sh 脚本用于本地迁移兼容性测试
- 配置 atlas.hcl 支持本地(local)和生产(prod)两个环境
- 添加 docker-compose.yml 支持基于环境变量的容器化迁移服务
- 新增 .drone.yml 配置自动构建并推送迁移镜像流水线
- 提供 .env.example 和 .env.local 模板方便环境变量管理
- 更新 .gitignore 和 .dockerignore 优化开发与构建忽略规则
- 编写 README.md,详细说明项目架构、使用步骤及注意事项
- 编写 CLAUDE.md,提供代码库整体说明及迁移工作流程指导
This commit is contained in:
danial
2025-12-13 21:32:12 +08:00
commit db526ce3ab
14 changed files with 1850 additions and 0 deletions

6
.dockerignore Normal file
View File

@@ -0,0 +1,6 @@
*.sh
!migrate.sh
.git
.gitignore
.env.local
docker-compose.yml

26
.drone.yml Normal file
View File

@@ -0,0 +1,26 @@
---
kind: pipeline
type: ssh
name: master-machine
server:
host: 38.38.251.113:34156
user: root
password:
from_secret: www_password
clone:
depth: 1
steps:
- name: build new image
environment:
DOCKER_LOGIN:
from_secret: docker_login
DOCKER_TOKEN:
from_secret: docker_token
commands:
- docker login git.oceanpay.cc -u $DOCKER_LOGIN -p $DOCKER_TOKEN
- docker build -t git.oceanpay.cc/danial/kami-db-migrate${DRONE_BRANCH}:latest .
- docker push git.oceanpay.cc/danial/kami-db-migrate${DRONE_BRANCH}:latest
- docker logout git.oceanpay.cc

6
.env.example Normal file
View File

@@ -0,0 +1,6 @@
# 生产环境数据库配置
DB_USER=root
DB_PASSWORD=your_password
DB_HOST=mysql_host
DB_PORT=3306
DB_NAME=production_db

9
.env.local Normal file
View File

@@ -0,0 +1,9 @@
# MySQL Docker 容器名称(根据实际情况修改)
MYSQL_CONTAINER=mysql-server
# 本地数据库连接信息
DB_USER=root
DB_PASSWORD=mysql123
DB_NAME=kami
DB_HOST=localhost
DB_PORT=3306

2
.gitignore vendored Normal file
View File

@@ -0,0 +1,2 @@
/.idea/
/.vscode/

74
CLAUDE.md Normal file
View File

@@ -0,0 +1,74 @@
# CLAUDE.md
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
## Overview
This is a database migration repository using Atlas for declarative schema management. The project manages MySQL database schema migrations using Atlas' declarative approach.
## Architecture
- **Declarative Schema Management**: Uses `schema.sql` as the single source of truth for database schema
- **Atlas**: Uses Atlas CLI for schema inspection and migration
- **Docker-based**: All operations run in Docker containers for consistency
- **Environment Configuration**: Supports both local development and production deployments
## Key Commands
### Local Development
```bash
# Export current database schema to schema.sql
./generate-migration.sh
# Run local testing (creates test database and applies migrations)
./test-local.sh
```
### Production Deployment
```bash
# Using Docker Compose (recommended)
cp .env.example .env
# Edit .env with production database credentials
docker-compose up db-migrate
# Using Docker directly
docker build -t db-migrate:latest .
docker run --rm -e DB_URL="mysql://user:password@host:3306/database" db-migrate:latest
```
## Configuration Files
- `atlas.hcl`: Atlas environment configuration (local and prod)
- `.env.local`: Local development settings (includes MySQL container name)
- `.env.example`: Production environment template
- `schema.sql`: Database schema definition (generated from local database)
## Environment Setup
The project uses two Atlas environments:
- **local**: Connects to local MySQL instance at `localhost:3306/kami`
- **prod**: Uses `DB_URL` environment variable for production database connection
Both environments use `atlas_dev` as the development database for Atlas operations.
## Migration Process
1. **Schema Development**: Make changes to local database
2. **Export Schema**: Run `./generate-migration.sh` to update `schema.sql`
3. **Local Testing**: Run `./test-local.sh` to verify migrations work
4. **Production Deployment**: Use Docker Compose or Docker run with production credentials
## Testing
The `test-local.sh` script performs a complete integration test:
1. Creates `atlas_dev` database for Atlas operations
2. Generates current schema from local database
3. Creates fresh `kami_test` database
4. Applies migrations to test database
5. Verifies migration results by listing tables
## Docker Configuration
- Base image: `arigaio/atlas:latest`
- Entry point: `/app/migrate.sh` (expects `DB_URL` environment variable)
- Built with Atlas CLI and migration scripts

11
Dockerfile Normal file
View File

@@ -0,0 +1,11 @@
FROM arigaio/atlas:latest
WORKDIR /app
COPY atlas.hcl .
COPY schema.sql .
COPY migrate.sh .
RUN chmod +x migrate.sh
ENTRYPOINT ["/app/migrate.sh"]

62
README.md Normal file
View File

@@ -0,0 +1,62 @@
# Atlas 数据库迁移(声明式)
## 文件说明
- `atlas.hcl` - Atlas 配置文件
- `schema.sql` - 数据库 schema 定义(声明式)
- `.env.local` - 本地环境配置
- `.env.example` - 生产环境配置示例
- `generate-migration.sh` - 从本地数据库导出 schema.sql
- `migrate.sh` - 生产环境迁移脚本
- `test-local.sh` - 本地测试脚本
- `Dockerfile` - Docker 镜像配置
- `docker-compose.yml` - Docker Compose 配置
## 使用步骤
### 1. 导出当前数据库 schema
```bash
./generate-migration.sh
```
### 2. 本地测试
```bash
./test-local.sh
```
### 3. 生产环境部署
#### 方式一Docker Compose推荐
```bash
# 1. 复制环境变量配置
cp .env.example .env
# 2. 修改 .env 文件,填入生产数据库信息
# DB_USER=root
# DB_PASSWORD=your_password
# DB_HOST=mysql_host
# DB_PORT=3306
# DB_NAME=production_db
# 3. 执行迁移
docker-compose up db-migrate
```
#### 方式二Docker Run
```bash
docker build -t db-migrate:latest .
docker run --rm \
-e DB_URL="mysql://user:password@host:3306/database" \
db-migrate:latest
```
## 注意事项
1. 本地测试需修改 `.env.local` 中的 `MYSQL_CONTAINER` 为实际容器名称
2. 生产环境需配置 `.env` 文件或设置环境变量
3. 使用声明式迁移schema.sql 是数据库最终状态
4. Atlas 自动计算并执行差异变更

11
atlas.hcl Normal file
View File

@@ -0,0 +1,11 @@
env "local" {
src = "file://schema.sql"
url = "mysql://root:mysql123@localhost:3306/kami"
dev = "mysql://root:mysql123@localhost:3306/atlas_dev"
}
env "prod" {
src = "file://schema.sql"
url = getenv("DB_URL")
dev = "mysql://root:mysql123@localhost:3306/atlas_dev"
}

10
docker-compose.yml Normal file
View File

@@ -0,0 +1,10 @@
version: "3.8"
services:
# 数据库迁移服务
db-migrate:
build: .
environment:
# 从环境变量读取数据库连接信息
DB_URL: "mysql://${DB_USER}:${DB_PASSWORD}@${DB_HOST}:${DB_PORT}/${DB_NAME}"
restart: "no"

12
generate-migration.sh Executable file
View File

@@ -0,0 +1,12 @@
#!/bin/bash
set -e
echo "从本地数据库导出 schema.sql..."
atlas schema inspect \
--env local \
--format '{{ sql . }}' > schema.sql
echo "schema.sql 生成完成!"
wc -l schema.sql

16
migrate.sh Executable file
View File

@@ -0,0 +1,16 @@
#!/bin/bash
set -e
echo "开始数据库迁移..."
if [ -z "$DB_URL" ]; then
echo "错误: DB_URL 环境变量未设置"
exit 1
fi
atlas schema apply \
--env prod \
--auto-approve
echo "迁移完成!"

1561
schema.sql Normal file

File diff suppressed because it is too large Load Diff

44
test-local.sh Executable file
View File

@@ -0,0 +1,44 @@
#!/bin/bash
set -e
# 加载配置
if [ -f .env.local ]; then
export $(cat .env.local | grep -v '^#' | xargs)
fi
echo "========================================="
echo "本地测试数据库迁移"
echo "使用容器: $MYSQL_CONTAINER"
echo "========================================="
# 1. 创建 atlas_dev 数据库
echo ""
echo "步骤 1: 创建 atlas_dev 数据库"
docker exec $MYSQL_CONTAINER mysql -uroot -pmysql123 -e "CREATE DATABASE IF NOT EXISTS atlas_dev;"
# 2. 生成 schema.sql
echo ""
echo "步骤 2: 生成 schema.sql"
./generate-migration.sh
# 3. 创建测试数据库
echo ""
echo "步骤 3: 创建测试数据库"
docker exec $MYSQL_CONTAINER mysql -uroot -pmysql123 -e "DROP DATABASE IF EXISTS kami_test; CREATE DATABASE kami_test;"
# 4. 测试迁移
echo ""
echo "步骤 4: 测试迁移到 kami_test"
export DB_URL="mysql://root:mysql123@localhost:3306/kami_test"
atlas schema apply --env prod --auto-approve
# 5. 验证结果
echo ""
echo "步骤 5: 验证迁移结果"
docker exec $MYSQL_CONTAINER mysql -uroot -pmysql123 kami_test -e "SHOW TABLES;"
echo ""
echo "========================================="
echo "测试完成!"
echo "========================================="