Developer Portals and Backstage

📖 Introduction

The first time I saw Backstage in action at a conference demo, I thought it was just another fancy dashboard. But after implementing it as an Internal Developer Portal (IDP) for a platform team, I realized it's much more—it's the front door to your entire engineering ecosystem. A well-configured IDP reduces the friction between "I need to ship something" and "it's deployed and observable."

Backstage, open-sourced by Spotify in 2020 and now a CNCF incubating project, has become the de facto standard for Internal Developer Portals. In this article, we'll build an IDP backed by GitHub, ArgoCD, Kubernetes, Prometheus, and Grafana—giving developers a single interface to discover, create, deploy, and observe services.


🎯 What Is an Internal Developer Portal (IDP)?

Definition

An Internal Developer Portal (IDP) is a centralized web application that provides developers with everything they need to discover, create, deploy, and observe software components within an organization. The key word is internal—an IDP is opinionated around your organization's specific toolchain and golden paths.

Backstage vs Generic Developer Portal: A generic developer portal is just a website. An IDP built with Backstage is the front-end to your entire platform—it surfaces GitHub repos, triggers ArgoCD deployments, shows Kubernetes workload health, and brings Grafana dashboards into a single pane of glass.

spinner

Core Capabilities

Capability
Description
Value
Integrated Tool

Software Catalog

Inventory of all software components

"What exists and who owns it?"

GitHub

Software Templates

Scaffolding for new projects

"How do I start something new?"

GitHub + ArgoCD

TechDocs

Documentation alongside code

"How do I use this?"

GitHub

Kubernetes Plugin

Workload visibility per component

"Is my service healthy?"

Kubernetes

ArgoCD Plugin

GitOps deployment status

"What's deployed and where?"

ArgoCD

Grafana/Prometheus

Metrics and dashboards

"How is my service performing?"

Prometheus + Grafana

Search

Find anything across the org

"Where is what I need?"


🏗️ Backstage Architecture

High-Level Overview

spinner

Core Components


🌐 IDP Stack Architecture

Backstage acts as the single pane of glass in front of your entire platform. In our stack, every service deployed to Kubernetes is created via a GitHub repository, promoted through ArgoCD, and observed via Prometheus and Grafana—all surfaced through Backstage.

spinner

How Each Tool Maps to Backstage

Tool
Backstage Integration
What Developers See

GitHub

Catalog ingestion, Scaffolder publisher

Repo link, CI status, PRs

GitHub Actions

github-actions plugin

Workflow runs per component

ArgoCD

argocd plugin

Sync status, health, revision

Kubernetes

kubernetes plugin

Pods, events, logs per service

Prometheus

prometheus plugin

Alert status, custom metrics

Grafana

grafana plugin

Embedded dashboards per component


📚 Software Catalog

Catalog Model

The catalog organizes entities using a well-defined model:

Entity Kinds

spinner

Entity Relationships

Catalog Processor (Python Example)


🛠️ Software Templates

Template Structure

Template Skeleton

Skeleton File Example


📖 TechDocs

Documentation as Code

TechDocs integrates documentation directly with your code using MkDocs:

TechDocs Annotation


🔄 ArgoCD Integration

ArgoCD is the GitOps delivery engine for our IDP. When a developer uses a Backstage Software Template to create a service, the scaffolder creates the GitHub repo and registers an ArgoCD Application—so the service is immediately deployable.

ArgoCD Application via Backstage Template

The template step that creates the ArgoCD Application (already shown in the scaffolder section above) triggers this resource in the cluster:

ArgoCD Plugin in Backstage

Add the ArgoCD plugin to surface deployment status directly on each catalog entity page:

Catalog Annotation for ArgoCD

Annotate your catalog-info.yaml to link the entity to its ArgoCD app:

End-to-End GitOps Flow

spinner

📊 Observability Integration (Prometheus & Grafana)

Every service in our IDP exposes metrics collected by Prometheus and visualized in Grafana. Backstage surfaces both—developers never need to leave the portal to check service health.

Kubernetes Plugin (Pod-Level Visibility)

Prometheus Plugin

Annotate services to bind Prometheus alerts and rules:

Grafana Plugin

Annotate services to link their Grafana dashboard:

Complete catalog-info.yaml for an IDP-managed Service


🔌 Plugins

Plugin Architecture

spinner
Plugin
Purpose
Integration

kubernetes

View K8s resources per component

Pods, events, logs, rollouts

argocd

GitOps deployment status

Sync state, health, revision history

github-actions

CI/CD visibility

Workflow runs, build status

prometheus

Metrics and alert status

Active alerts, custom metric graphs

grafana

Embedded dashboards

Per-service Grafana dashboards and alerts

pagerduty

Incident management

On-call info, active incidents

sonarqube

Code quality

Quality gates, issues

cost-insights

Cloud costs

Spending, trends

security-insights

Security posture

Vulnerabilities, compliance

Custom Plugin Example


🚀 Deployment Considerations

Production Architecture

This diagram shows the full production deployment of Backstage as an IDP alongside the platform tools it integrates with:

spinner

Kubernetes Deployment


✅ Best Practices

Catalog Management

  1. Automate discovery - Use GitHub discovery or similar

  2. Enforce ownership - Every entity must have an owner

  3. Keep it current - Automated health checks for stale entities

  4. Start simple - Add complexity gradually

Template Design

  1. Provide sensible defaults - Minimize required decisions

  2. Follow golden paths - Templates encode best practices

  3. Include everything - CI/CD, docs, monitoring from day one

  4. Test templates - Validate template output regularly

Adoption Strategy

  1. Start with catalog - Show value with visibility first

  2. Add templates gradually - One use case at a time

  3. Integrate existing tools - Don't replace, unify

  4. Gather feedback - Iterate based on developer needs


🔗 What's Next?

In Article 9: Platform APIs and Abstractions, we'll explore how to design and implement platform APIs using Kubernetes operators, Crossplane, and API-first design principles that integrate seamlessly with your Backstage IDP.


📚 References

Last updated