تخطَّ إلى المحتوى

Backstage

منصة بوابة المطورين الداخلية مفتوحة المصدر من Spotify لإدارة كتالوج البرمجيات وتجربة المطور.

الأمرالوصف
npx @backstage/create-app@latestإنشاء تطبيق Backstage جديد
npx @backstage/create-app@latest --skip-installإنشاء تطبيق بدون تثبيت التبعيات
cd my-backstage-app && yarn installتثبيت التبعيات
yarn devبدء الواجهة الأمامية والخلفية في وضع التطوير
yarn startبدء الواجهة الأمامية فقط
yarn start-backendبدء الواجهة الخلفية فقط
yarn build:backendبناء الواجهة الخلفية للإنتاج
yarn buildبناء جميع الحزم
node_modules/.bin/backstage-cli --versionعرض إصدار CLI الخاص بـ Backstage
الأمرالوصف
yarn build:backend --config ../../app-config.yamlبناء الواجهة الخلفية مع التكوين
docker build -t backstage -f packages/backend/Dockerfile .بناء صورة Docker
docker run -p 7007:7007 backstageتشغيل حاوية Backstage
الأمرالوصف
yarn backstage-cli package startبدء حزمة في وضع التطوير
yarn backstage-cli package buildبناء حزمة
yarn backstage-cli package lintفحص الكود المصدري للحزمة
yarn backstage-cli package testتشغيل اختبارات الحزمة
yarn backstage-cli repo build --allبناء جميع الحزم في المستودع الأحادي
yarn backstage-cli repo lint --allفحص جميع الحزم
yarn backstage-cli versions:bumpتحديث تبعيات Backstage لأحدث إصدار
yarn backstage-cli versions:bump --release nextالتحديث للإصدار التجريبي التالي
yarn backstage-cli migrate package-rolesترحيل الحزم لاستخدام الأدوار
الأمرالوصف
yarn backstage-cli create-pluginإنشاء إضافة واجهة أمامية جديدة
yarn backstage-cli create-plugin --backendإنشاء إضافة واجهة خلفية جديدة
yarn backstage-cli create-plugin --id my-pluginإنشاء إضافة بمعرف محدد
yarn newإنشاء مكون تفاعلي من قالب
الأمرالوصف
إضافة catalog-info.yaml في جذر المستودعتسجيل مكون في الكتالوج
kind: Component في catalog-info.yamlتعريف مكون برمجي
kind: API في catalog-info.yamlتعريف كيان API
kind: System في catalog-info.yamlتعريف تجميع نظام
kind: Domain في catalog-info.yamlتعريف مجال عمل
kind: Resource في catalog-info.yamlتعريف مورد بنية تحتية
kind: Group في catalog-info.yamlتعريف فريق/مجموعة
kind: User في catalog-info.yamlتعريف مستخدم
kind: Location في catalog-info.yamlالإشارة إلى ملفات كتالوج أخرى
الأمرالوصف
تعيين spec.owner: team-nameتعيين ملكية الكيان
تعيين spec.lifecycle: productionتعيين مرحلة دورة حياة الكيان
تعيين spec.type: serviceتعيين نوع المكون (service، website، library)
تعيين spec.dependsOn: ['component:other']تعريف التبعيات
تعيين spec.providesApis: ['api-name']الإعلان عن واجهات API المقدمة
تعيين spec.consumesApis: ['api-name']الإعلان عن واجهات API المستهلكة
تعيين spec.system: system-nameالتعيين لنظام
تعيين metadata.annotations للتكاملاتالربط بـ CI/CD والمراقبة وغيرها
apiVersion: backstage.io/v1alpha1
kind: Component
metadata:
  name: payment-service
  description: يتعامل مع معالجة المدفوعات والفوترة
  annotations:
    github.com/project-slug: org/payment-service
    backstage.io/techdocs-ref: dir:.
    jenkins.io/job-full-name: payment-service/main
    pagerduty.com/service-id: PABC123
    sonarqube.org/project-key: org_payment-service
  tags:
    - java
    - payments
  links:
    - url: https://dashboard.example.com/payments
      title: لوحة المراقبة
      icon: dashboard
    - url: https://wiki.example.com/payment-service
      title: Wiki
spec:
  type: service
  lifecycle: production
  owner: team-payments
  system: billing
  providesApis:
    - payment-api
  consumesApis:
    - user-api
    - notification-api
  dependsOn:
    - resource:payments-db
    - component:auth-service
apiVersion: backstage.io/v1alpha1
kind: API
metadata:
  name: payment-api
  description: واجهة REST API لمعالجة المدفوعات
  tags:
    - rest
    - payments
