Infrastructure
The hosts, the shared services, and what each hostname is.
Everything runs on the sawasoft server via Dokploy, behind Cloudflare. Web projects deploy as Cloudflare Workers; backends deploy as containers.
Hostnames
| Host | What | Notes |
|---|---|---|
iam.ringojr.cc | IAM frontend | Worker |
iam-backend.ringojr.cc | IAM backend | Dokploy |
finloop.ringojr.cc | Finloop frontend | Worker |
finloop-backend.ringojr.cc | Finloop backend | Dokploy |
docs.ringojr.cc | this handbook | Worker |
adminer.sawasoft.co.tz | database console | behind basic auth |
infisical.sawasoft.co.tz | secrets manager | |
rustfs.sawasoft.co.tz | object storage console | at /rustfs/console/ |
s3.sawasoft.co.tz | S3 API | DNS-only, deliberately |
The shared services live in Dokploy's Infrastructure project; their compose files are the
reference copies in tools/deploy/infra/, deployed with tools/deploy/infra/deploy.sh.
s3.sawasoft.co.tz must stay grey-cloud in Cloudflare. The proxy rewrites requests enough to
break S3 SigV4 signatures and caps bodies at 100 MB, so authenticated and presigned access fail with
SignatureDoesNotMatch. The console hostname can stay proxied; internal access over
http://rustfs:9000 is unaffected.
RustFS is beta
Run single-node only — distributed mode is described upstream as still under testing. The image is pinned by digest for the same reason. Per-app scoped access keys are deferred while its IAM implementation matures; today there is one root credential pair.
Infisical is the root of trust
Every secret in Infisical's database is encrypted with its ENCRYPTION_KEY. A backup of that
database without the key restores nothing, so the key belongs in a password manager, not only on
the host.
Things that have already gone wrong here
docker system df misreports under Swarm mode. It has reported gigabytes of reclaimable space
on hosts where the true figure is ≈0 B, because every "unused" image is backing a live service.
Never act on its numbers; map image IDs to containers instead.
One image that reads as dangling backs eight running databases on the reference host. A blanket
docker image prune -a would take down client services. Never blanket-prune either box.
There are no backups of the client databases on sawasoft. Several orphaned volumes are the only surviving copy of data belonging to real clients. Nothing gets deleted on a blanket instruction; each volume is an individual decision made against a dump and a manifest, not from memory.