feat: support optional Traefik compose deployment

This commit is contained in:
gary committed 2026-10-27 23:35:14 +08:00
1 parent 3581f62139
commit eec7eef96d
5 files changed
+56 -9

No files matched your search

+19
View File
@@ -11,6 +11,24 @@
#
# 所有项都有内置默认值,全部留空也能启动;下面只列需要按部署环境改的几项。
# ── 部署入口 ─────────────────────────────────────────────────────
# 空值:开发/直连模式,只发布到 127.0.0.1:8080。
# 设为 1:加载 Traefik 覆盖配置,不发布宿主机端口。
TRAEFIK_ENABLED=
COMPOSE_FILE=docker-compose.yml${TRAEFIK_ENABLED:+:docker-compose.traefik.yml}
HOST_BIND_IP=127.0.0.1
HOST_PORT=8080
# Traefik 模式设置;TRAEFIK_ENABLED=1 时生效。
TRAEFIK_HOST=img.example.com
TRAEFIK_NETWORK=frontend
TRAEFIK_ENTRYPOINTS=https
TRAEFIK_TLS=true
TRAEFIK_CERTRESOLVER=cloudflare
TRAEFIK_PRIORITY=10
# 需在 Traefik file provider 中定义此中间件;没有中间件时请同步移除覆盖文件中的对应 label。
TRAEFIK_MIDDLEWARES=real-ip@file
# ── 必改 ─────────────────────────────────────────────────────────
# 站点对外地址:API 返回的图片 URL 固定取自该值(不再反射请求 Host)。
# 公网部署必须改成实际地址,否则返回的图片链接不可用。
@@ -73,5 +91,6 @@ ALLOWED_TYPES=image/jpeg,image/png,image/gif,image/webp
# ── 反向代理 ─────────────────────────────────────────────────────
# 逗号分隔 IP/CIDR。仅这些来源的 X-Forwarded-For 会被采信为客户端 IP,
# Traefik 模式请填写 Traefik 在共享 Docker 网络中的 IP 或子网;
# 留空表示不信任任何代理(直连部署保持留空)。
TRUSTED_PROXIES=
+1 -1
View File
@@ -18,7 +18,7 @@ COPY backend/ ./backend/
COPY main.go ./
COPY --from=frontend-builder /src/frontend/dist ./frontend/dist
COPY --from=frontend-builder /src/frontend/src/assets/fonts ./frontend/src/assets/fonts
RUN --mount=type=cache,target=/go/pkg/mod --mount=type=cache,target=/root/.cache/go-build go build -p 8 -trimpath -ldflags="-s -w" -o /out/oneimg ./main.go
RUN --mount=type=cache,target=/go/pkg/mod --mount=type=cache,target=/root/.cache/go-build go build -p 16 -trimpath -ldflags="-s -w" -o /out/oneimg ./main.go
FROM alpine:3.23
RUN apk add --no-cache ca-certificates tzdata libwebp
+13 -2
View File
@@ -151,10 +151,14 @@ S3 存储默认启用 **Path Style** 请求(`Endpoint/Bucket/Object`),适
```bash
git clone https://git.bytevibe.dev/gary/oneimg.git
cd oneimg
cp .env.example .env
docker compose up -d
docker compose exec oneimg cat /app/data/.initial_admin_password
```
默认直连模式只在本机发布 `127.0.0.1:8080`,访问 `http://127.0.0.1:8080`。
使用 Traefik 时,在 `.env` 设置 `TRAEFIK_ENABLED=1`、`TRAEFIK_HOST` 和公网 `APP_URL`,并确认 Traefik 与 oneImg 共用 `TRAEFIK_NETWORK` 指定的外部网络(默认 `frontend`)。例如网络尚未创建时先执行 `docker network create frontend`,然后运行 `docker compose up -d`。Traefik 模式不会发布宿主机端口;`TRUSTED_PROXIES` 应设为该网络中 Traefik 的 IP 或子网。示例默认挂载 `real-ip@file`,需在 Traefik file provider 中定义;没有该中间件时移除覆盖文件中的对应 label。关闭 Traefik 时清空 `TRAEFIK_ENABLED` 再运行 `docker compose up -d`。
### Gitea 容器镜像
仓库内的 Gitea Actions 工作流在推送版本标签(`v*`)或手动触发时构建 `linux/amd64` 和
@@ -166,7 +170,7 @@ docker compose exec oneimg cat /app/data/.initial_admin_password
默认注册表为 `git.bytevibe.dev`。如需覆盖,设置仓库 Actions Variable `GITEA_REGISTRY`。
镜像标签为 `latest` 和触发构建的版本标签,例如 `git.bytevibe.dev/gary/oneimg:latest`。
启动后访问 `http://localhost:8080`
启动后访问 `http://127.0.0.1:8080`
### Docker 直接运行
@@ -287,7 +291,14 @@ docker run -d --name oneimg -p 8080:8080 \
| `GITEA_URL` | `https://git.bytevibe.dev` | 账户页管理员版本信息使用的 Gitea 地址 |
| `GITEA_REPOSITORY` | `gary/oneimg` | 账户页管理员版本信息使用的仓库路径(`所有者/仓库名`) |
| `GITEA_TOKEN` | 空 | 私有仓库访问令牌,公开仓库留空 |
| `SERVER_PORT` | `8080` | 监听端口 |
| `SERVER_PORT` | `8080` | 容器内监听端口 |
| `HOST_BIND_IP` / `HOST_PORT` | `127.0.0.1` / `8080` | 直连模式发布到宿主机的地址与端口 |
| `TRAEFIK_ENABLED` | 空 | 设为 `1` 加载 Traefik 覆盖配置;空值使用直连模式 |
| `TRAEFIK_HOST` | `img.example.com` | Traefik Host 路由域名 |
| `TRAEFIK_NETWORK` | `frontend` | Traefik 与 oneImg 共用的外部 Docker 网络 |
| `TRAEFIK_ENTRYPOINTS` | `https` | Traefik 入口点 |
| `TRAEFIK_CERTRESOLVER` | `cloudflare` | Traefik TLS 证书解析器 |
| `TRAEFIK_MIDDLEWARES` | `real-ip@file` | Traefik 中间件列表,需在 Traefik 中预先定义 |
| `DB_TYPE` | `sqlite` | `sqlite` / `mysql` / `postgres` |
| `DB_TLS_MODE` | `auto` | 数据库 TLS 模式,见上文「数据库」 |
| `DEFAULT_USER` / `DEFAULT_PASS` | `admin` / 空 | 初始管理员;`DEFAULT_PASS` 留空则随机生成 |
+22
View File
@@ -0,0 +1,22 @@
services:
oneimg:
ports: !reset []
expose:
- "${SERVER_PORT:-8080}"
networks:
- frontend
labels:
- "traefik.enable=true"
- "traefik.http.routers.oneimg.rule=Host(`${TRAEFIK_HOST:-img.example.com}`)"
- "traefik.http.routers.oneimg.entrypoints=${TRAEFIK_ENTRYPOINTS:-https}"
- "traefik.http.routers.oneimg.tls=${TRAEFIK_TLS:-true}"
- "traefik.http.routers.oneimg.tls.certresolver=${TRAEFIK_CERTRESOLVER:-cloudflare}"
- "traefik.http.routers.oneimg.priority=${TRAEFIK_PRIORITY:-10}"
- "traefik.http.routers.oneimg.middlewares=${TRAEFIK_MIDDLEWARES:-real-ip@file}"
- "traefik.http.routers.oneimg.service=oneimg"
- "traefik.http.services.oneimg.loadbalancer.server.port=${SERVER_PORT:-8080}"
networks:
frontend:
external: true
name: ${TRAEFIK_NETWORK:-frontend}
+1 -6
View File
@@ -15,7 +15,7 @@ services:
# 也可改用官方镜像:image: onexru/oneimg-oneimg
# 或加载离线包:docker load -i oneImg_Docker_amd64_v3.5.8.tar(镜像名 oneimg:v3.5.8-amd64)
ports:
- "${SERVER_PORT:-8080}:${SERVER_PORT:-8080}"
- "${HOST_BIND_IP:-127.0.0.1}:${HOST_PORT:-8080}:${SERVER_PORT:-8080}"
environment:
# ── 服务器 ───────────────────────────────────────────────
# 监听端口(镜像内 EXPOSE 8080,改动时上面的 ports 会跟着变)
@@ -86,8 +86,3 @@ services:
- ./data:/app/data
- ./uploads:/app/uploads
restart: unless-stopped
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "3"