Self-hostable website analytics on Django: a straightforward collector API, dashboards, a world map, and PDF reports.
analyticsdjangodockerhandcodedpythonself-hostedsqliteviteweb-analytics
1FROM alpine:3.21
2
3ENV LANG="C.UTF-8" \
4 PYTHONUNBUFFERED=1
5
6COPY --from=ghcr.io/astral-sh/uv:latest /uv /uvx /usr/local/bin/
7COPY --from=oven/bun:alpine /usr/local/bin/bun /usr/local/bin/bun
8
9RUN apk add --update --no-cache \
10 python3 py3-pip \
11 chromium libstdc++ nss harfbuzz freetype \
12 font-noto font-noto-extra font-noto-emoji
13
14WORKDIR /app
15
16COPY pyproject.toml uv.lock package.json bun.lock /app/
17RUN bun install --frozen-lockfile && \
18 uv sync --frozen --no-dev
19
20COPY . .
21
22ENV PATH="/app/.venv/bin:/app/node_modules/.bin:$PATH"
23
24RUN bun run build && \
25 bun run build:maps && \
26 uv run python manage.py collectstatic --noinput
27
28RUN addgroup -S -g 1000 app && \
29 adduser -S -h /app -s /sbin/nologin -u 1000 -G app app && \
30 chown -R app:app /app
31USER app:app