Files
stack/cloud/self-hosted
kert 8bd649d9ab feat: skinny packages, tree reorg, cloud abstraction (refs #182–#201)
P23 — Skinny Packages:
- Break conf→bib circular dependency with lazy guarded import
- Extract aco.table.base → conf.table_base (shared foundation)
- Add try/except ImportError guards on all cross-module imports
- Define per-module optional-dependencies in pyproject.toml
- Slim base deps to just pydantic; all heavy deps in optional groups
- Add gen_config.py --check validation for module/dep sync
- Add skinny-install CI matrix job (tests each extra in isolation)

P24 — Tree Reorganization:
- Move service configs to infra/ (traefik, coredns, grafana, etc.)
- Consolidate Dockerfiles under infra/images/
- Move styles/ → assets/css/ + assets/icons/ + assets/nature.py
- Update compose.yml, stack.toml, gen_config.py, all backend emitters
- Update bootstrap scripts and install_certs.sh

P25 — Cloud Provider Abstraction:
- Add cloud/ directory with self-hosted, aws, gcp, azure stubs
- Add cloud contexts (aws, gcp, azure) to stack.toml
- Add conf/storage.py — get_filesystem() dispatches per context
- Add aws, gcp, azure optional dependency groups
- Document service mapping for each provider

All 11955 tests pass. Zero functionality lost.
2026-03-24 15:00:26 -04:00
..

Self-Hosted Deployment (Default)

Docker Compose on a single node with Traefik ingress.

Service Mapping

Component Self-Hosted Service Config
Object Storage RustFS (S3-compatible) [s3] in stack.toml
Database PostgreSQL compose.yml postgres service
Iceberg Catalog Nessie / Polaris [lake.nessie], [lake.polaris]
Query Engine Trino [lake.trino]
Ingress Traefik infra/traefik/
CI/CD Gitea Actions + Woodpecker [ci] in stack.toml
Observability Grafana + Prometheus + Loki + Jaeger compose.yml
DNS CoreDNS infra/coredns/

Context

[context.local]
db_backend = "duckdb"
storage_backend = "local"

[context.lake]
db_backend = "iceberg"
storage_backend = "s3"
catalog = "nessie"

Quick Start

docker compose up -d