Files
HomeDash/Dockerfile
HomeDash Bot c0cbdb5efc feat(deploy): 补首装路径,使他人/AI 可照教程从零部署
审计发现 5 处断点(3 处硬阻断):
1. Dockerfile 的 HTTP_PROXY/HTTPS_PROXY 默认指向内网代理 → 他人构建必失败
2. zd-host.sh 是升级脚本(要求已存在 host 模式 navi 容器)→ 新机器第一句过不去
3. docker-compose.yml 是桥接+端口映射,与'统一入口 host 模式'口径冲突
4. 证书文件名约定未文档化(实际来自 gateway.yml 的 certFile/keyFile)
5. 环境变量表不完整、缺 sshpass 依赖说明

本次:
- Dockerfile:代理默认置空,需要时 --build-arg 传入
- deploy/install-host.sh(新):干净机器首次安装,6 步并在任一步失败即停,
  含端口独占检查、证书检查、初始 gateway.yml 生成、apply、四项自检,
  令牌可自动生成并只打印一次;已存在 navi 容器时拒绝执行(引导去 zd-host.sh)
- docker-compose.yml:标注为试用形态,指向 install-host.sh
- README:新增「从零部署(干净机器)」——两条路径分工表、前置条件表、
  完整环境变量表、证书与初始网关配置说明、装完自检命令;自定义文件表登记新脚本

另修:脚本自检原用 /.navi-ping(该路径已按用户要求删除),改用 /conf.yml。
2026-09-12 09:37:45 +08:00

108 lines
4.4 KiB
Docker
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 不用 `# syntax=docker/dockerfile:1`:该指令会让 BuildKit 去 pull
# docker/dockerfile 前端镜像,在无外网/仅代理的环境里会直接构建失败。
# 本文件未使用任何 BuildKit 专有语法,去掉后走内置前端即可。
# ── Stage 1: Go binaries ──
FROM golang:1.21-bookworm AS gobuild
WORKDIR /src/history
COPY history-server/ .
RUN GOPROXY=https://goproxy.cn,direct CGO_ENABLED=0 go build -trimpath -ldflags="-s -w" -o /out/history-server .
WORKDIR /src/admin
COPY admin-server/ .
RUN GOPROXY=https://goproxy.cn,direct go mod tidy && CGO_ENABLED=0 go build -trimpath -ldflags="-s -w" -o /out/admin-server .
# ── Stage 2: SearXNG from source ──
FROM debian:bookworm-slim AS searxng-build
# 需要代理时用 --build-arg 传入(默认不设,保证他人环境可直接构建)
ARG HTTP_PROXY=
ARG HTTPS_PROXY=
ENV DEBIAN_FRONTEND=noninteractive
ENV http_proxy=${HTTP_PROXY}
ENV https_proxy=${HTTPS_PROXY}
ENV HTTP_PROXY=${HTTP_PROXY}
ENV HTTPS_PROXY=${HTTPS_PROXY}
RUN apt-get -o Acquire::Retries=5 -o Acquire::http::Timeout=30 update \
&& apt-get -o Acquire::Retries=5 install -y --no-install-recommends \
python3 python3-pip python3-venv git ca-certificates \
&& rm -rf /var/lib/apt/lists/*
RUN git clone --depth 1 https://github.com/searxng/searxng.git /src/searxng \
&& python3 -m venv /opt/searxng-venv \
&& /opt/searxng-venv/bin/pip install --upgrade pip setuptools wheel msgspec \
&& cd /src/searxng \
&& /opt/searxng-venv/bin/pip install --no-cache-dir -r requirements.txt \
&& /opt/searxng-venv/bin/pip install --no-cache-dir --no-build-isolation . \
&& rm -rf /src/searxng
# ── Stage 3: browser extension packages ──
# 供 /extension/install.html 下载(Chromium 用 zip,Firefox 用 xpi)
FROM debian:bookworm-slim AS extpack
RUN apt-get -o Acquire::Retries=5 -o Acquire::http::Timeout=30 update \
&& apt-get -o Acquire::Retries=5 install -y --no-install-recommends zip ca-certificates \
&& rm -rf /var/lib/apt/lists/*
COPY extension/chrome /src/chrome
COPY extension/firefox /src/firefox
# Go 的 -o 会自动建父目录,zip 不会,所以这里必须显式创建 /out
RUN mkdir -p /out \
&& cd /src/chrome && zip -qr /out/navi-chrome.zip . \
&& cd /src/firefox && zip -qr /out/navi-firefox.xpi .
# ── Stage 4: Runtime ──
FROM debian:bookworm-slim
ENV DEBIAN_FRONTEND=noninteractive
RUN apt-get -o Acquire::Retries=5 -o Acquire::http::Timeout=30 update \
&& apt-get -o Acquire::Retries=5 install -y --no-install-recommends \
nginx python3 supervisor curl ca-certificates git \
&& rm -rf /var/lib/apt/lists/*
# Copy SearXNG venv + source
COPY --from=searxng-build /opt/searxng-venv /app/searxng-venv
COPY --from=searxng-build /usr/lib/python3.11 /usr/lib/python3.11
COPY --from=searxng-build /lib/x86_64-linux-gnu /lib/x86_64-linux-gnu
COPY --from=searxng-build /usr/lib/x86_64-linux-gnu /usr/lib/x86_64-linux-gnu
# Dashy static files
COPY --from=lissy93/dashy:latest /app/dist /app/dashy
# Go binaries
COPY --from=gobuild /out/history-server /usr/local/bin/history-server
COPY --from=gobuild /out/admin-server /usr/local/bin/admin-server
# Config files
COPY nginx.conf /etc/nginx/nginx.conf
COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf
COPY searxng-settings.yml /etc/searxng/settings.yml
COPY conf.example.yml /app/defaults/conf.yml
COPY admin/index.html /app/admin/index.html
COPY portal /app/portal
# 浏览器扩展安装页与安装包(通过 /extension/ 访问)
COPY web/extension/install.html /app/dashy/extension/install.html
COPY --from=extpack /out/navi-chrome.zip /app/dashy/extension/navi-chrome.zip
COPY --from=extpack /out/navi-firefox.xpi /app/dashy/extension/navi-firefox.xpi
# Inject search script into Dashy
COPY web/navi.js /app/dashy/navi.js
COPY web/navi.css /app/dashy/navi.css
COPY web/patch-index.py /tmp/patch-index.py
# index.html 里不一定有 </body>,用脚本幂等注入,不能靠 sed 替换 </body>。
RUN python3 /tmp/patch-index.py /app/dashy/index.html
# Data directory
RUN mkdir -p /app/data/item-icons /app/data/gateway /var/log/supervisor /var/cache/searxng /run/nginx
VOLUME ["/app/data"]
EXPOSE 18080 3080 3081 8443
HEALTHCHECK --interval=30s --timeout=5s --start-period=30s --retries=3 \
CMD curl -fs http://localhost:18080/healthz || exit 1
CMD ["/usr/bin/supervisord", "-c", "/etc/supervisor/conf.d/supervisord.conf"]