Retro Bulletin Board Systems on atproto. Web app and TUI.
atbbs.xyz
python
tui
atproto
bbs
1FROM node:22-slim AS frontend
2
3WORKDIR /app
4COPY package.json ./
5RUN npm install
6COPY web/static/input.css web/static/input.css
7COPY web/templates/ web/templates/
8COPY web/ts/ web/ts/
9
10RUN npx @tailwindcss/cli -i web/static/input.css -o web/static/style.css --minify
11RUN npx esbuild web/ts/main.ts --bundle --outfile=web/static/app.js --minify
12
13
14FROM python:3.14-slim
15
16WORKDIR /app
17
18COPY --from=ghcr.io/astral-sh/uv:latest /uv /usr/local/bin/uv
19
20# Copy source
21COPY pyproject.toml uv.lock README.md ./
22COPY cli/ cli/
23COPY core/ core/
24COPY tui/ tui/
25COPY web/ web/
26
27# Copy built frontend assets
28COPY --from=frontend /app/web/static/style.css web/static/style.css
29COPY --from=frontend /app/web/static/app.js web/static/app.js
30
31# Remove TS source
32RUN rm -rf web/ts
33
34# Install Python package
35RUN uv sync --frozen --no-dev
36
37RUN mkdir -p /data
38
39ENV ATBBS_DATA_DIR=/data
40ENV PYTHONUNBUFFERED=1
41
42EXPOSE 8000
43
44HEALTHCHECK --interval=30s --timeout=5s CMD python -c "import urllib.request; urllib.request.urlopen('http://localhost:8000/')" || exit 1
45
46CMD ["uv", "run", "atbbs", "serve", "--host", "0.0.0.0", "--port", "8000", "--workers", "3", "--data-dir", "/data"]