# =====================================================================
# shell-gen - Linux 一键部署脚本生成器 (Flask Web 应用)
#
# 零 pip 依赖设计：除了 Flask，仅使用 Python 标准库。
# 通过 PORT 环境变量控制监听端口（默认 5099）。
#
# 构建：
#   docker build -t shell-gen .
#
# 运行：
#   docker run -d --name shell-gen -p 5099:5099 \
#     -e PORT=5099 \
#     -e SHELLGEN_SECRET='change-me' \
#     shell-gen
#
# 验证：
#   curl http://localhost:5099/healthz
#   # -> {"ok":true,"generators":50}
# =====================================================================

# ---------- 基础镜像 ----------
# slim 版足够（项目只用 Flask + 标准库，无需编译工具）
FROM python:3.11-slim

# ---------- 元信息 ----------
LABEL org.opencontainers.image.title="shell-gen" \
      org.opencontainers.image.description="Linux 一键部署脚本生成器 (Flask)" \
      org.opencontainers.image.licenses="MIT"

# 环境变量：缓冲输出便于 docker logs 实时查看
ENV PYTHONUNBUFFERED=1 \
    PYTHONDONTWRITEBYTECODE=1 \
    PORT=5099 \
    PIP_NO_CACHE_DIR=1

# ---------- 工作目录 ----------
WORKDIR /app

# ---------- 安装依赖 ----------
# 唯一第三方依赖是 Flask；先复制 requirements 以利用层缓存
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

# ---------- 复制应用代码 ----------
COPY app.py              /app/app.py
COPY generators/         /app/generators/
COPY templates/          /app/templates/
COPY static/             /app/static/
COPY README.md           /app/README.md
COPY start.sh            /app/start.sh

# ---------- 非 root 运行 ----------
# 创建专有运行用户，降低容器内权限风险
RUN useradd --create-home --uid 10001 appuser \
    && mkdir -p /app/instance && chown -R appuser:appuser /app
USER appuser

# ---------- 端口 & 健康检查 ----------
EXPOSE 5099
# 依赖 /healthz 路由做容器健康探针（无需额外工具）
HEALTHCHECK --interval=30s --timeout=5s --start-period=10s --retries=3 \
    CMD python -c "import urllib.request,sys; sys.exit(0 if urllib.request.urlopen('http://127.0.0.1:'+__import__('os').environ.get('PORT','5099')+'/healthz',timeout=3).status==200 else 1)" || exit 1

# ---------- 启动 ----------
# 用 Flask 自带开发服务器（保持与项目 start.sh 一致的零依赖启动方式）
# 若要生产级并发，可改用 gunicorn：见下方注释
CMD ["python", "app.py"]

# ---------------- 生产并发方案（可选） ----------------
# 如果希望多 worker 并发处理，取消下面注释并将上面的 CMD 替换：
#
#   1) 在 requirements.txt 增加一行：gunicorn
#   2) 将 CMD 改为：
#   CMD ["gunicorn", "--bind", "0.0.0.0:5099", "--workers", "2", \
#        "--threads", "4", "--timeout", "60", "app:app"]
