1
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# fossilrepo omnibus — Fossil + Caddy + Litestream
2
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
#
3
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# Builds Fossil from source for version locking. Serves Fossil repos
4
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# with automatic SSL via Caddy and continuous S3 replication via Litestream.
5
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# Everything is compiled/pinned — no distro package dependencies at runtime.
6
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
7
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# ── Stage 1: Build Fossil from source ──────────────────────────────────────
8
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
9
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
FROM debian:bookworm-slim AS fossil-builder
10
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
11
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
ARG FOSSIL_VERSION=2.24
12
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
13
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
RUN apt-get update && apt-get install -y --no-install-recommends \
14
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
build-essential \
15
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
curl \
16
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
ca-certificates \
17
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
zlib1g-dev \
18
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
libssl-dev \
19
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
tcl \
20
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
&& rm -rf /var/lib/apt/lists/*
21
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
22
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
WORKDIR /build
23
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
24
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
RUN curl -sSL "https://fossil-scm.org/home/tarball/version-${FOSSIL_VERSION}/fossil-src-${FOSSIL_VERSION}.tar.gz" \
25
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
-o fossil.tar.gz \
26
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
&& tar xzf fossil.tar.gz \
27
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
&& cd fossil-src-${FOSSIL_VERSION} \
28
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
&& ./configure --prefix=/usr/local --with-openssl=auto --json \
29
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
&& make -j$(nproc) \
30
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
&& make install \
31
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
&& fossil version
32
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
33
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# ── Stage 2: Runtime image ─────────────────────────────────────────────────
34
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
35
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
FROM python:3.12-slim AS base
36
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
37
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# Version pins — change these to upgrade
38
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
ARG LITESTREAM_VERSION=0.3.13
39
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
ARG CADDY_VERSION=2.9
40
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
41
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# Runtime deps only (no build tools)
42
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
RUN apt-get update && apt-get install -y --no-install-recommends \
43
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
zlib1g \
44
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
libssl3 \
45
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
curl \
46
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
ca-certificates \
47
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
&& rm -rf /var/lib/apt/lists/*
48
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
49
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# Copy Fossil binary from builder
50
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
COPY --from=fossil-builder /usr/local/bin/fossil /usr/local/bin/fossil
51
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
52
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# Install Caddy (pinned)
53
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
RUN curl -sSL "https://caddyserver.com/api/download?os=linux&arch=amd64&version=v${CADDY_VERSION}" \
54
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
-o /usr/local/bin/caddy \
55
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
&& chmod +x /usr/local/bin/caddy
56
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
57
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# Install Litestream (pinned)
58
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
RUN curl -sSL "https://github.com/benbjohnson/litestream/releases/download/v${LITESTREAM_VERSION}/litestream-v${LITESTREAM_VERSION}-linux-amd64.tar.gz" \
59
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| tar -xz -C /usr/local/bin/
60
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
61
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# Verify all binaries
62
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
RUN fossil version && caddy version && litestream version
63
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
64
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# Create data directories
65
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
RUN mkdir -p /data/repos /data/trash /etc/caddy
66
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
67
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# Copy configuration files
68
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
COPY Caddyfile /etc/caddy/Caddyfile
69
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
COPY litestream.yml /etc/litestream.yml
70
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
71
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# Copy and install the fossilrepo package
72
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
COPY .. /app
73
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
WORKDIR /app
74
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
RUN pip install --no-cache-dir .
75
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
76
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# Expose ports: Caddy HTTPS (443), Caddy HTTP (80), Fossil direct (8080)
77
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
EXPOSE 80 443 8080
78
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
79
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# Litestream wraps the fossil server process, replicating all .fossil
80
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# files to S3 continuously while the server runs.
81
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
CMD ["litestream", "replicate", "-exec", "caddy run --config /etc/caddy/Caddyfile"]
82
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!