articha.ru
Live2025-02 → present
- Role
- solo, 712 of 733 commits
- Scale
- 411 files, 11 Django apps
articha.ru Private repository
A public utilities platform where people upload markdown projects and render them into standards-compliant Word documents in the browser — plus a document compressor, a payment system and a companion Chrome extension. It is the product side of a document engine I also wrote.
Eleven apps, one deployment.
The converter UI, authentication with API tokens and a trust system, the Chrome extension's distribution and update feed, an async document compressor, the public API, payments, the legal and feedback pages, a companion bot's web side, a CSS-inlining layer written for this site, the pages you are reading now, and the core. Each is a Django app with its own templates, translations and tests.
Django and FastAPI in one process.
Django owns authentication, the database and every rendered page. A FastAPI sub-application is mounted inside it and owns the typed public API — Pydantic schemas, routers, a generated OpenAPI description — which a published PyPI client consumes. One deployment, one database, two frameworks doing what each is good at.
Operated, not just deployed.
It runs on a Raspberry Pi in my own room, behind nginx, systemd and Cloudflare. Deploys push their version, commit count and exit status into my own monitoring over webhooks; a failed deploy escalates to a high-priority alarm that deliberately breaks through do-not-disturb. Continuous integration runs lint, tests and coverage on every push, and a git hook refuses direct commits to the main branch.
The address is dynamic, and that was a measured decision.
Dynamic DNS providers took up to six hours to propagate a change; the Cloudflare API takes five minutes or less. So the project ships a management command that pushes the new address through Cloudflare itself, rather than delegating to a service that would be slower.
Real money and real obligations.
Card payments through a Russian payment provider, a public offer, a personal-data processing policy, and a registered self-employed entity behind them.
Highlights
- Hybrid Django + FastAPI in a single deployment, with a published client against the API
- A custom app that inlines and caches CSS — a performance layer written rather than installed
- Full Russian localisation with per-app catalogs
- Deploy alerting into self-hosted monitoring, with severity-differentiated escalation
- A management command driving the Cloudflare API, chosen over dynamic DNS after measuring both
- Small deliberate touches: a trust gauge widget, an easter-egg game page
Stack
Python 3.12Django 6django-allauthFastAPICeleryRedisPostgreSQLpsycopg3uWSGIBootstrap 5htmxCodeMirrorPlotlyCloudflare APInginxsystemdi18n