5.8 KiB
type, title, description, tags, timestamp
| type | title | description | tags | timestamp | |||
|---|---|---|---|---|---|---|---|
| api | Config Schema | Required/optional environment variables, validation rules, and the typed Config dataclass returned by tenbackward.config.load_config. |
|
2026-08-04T17:51:00Z |
Purpose
tenbackward.config.load_config() is the single boundary that turns
process environment + optional .env file into a typed Config
dataclass. Job 1083 changes every variable that ships in
.env.example so that it is explicitly required at every layer
(entrypoint.sh, config.validate_config, and the rendered cron).
Required Environment Variables
All eight of these must be present and non-empty in the process environment for the container to boot.
| Key | Purpose | Validation |
|---|---|---|
MASTODON_BASE_URL |
Mastodon instance to post against. | Must parse with http or https scheme and a non-empty netloc. |
MASTODON_ACCESS_TOKEN |
OAuth token used by the future Mastodon.py client. | Required string. |
VISIBILITY |
Default post visibility. | Must be public or unlisted. |
SITE_URL |
Source blog URL (used by the future clone step). | Must parse with http or https scheme and a non-empty netloc. |
HASHTAGS |
Comma-separated hashtags appended to every throwback. | Required string (formatting handled by the future poster). |
THROWNBACK_PREFIX |
Per-post title prefix (default: Throwback:). |
Required string. |
MAX_RETRIES |
Number of additional retries after the first attempt. | Non-negative integer (parsed by _parse_max_retries). |
RUN_AT |
Daily fire time for the cron entry. | HH:MM 24-hour format. |
TZ |
IANA timezone used by cron + the container clock. | Must resolve via zoneinfo.ZoneInfo. |
Note
— All nine keys are required since Job 1083. The previously optional
MASTODON_VISIBILITY,THROWBACK_PREFIX, andRETRY_COUNTwere promoted to first-class citizens and renamed toVISIBILITY,THROWNBACK_PREFIX, andMAX_RETRIES.
Defaults
DEFAULTS in config.py provides fallback strings that apply_defaults
fills into the merged map before validation runs:
| Default key | Default value |
|---|---|
VISIBILITY |
public |
THROWNBACK_PREFIX |
Throwback: |
MAX_RETRIES |
3 |
TZ |
Europe/Berlin |
RUN_AT |
09:00 |
Because every required key carries a default, a freshly-initialised
container can still boot to validate the scaffold, but the operator
must supply MASTODON_BASE_URL and MASTODON_ACCESS_TOKEN (and
ideally SITE_URL) to make a real run.
Config Dataclass
| Field | Type | Source |
|---|---|---|
mastodon_base_url |
str |
MASTODON_BASE_URL |
mastodon_access_token |
str |
MASTODON_ACCESS_TOKEN |
visibility |
str |
VISIBILITY |
site_url |
str |
SITE_URL |
hashtags |
str |
HASHTAGS |
throwback_prefix |
str |
THROWNBACK_PREFIX |
max_retries |
int |
MAX_RETRIES (parsed as non-negative int) |
run_at |
str |
RUN_AT |
tz |
str |
TZ |
data_dir |
Path |
Constant: Path("/app/data") |
Validation Behaviour
validate_config(values) collects all failures before raising so the
operator sees every problem at once. A single ConfigError lists each
problem joined with "; ". Validation covers:
- Required keys are non-empty.
RUN_ATparses asHH:MM.MASTODON_BASE_URLandSITE_URLparse viaurllib.parse.urlparsewith anhttp/httpsscheme and a non-emptynetloc.VISIBILITYis one of{"public", "unlisted"}(ALLOWED_VISIBILITY).TZresolves viazoneinfo.ZoneInfo.MAX_RETRIESparses as a non-negative integer (rejects bools).
Exit Codes
| Code | Source | Meaning |
|---|---|---|
1 |
main.main() (retry budget exhausted) |
Pipeline failed on every attempt after MAX_RETRIES + 1 tries. |
2 |
main.main() (ConfigError) |
Configuration was present but invalid; details are logged. |
Citations
- [1]
src/tenbackward/config.py—REQUIRED_KEYS,DEFAULTS,ALLOWED_VISIBILITY,Config,load_config,validate_config. - [2]
.env.example— canonical env-var list. - [3]
entrypoint.sh— shell-side mirror of the required keys.