Skip to content

blissful-infra start

blissful-infra start <name> is the primary command. It creates a new project directory, generates all configuration, and boots the entire Docker Compose stack.

Terminal window
blissful-infra start <name> [options]

<name> must be lowercase alphanumeric with hyphens (e.g. my-app, fraud-detector, api-v2).

FlagShortDefaultDescription
--backend <backend>-bspring-bootBackend framework template
--frontend <frontend>-freact-viteFrontend framework template
--database <database>-dpostgresDatabase option
--plugins <plugins>-pComma-separated plugin list
--no-monitoringmonitoring onDisable Prometheus + Grafana
--link-lTemplate dev mode: skip copying, link to template sources
Terminal window
# Default stack (Spring Boot + React + Postgres)
blissful-infra start my-app
# FastAPI backend
blissful-infra start my-app --backend fastapi
# Postgres + Redis cache layer
blissful-infra start my-app --database postgres-redis
# AI/ML pipeline plugin
blissful-infra start my-app --plugins ai-pipeline
# Multiple plugins
blissful-infra start my-app --plugins ai-pipeline,agent-service
# Minimal stack (no monitoring overhead)
blissful-infra start my-app --no-monitoring --database none

Before creating anything, the CLI:

  • Verifies Docker Desktop is running (docker info)
  • Checks that required ports are free. If any port is in use, the command lists the conflicts and exits cleanly. You can stop the conflicting service or use blissful-infra down to stop a previous project.

Required ports (default stack):

PortService
3000Frontend
3001Grafana
3002Dashboard
8080Backend API
8081Jenkins
9090Prometheus
9092Kafka external listener
5432Postgres
6379Redis (with redis or postgres-redis)
16686Jaeger
3100Loki
5050Docker registry

If the shared Jenkins server is not already running, start boots it automatically. Jenkins is a shared service — it persists across projects and lives in ~/.blissful-infra/jenkins/.

The CLI creates the project directory and copies template files. {{PROJECT_NAME}} placeholders in all template files are replaced with the project name you provided. Conditional blocks like {{#IF_POSTGRES}} are resolved based on the --database flag, so the generated code only includes what your stack actually needs.

For the default spring-boot + react-vite + postgres stack, this creates:

  • backend/ — compiled Kotlin source, Gradle wrapper, Dockerfile, Jenkinsfile, Flyway migrations, JPA entities
  • frontend/ — React + Vite + TypeScript source, TailwindCSS config, Dockerfile
  • loki/ — Loki and Promtail configuration files
  • prometheus/ — Prometheus scrape config targeting backend:8080/actuator/prometheus
  • grafana/ — Datasource provisioning (Prometheus + Loki) and three pre-built dashboards
  • nginx.conf — Reverse proxy routing /api/ and /ws/ to the backend, everything else to the frontend
  • blissful-infra.yaml — Project configuration file
  • .gitignore

The CLI programmatically generates docker-compose.yaml based on your flags. Services included:

Always present: kafka, backend, frontend, nginx, jaeger, loki, promtail, dashboard

With postgres or postgres-redis: adds postgres

With redis or postgres-redis: adds redis

With --monitoring (default): adds prometheus, grafana

With --plugins ai-pipeline: adds clickhouse, mlflow, mage, and the AI pipeline service itself

All services have health checks and proper depends_on conditions so containers start in dependency order.

Runs docker compose up -d --build in the project directory. The backend Dockerfile includes the OpenTelemetry Java agent for automatic distributed tracing to Jaeger.

After containers start, the CLI registers the project as a Jenkins pipeline job pointing at the backend/Jenkinsfile. The job is created in a blissful-projects folder at http://localhost:8081/job/blissful-projects/job/<name>.

Once everything is running, the CLI prints all service URLs and opens the frontend and dashboard in your browser.

When the AI pipeline plugin is enabled, three additional data platform services start:

ServiceURLPurpose
AI Pipelinehttp://localhost:8090/docsFastAPI + scikit-learn classifier
ClickHousehttp://localhost:8123/playColumnar store for predictions
MLflowhttp://localhost:5001Experiment tracking + model registry
Magehttp://localhost:6789Visual data pipeline orchestrator

Use --link when developing the blissful-infra templates themselves. Instead of making a fully independent copy, the project is scaffolded and then you can use blissful-infra dev --templates <name> to sync template changes live into the running project. See blissful-infra dev for the full template development workflow.

Port conflict: The CLI lists which ports are occupied and which services own them, then exits without creating any files.

Docker not running: Clear error with instructions to start Docker Desktop.

Directory already exists: The CLI refuses to overwrite an existing directory. Use a different name or remove the old directory first.

Build failure: If docker compose up --build fails, the project directory is still created (so you can debug). The CLI prints the compose exit and suggests running docker compose up --build manually from the project directory to see the full output.