# 快速部署

项目提供多种基础镜像，默认版本基于 Debian 12，集成了 Python 3.13 与 Node.js 23。

## 基础镜像选择

| 标签 (Tag) | 基础镜像 | 说明 |
| :--- | :--- | :--- |
| `latest` | Debian 12 | **默认推荐**：集成 Python 3.13 与 Node.js 23，开箱即用 |
| `latest-debian13` | Debian 13 | 尝鲜版本，基于 Debian Trixie |
| `latest-minimal` | Debian 13 | **最小化版**：不预置任何语言环境，仅内置 Mise，适合追求极致纯净的用户 |

> **提示**：目前默认使用 `latest` 标签。如需切换环境，只需将镜像名后的 `latest` 替换为 `latest-minimal`（极致纯净）或 `latest-debian13` 即可。

## 环境版本重构说明 (2026.02.13+)

> **警告**：架构升级破坏性变更
> 
> 本版本（2026.02.13+）对底层运行时环境进行了彻底重构，弃用了原有的静态 Python/Node 环境，转为使用 **Mise** 进行动态版本管理。
> 
> 1. **不再提供 Alpine 镜像**：由于 glibc 兼容性问题，Mise 无法在 Alpine 上完美运行，因此暂时取消 Alpine 镜像支持。
> 2. **环境数据不兼容**：如果您是从旧版本升级上来，原有的 Python/Node 环境数据将无法迁移。您需要清空挂载的 `envs/` 目录并让其由新容器自动初始化。

---

## 方式一：Docker 运行 (环境变量配置)

通过环境变量指定配置，简单灵活，适合一般部署。

### SQLite (默认)
```bash
docker run -d \
  --name taskpool \
  -p 8052:8052 \
  -v $(pwd)/data:/app/data \
  -v $(pwd)/envs:/app/envs \
  -e TZ=Asia/Shanghai \
  -e BH_SERVER_PORT=8052 \
  -e BH_SERVER_HOST=0.0.0.0 \
  -e BH_DB_TYPE=sqlite \
  -e BH_DB_PATH=/app/data/taskpool.db \
  -e BH_DB_TABLE_PREFIX=taskpool_ \
  --restart unless-stopped \
  ghcr.io/engigu/taskpool:latest
```

### MySQL
```bash
docker run -d \
  --name taskpool \
  -p 8052:8052 \
  -v $(pwd)/data:/app/data \
  -v $(pwd)/envs:/app/envs \
  -e TZ=Asia/Shanghai \
  -e BH_SERVER_PORT=8052 \
  -e BH_SERVER_HOST=0.0.0.0 \
  -e BH_DB_TYPE=mysql \
  -e BH_DB_HOST=mysql-server \
  -e BH_DB_PORT=3306 \
  -e BH_DB_USER=root \
  -e BH_DB_PASSWORD=your_password \
  -e BH_DB_NAME=taskpool \
  -e BH_DB_TABLE_PREFIX=taskpool_ \
  --restart unless-stopped \
  ghcr.io/engigu/taskpool:latest
```

---

## 方式二：Docker Compose 部署

推荐的生产环境部署方式。

### 核心部署模板
```yaml
services:
  taskpool:
    image: ghcr.io/engigu/taskpool:latest
    container_name: taskpool
    ports:
      - "8052:8052"
    volumes:
      - ./data:/app/data
      - ./envs:/app/envs
    environment:
      - TZ=Asia/Shanghai
      - BH_SERVER_PORT=8052
      - BH_SERVER_HOST=0.0.0.0
      - BH_DB_TYPE=sqlite
      - BH_DB_PATH=/app/data/taskpool.db
      - BH_DB_TABLE_PREFIX=taskpool_
      # - BH_SERVER_URL_PREFIX=/taskpool  # 可选：配置 URL 前缀用于反向代理
    logging:
      driver: json-file
      options:
        max-size: "10m"
        max-file: "3"
    restart: unless-stopped
```

---

## 方式三：配置文件挂载模式

通过挂载 `/app/configs/config.ini` 来管理详细配置。

### 配置文件挂载示例
```yaml
volumes:
  - ./data:/app/data
  - ./configs:/app/configs
  - ./envs:/app/envs
```
---

## Docker 启动流程

容器启动时 `docker-entrypoint.sh` 会自动执行以下关键步骤：

1. **环境自检**：检查 `/app/data`、`/app/configs`、`/app/envs` 挂载点并创建必要子目录。
2. **Mise 同步**：自动将镜像内置的 Mise 核心运行时激活文件同步到持久化挂载目录中，确保容器重启后环境依然可用。
3. **运行时激活**：动态注入环境变量，将 `mise shims` 路径加入系统 `PATH`。
4. **包管理预设**：自动为 Python 配置清华源 (PIP) 镜像，配置 Node.js 内存限制。
5. **主进程启动**：运行 `taskpool server` 开启面板。

> **提示**：通过持久化挂载 `./envs` 目录，您安装的所有运行时版本和第三方依赖库均会永久保留。

---

## 自动更新 Docker 镜像

如果您希望taskpool能够自动拉取最新镜像并无感更新，推荐使用 **Watchtower**。Watchtower 会定期检查被监控容器的基础镜像，当发现有新版本推送时，它会自动拉取新镜像、使用与原容器完全相同的配置重启容器。

由于taskpool采用持久化挂载（数据和环境都在外部），因此自动更新不会造成任何数据丢失。

### 方式一：独立一行命令运行 Watchtower（推荐）

执行以下命令，Watchtower 将会自动在每天凌晨 3 点自动检查并更新名为 `taskpool` 的容器：

```bash
docker run -d \
  --name watchtower \
  -v /var/run/docker.sock:/var/run/docker.sock \
  -e TZ=Asia/Shanghai \
  -e WATCHTOWER_SCHEDULE="0 0 3 * * *" \
  -e WATCHTOWER_CLEANUP=true \
  --restart unless-stopped \
  containrrr/watchtower \
  taskpool
```

> **参数说明**：
> - 结尾处的 `taskpool` 为指定仅监控更新名为 `taskpool` 的容器。若不加此参数，则会自动更新宿主机上所有的 Docker 容器。
> - `WATCHTOWER_CLEANUP=true`：更新成功后自动删除旧版本的废弃镜像，防止存储空间被占满。
> - `WATCHTOWER_SCHEDULE`：设置定时检查的 Cron 表达式（秒 分 时 日 月 周）。

### 方式二：集成到 Docker Compose 中

您可以直接将 Watchtower 作为附加服务加入现有的 `docker-compose.yml` 中：

```yaml
services:
  taskpool:
    image: ghcr.io/engigu/taskpool:latest
    container_name: taskpool
    # ... 省略端口、挂载等其他配置 ...
    
  watchtower:
    image: containrrr/watchtower
    container_name: watchtower
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    environment:
      - TZ=Asia/Shanghai
      - WATCHTOWER_CLEANUP=true
      - WATCHTOWER_SCHEDULE="0 0 3 * * *"
    command: taskpool
    restart: unless-stopped
```

修改完成后，执行 `docker compose up -d` 生效即可。
