Exordos MetaPaaS
Single control-plane runtime hosting many PaaS types as installable plugins.
Instead of deploying a new VM + database for each PaaS service (s3, mail, database, etc.), MetaPaaS runs one shared control-plane that manages them all. A new PaaS is an installable plugin, not a new control-plane node — only data-plane instances are launched per service instance.
Quick Start
Build
make build
# Produces: output/exordos-metapaas.raw.zst, output/manifests/metapaas.yaml
Install to Exordos Core
exordos -e http://10.20.0.2:11010 -u admin -p <password> \
ee install metapaas --version <version>
The element is resolved by name across the repositories registered in the core (the official one is registered at bootstrap). To install from another repository (e.g. a local mirror), register it first with a higher priority:
exordos -e http://10.20.0.2:11010 -u admin -p <password> \
repo add -p <project-uuid> -n local-mirror \
--repo-url http://10.20.0.1:8081/exordos-elements/ --priority 4096
Create a PaaS Instance
Once metapaas is deployed, install a plugin (e.g., s3aas):
exordos -e http://10.20.0.2:11010 -u admin -p <password> \
ee install s3aas --version 0.0.5
Then create an instance via the metapaas-cp REST API:
curl -X POST http://metapaas-cp:8080/v1/types/s3/instances \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer <token>' \
-d '{
"name": "s3-prod",
"version": "0.0.1",
"bucket_name": "data",
"encryption": "aes256"
}'
Documentation
For Platform Users
- DESIGN.md — Architecture, why this approach, solved decisions
For PaaS Plugin Developers
- HOW_TO_BUILD_NEW_PAAS.md — Complete guide: 9 steps from architecture to deployment
- Control Plane (CP): SQLAlchemy models, REST controllers, IAM setup
- Data Plane (DP): Packer image config, health checks, systemd units
- Build config, manifest template, tests, CI/CD
- Examples: mail-aas (Postfix+Dovecot), database-aas patterns
- Checklist + troubleshooting
Reference Plugins
- ../exordos_s3/ — Production s3aas plugin (validated, fully featured)
- ../exordos_mail/ — Blueprint mail-aas plugin (validates framework is service-agnostic)
- ./metapaas_demo/ — Demo plugin (bundled in runtime, minimal example)
Architecture
exordos_core (user-facing)
↓
exordos_metapaas-cp (single shared control-plane)
├─ user-api (REST endpoints: /v1/types/<slug>/instances)
├─ orch-api (orchestration, node lifecycle)
├─ status-api (monitoring, node status)
└─ PostgreSQL (shared database for all plugins)
├─ s3_instances, s3_buckets, ...
├─ mail_instances, mail_users, ...
└─ plugin_migrations (each plugin versions independently)
↓
data-plane nodes (s3-dp, mail-dp, db-dp, ...)
↓
actual services (RustFS, Postfix, PostgreSQL, ...)
Key insight: Plugin = pip package with CP code + manifest + DP image. No new CP VM, no new database — just install and go.
Building Your First Plugin
- Read HOW_TO_BUILD_NEW_PAAS.md
- Copy structure from ../exordos_mail/ (simple, well-commented)
- Follow the 9 steps: models → controllers → IAM → DP image → manifest → build → tests
- Validate against the checklist
- Deploy and test
Development
Unit Tests
tox -e py312
Linting & Type Checking
tox -e ruff-check
tox -e mypy
Full Test Matrix
tox
Plugin Installation Mechanism
When a PaaS element is installed in exordos_core:
- PluginReconciler (running on metapaas-cp) detects new element
- Fetches the CP wheel from the pip index (registry URL from element spec)
- Installs wheel on metapaas-cp with
pip install --upgrade - Discovers the plugin via entry-point:
[project.entry-points."exordos_metapaas.plugins"] - Registers REST routes, models, migrations
- Applies any pending database migrations (cross-project safe via UUID-keyed tracking)
- Reloads metapaas-cp services to pick up new routes
Data-plane nodes are provisioned per instance as the plugin's CP controllers orchestrate them.
Troubleshooting
Plugin not appearing in API
Check PluginReconciler logs on metapaas-cp:
exordos -e http://10.20.0.2:11010 -u admin -p <pass> \
cn exec metapaas-cp -- \
journalctl -u metapaas-plugin-reconciler -f
Cannot create instance
Verify metapaas-cp is reachable and user has credentials:
curl -s http://metapaas-cp:8080/v1/types/ -H 'Authorization: Bearer <token>' | jq .
Data-plane nodes stuck in CREATING
Check orchestration (orch-api) and agent logs on metapaas-cp:
exordos -e http://10.20.0.2:11010 -u admin -p <pass> \
cn exec metapaas-cp -- \
tail -f /var/log/orch-api.log
Standards
- Python: 3.10+
- Testing: pytest, tox, coverage
- Code style: ruff (fmt + check), mypy
- Database: SQLAlchemy 2.0+, PostgreSQL 13+
- Container format: Packer → Zstandard-compressed raw image
License
Proprietary — Exordos
Release files for exordos-metapaas 1.2.4
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| exordos_metapaas-1.2.4.tar.gz | 200.5 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| exordos_metapaas-1.2.4-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 250.3 kB
Release files / exordos_metapaas-1.2.4.tar.gz
| Download URL | exordos_metapaas-1.2.4.tar.gz |
|---|---|
| Size | 200.5 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
887a431b09eda3837bf48a93e68a2791b35aa28944cae90881a2fe9d3c17dd85
|
|
BLAKE2b-256 checksum How to use checksums |
a1f80024da887f60766ee59db055a14d09d8162d8b250d5adaca7d5d908fe106
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 26, 2026.
Transparency logRelease files / exordos_metapaas-1.2.4-py3-none-any.whl
| Download URL | exordos_metapaas-1.2.4-py3-none-any.whl |
|---|---|
| Size | 49.8 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
ceee309b418e352ce0bf8b7efbcc8feaf2c74c2e028319844c24aa321d602117
|
|
BLAKE2b-256 checksum How to use checksums |
ef7e6cbf4b93be157d9a4a37b49bf176d46207e58a74051e063212782a8ad446
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 26, 2026.
Transparency log