staging
10Backward
Daily Mastodon throwback bot scaffolded with Docker Compose.
The container runs a cron daemon that invokes the Python entrypoint once per
day at the configured RUN_AT (Europe/Berlin default). The actual blog
clone / post pipeline is intentionally stubbed in this scaffold and is to be
implemented in a follow-up job — this repository currently ships:
- Pinned Python dependency manifest.
Dockerfile(python:3.11-slim + cron + git + ca-certificates + tzdata).docker-compose.ymlbuilding locally, mounting.envread-only and persisting./datafor the blog clone andposted.jsonstate.entrypoint.shthat validates required env vars and fails clearly on startup before launchingcron -fin the foreground.- Safe
.env.examplewith placeholder credentials only.
Build & run
cp .env.example .env # fill in real credentials locally
docker compose build
docker compose up -d
docker compose logs -f bot
./data is persisted across restarts on the host. The blog clone (added in a
follow-up job) will live in ./data/blog/, and posted-state in
./data/posted.json.
Configuration
| Variable | Required | Default | Notes |
|---|---|---|---|
MASTODON_BASE_URL |
yes | — | e.g. https://mastodon.social |
MASTODON_ACCESS_TOKEN |
yes | — | never commit |
SITE_URL |
yes | — | source blog URL (HTTPS) |
HASHTAGS |
yes | — | comma-separated, e.g. #throwback,#10backward |
RUN_AT |
yes | 09:00 |
HH:MM in TZ |
MASTODON_VISIBILITY |
no | public |
public, unlisted, private, direct |
THROWBACK_PREFIX |
no | Throwback: |
German-localizable |
RETRY_COUNT |
no | 3 |
post retries |
TZ |
no | Europe/Berlin |
any IANA timezone |
Tests
pip install -r requirements-dev.txt
pytest
Description