{
  "title": "گزارش دستورات استقرار و خودکارسازی",
  "slug": "team/devops/deployment-execution-report",
  "url": "/docs/team/devops/deployment-execution-report",
  "frontmatter": {
    "layout": "doc",
    "title": "گزارش دستورات استقرار و خودکارسازی",
    "description": "گزارش دقیق تمامی دستورات اجرا شده برای استقرار پروداکشن به همراه فایل خودکارسازی Makefile",
    "version": "1.0.0",
    "status": "PRIVATE",
    "author": "Antigravity",
    "owner": "Devops Team",
    "created_at": "2026-06-17",
    "updated_at": "2026-06-17",
    "tags": "",
    "reviewers": ""
  },
  "sections": [
    {
      "level": 1,
      "heading": "گزارش دستورات استقرار و خودکارسازی",
      "content": "**Deployment Execution Report & Makefile Automation Blueprint**\n\n---"
    },
    {
      "level": 2,
      "heading": "۱. اقدامات انجام شده روی سرور پروداکشن (توسط کاربر)",
      "content": "اقداماتی که مستقیماً روی سرور عملیاتی اوبونتو (`ubuntu@63.177.99.79` با IP داخلی `172.31.42.183`) صورت گرفت:"
    },
    {
      "level": 3,
      "heading": "۱.۱. نصب و راه‌اندازی کلاستر سبک K3s",
      "content": "کلاستر سبک کوبرنتیز (K3s) با غیرفعال‌سازی پیش‌فرض Traefik (برای نصب نسخه سفارشی شده با Helm) راه‌اندازی شد."
    },
    {
      "level": 3,
      "heading": "۱.۲. استخراج Kubeconfig سالم",
      "content": "برای ایجاد دسترسی ایمن از سیستم محلی/سیستم CI/CD به کلاستر سرور، محتوای فایل دسترسی خوانده شده و به صورت Base64 فشرده شد:\n```bash\nsudo cat /etc/rancher/k3s/k3s.yaml | base64 -w 0\n```"
    },
    {
      "level": 3,
      "heading": "۱.۳. لود تصاویر بیلد شده در containerd (گام نهایی)",
      "content": "به دلیل استفاده از `Never` برای سیاست Pull تصاویر در چارت auth-service، تصاویر بیلد شده باید مستقیماً وارد زیرسیستم containerd کلاستر K3s شوند:\n```bash"
    },
    {
      "level": 1,
      "heading": "خروجی گرفتن از داکر محلی",
      "content": "docker save ghcr.io/nons/auth-service:latest -o auth-service.tar"
    },
    {
      "level": 1,
      "heading": "انتقال فایل tar به سرور و ایمپورت در containerd پروداکشن",
      "content": "sudo k3s ctr images import auth-service.tar\n```\n\n---"
    },
    {
      "level": 2,
      "heading": "۲. اقدامات انجام شده روی سیستم محلی (توسط دستیار)",
      "content": "تمامی دستوراتی که برای برقراری ارتباط، ساخت سکرت‌ها و استقرار چارت‌های Helm در فضای نام‌های مربوطه کلاستر پروداکشن اجرا شد:"
    },
    {
      "level": 3,
      "heading": "۲.۱. رمزگشایی و اصلاح Kubeconfig برای اتصال خارجی",
      "content": "با اجرای اسکریپت `decode.js` مقادیر Base64 رمزگشایی شده، آدرس سرور به IP عمومی تغییر یافت و با توجه به محدودیت TLS SAN گواهی پیش‌فرض کلاستر، قابلیت نادیده گرفتن بررسی CA فعال گردید:\n```bash\nnode decode.js\n```\n*خروجی تولید شده:* ایجاد فایل `kubeconfig-prod.yaml` با تغییر مقدار سرور به `https://63.177.99.79:6443` و افزودن `insecure-skip-tls-verify: true`."
    },
    {
      "level": 3,
      "heading": "۲.۲. ایجاد فضاهای نام (Namespaces) روی کلاستر پروداکشن",
      "content": "```bash\nkubectl --kubeconfig kubeconfig-prod.yaml create namespace nons-platform\nkubectl --kubeconfig kubeconfig-prod.yaml create namespace nons-system\n```"
    },
    {
      "level": 3,
      "heading": "۲.۳. تعریف سکرت‌های کوبرنتیز (Kubernetes Secrets)",
      "content": "تمام پسوردهای قوی، توکن‌ها و کلیدهای سشن در فضای نام `nons-platform` ثبت شدند:\n\n```bash"
    },
    {
      "level": 1,
      "heading": "1. سکرت دانلود تصاویر از رجیستری گیت‌هاب (docker-registry)",
      "content": "kubectl --kubeconfig kubeconfig-prod.yaml create secret docker-registry ghcr-pull \\\n  --docker-server=ghcr.io \\\n  --docker-username=\"<YOUR_GITHUB_USERNAME>\" \\\n  --docker-password=\"<YOUR_GHCR_PAT_TOKEN>\" \\\n  --namespace nons-platform"
    },
    {
      "level": 1,
      "heading": "2. اطلاعات ورود و پسورد دیتابیس PostgreSQL",
      "content": "kubectl --kubeconfig kubeconfig-prod.yaml create secret generic postgres-credentials \\\n  --from-literal=POSTGRES_USER=\"nons\" \\\n  --from-literal=POSTGRES_PASSWORD=\"OQg3i4DxQLvnkj45YQ8u0cp80Y0QFRPowtTmn14R71+uWTh4\" \\\n  --namespace nons-platform"
    },
    {
      "level": 1,
      "heading": "3. کلیدهای امنیتی داخلی Ory Kratos",
      "content": "kubectl --kubeconfig kubeconfig-prod.yaml create secret generic kratos-secrets \\\n  --from-literal=KRATOS_SECRET=\"185e07e2ab5d151613e390500ccc476a1c82c80f57bacfb9b5a34d8d556f97cc\" \\\n  --namespace nons-platform"
    },
    {
      "level": 1,
      "heading": "4. کلیدهای سرفصل سیستم و نمک رمزنگاری Ory Hydra",
      "content": "kubectl --kubeconfig kubeconfig-prod.yaml create secret generic hydra-secrets \\\n  --from-literal=HYDRA_SYSTEM_SECRET=\"ac852a2e4195e04f0379f9bc40170672a0115b700c256016a5ea8aa0f7fcc323\" \\\n  --from-literal=HYDRA_PAIRWISE_SALT=\"1d23bf3f3ccc8ff03b698068653b4352\" \\\n  --namespace nons-platform"
    },
    {
      "level": 1,
      "heading": "5. متغیرهای محیطی حساس سرویس واسط هویت (auth-service)",
      "content": "kubectl --kubeconfig kubeconfig-prod.yaml create secret generic auth-service-env \\\n  --from-literal=SESSION_SECRET=\"HVF7ButVKilinbXtuIGpgfyOeApqE8DH8D1IaqZZ04Khnuge\" \\\n  --from-literal=WEBHOOK_SECRET_TOKEN=\"33f5d286f3df7dd156be5f635c4f570c08dc0503c7d324fba3dd89239d47f9f5\" \\\n  --from-literal=OAUTH_CLIENT_ID=\"nons-client\" \\\n  --from-literal=OAUTH_CLIENT_SECRET=\"1dNRDxyzlLBL4gz2ShWkLyHYxV1Ryoy3ZqvVotLHSRIh2Q8G\" \\\n  --namespace nons-platform"
    },
    {
      "level": 1,
      "heading": "6. اطلاعات SMTP برای سیستم ارسال ایمیل Kratos",
      "content": "kubectl --kubeconfig kubeconfig-prod.yaml create secret generic kratos-smtp \\\n  --from-literal=SMTP_CONNECTION_URI=\"smtps://user:password@smtp.example.com:465/?skip_ssl_verify=false\" \\\n  --namespace nons-platform\n```"
    },
    {
      "level": 3,
      "heading": "۲.۴. آماده‌سازی باینری Helm",
      "content": "برای اجرای فرآیند استقرار در ویندوز، نسخه پرتابل Helm دانلود و در دایرکتوری محلی قرار گرفت:\n```powershell\nNew-Item -ItemType Directory -Force -Path temp_helm\nInvoke-WebRequest -Uri https://get.helm.sh/helm-v3.14.0-windows-amd64.zip -OutFile temp_helm\\helm.zip\nExpand-Archive -Path temp_helm\\helm.zip -DestinationPath temp_helm -Force\nMove-Item -Path temp_helm\\windows-amd64\\helm.exe -Destination temp_helm\\helm.exe -Force\n```"
    },
    {
      "level": 3,
      "heading": "۲.۵. اعمال تعاریف پایه شبکه (Traefik CRDs & RBAC)",
      "content": "قبل از استقرار API Gateway، ابتدا منابع سفارشی (`CustomResourceDefinitions`) و دسترسی‌های نقش گیت‌وی به کلاستر اعمال شد:\n```bash"
    },
    {
      "level": 1,
      "heading": "نصب CRDهای پیش‌فرض Traefik v3",
      "content": "kubectl --kubeconfig kubeconfig-prod.yaml apply -f https://raw.githubusercontent.com/traefik/traefik/v3.7/docs/content/reference/dynamic-configuration/kubernetes-crd-definition-v1.yml"
    },
    {
      "level": 1,
      "heading": "نصب مجوزهای دسترسی تراژیک",
      "content": "kubectl --kubeconfig kubeconfig-prod.yaml apply -f https://raw.githubusercontent.com/traefik/traefik/v3.7/docs/content/reference/dynamic-configuration/kubernetes-crd-rbac.yml\n```"
    },
    {
      "level": 3,
      "heading": "۲.۶. بیلد تصاویر میکروسرویس‌ها به صورت محلی",
      "content": "تصاویر میکروسرویس‌ها با داکر محلی ساخته شدند:\n```bash"
    },
    {
      "level": 1,
      "heading": "بیلد سرویس احراز هویت",
      "content": "docker build -t ghcr.io/nons/auth-service:latest -f services/auth-service/Dockerfile ."
    },
    {
      "level": 1,
      "heading": "بیلد هسته Go کنترل پلن",
      "content": "docker build -t ghcr.io/nons/core:latest -f core/Dockerfile core/\n```"
    },
    {
      "level": 3,
      "heading": "۲.۷. استقرار گام‌به‌گام چارت‌های Helm در پروداکشن",
      "content": "استقرار طبق ترتیب وابستگی‌های معماری به کلاستر سرور ارسال شد:\n\n```bash"
    },
    {
      "level": 1,
      "heading": "۱. استقرار پایگاه‌داده PostgreSQL",
      "content": ".\\temp_helm\\helm.exe upgrade --install postgres .\\nons-api\\deploy\\helm\\postgres -n nons-platform --kubeconfig kubeconfig-prod.yaml"
    },
    {
      "level": 1,
      "heading": "۲. استقرار کش و مدیریت نشست‌های Redis",
      "content": ".\\temp_helm\\helm.exe upgrade --install redis .\\nons-api\\deploy\\helm\\redis -n nons-platform --kubeconfig kubeconfig-prod.yaml"
    },
    {
      "level": 1,
      "heading": "۳. استقرار گذرگاه پیام‌رسان NATS JetStream",
      "content": ".\\temp_helm\\helm.exe upgrade --install nats .\\nons-api\\deploy\\helm\\nats -n nons-platform --kubeconfig kubeconfig-prod.yaml"
    },
    {
      "level": 1,
      "heading": "۴. استقرار سرویس مدیریت هویت Ory Kratos (شامل جاب pre-install مهاجرت جداول)",
      "content": ".\\temp_helm\\helm.exe upgrade --install kratos .\\nons-api\\deploy\\helm\\kratos -n nons-platform --kubeconfig kubeconfig-prod.yaml"
    },
    {
      "level": 1,
      "heading": "۵. استقرار سرویس OAuth2 پروتکل Ory Hydra (شامل جاب pre-install مهاجرت جداول)",
      "content": ".\\temp_helm\\helm.exe upgrade --install hydra .\\nons-api\\deploy\\helm\\hydra -n nons-platform --kubeconfig kubeconfig-prod.yaml"
    },
    {
      "level": 1,
      "heading": "۶. استقرار سرویس واسط احراز هویت auth-service",
      "content": ".\\temp_helm\\helm.exe upgrade --install auth-service .\\nons-api\\deploy\\helm\\auth-service -n nons-platform --kubeconfig kubeconfig-prod.yaml"
    },
    {
      "level": 1,
      "heading": "۷. استقرار درگاه ارتباطی API Gateway (Traefik v3)",
      "content": ".\\temp_helm\\helm.exe upgrade --install gateway .\\nons-api\\deploy\\helm\\gateway -n nons-system --kubeconfig kubeconfig-prod.yaml\n```\n\n---"
    },
    {
      "level": 2,
      "heading": "۳. فایل خودکارسازی استقرار (Makefile Blueprint)",
      "content": "شما می‌توانید با استفاده از قالب زیر، یک فایل به نام `Makefile` در روت پروژه ایجاد کنید تا تمام مراحل فوق را به صورت خودکار و تک‌دستوری اجرا نمایید:\n\n```makefile"
    },
    {
      "level": 1,
      "heading": "Makefile - NONS Production Deployment Automation",
      "content": ".PHONY: all bootstrap secrets crds deploy-infra deploy-identity deploy-apps clean status\n\nKUBECONFIG = kubeconfig-prod.yaml\nKUBECTL = kubectl --kubeconfig=$$(KUBECONFIG)\nHELM = ./temp_helm/helm.exe --kubeconfig=$$(KUBECONFIG)"
    },
    {
      "level": 1,
      "heading": "اطلاعات پیش‌فرض گیت‌هاب برای ریجستری",
      "content": "GH_USER ?= nons\nGH_PAT ?= your_personal_access_token_here\n\nall: bootstrap secrets crds deploy-infra deploy-identity deploy-apps status"
    },
    {
      "level": 1,
      "heading": "۱. راه‌اندازی پیش‌نیازها و نیم‌اسپیس‌ها",
      "content": "bootstrap:\n\t@echo \"Creating namespaces...\"\n\t$$(KUBECTL) create namespace nons-platform --dry-run=client -o yaml | $$(KUBECTL) apply -f -\n\t$$(KUBECTL) create namespace nons-system --dry-run=client -o yaml | $$(KUBECTL) apply -f -"
    },
    {
      "level": 1,
      "heading": "۲. ایجاد سکرت‌ها در کلاستر پروداکشن",
      "content": "secrets:\n\t@echo \"Creating Kubernetes secrets...\"\n\t-$$(KUBECTL) create secret docker-registry ghcr-pull \\\n\t\t--docker-server=ghcr.io \\\n\t\t--docker-username=\"$$(GH_USER)\" \\\n\t\t--docker-password=\"$$(GH_PAT)\" \\\n\t\t--namespace nons-platform -o yaml --dry-run=client | $$(KUBECTL) apply -f -\n\t-$$(KUBECTL) create secret generic postgres-credentials \\\n\t\t--from-literal=POSTGRES_USER=\"nons\" \\\n\t\t--from-literal=POSTGRES_PASSWORD=\"OQg3i4DxQLvnkj45YQ8u0cp80Y0QFRPowtTmn14R71+uWTh4\" \\\n\t\t--namespace nons-platform -o yaml --dry-run=client | $$(KUBECTL) apply -f -\n\t-$$(KUBECTL) create secret generic kratos-secrets \\\n\t\t--from-literal=KRATOS_SECRET=\"185e07e2ab5d151613e390500ccc476a1c82c80f57bacfb9b5a34d8d556f97cc\" \\\n\t\t--namespace nons-platform -o yaml --dry-run=client | $$(KUBECTL) apply -f -\n\t-$$(KUBECTL) create secret generic hydra-secrets \\\n\t\t--from-literal=HYDRA_SYSTEM_SECRET=\"ac852a2e4195e04f0379f9bc40170672a0115b700c256016a5ea8aa0f7fcc323\" \\\n\t\t--from-literal=HYDRA_PAIRWISE_SALT=\"1d23bf3f3ccc8ff03b698068653b4352\" \\\n\t\t--namespace nons-platform -o yaml --dry-run=client | $$(KUBECTL) apply -f -\n\t-$$(KUBECTL) create secret generic auth-service-env \\\n\t\t--from-literal=SESSION_SECRET=\"HVF7ButVKilinbXtuIGpgfyOeApqE8DH8D1IaqZZ04Khnuge\" \\\n\t\t--from-literal=WEBHOOK_SECRET_TOKEN=\"33f5d286f3df7dd156be5f635c4f570c08dc0503c7d324fba3dd89239d47f9f5\" \\\n\t\t--from-literal=OAUTH_CLIENT_ID=\"nons-client\" \\\n\t\t--from-literal=OAUTH_CLIENT_SECRET=\"1dNRDxyzlLBL4gz2ShWkLyHYxV1Ryoy3ZqvVotLHSRIh2Q8G\" \\\n\t\t--namespace nons-platform -o yaml --dry-run=client | $$(KUBECTL) apply -f -\n\t-$$(KUBECTL) create secret generic kratos-smtp \\\n\t\t--from-literal=SMTP_CONNECTION_URI=\"smtps://user:password@smtp.example.com:465/?skip_ssl_verify=false\" \\\n\t\t--namespace nons-platform -o yaml --dry-run=client | $$(KUBECTL) apply -f -"
    },
    {
      "level": 1,
      "heading": "۳. دانلود Helm و نصب پکیج‌های پایه Traefik CRDs",
      "content": "crds:\n\t@echo \"Applying Traefik v3 CRDs and RBAC...\"\n\t$$(KUBECTL) apply -f https://raw.githubusercontent.com/traefik/traefik/v3.7/docs/content/reference/dynamic-configuration/kubernetes-crd-definition-v1.yml\n\t$$(KUBECTL) apply -f https://raw.githubusercontent.com/traefik/traefik/v3.7/docs/content/reference/dynamic-configuration/kubernetes-crd-rbac.yml"
    },
    {
      "level": 1,
      "heading": "۴. بیلد تصاویر میکروسرویس‌ها",
      "content": "build-images:\n\t@echo \"Building Docker images...\"\n\tdocker build -t ghcr.io/nons/auth-service:latest -f services/auth-service/Dockerfile .\n\tdocker build -t ghcr.io/nons/core:latest -f core/Dockerfile core/"
    },
    {
      "level": 1,
      "heading": "۵. استقرار سرویس‌های پایه دیتابیس و مسیریابی",
      "content": "deploy-infra:\n\t@echo \"Deploying Postgres, Redis, and NATS...\"\n\t$$(HELM) upgrade --install postgres ./nons-api/deploy/helm/postgres -n nons-platform\n\t$$(HELM) upgrade --install redis ./nons-api/deploy/helm/redis -n nons-platform\n\t$$(HELM) upgrade --install nats ./nons-api/deploy/helm/nats -n nons-platform"
    },
    {
      "level": 1,
      "heading": "۶. استقرار سرویس‌های مدیریت هویت",
      "content": "deploy-identity:\n\t@echo \"Deploying Kratos and Hydra...\"\n\t$$(HELM) upgrade --install kratos ./nons-api/deploy/helm/kratos -n nons-platform\n\t$$(HELM) upgrade --install hydra ./nons-api/deploy/helm/hydra -n nons-platform"
    },
    {
      "level": 1,
      "heading": "۷. استقرار اپلیکیشن و درگاه خروجی",
      "content": "deploy-apps:\n\t@echo \"Deploying auth-service and API Gateway...\"\n\t$$(HELM) upgrade --install auth-service ./nons-api/deploy/helm/auth-service -n nons-platform\n\t$$(HELM) upgrade --install gateway ./nons-api/deploy/helm/gateway -n nons-system"
    },
    {
      "level": 1,
      "heading": "۸. لاگ و بررسی آخرین وضعیت پادها",
      "content": "status:\n\t@echo \"Listing all pods on the cluster:\"\n\t$$(KUBECTL) get pods -A\n```"
    }
  ]
}