MetaPaaS runtime for Exordos Core — single control-plane hosting many PaaS types as plugins
Project description
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 0.0.7 --repository https://repo.exordos.com/exordos-elements
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.1 --repository https://repo.exordos.com/exordos-elements
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
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file exordos_metapaas-0.0.1.tar.gz.
File metadata
- Download URL: exordos_metapaas-0.0.1.tar.gz
- Upload date:
- Size: 166.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
73a38d047bfd58fc7e6aeb71f9ee7b421241608ab02b5218197e6b6aca698142
|
|
| MD5 |
344d9ffdc4270ca4e300d519f6a7c79c
|
|
| BLAKE2b-256 |
5705fbdd2a02fe75f2746e81c8252ffd7c190d6f13a8bed4352545754f5bc045
|
Provenance
The following attestation bundles were made for exordos_metapaas-0.0.1.tar.gz:
Publisher:
publish-to-pypi.yml on exordos/exordos_metapaas
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
exordos_metapaas-0.0.1.tar.gz -
Subject digest:
73a38d047bfd58fc7e6aeb71f9ee7b421241608ab02b5218197e6b6aca698142 - Sigstore transparency entry: 1735559839
- Sigstore integration time:
-
Permalink:
exordos/exordos_metapaas@050137f7766c00a68f9b7390e0238cbd94e568d4 -
Branch / Tag:
refs/tags/0.0.1 - Owner: https://github.com/exordos
-
Access:
private
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish-to-pypi.yml@050137f7766c00a68f9b7390e0238cbd94e568d4 -
Trigger Event:
push
-
Statement type:
File details
Details for the file exordos_metapaas-0.0.1-py3-none-any.whl.
File metadata
- Download URL: exordos_metapaas-0.0.1-py3-none-any.whl
- Upload date:
- Size: 49.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
827198938e99d8be8b530e2ded13fab7e2c1ecd07db61f995cb0ca6a2d421496
|
|
| MD5 |
45819b67280991cace50a8f4328dedd4
|
|
| BLAKE2b-256 |
caa7a3950b3cc829734b14e40f9bd85056af40c8d80b89e94e963d1e88c51d16
|
Provenance
The following attestation bundles were made for exordos_metapaas-0.0.1-py3-none-any.whl:
Publisher:
publish-to-pypi.yml on exordos/exordos_metapaas
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
exordos_metapaas-0.0.1-py3-none-any.whl -
Subject digest:
827198938e99d8be8b530e2ded13fab7e2c1ecd07db61f995cb0ca6a2d421496 - Sigstore transparency entry: 1735559887
- Sigstore integration time:
-
Permalink:
exordos/exordos_metapaas@050137f7766c00a68f9b7390e0238cbd94e568d4 -
Branch / Tag:
refs/tags/0.0.1 - Owner: https://github.com/exordos
-
Access:
private
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish-to-pypi.yml@050137f7766c00a68f9b7390e0238cbd94e568d4 -
Trigger Event:
push
-
Statement type: