适用:内网 / 家庭 / 小团队(≤50 并发),无 K8s 需求。
特性:单容器 + SQLite + 端口暴露,最小维护成本。
新增:
- deploy/nas/Dockerfile: python:3.11-slim 基础镜像 + 非 root + HEALTHCHECK
- deploy/nas/start.sh: flask db upgrade 幂等迁移 + gunicorn (2 workers × 4 threads)
- deploy/nas/docker-compose.yaml: 单服务 + 4 个命名卷 (db/logs/session/upload) + 资源限制
- docs/deployment-nas.md: 完整部署/备份/升级/排障指南
完善:
- .env.example: 改为生产环境导向 (PEAR_ENV=pro,SECRET_KEY 必填)
- .dockerignore: 排除 deploy/dev (开发用容器配置)、tests/截图、一次性脚本
- applications/view/public/__init__.py: 注释说明 /healthz 已在 applications/view/health.py 注册
复用现有:
- /healthz 接口 (applications/view/health.py) 含 DB 探活,DB 不可达返回 503
→ 容器 HEALTHCHECK 直接用 /healthz 即可
⚠️ 本机无 docker,未执行 docker build 验证;已静态校验 YAML/bash 语法、
文件路径、.env 字段消费、ProConfig 严格性、/healthz 端点可用性。
首次 NAS 上部署时跑一遍文档步骤即可。
54 lines
1.7 KiB
Docker
54 lines
1.7 KiB
Docker
# =====================================================
|
||
# Pear Admin Flask - 个人 NAS / 单机部署 Dockerfile
|
||
# =====================================================
|
||
# 适用场景:内网访问 / 少量并发 / 数据量小
|
||
# 基础:python:3.11-slim(~150 MB),无 MySQL,纯 SQLite
|
||
#
|
||
# 构建: docker build -f deploy/nas/Dockerfile -t pear-admin-nas .
|
||
# 运行: docker compose -f deploy/nas/docker-compose.yaml up -d
|
||
# =====================================================
|
||
|
||
FROM python:3.11-slim
|
||
|
||
# 容器内时区与 Python 输出
|
||
ENV TZ=Asia/Shanghai \
|
||
PYTHONUNBUFFERED=1 \
|
||
PIP_DISABLE_PIP_VERSION_CHECK=1 \
|
||
PIP_NO_CACHE_DIR=1 \
|
||
PEAR_ENV=pro \
|
||
FLASK_APP=app.py
|
||
|
||
# 安装时区数据 + 健康检查用的 curl
|
||
# (curl 在 slim 里已有,但保持显式声明便于以后切到 alpine)
|
||
RUN apt-get update \
|
||
&& apt-get install -y --no-install-recommends curl tzdata \
|
||
&& ln -snf /usr/share/zoneinfo/$TZ /etc/localtime \
|
||
&& echo $TZ > /etc/timezone \
|
||
&& rm -rf /var/lib/apt/lists/*
|
||
|
||
# 非 root 运行(生产最佳实践)
|
||
RUN useradd -m -u 1001 appuser
|
||
|
||
WORKDIR /app
|
||
|
||
# 先只 copy 依赖文件 → 利用 Docker 缓存;requirements 不变则跳过 pip install
|
||
COPY requirements.txt ./
|
||
RUN pip install -r requirements.txt \
|
||
&& pip install gunicorn==21.2.0
|
||
|
||
# 再 copy 全部源码
|
||
COPY --chown=appuser:appuser . .
|
||
|
||
# 启动脚本加执行权限
|
||
RUN chmod +x /app/deploy/nas/start.sh
|
||
|
||
# 切换到非 root
|
||
USER appuser
|
||
|
||
EXPOSE 5000
|
||
|
||
# 容器健康检查:访问 /healthz 接口(applications/view/health.py 提供,DB 不可达返回 503)
|
||
HEALTHCHECK --interval=30s --timeout=10s --start-period=40s --retries=3 \
|
||
CMD curl -fsS http://localhost:5000/healthz || exit 1
|
||
|
||
CMD ["/app/deploy/nas/start.sh"] |