spec:
  type: openapi
  lifecycle: production
  owner: team-payments
  system: billing
  definition: |
    openapi: "3.0.0"
    info:
      title: Payment API
      version: 1.0.0
    paths:
      /payments:
        post:
          summary: إنشاء دفعة
          responses:
            "201":
              description: تم إنشاء الدفعة
apiVersion: backstage.io/v1alpha1
kind: System
metadata:
  name: billing
  description: نظام الفوترة ومعالجة المدفوعات
spec:
  owner: team-payments
  domain: commerce
---
apiVersion: backstage.io/v1alpha1
kind: Domain
metadata:
  name: commerce
  description: مجال التجارة الإلكترونية يغطي الطلبات والمدفوعات والتسليم
spec:
  owner: group:engineering-leadership
الأمرالوصف
kind: Template في template.yamlتعريف قالب برمجي
تعيين spec.type: serviceالقالب ينشئ خدمة
تعيين spec.steps[] لإجراءات القالبتعريف خطوات التهيئة
action: fetch:templateجلب وعرض ملفات القالب
action: publish:githubنشر المستودع المُنشأ على GitHub
action: publish:github:pull-requestإنشاء PR بدلاً من مستودع جديد
action: catalog:registerتسجيل الكيان المُنشأ في الكتالوج
action: github:actions:dispatchتشغيل سير عمل GitHub Actions
استخدام ${{ parameters.name }} في القوالبالإشارة إلى معلمات إدخال المستخدم
تعيين spec.parameters[] لحقول النموذجتعريف نموذج إدخال القالب
استخدام ui:widget: textarea في المعلماتتخصيص عنصر حقل النموذج
apiVersion: scaffolder.backstage.io/v1beta3
kind: Template
metadata:
  name: microservice-template
  title: إنشاء خدمة مصغرة
  description: تهيئة خدمة مصغرة جديدة مع CI/CD والمراقبة والوثائق
  tags:
    - recommended
    - microservice
spec:
  owner: team-platform
  type: service
  parameters:
    - title: تفاصيل الخدمة
      required:
        - name
        - description
        - owner
      properties:
        name:
          title: اسم الخدمة
          type: string
          description: اسم فريد للخدمة
          ui:autofocus: true
          ui:options:
            rows: 5
        description:
          title: الوصف
          type: string
        owner:
          title: المالك
          type: string
          description: الفريق المالك لهذه الخدمة
          ui:field: OwnerPicker
          ui:options:
            catalogFilter:
              kind: Group
    - title: البنية التحتية
      properties:
        language:
          title: اللغة
          type: string
          enum: ["go", "java", "python", "typescript"]
          default: go
        database:
          title: قاعدة البيانات
          type: string
          enum: ["postgres", "mysql", "none"]
          default: postgres
        enableMonitoring:
          title: تفعيل المراقبة
          type: boolean
          default: true
  steps:
    - id: fetch-base
      name: جلب القالب الأساسي
      action: fetch:template
      input:
        url: ./skeleton
        values:
          name: ${{ parameters.name }}
          description: ${{ parameters.description }}
          owner: ${{ parameters.owner }}
          language: ${{ parameters.language }}
    - id: publish
      name: النشر على GitHub
      action: publish:github
      input:
        allowedHosts: ["github.com"]
        repoUrl: github.com?owner=my-org&repo=${{ parameters.name }}
        description: ${{ parameters.description }}
        defaultBranch: main
        repoVisibility: internal
    - id: register
      name: التسجيل في الكتالوج
      action: catalog:register
      input:
        repoContentsUrl: ${{ steps['publish'].output.repoContentsUrl }}
        catalogInfoPath: /catalog-info.yaml
  output:
    links:
      - title: المستودع
        url: ${{ steps['publish'].output.remoteUrl }}
      - title: فتح في الكتالوج
        icon: catalog
        entityRef: ${{ steps['register'].output.entityRef }}
الأمرالوصف
yarn add @backstage/plugin-catalogتثبيت إضافة الكتالوج
yarn add @backstage/plugin-techdocsتثبيت إضافة TechDocs
yarn add @backstage/plugin-kubernetesتثبيت إضافة Kubernetes
yarn add @backstage/plugin-github-actionsتثبيت إضافة GitHub Actions
yarn add @backstage/plugin-searchتثبيت إضافة البحث
yarn add @backstage/plugin-scaffolderتثبيت إضافة المُنشئ
yarn add @backstage/plugin-api-docsتثبيت إضافة وثائق API
yarn add @backstage/plugin-cost-insightsتثبيت إضافة رؤى التكاليف

