feat: 替换 GitLab 为 Gitea + Act Runner

- 删除 .gitlab-ci.yml
- 新增 .gitea/workflows/deploy.yml (Gitea Actions 工作流)
- 新增 deploy/docker/docker-compose.gitea.yml (Gitea + Act Runner)
- 更新 scripts/setup-server.sh 初始化脚本
- 更新 deploy/README.md 部署文档
- 更新 Makefile 新增 gitea-* 命令
- 更新 .env.example 新增 GITEA_RUNNER_TOKEN

Gitea 内存占用约 100MB,适合 4GB 小内存服务器

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-06-01 20:01:52 +08:00
parent bcf16fe53d
commit 501adf7819
7 changed files with 236 additions and 206 deletions
+98
View File
@@ -0,0 +1,98 @@
name: Deploy
on:
push:
branches:
- prod
- test
env:
NODE_ENV: production
jobs:
install:
runs-on: [self-hosted, rent-deploy]
steps:
- uses: actions/checkout@v4
- name: Install dependencies
run: |
npm install -g pnpm
pnpm config set store-dir .pnpm-store
pnpm install --frozen-lockfile
- name: Cache pnpm store
uses: actions/cache@v4
with:
path: .pnpm-store
key: pnpm-${{ hashFiles('pnpm-lock.yaml') }}
build:
runs-on: [self-hosted, rent-deploy]
needs: install
steps:
- uses: actions/checkout@v4
- name: Restore pnpm cache
uses: actions/cache@v4
with:
path: .pnpm-store
key: pnpm-${{ hashFiles('pnpm-lock.yaml') }}
- name: Build shared packages
run: |
npm install -g pnpm
pnpm config set store-dir .pnpm-store
pnpm install --frozen-lockfile
pnpm --filter @rent/shared-types build
pnpm --filter @rent/shared-utils build
- name: Build server
run: pnpm --filter @rent/server build
- name: Build merchant-admin
run: pnpm --filter @rent/merchant-admin build
- name: Build platform-admin
run: pnpm --filter @rent/platform-admin build
- name: Build website
run: pnpm --filter @rent/official-website build
deploy-production:
runs-on: [self-hosted, rent-deploy]
needs: build
if: github.ref == 'refs/heads/prod'
steps:
- uses: actions/checkout@v4
- name: Deploy to production
run: |
echo "部署到生产环境..."
cd deploy/docker
docker-compose -f docker-compose.prod.yml down --remove-orphans
docker-compose -f docker-compose.prod.yml build --parallel
docker-compose -f docker-compose.prod.yml up -d
docker image prune -f
echo "等待服务启动..."
sleep 10
docker-compose -f docker-compose.prod.yml ps
deploy-test:
runs-on: [self-hosted, rent-deploy]
needs: build
if: github.ref == 'refs/heads/test'
steps:
- uses: actions/checkout@v4
- name: Deploy to test
run: |
echo "部署到测试环境..."
cd deploy/docker
docker-compose -f docker-compose.test.yml down --remove-orphans
docker-compose -f docker-compose.test.yml build --parallel
docker-compose -f docker-compose.test.yml up -d
docker image prune -f
echo "等待服务启动..."
sleep 10
docker-compose -f docker-compose.test.yml ps
-151
View File
@@ -1,151 +0,0 @@
stages:
- install
- build
- deploy
variables:
NODE_ENV: production
# prod 和 test 分支触发
workflow:
rules:
- if: $CI_PIPELINE_SOURCE == "merge_request_event"
when: never
- if: $CI_COMMIT_BRANCH == "prod"
- if: $CI_COMMIT_BRANCH == "test"
# pnpm store 缓存
cache:
key:
files:
- pnpm-lock.yaml
paths:
- .pnpm-store
# ==================== INSTALL ====================
install_dependencies:
stage: install
tags:
- rent-deploy
script:
- npm install -g pnpm
- pnpm config set store-dir .pnpm-store
- pnpm install --frozen-lockfile
artifacts:
paths:
- node_modules/
- apps/*/node_modules/
- packages/*/node_modules/
expire_in: 1 hour
# ==================== BUILD ====================
build_server:
stage: build
tags:
- rent-deploy
needs: [install_dependencies]
script:
- npm install -g pnpm
- pnpm config set store-dir .pnpm-store
- pnpm --filter @rent/shared-types build
- pnpm --filter @rent/shared-utils build
- pnpm --filter @rent/server build
artifacts:
paths:
- apps/server/dist/
expire_in: 1 hour
build_merchant:
stage: build
tags:
- rent-deploy
needs: [install_dependencies]
script:
- npm install -g pnpm
- pnpm config set store-dir .pnpm-store
- pnpm --filter @rent/shared-types build
- pnpm --filter @rent/shared-utils build
- pnpm --filter @rent/merchant-admin build
artifacts:
paths:
- apps/merchant-admin/dist/
expire_in: 1 hour
build_platform:
stage: build
tags:
- rent-deploy
needs: [install_dependencies]
script:
- npm install -g pnpm
- pnpm config set store-dir .pnpm-store
- pnpm --filter @rent/shared-types build
- pnpm --filter @rent/shared-utils build
- pnpm --filter @rent/platform-admin build
artifacts:
paths:
- apps/platform-admin/dist/
expire_in: 1 hour
build_website:
stage: build
tags:
- rent-deploy
needs: [install_dependencies]
script:
- npm install -g pnpm
- pnpm config set store-dir .pnpm-store
- pnpm --filter @rent/official-website build
artifacts:
paths:
- apps/official-website/out/
expire_in: 1 hour
# ==================== DEPLOY ====================
deploy_production:
stage: deploy
tags:
- rent-deploy
needs:
- build_server
- build_merchant
- build_platform
- build_website
script:
- echo "部署到生产环境..."
- cd deploy/docker
- docker-compose -f docker-compose.prod.yml down --remove-orphans
- docker-compose -f docker-compose.prod.yml build --parallel
- docker-compose -f docker-compose.prod.yml up -d
- docker image prune -f
- echo "等待服务启动..."
- sleep 10
- docker-compose -f docker-compose.prod.yml ps
environment:
name: production
rules:
- if: $CI_COMMIT_BRANCH == "prod"
deploy_test:
stage: deploy
tags:
- rent-deploy
needs:
- build_server
- build_merchant
- build_platform
- build_website
script:
- echo "部署到测试环境..."
- cd deploy/docker
- docker-compose -f docker-compose.test.yml down --remove-orphans
- docker-compose -f docker-compose.test.yml build --parallel
- docker-compose -f docker-compose.test.yml up -d
- docker image prune -f
- echo "等待服务启动..."
- sleep 10
- docker-compose -f docker-compose.test.yml ps
environment:
name: test
rules:
- if: $CI_COMMIT_BRANCH == "test"
+13
View File
@@ -2,11 +2,13 @@
prod-build prod-up prod-down prod-restart prod-logs prod-logs-server prod-ps prod-deploy \
test-build test-up test-down test-restart test-logs test-logs-server test-ps test-deploy \
gateway-up gateway-down gateway-reload \
gitea-up gitea-down gitea-logs \
init deploy clean
DOCKER_PROD = docker-compose -f deploy/docker/docker-compose.prod.yml
DOCKER_TEST = docker-compose -f deploy/docker/docker-compose.test.yml
DOCKER_GATEWAY = docker-compose -f deploy/docker/docker-compose.gateway.yml
DOCKER_GITEA = docker-compose -f deploy/docker/docker-compose.gitea.yml
help: ## 显示帮助信息
@grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | sort | \
@@ -97,4 +99,15 @@ clean: ## 清理所有容器、数据卷和悬空镜像
$(DOCKER_PROD) down -v
$(DOCKER_TEST) down -v
$(DOCKER_GATEWAY) down
$(DOCKER_GITEA) down
docker image prune -f
# ===== Gitea =====
gitea-up: ## 启动 Gitea + Act Runner
$(DOCKER_GITEA) up -d
gitea-down: ## 停止 Gitea + Act Runner
$(DOCKER_GITEA) down
gitea-logs: ## 查看 Gitea 日志
$(DOCKER_GITEA) logs -f --tail=100
+40 -34
View File
@@ -107,66 +107,72 @@ make test-deploy
---
## 二、GitLab CI/CD 自动化
## 二、Gitea + Act Runner 自动化
> Gitea 内存占用约 100MB,适合 4GB 小内存服务器。
### 前提条件
- 服务器已运行初始化脚本
- 代码已推送到 GitLab 仓库
- 服务器已运行初始化脚本Gitea 和 Act Runner 已自动启动)
- Gitea 已完成初始配置
### 第 1 步:安装 GitLab Runner
### 第 1 步:配置 Gitea
首次初始化已自动启动 Gitea,访问 `http://服务器IP:3002` 完成:
1. 设置管理员账号密码
2. 创建仓库 `rent-platform`
### 第 2 步:注册 Act Runner
1. Gitea → **Settings → Actions → Runners → Create new Runner**
2. 复制 Registration Token
3. 编辑 `.env` 填入 token
```bash
curl -L https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.deb.sh | sudo bash
sudo apt install gitlab-runner
vi deploy/docker/.env
# 将 GITEA_RUNNER_TOKEN=change_me 改为真实 token
```
### 第 2 步:注册 Runner
1. GitLab → **Settings → CI/CD → Runners** → 复制 token
2. 在服务器执行:
4. 重启 Runner
```bash
sudo gitlab-runner register
docker compose -f deploy/docker/docker-compose.gitea.yml restart act-runner
```
| 项目 | 值 |
|------|------|
| GitLab URL | `http://你的GitLab地址/` |
| Token | 从页面复制 |
| Description | `rent-deploy-runner` |
| Tags | `rent-deploy` |
| Executor | `shell` |
### 第 3 步:配置 Runner 权限
5. 验证 Runner 状态:
```bash
sudo usermod -aG docker gitlab-runner
sudo -u gitlab-runner npm install -g pnpm
docker logs rent-act-runner
```
### 第 4 步:配置 CI/CD 变量
在 Gitea → **Settings → Actions → Runners** 页面应能看到 `rent-deploy-runner` 已注册并在线。
GitLab → **Settings → CI/CD → Variables**
### 第 3 步:推送代码到 Gitea
| 变量名 | 说明 | Masked |
|--------|------|--------|
| `PROD_DB_PASSWORD` | 生产数据库密码 | ✅ |
| `PROD_JWT_SECRET` | 生产 JWT 密钥 | ✅ |
| `TEST_DB_PASSWORD` | 测试数据库密码 | ✅ |
| `TEST_JWT_SECRET` | 测试 JWT 密钥 | ✅ |
```bash
# 添加 Gitea 远程仓库
git remote add gitea http://服务器IP:3002/用户名/rent-platform.git
### 第 5 步:推送代码触发部署
# 推送分支
git push gitea master
git push gitea test
git push gitea prod
```
### 第 4 步:自动部署触发
```bash
# 推送 test 分支 → 自动部署测试环境
git push origin test
git push gitea test
# 推送 prod 分支 → 自动部署生产环境
git push origin prod
git push gitea prod
```
流水线:install → build(并行构建 4 个应用)→ deploy
流水线:install → build → deploy
在 Gitea → **仓库 → Actions** 页面查看实时日志。
---
+3
View File
@@ -5,3 +5,6 @@ PROD_JWT_SECRET=change_me_in_production
# ===== 测试环境 =====
TEST_DB_PASSWORD=change_me_in_test
TEST_JWT_SECRET=change_me_in_test
# ===== Gitea Act Runner =====
GITEA_RUNNER_TOKEN=change_me
+49
View File
@@ -0,0 +1,49 @@
version: '3.8'
services:
gitea:
image: gitea/gitea:latest
container_name: rent-gitea
restart: always
environment:
- USER_UID=1000
- USER_GID=1000
- GITEA__server__ROOT_URL=http://localhost:3002/
- GITEA__server__HTTP_PORT=3000
- GITEA__server__SSH_PORT=2222
- GITEA__server__SSH_LISTEN_PORT=2222
ports:
- "3002:3000"
- "2222:2222"
volumes:
- gitea_data:/data
- /etc/timezone:/etc/timezone:ro
- /etc/localtime:/etc/localtime:ro
networks:
- gitea
act-runner:
image: gitea/act_runner:latest
container_name: rent-act-runner
restart: always
depends_on:
- gitea
environment:
- GITEA_INSTANCE_URL=http://gitea:3000
# 注册后在 Gitea Web 界面获取 token,填入下面配置
- GITEA_RUNNER_REGISTRATION_TOKEN=${GITEA_RUNNER_TOKEN:-change_me}
- GITEA_RUNNER_NAME=rent-deploy-runner
- GITEA_RUNNER_LABELS=rent-deploy:docker://node:18-alpine
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- act_runner_data:/data
networks:
- gitea
volumes:
gitea_data:
act_runner_data:
networks:
gitea:
name: gitea
+33 -21
View File
@@ -6,6 +6,9 @@ echo " 品居会 - 服务器首次初始化"
echo "============================================"
echo ""
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
PROJECT_DIR="$(dirname "$SCRIPT_DIR")"
# ===== 1. 系统更新 =====
echo ">>> 更新系统包..."
sudo apt update && sudo apt upgrade -y
@@ -45,8 +48,6 @@ else
fi
# ===== 6. 配置环境变量 =====
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
PROJECT_DIR="$(dirname "$SCRIPT_DIR")"
ENV_FILE="$PROJECT_DIR/deploy/docker/.env"
if [ ! -f "$ENV_FILE" ]; then
@@ -72,9 +73,17 @@ echo ">>> 创建 Docker 网络..."
docker network create rent-prod 2>/dev/null || echo " rent-prod 网络已存在。"
docker network create rent-test 2>/dev/null || echo " rent-test 网络已存在。"
# ===== 8. 启动网关 =====
echo ">>> 启动 Gateway Nginx..."
# ===== 8. 启动 Gitea =====
echo ">>> 启动 Gitea + Act Runner..."
cd "$PROJECT_DIR"
docker compose -f deploy/docker/docker-compose.gitea.yml up -d
echo ""
echo " 等待 Gitea 启动(约 30 秒)..."
sleep 30
# ===== 9. 启动 Gateway =====
echo ">>> 启动 Gateway Nginx..."
docker compose -f deploy/docker/docker-compose.gateway.yml up -d
echo ""
@@ -83,25 +92,28 @@ echo " 初始化完成!"
echo "============================================"
echo ""
echo "后续步骤:"
echo " 1. 确认 .env 中的密码已正确填写"
echo " 2. 部署生产环境:make prod-deploy"
echo " 3. 部署测试环境:make test-deploy"
echo ""
echo " 配置以下 DNS 记录指向本服务器 IP"
echo " 1. 配置 Gitea"
echo " 访问 http://服务器IP:3002 完成初始设置"
echo " 创建管理员账号,创建仓库"
echo ""
echo " 生产环境"
echo " api.pinzhuhui.com"
echo " www.pinzhuhui.com"
echo " merchant.pinzhuhui.com"
echo " platform-admin.pinzhuhui.com"
echo " 2. 注册 Act Runner"
echo " Gitea → Settings → Actions → Runners → Create Runner"
echo " 复制 Registration Token"
echo " 编辑 $PROJECT_DIR/deploy/docker/.env"
echo " 将 GITEA_RUNNER_TOKEN 替换为真实 token"
echo " 然后重启:docker compose -f deploy/docker/docker-compose.gitea.yml restart act-runner"
echo ""
echo " 测试环境"
echo " api-test.pinzhuhui.com"
echo " test.pinzhuhui.com"
echo " merchant-test.pinzhuhui.com"
echo " platform-admin-test.pinzhuhui.com"
echo " 3. 推送代码到 Gitea"
echo " git remote add gitea http://服务器IP:3002/用户名/rent-platform.git"
echo " git push gitea master"
echo " git push gitea test"
echo ""
echo " 4. (可选)配置 SSL 证书"
echo " sudo apt install certbot"
echo " sudo certbot certonly --standalone -d api.pinzhuhui.com -d www.pinzhuhui.com ..."
echo " 4. 部署服务"
echo " make prod-deploy # 生产环境"
echo " make test-deploy # 测试环境"
echo ""
echo " 5. 配置 DNS 记录指向本服务器 IP:"
echo " 生产:api/www/merchant/platform-admin.pinzhuhui.com"
echo " 测试:api-test/test/merchant-test/platform-admin-test.pinzhuhui.com"
echo ""