# 构建：docker build -t fossil-manager:latest .
# 运行：用同级 docker-compose.yml（image: fossil-manager:latest，不在 compose 里 build）
#
# APT 默认阿里云 HTTP（基础镜像尚无 ca-certificates，HTTPS 会验签失败）
# 可覆盖：--build-arg APT_MIRROR=http://mirrors.tuna.tsinghua.edu.cn/ubuntu
ARG APT_MIRROR=http://mirrors.aliyun.com/ubuntu

# 阶段 1：构建 Crystal 应用
FROM crystallang/crystal:1.21 AS builder
ARG APT_MIRROR

RUN set -eux; \
    if [ -f /etc/apt/sources.list.d/ubuntu.sources ]; then \
      sed -i \
        -e "s|http://archive.ubuntu.com/ubuntu|${APT_MIRROR}|g" \
        -e "s|https://archive.ubuntu.com/ubuntu|${APT_MIRROR}|g" \
        -e "s|http://security.ubuntu.com/ubuntu|${APT_MIRROR}|g" \
        -e "s|https://security.ubuntu.com/ubuntu|${APT_MIRROR}|g" \
        /etc/apt/sources.list.d/ubuntu.sources; \
    fi; \
    if [ -f /etc/apt/sources.list ]; then \
      sed -i \
        -e "s|http://archive.ubuntu.com/ubuntu|${APT_MIRROR}|g" \
        -e "s|https://archive.ubuntu.com/ubuntu|${APT_MIRROR}|g" \
        -e "s|http://security.ubuntu.com/ubuntu|${APT_MIRROR}|g" \
        -e "s|https://security.ubuntu.com/ubuntu|${APT_MIRROR}|g" \
        /etc/apt/sources.list; \
    fi; \
    apt-get update && apt-get install -y --no-install-recommends \
    libsqlite3-dev \
    libargon2-dev \
    libssl-dev \
    libpcre2-dev \
    libgc-dev \
    libevent-dev \
    libxml2-dev \
    && rm -rf /var/lib/apt/lists/*

WORKDIR /app

COPY shard.yml shard.lock ./
COPY lib ./lib
COPY src ./src
COPY config ./config
COPY public ./public
RUN test -f lib/amber/src/amber.cr \
    || (echo "缺少 lib/，请先在能上网的机器上执行 shards install，再带着 lib/ 构建" && exit 1)
RUN mkdir -p bin \
    && crystal build src/FOS-Anvil.cr -o bin/fossil-manager --release

# 阶段 2：运行时（ubuntu:24.04，glibc 2.39 满足打包 fossil 所需 >= 2.38）
FROM ubuntu:24.04
ARG APT_MIRROR

RUN set -eux; \
    if [ -f /etc/apt/sources.list.d/ubuntu.sources ]; then \
      sed -i \
        -e "s|http://archive.ubuntu.com/ubuntu|${APT_MIRROR}|g" \
        -e "s|https://archive.ubuntu.com/ubuntu|${APT_MIRROR}|g" \
        -e "s|http://security.ubuntu.com/ubuntu|${APT_MIRROR}|g" \
        -e "s|https://security.ubuntu.com/ubuntu|${APT_MIRROR}|g" \
        /etc/apt/sources.list.d/ubuntu.sources; \
    fi; \
    if [ -f /etc/apt/sources.list ]; then \
      sed -i \
        -e "s|http://archive.ubuntu.com/ubuntu|${APT_MIRROR}|g" \
        -e "s|https://archive.ubuntu.com/ubuntu|${APT_MIRROR}|g" \
        -e "s|http://security.ubuntu.com/ubuntu|${APT_MIRROR}|g" \
        -e "s|https://security.ubuntu.com/ubuntu|${APT_MIRROR}|g" \
        /etc/apt/sources.list; \
    fi; \
    apt-get update && apt-get install -y --no-install-recommends \
    libsqlite3-0 \
    libargon2-1 \
    libssl3t64 \
    libpcre2-8-0 \
    libgc1 \
    libevent-2.1-7t64 \
    libxml2 \
    zlib1g \
    ca-certificates \
    wget \
    supervisor \
    docker.io \
    openssh-client \
    sshpass \
    && rm -rf /var/lib/apt/lists/*

COPY docs/fossil-linux-x64-20260801193352.tar.gz /tmp/
RUN tar -xzf /tmp/fossil-linux-x64-20260801193352.tar.gz -C /usr/local/bin fossil \
    && chmod +x /usr/local/bin/fossil \
    && rm /tmp/fossil-linux-x64-20260801193352.tar.gz \
    && fossil version

WORKDIR /app

COPY --from=builder /app/bin/fossil-manager /app/fossil-manager
COPY public /app/public
COPY config /app/config

COPY docker/supervisord.conf /app/docker/supervisord.conf
COPY docker/fossil-server.sh /app/docker/fossil-server.sh
RUN chmod +x /app/docker/fossil-server.sh

RUN mkdir -p /srv/fossil /app/data /app/data/git-export /app/data/docker

ENV DATABASE_URL=sqlite:/app/data/fossil_manager.db?mode=rwc
ENV FOSSIL_REPO_DIR=/srv/fossil
ENV FOSSIL_BINARY=/usr/local/bin/fossil
ENV FOSSIL_BASE_URL=http://localhost:8080
ENV LISTEN_ADDR=0.0.0.0:3000
ENV GIT_EXPORT_DIR=/app/data/git-export
ENV DOCKER_DATA_DIR=/app/data/docker
ENV DOCKER_BIN=docker
ENV SITE_TITLE=Fossil-Manager
ENV AMBER_ENV=production

EXPOSE 3000 8080

VOLUME ["/app/data", "/srv/fossil"]

HEALTHCHECK --interval=30s --timeout=5s --start-period=10s --retries=3 \
    CMD wget --no-verbose --tries=1 --spider http://localhost:3000/ && wget --no-verbose --tries=1 --spider http://localhost:8080/ || exit 1

CMD ["supervisord", "-n", "-c", "/app/docker/supervisord.conf"]
