Commit 0a7111f7 by 周田

feat: docker 部署

parent 907da208
*
!pyproject.toml
!uv.lock
!distribution-server/
distribution-server/*
!distribution-server/__init__.py
!distribution-server/app.py
!distribution-server/server.py
!distribution-server/settings.py
!distribution-server/api/
!distribution-server/core/
!distribution-server/frontend/
**/__pycache__/
**/*.py[cod]
FROM ghcr.io/astral-sh/uv:0.12.13 AS uv
FROM python:3.12-slim AS dependencies
COPY --from=uv /uv /usr/local/bin/uv
WORKDIR /app
COPY pyproject.toml uv.lock ./
RUN uv sync --locked --extra server --no-dev --no-install-project --no-cache
FROM python:3.12-slim
ENV PYTHONDONTWRITEBYTECODE=1 \
PYTHONUNBUFFERED=1
WORKDIR /app
COPY --from=dependencies /app/.venv /app/.venv
COPY distribution-server/ ./distribution-server/
RUN groupadd --system --gid 10001 distribution \
&& useradd --system --uid 10001 --gid distribution --no-create-home distribution \
&& mkdir -p /app/distribution-server/data \
&& chown distribution:distribution /app/distribution-server/data
USER distribution
EXPOSE 8000
HEALTHCHECK --interval=30s --timeout=5s --start-period=10s --retries=3 \
CMD ["/app/.venv/bin/python", "-c", "from urllib.request import urlopen; urlopen('http://127.0.0.1:8000/healthz', timeout=3).close()"]
CMD ["/app/.venv/bin/python", "-m", "distribution-server.server"]
...@@ -8,6 +8,14 @@ ...@@ -8,6 +8,14 @@
默认安装只包含 updater 运行依赖;管理 Web 的 FastAPI/Uvicorn 通过 `server` extra 启用,不会进入目标应用的基础安装。 默认安装只包含 updater 运行依赖;管理 Web 的 FastAPI/Uvicorn 通过 `server` extra 启用,不会进入目标应用的基础安装。
Docker Compose 部署分发服务(默认仅本机访问,数据保存在 Docker 命名卷):
```bash
docker compose up -d --build
```
局域网访问、安全限制及数据迁移说明见 [`distribution-server/README.md`](./distribution-server/README.md)。
## 启动 Web 与测试 ## 启动 Web 与测试
需要 Python 3.12 和 uv。从仓库根目录使用 `python -m` 启动,不需要先设置环境变量;uv 会根据根 `pyproject.toml` 自动准备服务器依赖: 需要 Python 3.12 和 uv。从仓库根目录使用 `python -m` 启动,不需要先设置环境变量;uv 会根据根 `pyproject.toml` 自动准备服务器依赖:
......
services:
distribution-server:
build:
context: .
dockerfile: Dockerfile
restart: unless-stopped
ports:
- "18000:18000"
volumes:
- distribution-data:/app/distribution-server/data
volumes:
distribution-data:
...@@ -25,6 +25,39 @@ distribution-server/ ...@@ -25,6 +25,39 @@ distribution-server/
管理页、下载页和静态资源要求浏览器在使用缓存前重新验证;更新前端后如仍看到旧页面,可重新加载页面。 管理页、下载页和静态资源要求浏览器在使用缓存前重新验证;更新前端后如仍看到旧页面,可重新加载页面。
## Docker Compose 部署
安装 Docker Engine 和 Docker Compose 后,在仓库根目录运行:
```bash
docker compose up -d --build
docker compose ps
docker compose logs -f distribution-server
```
默认仅在部署主机的 `127.0.0.1:8000` 监听,访问 `http://127.0.0.1:8000/`。
容器以非 root 用户运行,并从根目录的 `uv.lock` 安装服务器依赖。SQLite 数据库和
程序包保存在 Docker 命名卷 `distribution-data` 中,不会随容器重新创建而丢失;
该卷与本地直接运行时的 `distribution-server/data/` 相互独立。升级时重新运行
`docker compose up -d --build`,并定期备份整个卷。`docker compose down` 保留数据,
`docker compose down -v` 会删除数据卷,请谨慎操作。
可通过环境变量调整宿主机绑定地址和端口。例如,限制好防火墙后允许局域网访问:
```bash
DISTRIBUTION_BIND_ADDRESS=192.168.1.20 DISTRIBUTION_PORT=8000 docker compose up -d --build
```
将地址替换为部署主机的局域网 IP。管理接口没有登录验证,Docker 端口映射或反向代理
可能使服务看到的是网关/代理地址,而不是访问者地址,因此不能依赖服务内的
`ALLOWED_CIDRS` 在容器环境中可靠地限制外部访问。开放非回环地址前,必须在宿主机、
网络或可信反向代理上限制管理接口的访问;不要将整个端口直接暴露给不可信网络。
反向代理只开放公开下载路径时,也应正确转发 Host 并按实际情况限制管理路径。
如需迁移现有数据,先停止所有使用该数据库的服务,再将原数据目录完整备份并复制到
Docker 数据卷,确保容器内 UID/GID `10001` 可读写。不要让本地服务和容器同时使用
同一份数据。容器内运行参数沿用 `settings.py`,修改后需重新构建镜像。
## 直接启动 ## 直接启动
分发服务器可运行在 Linux、Windows 或 macOS。它只接收、保存并分发 Windows exe,不会在服务器上运行这些 exe。开发或试用时不必手动创建虚拟环境、设置环境变量或执行 `pip install`;在仓库根目录运行: 分发服务器可运行在 Linux、Windows 或 macOS。它只接收、保存并分发 Windows exe,不会在服务器上运行这些 exe。开发或试用时不必手动创建虚拟环境、设置环境变量或执行 `pip install`;在仓库根目录运行:
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment