An MVP developer portal that demonstrates Platform Engineering practices with Backstage: a software catalog, ownership, TechDocs, API contracts and a Golden Path for Python microservices.
The portal is container-first: docker compose up --build starts Backstage,
PostgreSQL and Keycloak. Cloud integrations remain out of scope for this MVP.
- Software Catalog for
frontend-api,orders-api, andpayment-api - Domain, system, group, component, and API relationships
- TechDocs for the catalogued services
Create Python Microservicesoftware template- Generated FastAPI service skeleton with Docker, CI, tests, documentation, and catalog metadata
- Local-first execution with Yarn and Docker Compose
flowchart TD
Developer --> Backstage
Backstage --> Catalog[Software Catalog]
Backstage --> Templates[Software Templates]
Backstage --> TechDocs
Backstage --> APIs[API Catalog]
Templates --> GitRepository[Git repository]
GitRepository --> GitHubActions[GitHub Actions]
Catalog --> Frontend[frontend-api]
Catalog --> Orders[orders-api]
Catalog --> Payment[payment-api]
Backstage is the developer portal, catalog, self-service and documentation layer. It does not replace Git, CI/CD, Kubernetes, Terraform, observability or cloud providers; it connects developers to those capabilities.
The planned Create Python Microservice template asks for a service name,
description, owner and system. It creates a small FastAPI service with:
GET /healthandGET /- tests, Dockerfile and dependency manifest
- a GitHub Actions CI workflow (lint, tests and Docker build)
catalog-info.yaml,mkdocs.ymland starter TechDocs
This means a developer asks for a capability and receives an organization-wide standard path instead of manually assembling repository structure, CI, Docker, documentation and catalog metadata.
- In Backstage, select Create Python Microservice.
- Enter
inventory-api, its description, owner and system. - Generate the service structure and inspect
catalog-info.yaml. - Run the FastAPI service and tests.
- Open its TechDocs from the catalog.
The local publisher writes generated services to generated-services/ and
registers the generated catalog-info.yaml in the running catalog. GitHub
repository creation is intentionally optional and is not required for this
local flow.
After the local MVP: GitHub repository creation and authentication, Kubernetes and Argo CD plugins, Grafana/OpenTelemetry integration, EKS and AWS metadata, Terraform templates, scorecards, SLO/security/cost metadata, RBAC and production deployment.
The approved MVP scope and staged implementation plan live in
docs/prd/001-backstage-idp-mvp.md.
Prerequisite: Docker Desktop (or Docker Engine with the Compose plugin) must be running.
docker compose up --buildThe first build downloads the Backstage dependencies and can take several minutes.
When the services are ready, open http://localhost:7007, choose Sign in using
Keycloak, and use the local demo account crilsen / crilsen. Keycloak is
available at http://localhost:8080. These credentials and the local client
secret are for a disposable portfolio demo only; never expose this Compose
stack to a public network as-is.
Run in the background with make up (or docker compose up --build -d), inspect
logs with make logs, and stop the environment with make down. To remove the
local persisted data as well, run make clean (destructive).
The Compose stack contains:
backstage: the portal, catalog, Scaffolder and TechDocs backend on port 7007;postgres: the Backstage database, persisted in thepostgres-dataDocker volume;keycloak: local identity provider on port 8080, persisted inkeycloak-data.
make down stops containers without deleting the database or Keycloak realm.
make up starts them again. Generated TechDocs files are persisted in the
techdocs-data volume. The Markdown source stays versioned in docs/services/.
All runtime dependencies are containerized. Node and Yarn are only needed when developing the Backstage source outside the container.
The Compose file declares three named volumes:
| Volume | Stores | Removed by |
|---|---|---|
postgres-data |
Catalog, Scaffolder and Backstage plugin data | make clean |
keycloak-data |
Realm, users and login configuration | make clean |
techdocs-data |
Generated TechDocs output | make clean |
make down preserves these volumes. Use make clean only when intentionally
resetting the demo environment.
make install # build the container image
make up # build and start in background
make logs # follow all service logs
make down # stop containers and preserve data
make clean # stop and delete volumesTo run the generated service independently after creating it:
docker compose -f generated-services/inventory-api/compose.yaml up --buildThe generated service exposes GET /health and GET / on port 8000.
- Docker socket unavailable: start Docker Desktop, confirm
docker infoworks, then retrymake up. - Port 7007 or 8080 already in use: stop the process/container using the
port, or change the host-side port mapping in
docker-compose.yml. - Login fails after changing Keycloak data: run
make cleanandmake upto re-import the disposable realm and demo user. - Catalog still shows an old entity: restart the stack with
make downfollowed bymake up; static catalog locations may be cached by Backstage. - Template output already exists: remove only the generated test directory
generated-services/inventory-apiand run the template again.
The Keycloak account crilsen/crilsen, client secret and local admin account
admin/admin are demo credentials. Do not reuse them outside this local
portfolio environment.