- Đăng vào
Cài đặt và thiết lập Backstage trên Kubernetes với Argo CD
Gần đây, trong quá trình làm việc mình bắt đầu tham gia vào việc phát triển Internal Developer Portal (IDP), là một nền tảng tập trung giúp đơn giản hóa quy trình phát triển phần mềm trong nội bộ tổ chức, cung cấp cho developer các công cụ, tài nguyên và thông tin cần thiết để xây dựng, triển khai và vận hành ứng dụng một cách hiệu quả.
Với quan điểm tận dụng những giải pháp mã nguồn mở, nằm trong các dự án của CNCF minh đã chọn Backstage để xây dựng IDP phục vụ công việc cho dự án.
Sau đây mình sẽ giới thiệu cách deploy nó trên Kuberetes bằng Argo CD
Giới thiệu
Backstage là một nền tảng developer portal mã nguồn mở được phát triển bởi Spotify, giúp các tổ chức quản lý, xây dựng và vận hành hệ sinh thái phần mềm một cách hiệu quả. Backstage cung cấp một cổng thông tin tập trung để phát triển, quản lý và tài liệu hóa các dịch vụ, thư viện, API và tài nguyên công nghệ khác.

Backstage cung cấp sẵn một GitHub repository chứa toàn bộ source code demo, bây giờ mình sẽ dùng nó để deploy. Source code The Backstage demo deployment
Build docker image cho Backstage
Chúng ta clone source code ở trên và build docker image, để cho tiện, mình đẩy lên DockerHub với repo tên nvtienanh/backstage
git clone https://github.com/backstage/demo
cd demo
docker image build . -t nvtienanh/backstage --build-arg ENVIRONMENT_CONFIG=production
docker push nvtienanh/backstage
Deploy Backstage
Việc deploy Backstage đòi hỏi cần sử dụng Postgres databse, trong nhiều bài viết trước mình đã có giới thiệu về CloudNative-PG dùng để triển khai Postgres trên Kubernetes. Xem thêm tại đây: Sử dụng ArgoCD triển khai giải pháp database trên Kubernetes với CloudNative-PG
Dưới đây sẽ là Argo CD đùng để tạo database cho Backstage
Backstage Postgres database
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: backstage-db
namespace: argocd
finalizers:
- resources-finalizer.argocd.argoproj.io
labels:
name: postgresql
spec:
project: default
syncPolicy:
automated:
prune: true
selfHeal: true
allowEmpty: false
syncOptions:
- Validate=false
- CreateNamespace=true
- PrunePropagationPolicy=foreground
- PruneLast=true
- RespectIgnoreDifferences=true
- Replace=true
sources:
- chart: cluster
repoURL: https://cloudnative-pg.github.io/charts
targetRevision: 0.*
helm:
releaseName: backstage-db
passCredentials: false
parameters:
- name: "fullnameOverride"
value: "pgsql"
- name: "version.postgresql"
value: "16"
forceString: true
- name: "cluster.instances"
value: "1"
- name: "cluster.storage.storageClass"
value: "nfs-csi"
- name: "cluster.walStorage.storageClass"
value: "nfs-csi"
- name: "cluster.walStorage.enabled"
value: "true"
- name: "cluster.monitoring.enabled"
value: "true"
- name: "cluster.roles[0].name"
value: "backstage"
- name: "cluster.roles[0].superuser"
value: "true"
- name: "cluster.roles[0].login"
value: "true"
- name: "cluster.initdb.database"
value: "backstage"
- name: "cluster.initdb.owner"
value: "backstage"
- name: "cluster.initdb.secret.name"
value: "db-admin-creds"
# Disale Backup in development
- name: "backups.enabled"
value: "false"
- repoURL: https://github.com/nvtienanh/argocd-applications
targetRevision: HEAD
path: backstage/manifests/db
destination:
server: https://kubernetes.default.svc
namespace: backstage
revisionHistoryLimit: 3
Backstage applications
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: backstage-app
namespace: argocd
finalizers:
- resources-finalizer.argocd.argoproj.io
labels:
name: backstage
spec:
project: default
syncPolicy:
automated:
prune: true
selfHeal: true
allowEmpty: false
syncOptions:
- Validate=false
- CreateNamespace=true
- PrunePropagationPolicy=foreground
- PruneLast=true
- RespectIgnoreDifferences=true
sources:
- chart: backstage
repoURL: https://backstage.github.io/charts
targetRevision: 2.*
helm:
releaseName: backstage
passCredentials: false
parameters:
# Ingress
- name: "ingress.enabled"
value: "true"
- name: "ingress.className"
value: "nginx"
- name: "ingress.annotations.cert-manager\\.io/cluster-issuer"
value: "letsencrypt-prod"
- name: "ingress.host"
value: "idp.nvtienanh.info"
- name: "ingress.tls.enabled"
value: "true"
- name: "ingress.tls.secretName"
value: "backstage-tls"
# Backstage
- name: "backstage.revisionHistoryLimit"
value: "3"
- name: "backstage.image.registry"
value: "docker.io"
- name: "backstage.image.repository"
value: "nvtienanh/backstage"
- name: "backstage.image.tag"
value: "latest"
- name: "backstage.extraEnvVarsSecrets[0]"
value: "backstage-db-creds"
- name: "backstage.extraEnvVarsSecrets[1]"
value: "app-secrets"
- name: "backstage.extraAppConfig[0].configMapRef"
value: "app-config"
- name: "backstage.extraAppConfig[0].filename"
value: "main.yaml"
- repoURL: https://github.com/codemauvn/gitops
targetRevision: HEAD
path: deploys/backstage/manifests/app
destination:
server: https://kubernetes.default.svc
namespace: backstage
revisionHistoryLimit: 3
Sau khi apply các file yaml, trên giao diện của Argo CD

Còn đây là, kết quả là Backstage đã lên như vậy

Kết luận
- Hiện tại mình chưa thêm phần SSO vào nên user mặc định là guest, tức là ai cũng có quyền truy cập. Săp tới mình sẽ hướng dẫn tích hợp SSO bằng EntraID trong bài viết khác
- Toàn bộ file YAML có thể tìm lại đây: https://github.com/nvtienanh/argocd-applications
Chúc thành công,
ANH NGUYỄN