Repository navigation
Service Directory Layout
Per-service manifest folders. Each subfolder is one service family — a
logical grouping of co-lifecycled containers. Examples: supabase/ owns all
eight supabase-* containers; n8n/ owns n8n + n8n-worker + n8n-init;
open-webui/ owns open-web-ui + open-webui-init.
The root docker-compose.yml is a thin include: shell that merges every
fragment under services/<name>/compose.yml. See
docs/CONTRIBUTING-services.md for the full architecture rationale.
services/
├── README.md # this file
├── supabase/
│ ├── service.yml # manifest: env vars, sources, deps, image refs
│ ├── compose.yml # Docker Compose fragment for the family's containers
│ ├── README.md # service family overview (required by policy)
│ └── db/scripts/ # SQL init scripts (bind-mounted into supabase-db-init)
├── redis/
│ ├── service.yml
│ └── compose.yml
└── … (additional manifest and documentation-only service families)
A virtual service (e.g. cloud-providers/, tts-provider/, globals/) has
no compose fragment because it owns no containers. It still ships
service.yml plus operator-facing documentation because it owns environment
variables and source toggles that other services consume.
Current service-family and SOURCE-surface counts are generated from the manifests into the documentation home and service catalog; this file does not duplicate those changing totals.
- Edit
services/<name>/service.yml(the manifest) and/orservices/<name>/compose.yml(the fragment). - The schema lives at
bootstrapper/schemas/service.schema.json. - Run the schema lint locally:
Validates every manifest against
uv run --project bootstrapper python -m tools.validate_fragments
bootstrapper/schemas/service.schema.jsonand the cross-manifest rules. Exits non-zero on any violation. - If you changed any env-affecting field, also run the consistency tests.
They catch orphan
.env.examplekeys, manifest vars missing from.env.example, and duplicate ownership:Note:uv run --project bootstrapper pytest bootstrapper/tests/test_env_example_consistency.py
.env.exampleis AUTO-GENERATED from the manifests'env:declarations bybootstrapper/services/env_assembler.py. After adding or changing env vars in aservice.yml, regenerate it:uv run --project bootstrapper python -m services.env_assembler
tests/test_env_assembler.pyenforces byte-equivalence between the committed file and the assembler's output. Never edit.env.exampleby hand. - New service? Add the fragment's path to the
include:list in the rootdocker-compose.yml. Service order comes from thedepends_on:topology (seebootstrapper/services/topology.py). The full checklist, including CLI registration, tracks and the test fixtures, is in Adding a service.
- Lowercase kebab-case (matches the
name:field in the manifest). - Names starting with
_are reserved (e.g._user/). - Names starting with
.are ignored by the loader.
Every service family, including virtual manifests, ships documentation
describing its contract. A sibling README.md normally describes the
containers it owns, the role of any init/, build/, provider/,
extras/, or db/ subdirectories, and any non-obvious operational gotchas.
The manifest's docs: value may point to another canonical Markdown page when
an aggregate guide is authoritative.
A service with no appropriate page must carry a schema-validated
docs_exception with an explicit because clause. The clause needs at least
four substantive words and at least three distinct terms.
Generic reasons and exceptions on already-documented services fail manifest
validation.
When a service brings its own source code, init scripts, build context, or
config files, those live under a named subdirectory inside the service
folder. The full convention (app/, build/, init/,
pull/, config/, db/, provider/, extras/, workflows-stage/) is
documented in
docs/CONTRIBUTING-services.md.
Downstream forks consuming this repo as a git submodule can layer extra
services under services/_user/<name>/ without touching the upstream tree.
The folder is gitignored upstream. Full design: see
docs/CONTRIBUTING-services.md.
Atlas documentation.
- 1. Overview
- 2. Quick Start
- 3. Core Concepts
- 4. Tracks
-
5. Services
- 5.1. Service Catalog
-
5.2. Service Guides
- 5.2.1. airflow
- 5.2.2. asset-baker
- 5.2.3. asset-worker
- 5.2.4. backend
- 5.2.5. backup
- 5.2.6. blender-mcp
- 5.2.7. celery
- 5.2.8. chatterbox
- 5.2.9. cloud-providers
- 5.2.10. cloudflared
- 5.2.11. comfyui
- 5.2.12. crawl4ai
- 5.2.13. doc-processor
- 5.2.14. docling
- 5.2.15. docling-lightrag-adapter
- 5.2.16. fal
- 5.2.17. globals
- 5.2.18. grafana
- 5.2.19. hermes
- 5.2.20. iceberg-rest
- 5.2.21. jenkins
- 5.2.22. jupyterhub
- 5.2.23. kong
- 5.2.24. label-studio
- 5.2.25. langfuse
- 5.2.26. lightrag
- 5.2.27. litellm
- 5.2.28. llm-graph-builder
- 5.2.29. local-deep-researcher
- 5.2.30. loki
- 5.2.31. mcp-servers
- 5.2.32. minio
- 5.2.33. mlflow
- 5.2.34. multi2vec-clip
- 5.2.35. n8n
- 5.2.36. neo4j
- 5.2.37. ollama
- 5.2.38. open-webui
- 5.2.39. openclaw
- 5.2.40. otel-collector
- 5.2.41. parakeet
- 5.2.42. prometheus
- 5.2.43. ray
- 5.2.44. redis
- 5.2.45. redpanda
- 5.2.46. searxng
- 5.2.47. spark
- 5.2.48. speaches
- 5.2.49. stt-provider
- 5.2.50. supabase
- 5.2.51. supavisor
- 5.2.52. tei-reranker
- 5.2.53. tempo
- 5.2.54. tika
- 5.2.55. trino
- 5.2.56. trueforge
- 5.2.57. tts-provider
- 5.2.58. verba
- 5.2.59. vllm-metal
- 5.2.60. weaviate
- 5.2.61. zeppelin
- 5.3. Provider And Extension Guides
- 6. Configuration
- 7. Operations
- 8. Architecture
- 9. Development
- 10. Reference