FossilRepo

fossilrepo / Dockerfile
Blame History Raw 81 lines
1
# fossilrepo backend — Django + HTMX + Fossil binary
2
#
3
# Omnibus: bundles Fossil from source for repo init/management.
4
5
# ── Stage 1: Build Fossil from source ──────────────────────────────────────
6
7
FROM debian:bookworm-slim AS fossil-builder
8
9
ARG FOSSIL_VERSION=2.24
10
11
RUN apt-get update && apt-get install -y --no-install-recommends \
12
build-essential curl ca-certificates zlib1g-dev libssl-dev tcl \
13
&& rm -rf /var/lib/apt/lists/*
14
15
WORKDIR /build
16
RUN curl -sSL "https://fossil-scm.org/home/tarball/version-${FOSSIL_VERSION}/fossil-src-${FOSSIL_VERSION}.tar.gz" \
17
-o fossil.tar.gz \
18
&& tar xzf fossil.tar.gz \
19
&& cd fossil-src-${FOSSIL_VERSION} \
20
&& ./configure --prefix=/usr/local --with-openssl=auto --json \
21
&& make -j$(nproc) \
22
&& make install
23
24
# ── Stage 2: Runtime image ─────────────────────────────────────────────────
25
26
FROM python:3.12-slim-bookworm
27
28
RUN apt-get update && apt-get install -y --no-install-recommends \
29
postgresql-client ca-certificates zlib1g libssl3 openssh-server git \
30
&& rm -rf /var/lib/apt/lists/*
31
32
# Copy Fossil binary from builder
33
COPY --from=fossil-builder /usr/local/bin/fossil /usr/local/bin/fossil
34
RUN fossil version
35
36
RUN pip install --no-cache-dir uv
37
38
WORKDIR /app
39
40
COPY pyproject.toml ./
41
RUN uv pip install --system --no-cache -r pyproject.toml
42
43
COPY . .
44
45
RUN DJANGO_SECRET_KEY=build-placeholder DJANGO_DEBUG=true python manage.py collectstatic --noinput
46
47
# Create data directories
48
RUN mkdir -p /data/repos /data/trash /data/ssh
49
50
# SSH setup — restricted fossil user + sshd for clone/push
51
RUN useradd -r -m -d /home/fossil -s /usr/sbin/nologin fossil \
52
&& mkdir -p /run/sshd /home/fossil/.ssh \
53
&& chown fossil:fossil /home/fossil/.ssh \
54
&& chmod 700 /home/fossil/.ssh
55
56
COPY docker/sshd_config /etc/ssh/sshd_config
57
COPY docker/fossil-shell /usr/local/bin/fossil-shell
58
RUN chmod +x /usr/local/bin/fossil-shell
59
60
# Generate host keys if they don't exist (entrypoint will handle persistent keys)
61
RUN ssh-keygen -A
62
63
# Create non-root app user for running gunicorn
64
RUN useradd -r -m -d /home/app -s /bin/false app \
65
&& chown -R app:app /app /data
66
67
ENV PYTHONUNBUFFERED=1
68
ENV PYTHONDONTWRITEBYTECODE=1
69
ENV DJANGO_SETTINGS_MODULE=config.settings
70
71
EXPOSE 8000 2222
72
73
COPY docker/entrypoint.sh /usr/local/bin/entrypoint.sh
74
RUN chmod +x /usr/local/bin/entrypoint.sh
75
76
# Install gosu for privilege dropping in entrypoint
77
RUN apt-get update && apt-get install -y --no-install-recommends gosu && rm -rf /var/lib/apt/lists/*
78
79
# Entrypoint runs as root (to start sshd), then drops to app user for gunicorn
80
CMD ["/usr/local/bin/entrypoint.sh"]
81

Keyboard Shortcuts

Open search /
Next entry (timeline) j
Previous entry (timeline) k
Open focused entry Enter
Show this help ?
Toggle theme Top nav button