Transform your application deployments with a simple Python DSL
Celestra is a powerful Domain-Specific Language (DSL) that lets you define cloud-native applications using simple Python code and automatically generates production-ready Kubernetes manifests, Docker Compose files, Helm charts, and more.
Before (Traditional YAML):
# 100+ lines of complex YAML for a simple web app
apiVersion: apps/v1
kind: Deployment
metadata:
name: web-app
spec:
replicas: 3
selector:
matchLabels:
app: web-app
template:
metadata:
labels:
app: web-app
spec:
containers:
- name: web-app
image: web-server:latest
ports:
- containerPort: 8080
resources:
requests:
cpu: 500m
memory: 512Mi
limits:
cpu: 1000m
memory: 1Gi
# ... and much more YAML
After (Celestra):
from celestra import App
web_app = (App("web-app")
.image("web-server:latest")
.port(8080)
.resources(cpu="500m", memory="512Mi", cpu_limit="1000m", memory_limit="1Gi")
.replicas(3)
.expose())
# Generate everything
web_app.generate().to_yaml("./k8s/") # Kubernetes manifests
web_app.generate().to_docker_compose("./docker-compose.yml") # Local development
web_app.generate().to_helm_chart("./charts/") # Helm packaging
- π Python-First: Write infrastructure as code using familiar Python syntax
- π Multi-Format Output: Generate Kubernetes, Docker Compose, Helm, Kustomize from the same code
- π Production-Ready: Built-in security, monitoring, secrets management, and RBAC
- π Zero-Downtime Deployments: Blue-green, canary, and rolling update strategies
- π§ Extensible: Plugin system for custom requirements and integrations
- π‘ Developer Friendly: Start with Docker Compose, deploy to Kubernetes seamlessly
π π Full Documentation - Complete guides, tutorials, and API reference
# install from PyPI
pip install celestra
# Or from source (recommended for development)
git clone https://github.com/sps014/celestra.git
cd celestra
pip install -e src/
# app.py
from celestra import App, StatefulApp, Secret
# Database with automatic backups
db = (StatefulApp("database")
.image("postgres:15")
.port(5432)
.storage("20Gi"))
# Database credentials
db_secret = (Secret("db-creds")
.add("username", "admin")
.add("password", "secure-password"))
# Web application
app = (App("blog")
.image("webapp:latest")
.port(8080)
.replicas(3)
.expose())
# Generate and deploy
app.generate().to_yaml("./k8s/")
db.generate().to_yaml("./k8s/")
db_secret.generate().to_yaml("./k8s/")
# Generate Kubernetes manifests
python app.py
# Deploy to Kubernetes
kubectl apply -f ./k8s/
Celestra abstracts Kubernetes complexity while maintaining full power:
βββββββββββββββββββ ββββββββββββββββββββ βββββββββββββββββββ
β Python DSL βββββΆβ Celestra Core βββββΆβ Output Files β
β β β β β β
β β’ Apps β β β’ Validation β β β’ Kubernetes β
β β’ StatefulApps β β β’ Templates β β β’ Docker Composeβ
β β’ Secrets β β β’ Plugins β β β’ Helm Charts β
β β’ Jobs β β β’ Optimization β β β’ Kustomize β
βββββββββββββββββββ ββββββββββββββββββββ βββββββββββββββββββ
from celestra import AppGroup, App, StatefulApp
platform = AppGroup("ecommerce")
# Shared infrastructure
database = StatefulApp("database").image("postgres:15").port(5432).storage("100Gi")
cache = StatefulApp("cache").image("redis:7").port(6379).storage("10Gi")
# Microservices
user_service = App("users").image("myorg/users:v1.0").port(8080)
product_service = App("products").image("myorg/products:v1.0").port(8081)
order_service = App("orders").image("myorg/orders:v1.0").port(8082)
platform.add([database, cache, user_service, product_service, order_service])
platform.generate().to_yaml("./k8s/")
from celestra import Job, CronJob
# One-time training job
training = (Job("model-training")
.image("ml-framework:latest")
.resources(cpu="4000m", memory="16Gi")
.timeout("6h"))
# Scheduled retraining
retrain = (CronJob("model-retrain")
.image("ml-framework:latest")
.schedule("0 2 * * 0") # Weekly
.resources(cpu="8000m", memory="32Gi"))
training.generate().to_yaml("./jobs/")
retrain.generate().to_yaml("./jobs/")
from celestra import App, StatefulApp, Secret, Service, Ingress
# Database
db_secret = Secret("db-secret").add("password", "secure-password")
database = (StatefulApp("database")
.image("postgres:15")
.port(5432)
.storage("50Gi")
.add_secrets([db_secret]))
# Backend API
api = (App("api")
.image("myapp/api:latest")
.port(8080)
.replicas(3)
.add_secrets([db_secret]))
# Frontend
frontend = (App("frontend")
.image("myapp/frontend:latest")
.port(80)
.replicas(2))
# Services
api_service = Service("api-service").add_app(api)
frontend_service = Service("frontend-service").add_app(frontend)
# Ingress
ingress = (Ingress("app-ingress")
.domain("myapp.com")
.route("/api", api_service)
.route("/", frontend_service))
# Generate all components
for component in [db_secret, database, api, frontend, api_service, frontend_service, ingress]:
component.generate().to_yaml("./k8s/")
- π Complete Documentation - Full documentation site
- π Getting Started - Installation and first steps
- π API Reference - Complete API documentation
- π― Examples - Real-world examples and tutorials
- π§ Components - All available components
- βοΈ Configuration - Configuration options
App
- Stateless applications (Deployments)StatefulApp
- Stateful applications (StatefulSets)AppGroup
- Group multiple applications together
Job
- One-time tasksCronJob
- Scheduled tasksLifecycle
- Lifecycle hooks
Service
- Service definitionsIngress
- Ingress controllersNetworkPolicy
- Network policies
Secret
- Secret managementServiceAccount
- Service accountsRole
/ClusterRole
- RBAC rolesRoleBinding
/ClusterRoleBinding
- RBAC bindingsSecurityPolicy
- Security policies
ConfigMap
- Configuration management
Observability
- Monitoring and loggingDeploymentStrategy
- Deployment strategiesCostOptimization
- Resource optimizationCustomResource
- Custom resource definitions
- No YAML Hell - Write infrastructure in Python
- Fast Iteration - Start local, deploy anywhere
- Type Safety - Catch errors before deployment
- **Familiar Syntax - If you know Python, you know Celestra
- Standardization - Consistent deployments across teams
- Security Built-in - RBAC, secrets, policies by default
- Multi-Environment - Dev, staging, prod from same code
- Observability Ready - Monitoring and logging included
- Reduced Complexity - Abstract Kubernetes details
- Faster Onboarding - Developers focus on business logic
- Cost Optimization - Built-in resource management
- Compliance Ready - Security and governance features
# Run comprehensive examples
cd src/examples
# Multiple ports showcase
python multiple_ports_showcase.py
# Enterprise validation demo
python enterprise_validation_demo.py
# Complete platform demo
python complete_platform_demo.py
# RBAC security demo
python rbac_security_demo.py
# Kubernetes YAML generation example
python kubernetes_yaml_generation_example.py
Celestra supports multiple output formats (Kubernetes, Docker Compose, Helm, etc.). Some methods are only meaningful for certain formats. Celestra will automatically warn you if you use a method that is not supported in your chosen output format!
.port_mapping(host_port, container_port, ...)
β Only for Docker Compose (host:container mapping).expose_port(port, ..., external_port=...)
β Only for Docker Compose
.node_selector({...})
β Only for Kubernetes (pod scheduling).tolerations([...])
β Only for Kubernetes (taints/tolerations)
.port(port)
β Works everywhere (container port).image(image)
β Works everywhere.replicas(n)
β Works everywhere.env(key, value)
β Works everywhere
- If you use
.port_mapping()
and generate Kubernetes YAML, you will see:β οΈ Method 'port_mapping()' is Docker Compose-specific and will be ignored in Kubernetes output. For Kubernetes, use 'port()' + 'Service' instead of 'port_mapping()'.
- If you use
.node_selector()
and generate Docker Compose, you will see:β οΈ Method 'node_selector()' is Kubernetes-specific and will be ignored in Docker Compose output.
You can mark your own methods as format-specific using built-in decorators:
from celestra import docker_compose_only, kubernetes_only, output_formats
@docker_compose_only
def my_compose_method(self, ...): ...
@kubernetes_only
def my_k8s_method(self, ...): ...
@output_formats('kubernetes', 'helm')
def my_multi_format_method(self, ...): ...
- For Docker Compose: Use
.port_mapping()
for host:container mapping - For Kubernetes: Use
.port()
and create aService
for exposure - Universal: Use
.port()
,.image()
,.replicas()
,.env()
, etc.
Celestra will always guide you with clear warnings and suggestions if you use a method in the wrong context!
We welcome contributions! Here's how to get started:
- Fork the repository
- Create a feature branch:
git checkout -b feature/amazing-feature
- Make your changes and add tests
- Run tests:
python run_tests.py
- Submit a pull request
See our Contributing Guide for detailed guidelines.
This project is licensed under the MIT License - see the LICENSE file for details.
# Install Celestra from source
git clone https://github.com/your-org/celestra.git
cd celestra
pip install -e src/
# Create your first application
cat > my_app.py << EOF
from celestra import App
app = (App("hello-world")
.image("nginxdemos/hello:latest")
.port(80)
.replicas(2)
.expose())
app.generate().to_yaml("./k8s/")
print("β
Kubernetes manifests generated in ./k8s/")
EOF
# Generate and deploy
python my_app.py
kubectl apply -f ./k8s/
Ready to simplify your Kubernetes deployments? Check out the complete documentation and join thousands of developers already using Celestra! π
Documentation β’ Examples β’ API Reference β’ Components
Made with β€οΈ by the Celestra community