핵심 요약
회사 규모가 커지면 "이 서비스는 누가 운영하지?", "어떻게 새 서비스 시작하지?", "문서는 어디 있지?" 가 일상이 된다. Backstage는 이 모든 답을 한 페이지로 모은 개발자 포털 (Internal Developer Portal·IDP).
- Spotify에서 만들고 CNCF Incubating
- 2026년 시점 1만+ 회사 운영
- 핵심 4축: Catalog, Docs, Templates, Plugins
1. 무엇을 해결하나
| 문제 | Backstage 답 |
|---|---|
| 이 서비스 누가 운영? | Catalog의 owner 필드 |
| 새 서비스 어떻게 시작? | Software Template으로 자동 scaffolding |
| 문서 어디? | TechDocs (Markdown → 사이트) |
| 모니터링·CI 상태? | 각 서비스 카드에 통합 표시 |
| 의존성 관계? | System·Component 다이어그램 |
2. Day 1~3 — 셋업
npx @backstage/create-app@latest --skip-install
cd my-portal
yarn install
# 데이터베이스 (PostgreSQL)
# config: app-config.yaml
backend:
database:
client: pg
connection:
host: postgres
database: backstage
user: ...
password: ...
# 시작
yarn dev
# http://localhost:30003. Day 4~7 — Service Catalog
모든 서비스를 catalog-info.yaml로 등록.
# catalog-info.yaml (서비스 저장소 루트)
apiVersion: backstage.io/v1alpha1
kind: Component
metadata:
name: order-service
description: 주문 처리 서비스
annotations:
github.com/project-slug: myorg/order-service
pagerduty.com/service-id: P12345
grafana.com/dashboard-selector: app=order-service
tags: ['backend', 'tier1']
spec:
type: service
lifecycle: production
owner: payment-team
system: orders
dependsOn:
- resource:postgres-orders
- component:user-service# GitHub 자동 등록
# app-config.yaml
catalog:
providers:
github:
myorg-repos:
organization: 'myorg'
catalogPath: '/catalog-info.yaml'
schedule:
frequency: PT5M5분 간격으로 모든 repo 스캔, catalog-info.yaml 발견 시 자동 등록.
4. Day 8~14 — TechDocs
# 서비스 저장소 구조
├── catalog-info.yaml
├── mkdocs.yml
└── docs/
├── index.md
├── architecture.md
└── runbook.md
# catalog-info.yaml
metadata:
annotations:
backstage.io/techdocs-ref: dir:.
# Backstage가 자동으로 build·serveMarkdown 문서가 자동으로 검색 가능한 사이트로. 코드와 함께 docs도 PR로 관리.
5. Day 15~21 — Software Templates
# template.yaml
apiVersion: scaffolder.backstage.io/v1beta3
kind: Template
metadata:
name: nodejs-microservice
title: Node.js 마이크로서비스
spec:
parameters:
- title: 기본 정보
properties:
name: { type: string }
owner: { type: string, ui:field: OwnerPicker }
steps:
- id: fetch
action: fetch:template
input:
url: ./skeleton
values: { name: ${{ parameters.name }} }
- id: publish
action: publish:github
input:
repoUrl: github.com?owner=myorg&repo=${{ parameters.name }}
- id: register
action: catalog:register
input:
repoContentsUrl: ${{ steps.publish.output.repoContentsUrl }}
catalogInfoPath: /catalog-info.yaml"Create Component" 버튼 클릭 → 양식 작성 → GitHub repo 자동 생성 + Catalog 등록 + CI 설정 + 첫 PR 자동 생성.
6. Day 22~30 — 통합 플러그인
핵심 플러그인 5개
# GitHub Actions
yarn add @backstage/plugin-github-actions
# Kubernetes (Pod 상태)
yarn add @backstage/plugin-kubernetes
# Grafana 임베드
yarn add @backstage/plugin-grafana
# PagerDuty
yarn add @backstage/plugin-pagerduty
# Cost Insights (FinOps)
yarn add @backstage/plugin-cost-insights각 서비스 카드에 통합 표시
- 최근 deployments (GitHub Actions)
- 현재 Pod 상태 (Kubernetes)
- 대시보드 임베드 (Grafana)
- 온콜 정보 (PagerDuty)
- 이번 달 비용
7. 인증·RBAC
# app-config.yaml
auth:
providers:
github:
development:
clientId: ...
clientSecret: ...
signIn:
resolvers:
- resolver: usernameMatchingUserEntityName
# RBAC
permission:
enabled: true
rbac:
admin:
users:
- user:default/admin@company.com8. 검색 통합
# Postgres 기반 검색 (간단)
# 또는 ElasticSearch (대규모)
search:
pg:
highlightOptions:
preTag: '<mark>'
postTag: '</mark>'Catalog·TechDocs·플러그인 데이터 모두 통합 검색. 단축키 Cmd+K.
9. Software Catalog 시각화
System·Component 관계가 자동 다이어그램. 의존성 추적·영향도 분석에 강력.
10. 운영 — production 베스트 프랙티스
- PostgreSQL HA — Backstage가 SPOF 되면 안 됨
- Backstage 자체도 Kubernetes에 deploy
- 매일 catalog 동기화 + drift 알림
- plugin은 신중하게 — 너무 많으면 UX 저하
- 커스텀 plugin은 monorepo 내부 packages/
11. 도입 효과 (실측, 100+ 서비스 회사)
| 지표 | before | after |
|---|---|---|
| 새 서비스 시작 시간 | 2~4시간 | 10분 |
| 온콜 응답 (소유자 확인) | 15분 | 1분 |
| 문서 발견 시간 | 20분 | 30초 |
| 온보딩 시간 (신입) | 2주 | 3일 |
12. 대안
| 도구 | 특징 |
|---|---|
| Backstage | 가장 풍부, customization 강함, 운영 부담 |
| Port | SaaS, 빠른 시작, 비용 |
| OpsLevel | SaaS, scorecard 강함 |
| Cortex | SaaS, service maturity |

댓글 0