# 部署指南

## 概述

构建产物（`platform/server/dist/`、`platform/client/dist/`）已纳入 Git。服务器只需 `git pull` 即可获取最新代码和构建产物，无需 scp 或打包。

## 本地：构建 + 推送

```bash
npm run build   # 构建 client + 编译 server
git add .
git commit -m "deploy: build"
git push
```

## 服务器首次部署

```bash
# 1. Clone 代码
git clone <repo-url> playableads-platform
cd playableads-platform

# 2. 安装依赖
npm run install:all

# 3. 创建日志目录
mkdir -p logs

# 4. 启动（PM2）
pm2 start ecosystem.config.js
pm2 save
pm2 startup   # 开机自启（按提示执行输出的命令）
```

## 服务器更新

```bash
cd playableads-platform
git pull
# 如果 package.json 有变动：
npm run install:all
# 重启
pm2 restart playableads-platform
```

## 自动化部署（Git Hook，可选）

在服务器上配置 post-receive hook，`git push` 后自动触发更新：

```bash
# 服务器上
cd playableads-platform

cat > .git/hooks/post-receive << 'EOF'
#!/bin/bash
unset GIT_DIR
cd /path/to/playableads-platform
git pull origin master
# 只在 package 有变动时安装
if git diff-tree -r --name-only --no-commit-id ORIG_HEAD HEAD | grep -q "package.json"; then
  npm run install:all
fi
pm2 restart playableads-platform
EOF

chmod +x .git/hooks/post-receive
```

## 生产启动

```bash
# 本地验证
npm run build && node platform/server/dist/index.js

# 服务器（PM2）
pm2 start ecosystem.config.js
pm2 logs playableads-platform
```

## PM2 常用命令

```bash
pm2 list                    # 查看所有进程
pm2 logs playableads-platform  # 查看日志
pm2 restart playableads-platform  # 重启
pm2 stop playableads-platform     # 停止
pm2 monit                   # 实时监控 CPU/内存
pm2 save                    # 保存当前进程列表（重启后恢复）
pm2 startup                 # 设置开机自启
```

## Docker 部署（备选）

```bash
npm run docker:build   # 构建镜像
npm run docker:run     # 启动容器（:3001，storage 挂载）

# ECS
docker save playableads-platform | gzip > playableads-platform.tar.gz
scp playableads-platform.tar.gz ecs:~/
ssh ecs
docker load < playableads-platform.tar.gz
mkdir -p ~/playableads-storage
docker run -d -p 3001:3001 \
  -v ~/playableads-storage:/app/storage \
  --restart unless-stopped \
  --name playableads playableads-platform
```

## 环境变量

| 变量 | 默认值 | 说明 |
|------|--------|------|
| `PORT` | `3001` | 服务端口 |
| `NODE_ENV` | `production` | pm2 中通过 ecosystem.config.js 设置 |

## 运行时目录结构

```
playableads-platform/
├── platform/server/dist/   ← 编译产物（git 跟踪）
├── platform/client/dist/   ← 前端构建（git 跟踪）
├── storage/                ← 运行时数据（gitignore）
│   ├── data.db
│   └── creatives/
└── logs/                   ← PM2 日志
```
