Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 10 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -25,4 +25,13 @@ config.json
pnpm-lock.yaml
test/*
migrations/
errordump*
errordump*

# AI
.claude/
.gemini/
.codex/
.cursor/

# Docs
Docs/
101 changes: 42 additions & 59 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -1,81 +1,64 @@
# --- 基础阶段 (Base Stage) ---
# 定义一个基础阶段,包含通用的Node.js环境。
# 使用Alpine版本来保持镜像小巧。node:20-alpine是一个很好的现代选择。
# 确保这个基础镜像支持您需要的所有架构(官方镜像都支持)。
FROM node:20-alpine AS base
# ============================================
# AntiHub Plugin - Docker Image
# ============================================
# 这是一个纯 JavaScript 项目,无需构建步骤
# 使用多阶段构建优化镜像大小
# ============================================

# 设置工作目录
WORKDIR /usr/src/app
# ----- 阶段 1: 依赖安装 -----
FROM node:20-alpine AS deps

WORKDIR /app

# --- 依赖阶段 (Dependencies Stage) ---
# 这个阶段专门用于安装生产环境的依赖。
FROM base AS dependencies

# 复制 package.json 和 package-lock.json (或 yarn.lock, pnpm-lock.yaml)
# 这样做可以充分利用Docker的层缓存。只要这些文件不改变,就不需要重新安装依赖。
# 先复制锁文件,利用 Docker 层缓存
COPY package.json package-lock.json* ./

# 安装生产环境依赖。
# 使用 'npm ci' 是最佳实践,它比 'npm install' 更快、更可靠,因为它严格按照 lock 文件安装。
# '--only=production' 确保不安装devDependencies。
# 只安装生产环境依赖
RUN npm ci --only=production

# 安装 PostgreSQL 客户端(用于自动初始化数据库)
RUN apk add --no-cache postgresql-client

# --- 构建阶段 (Build Stage) ---
# 如果您的项目需要构建步骤(例如TypeScript编译、前端资源打包),则使用此阶段。
# 如果您的项目是纯JavaScript,可以直接跳过此阶段。
FROM base AS build

# 复制依赖定义文件
COPY package.json package-lock.json* ./

# 安装所有依赖,包括devDependencies,因为构建过程可能需要它们。
RUN npm install

# 复制项目的其余所有文件
COPY . .
# ----- 阶段 2: 生产镜像 -----
FROM node:20-alpine AS production

# 执行构建命令。构建产物通常会输出到 'dist' 目录。
# 请根据您的 package.json 中的脚本修改 'npm run build'。
RUN npm run build
# 安装 PostgreSQL 客户端(用于自动初始化数据库)
RUN apk add --no-cache postgresql-client

# 设置环境变量
ENV NODE_ENV=production
ENV PORT=8045

# --- 生产/运行阶段 (Production/Runtime Stage) ---
# 这是最终的镜像,它将非常轻量。
FROM base AS production
# 创建非 root 用户运行应用(安全最佳实践)
RUN addgroup -S appgroup && adduser -S appuser -G appgroup

# 设置环境变量,表明这是生产环境
ENV NODE_ENV=production
WORKDIR /app

# 从“依赖阶段”复制生产环境的 node_modules
COPY --from=dependencies /usr/src/app/node_modules ./node_modules
# 从依赖阶段复制 node_modules
COPY --from=deps /app/node_modules ./node_modules

# 从“构建阶段”复制构建好的应用代码。
# 如果您的项目有构建步骤,请使用这行,并将 'dist' 替换为您的构建输出目录。
COPY --from=build /usr/src/app/dist ./dist
# 复制应用源码
COPY package.json ./
COPY src ./src
COPY schema.sql ./
COPY scripts ./scripts

# 如果您的项目没有构建步骤(纯JS),请从 'build' 阶段复制源代码。
# 注意:上面的 'build' 阶段需要相应调整为只复制源码,或者直接从本地复制。
# 为了通用性,我们假设有构建步骤。如果没构建步骤,可以这样写:
# COPY --from=build /usr/src/app/src ./src
# COPY --from=build /usr/src/app/package.json .
# 创建 config.json 模板(运行时需要替换)
# 默认配置为空,用户需要通过环境变量或挂载配置文件
ENV CONFIG_TEMPLATE='{"server":{"port":8045,"host":"0.0.0.0"},"database":{"host":"${DB_HOST}","port":5432,"database":"${DB_NAME}","user":"${DB_USER}","password":"${DB_PASSWORD}"},"redis":{"host":"${REDIS_HOST}","port":6379,"password":"${REDIS_PASSWORD}"},"oauth":{"callbackUrl":"${OAUTH_CALLBACK_URL}"},"security":{"adminApiKey":"${ADMIN_API_KEY}"}}'

# 创建一个非root用户来运行应用,以增强安全性。
RUN addgroup -S appgroup && adduser -S appuser -G appgroup
# 复制入口脚本并添加执行权限
COPY entrypoint.sh /entrypoint.sh
RUN chmod +x /entrypoint.sh

# 将工作目录的所有权交给新用户
# 如果您复制了 'dist' 和 'node_modules'
RUN chown -R appuser:appgroup /usr/src/app/dist /usr/src/app/node_modules
# 如果您没有构建步骤,而是复制了'src'
# RUN chown -R appuser:appgroup /usr/src/app/src /usr/src/app/node_modules
# 修改文件所有者
RUN chown -R appuser:appgroup /app

# 切换到这个非root用户
# 切换到非 root 用户
USER appuser

# 暴露您的应用程序正在监听的端口。请务必修改为您的实际端口。
# 暴露端口
EXPOSE 8045

# 定义容器启动时执行的命令。
# 请将 'dist/main.js' 替换为您的应用入口文件。
CMD [ "node", "dist/main.js" ]
# 启动命令(使用 entrypoint 脚本生成配置)
ENTRYPOINT ["/entrypoint.sh"]
79 changes: 79 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -362,6 +362,85 @@ node scripts/quota-recovery-cron.js
- 自动负载均衡和故障转移
- 建议根据使用量调整数据库连接池大小

## 🐳 Docker 部署

### 使用 Docker Compose(推荐)

```bash
# 1. 复制环境变量模板
cp env.example .env

# 2. 修改环境变量配置
vim .env

# 3. 启动服务(PostgreSQL 会自动启动,Redis 连接外部实例)
docker-compose up -d postgres app

# 4. 查看日志
docker-compose logs -f app
```

### 生产环境部署

生产环境建议使用现有的 PostgreSQL 和 Redis 实例:

```bash
# 1. 构建镜像
docker build -t anticloud-api .

# 2. 运行容器(连接现有的数据库和 Redis)
docker run -d \
--name anticloud-api \
-p 8045:8045 \
-e DB_HOST=your-postgres-host \
-e DB_PORT=5432 \
-e DB_NAME=antigv \
-e DB_USER=postgres \
-e DB_PASSWORD=your-password \
-e REDIS_HOST=your-redis-host \
-e REDIS_PORT=6379 \
-e REDIS_PASSWORD=your-redis-password \
-e OAUTH_CALLBACK_URL=https://your-domain.com/api/oauth/callback \
-e ADMIN_API_KEY=sk-admin-your-secret-key \
anticloud-api
```

### 环境变量说明

| 变量名 | 说明 | 默认值 |
|--------|------|--------|
| `PORT` | 服务端口 | 8045 |
| `DB_HOST` | PostgreSQL 主机 | - |
| `DB_PORT` | PostgreSQL 端口 | 5432 |
| `DB_NAME` | 数据库名称 | - |
| `DB_USER` | 数据库用户名 | - |
| `DB_PASSWORD` | 数据库密码 | - |
| `REDIS_HOST` | Redis 主机 | localhost |
| `REDIS_PORT` | Redis 端口 | 6379 |
| `REDIS_PASSWORD` | Redis 密码 | - |
| `OAUTH_CALLBACK_URL` | OAuth 回调地址 | - |
| `ADMIN_API_KEY` | 管理员 API Key | - |

### 多项目共用 Redis

本项目的 Redis 仅用于存储 Kiro OAuth 状态(临时数据,10分钟过期),可以安全地与前端、后端等其他项目共用同一个 Redis 实例。

每个项目使用不同的 key prefix,互不干扰:
- **AntiHub-plugin**: `kiro:oauth:state:*`
- 其他项目: 使用各自的 prefix

### 自定义配置文件

可以挂载自定义 `config.json` 配置文件:

```bash
docker run -d \
--name anticloud-api \
-p 8045:8045 \
-v ./config.json:/app/config.json:ro \
anticloud-api
```

## 📄 许可证

MIT License
Expand Down
Loading