Files
docs/final-docs/05-DEPLOYMENT.md
T
masoodafar-web 5965b98728 update
2026-01-03 18:27:49 +03:30

6.6 KiB

🚀 Deployment Guide

آخرین بروزرسانی: January 3, 2026
Environment: Kubernetes on Stage
Domain: *.se.kbs1.ir


🌐 آدرس‌های سرویس‌ها

سرویس آدرس Stage
BackOffice UI https://backoffice.se.kbs1.ir
BackOffice BFF https://backoffice-bff.se.kbs1.ir
FrontOffice UI https://frontoffice.se.kbs1.ir
FrontOffice BFF https://frontoffice-bff.se.kbs1.ir
CMS https://cms.se.kbs1.ir
Git Registry git.se.kbs1.ir

📦 Git Repositories

Repo Remote URL
BackOffice kub-stage https://git.se.kbs1.ir/admin/BackOffice.git
BackOffice.BFF kub-stage https://git.se.kbs1.ir/admin/BackOffice.BFF.git
FrontOffice kub-stage https://git.se.kbs1.ir/admin/FrontOffice.git
FrontOffice.BFF kub-stage https://git.se.kbs1.ir/admin/FrontOffice.BFF.git
CMS gitea https://git.se.kbs1.ir/admin/CMS.git
Docs foursatDocs https://git.se.kbs1.ir/FourSat/docs.git

🔄 CI/CD Workflow

Gitea Actions

هر ریپو دارای workflow در .gitea/workflows/ است:

# kub-deploy.yml - Deploy to Stage
# prod-deploy.yml - Deploy to Production

مراحل Deploy:

1. Push to branch → Trigger workflow
2. Build Docker image
3. Push to Registry (git.se.kbs1.ir)
4. Deploy to Kubernetes

🐳 Docker Registry

تنظیمات:

env:
  EXTERNAL_REGISTRY: git.se.kbs1.ir
  IMAGE: backoffice  # or backoffice-bff, cms, etc.

# Docker daemon config
daemon.json: |
  {
    "insecure-registries": ["git.se.kbs1.ir", "gitea-svc:3000"]
  }

Image Names:

سرویس Image
BackOffice git.se.kbs1.ir/admin/backoffice:latest
BackOffice.BFF git.se.kbs1.ir/admin/backoffice-bff:latest
FrontOffice git.se.kbs1.ir/admin/frontoffice:latest
FrontOffice.BFF git.se.kbs1.ir/admin/frontoffice-bff:latest
CMS git.se.kbs1.ir/admin/cms:latest

📋 BackOffice Deployment

Prerequisites:

# 1. Build proto DLLs
cd BackOffice
./build-deps.sh

# 2. Verify DLLs
ls libs/*.dll | wc -l  # Should be 24

Build & Publish:

cd BackOffice/src
dotnet publish BackOffice/BackOffice.csproj -c Release -o ./publish

Docker Build:

cd BackOffice
docker build -t backoffice:latest .

Dockerfile:

FROM mcr.microsoft.com/dotnet/sdk:9.0 AS build
WORKDIR /src

# Copy pre-built proto DLLs
COPY ["libs/", "libs/"]

COPY ["src/BackOffice/", "BackOffice/"]
RUN dotnet publish "BackOffice/BackOffice.csproj" -c Release -o /app/publish

FROM nginx:alpine
COPY --from=build /app/publish/wwwroot /usr/share/nginx/html
EXPOSE 80

📋 BFF & CMS Deployment

Standard .NET Web API:

# Build
cd BackOffice.BFF/src
dotnet publish BackOffice.BFF.WebApi/BackOffice.BFF.WebApi.csproj -c Release -o ./publish

# Docker
docker build -t backoffice-bff:latest .

Dockerfile Template:

FROM mcr.microsoft.com/dotnet/aspnet:9.0 AS runtime
FROM mcr.microsoft.com/dotnet/sdk:9.0 AS build

WORKDIR /src
COPY . .
RUN dotnet publish -c Release -o /app

FROM runtime
WORKDIR /app
COPY --from=build /app .
EXPOSE 80
ENTRYPOINT ["dotnet", "BackOffice.BFF.WebApi.dll"]

⚙️ Configuration

appsettings.Staging.json (BackOffice):

{
  "Environment": "Staging",
  "GwUrl": "https://backoffice-bff.se.kbs1.ir",
  "AllowedHosts": "*"
}

appsettings.Staging.json (FrontOffice):

{
  "GwUrl": "https://frontoffice-bff.se.kbs1.ir",
  "AllowedHosts": "*"
}

appsettings.json (BFF):

{
  "ConnectionStrings": {
    "DefaultConnection": "Host=postgres;Database=cms;Username=xxx;Password=xxx"
  },
  "CMSMSAddress": "https://cms.se.kbs1.ir",
  "Jwt": {
    "Secret": "xxx",
    "Issuer": "FourSat",
    "Audience": "FourSat"
  }
}

🔧 Kubernetes Resources

Deployment Template:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: backoffice
spec:
  replicas: 2
  selector:
    matchLabels:
      app: backoffice
  template:
    spec:
      containers:
      - name: backoffice
        image: git.se.kbs1.ir/admin/backoffice:latest
        ports:
        - containerPort: 80
        env:
        - name: ASPNETCORE_ENVIRONMENT
          value: "Staging"

Service Template:

apiVersion: v1
kind: Service
metadata:
  name: backoffice-svc
spec:
  selector:
    app: backoffice
  ports:
  - port: 80
    targetPort: 80

Ingress Template:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: backoffice-ingress
spec:
  rules:
  - host: backoffice.se.kbs1.ir
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: backoffice-svc
            port:
              number: 80

🏥 Health Checks

CMS Health Endpoints:

Endpoint استفاده
/health وضعیت کلی
/health/ready Readiness probe
/health/live Liveness probe

Kubernetes Probes:

livenessProbe:
  httpGet:
    path: /health/live
    port: 80
  initialDelaySeconds: 30
  periodSeconds: 10

readinessProbe:
  httpGet:
    path: /health/ready
    port: 80
  initialDelaySeconds: 5
  periodSeconds: 5

📊 Monitoring

Hangfire Dashboard:

https://cms.se.kbs1.ir/hangfire

Logs:

# Kubernetes logs
kubectl logs -f deployment/cms -n foursat

# Docker logs
docker logs -f cms

🔄 Deploy Process

1. Manual Deploy:

# BackOffice
cd BackOffice
./build-deps.sh
git add .
git commit -m "Deploy: v1.x.x"
git push kub-stage main

# BFF/CMS
cd BackOffice.BFF
git add .
git commit -m "Deploy: v1.x.x"
git push kub-stage main

2. Verify Deployment:

# Check pods
kubectl get pods -n foursat

# Check services
kubectl get svc -n foursat

# Check ingress
kubectl get ingress -n foursat

3. Rollback:

# Rollback to previous version
kubectl rollout undo deployment/backoffice -n foursat

🛠️ Troubleshooting

Build Failed:

# Check proto DLLs
ls BackOffice/libs/*.dll | wc -l  # Should be 24

# Rebuild
./build-deps.sh

Image Push Failed:

# Login to registry
docker login git.se.kbs1.ir

# Check daemon.json
cat /etc/docker/daemon.json

Pod CrashLoopBackOff:

# Check logs
kubectl logs pod-name -n foursat

# Check events
kubectl describe pod pod-name -n foursat

📚 مستندات مرتبط