تسجيل إضافات الواجهة الأمامية في packages/app/src/App.tsx:

import { CatalogGraphPage } from '@backstage/plugin-catalog-graph';
import { TechDocsReaderPage } from '@backstage/plugin-techdocs';
import { SearchPage } from '@backstage/plugin-search';

const routes = (
  <FlatRoutes>
    <Route path="/catalog" element={<CatalogIndexPage />} />
    <Route path="/catalog/:namespace/:kind/:name" element={<CatalogEntityPage />}>
      <EntityLayout>
        <EntityLayout.Route path="/" title="Overview">
          <EntityOverviewContent />
        </EntityLayout.Route>
        <EntityLayout.Route path="/api" title="API">
          <EntityApiContent />
        </EntityLayout.Route>
        <EntityLayout.Route path="/docs" title="Docs">
          <EntityTechDocsContent />
        </EntityLayout.Route>
      </EntityLayout>
    </Route>
    <Route path="/docs" element={<TechDocsReaderPage />} />
    <Route path="/search" element={<SearchPage />} />
    <Route path="/catalog-graph" element={<CatalogGraphPage />} />
  </FlatRoutes>
);

تسجيل إضافات الواجهة الخلفية في packages/backend/src/index.ts:

import { createBackend } from '@backstage/backend-defaults';

const backend = createBackend();

backend.add(import('@backstage/plugin-app-backend'));
backend.add(import('@backstage/plugin-catalog-backend'));
backend.add(import('@backstage/plugin-catalog-backend-module-github-org'));
backend.add(import('@backstage/plugin-scaffolder-backend'));
backend.add(import('@backstage/plugin-techdocs-backend'));
backend.add(import('@backstage/plugin-search-backend'));
backend.add(import('@backstage/plugin-search-backend-module-catalog'));
backend.add(import('@backstage/plugin-search-backend-module-techdocs'));
backend.add(import('@backstage/plugin-auth-backend'));
backend.add(import('@backstage/plugin-auth-backend-module-github-provider'));
backend.add(import('@backstage/plugin-kubernetes-backend'));

backend.start();
الأمرالوصف
npx @techdocs/cli serveمعاينة TechDocs محلياً
npx @techdocs/cli serve --docker-image techdocs-containerالتقديم باستخدام صورة Docker مخصصة
npx @techdocs/cli generateتوليد موقع TechDocs الثابت
npx @techdocs/cli generate --source-dir .التوليد من دليل محدد
npx @techdocs/cli publish --publisher-type googleGcsنشر TechDocs على GCS
npx @techdocs/cli publish --publisher-type awsS3نشر TechDocs على S3
إضافة تعليق backstage.io/techdocs-refتفعيل TechDocs للكيان
إنشاء دليل docs/ مع mkdocs.ymlإعداد مصدر TechDocs
تعيين techdocs.builder: 'local' في التكويناستخدام بانٍ TechDocs محلي
تعيين techdocs.builder: 'external' في التكويناستخدام بانٍ CI/CD خارجي
site_name: Payment Service
nav:
  - Home: index.md
  - Architecture: architecture.md
  - API Reference: api-reference.md
  - Runbooks:
      - Deployment: runbooks/deployment.md
      - Incident Response: runbooks/incident-response.md
plugins:
  - techdocs-core
markdown_extensions:
  - admonition
  - pymdownx.highlight
  - pymdownx.superfences
الأمرالوصف
yarn add @backstage/plugin-searchتثبيت واجهة البحث الأمامية
yarn add @backstage/plugin-search-backendتثبيت واجهة البحث الخلفية
yarn add @backstage/plugin-search-backend-module-catalogإضافة جامع بحث الكتالوج
yarn add @backstage/plugin-search-backend-module-techdocsإضافة جامع بحث TechDocs
تكوين محرك البحث في app-config.yamlإعداد Lunr أو Elasticsearch أو PgStore
تعيين search.pg في التكويناستخدام PostgreSQL للبحث
تعيين search.elasticsearch في التكويناستخدام Elasticsearch للبحث
الأمرالوصف
تحرير app-config.yamlملف التكوين الرئيسي
تحرير app-config.local.yamlتجاوزات التطوير المحلي
تحرير app-config.production.yamlتكوين الإنتاج
تعيين app.baseUrl في التكوينتكوين URL الواجهة الأمامية
تعيين backend.baseUrl في التكوينتكوين URL الواجهة الخلفية
تعيين backend.database في التكوينتكوين اتصال قاعدة البيانات
تعيين backend.cors.origin في التكوينتكوين أصول CORS
تعيين auth.providers في التكوينتكوين مزودي المصادقة
تعيين catalog.locations[] في التكوينإضافة مصادر كيانات الكتالوج
تعيين catalog.rules[] في التكوينتعريف قواعد التحقق من الكيانات
تعيين integrations.github[] في التكوينتكوين رمز تكامل GitHub
app:
  title: بوابة المطورين لشركتي
  baseUrl: http://localhost:3000

organization:
  name: شركتي

backend:
  baseUrl: http://localhost:7007
  listen:
    port: 7007
  cors:
    origin: http://localhost:3000
    methods: [GET, HEAD, PATCH, POST, PUT, DELETE]
  database:
    client: pg
    connection:
      host: ${POSTGRES_HOST}
      port: ${POSTGRES_PORT}
      user: ${POSTGRES_USER}
      password: ${POSTGRES_PASSWORD}

integrations:
  github:
    - host: github.com
      token: ${GITHUB_TOKEN}

auth:
  environment: development
  providers:
    github:
      development:
        clientId: ${GITHUB_CLIENT_ID}
        clientSecret: ${GITHUB_CLIENT_SECRET}

catalog:
  import:
    entityFilename: catalog-info.yaml
    pullRequestBranchName: backstage-integration
  rules:
    - allow: [Component, System, API, Resource, Location, Domain, Group, User]
  locations:
    - type: url
      target: https://github.com/my-org/backstage-catalog/blob/main/all-components.yaml
    - type: github-discovery
      target: https://github.com/my-org
    - type: github-org
      target: https://github.com/my-org

techdocs:
  builder: local
  generator:
    runIn: local
  publisher:
    type: local

kubernetes:
  serviceLocatorMethod:
    type: multiTenant
  clusterLocatorMethods:
    - type: config
      clusters:
        - url: ${K8S_CLUSTER_URL}
          name: production
          authProvider: serviceAccount
          serviceAccountToken: ${K8S_TOKEN}
العلاقةمنإلىالوصف
ownerOfGroup/UserComponent/APIالمجموعة تملك الكيان
ownedByComponent/APIGroup/Userالكيان مملوك للمجموعة
consumesApiComponentAPIالمكون يستخدم واجهة API
providesApiComponentAPIالمكون يكشف واجهة API
dependsOnComponentComponent/Resourceالمكون يعتمد على آخر
dependencyOfComponent/ResourceComponentهو تبعية لـ
partOfComponentSystemالمكون ينتمي للنظام
hasPartSystemComponentالنظام يحتوي على مكون
parentOfGroupGroupعلاقة الفريق الأب
childOfGroupGroupعلاقة الفريق الابن
memberOfUserGroupالمستخدم ينتمي للمجموعة
hasMemberGroupUserالمجموعة تحتوي على مستخدم
  1. استخدام catalog-info.yaml في كل مستودع — تأكد من تسجيل جميع الخدمات والمكتبات وواجهات API في الكتالوج للحصول على رؤية كاملة.

  2. تعيين ملكية ذات معنى — يجب أن يكون لكل كيان حقل owner يشير إلى Group صالح، مما يتيح المساءلة والتوجيه.

  3. إضافة تعليقات توضيحية غنية للكيانات — أضف تعليقات لـ CI/CD والمراقبة وPagerDuty والوثائق لجعل الكتالوج مركزاً حقيقياً.

  4. إنشاء قوالب للمسارات الذهبية — استخدم المُنشئ لتعريف طرق موحدة لإنشاء خدمات جديدة، مما يضمن الاتساق.

  5. تنفيذ TechDocs — احتفظ بالوثائق بجانب الكود باستخدام إضافة TechDocs وmkdocs.yml للوثائق الحية.

  6. استخدام اكتشاف GitHub — كوّن github-discovery في مواقع الكتالوج لاكتشاف وتسجيل المستودعات تلقائياً.

  7. نمذجة مؤسستك — عرّف Groups وUsers لتعكس هيكل فريقك، مما يتيح تتبع الملكية وصفحات الفرق.

  8. الحفاظ على app-config.yaml واعياً بالبيئة — استخدم app-config.local.yaml للتطوير ومتغيرات البيئة لأسرار الإنتاج.

  9. بناء نظام إضافات — أنشئ إضافات واجهة أمامية وخلفية مخصصة لتوسيع Backstage بأدوات مؤسستك المحددة.

  10. تعريف Systems وDomains — نمذج البنية عالية المستوى باستخدام Systems وDomains لمنح المطورين خريطة لمنصتك.