feat(k8s): add full K8s staging deployment for all 25 services

- Add 17 new K8s manifests (15 services + RabbitMQ + MinIO)
- Update secrets.yaml with 24 DB URLs for remote PostgreSQL
- Update configmap.yaml with 25 service discovery URLs
- Update ingress.yaml with routes for all services (Nginx + letsencrypt-prod)
- Update network-policy.yaml with all services + RabbitMQ/MinIO policies
- Update deploy-staging.yml CI/CD for all 25 services via Harbor registry
- Fix mkt-* Dockerfiles (add curl, JwtBearer NuGet package)
- Fix membership/ads-billing PendingModelChangesWarning
- Switch DB connections to remote PostgreSQL (212.28.186.239:30992)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Ho Ngoc Hai
2026-04-10 19:53:09 +07:00
parent 6aa52cdb19
commit 966f5412bd
44 changed files with 3055 additions and 117 deletions

View File

@@ -5,7 +5,7 @@ name: Deploy to Staging
on:
push:
branches:
- develop
- master
paths:
- 'services/iam-service-net/**'
- 'services/merchant-service-net/**'
@@ -15,6 +15,22 @@ on:
- 'services/wallet-service-net/**'
- 'services/catalog-service-net/**'
- 'services/storage-service-net/**'
- 'services/booking-service-net/**'
- 'services/chat-service-net/**'
- 'services/social-service-net/**'
- 'services/promotion-service-net/**'
- 'services/membership-service-net/**'
- 'services/mining-service-net/**'
- 'services/mission-service-net/**'
- 'services/ads-manager-service-net/**'
- 'services/ads-serving-service-net/**'
- 'services/ads-billing-service-net/**'
- 'services/ads-tracking-service-net/**'
- 'services/ads-analytics-service-net/**'
- 'services/mkt-facebook-service-net/**'
- 'services/mkt-whatsapp-service-net/**'
- 'services/mkt-x-service-net/**'
- 'services/mkt-zalo-service-net/**'
- 'apps/web-client-tpos-net/**'
- 'deployments/staging/**'
workflow_dispatch:
@@ -34,10 +50,26 @@ on:
- wallet-service
- catalog-service
- storage-service
- booking-service
- chat-service
- social-service
- promotion-service
- membership-service
- mining-service
- mission-service
- ads-manager-service
- ads-serving-service
- ads-billing-service
- ads-tracking-service
- ads-analytics-service
- mkt-facebook-service
- mkt-whatsapp-service
- mkt-x-service
- mkt-zalo-service
- pos-web
env:
REGISTRY: docker.io
REGISTRY: harbor.techbi.org
NAMESPACE: staging
jobs:
@@ -73,6 +105,22 @@ jobs:
["services/wallet-service-net"]="wallet-service"
["services/catalog-service-net"]="catalog-service"
["services/storage-service-net"]="storage-service"
["services/booking-service-net"]="booking-service"
["services/chat-service-net"]="chat-service"
["services/social-service-net"]="social-service"
["services/promotion-service-net"]="promotion-service"
["services/membership-service-net"]="membership-service"
["services/mining-service-net"]="mining-service"
["services/mission-service-net"]="mission-service"
["services/ads-manager-service-net"]="ads-manager-service"
["services/ads-serving-service-net"]="ads-serving-service"
["services/ads-billing-service-net"]="ads-billing-service"
["services/ads-tracking-service-net"]="ads-tracking-service"
["services/ads-analytics-service-net"]="ads-analytics-service"
["services/mkt-facebook-service-net"]="mkt-facebook-service"
["services/mkt-whatsapp-service-net"]="mkt-whatsapp-service"
["services/mkt-x-service-net"]="mkt-x-service"
["services/mkt-zalo-service-net"]="mkt-zalo-service"
["apps/web-client-tpos-net"]="pos-web"
)
@@ -85,7 +133,7 @@ jobs:
# EN: If deployment configs changed, deploy all
# VI: Neu cau hinh deployment thay doi, deploy tat ca
if echo "$CHANGED" | grep -q "^deployments/staging/"; then
SERVICES=("\"iam-service\"" "\"merchant-service\"" "\"order-service\"" "\"fnb-engine\"" "\"inventory-service\"" "\"wallet-service\"" "\"catalog-service\"" "\"storage-service\"" "\"pos-web\"")
SERVICES=("\"iam-service\"" "\"merchant-service\"" "\"order-service\"" "\"fnb-engine\"" "\"inventory-service\"" "\"wallet-service\"" "\"catalog-service\"" "\"storage-service\"" "\"booking-service\"" "\"chat-service\"" "\"social-service\"" "\"promotion-service\"" "\"membership-service\"" "\"mining-service\"" "\"mission-service\"" "\"ads-manager-service\"" "\"ads-serving-service\"" "\"ads-billing-service\"" "\"ads-tracking-service\"" "\"ads-analytics-service\"" "\"mkt-facebook-service\"" "\"mkt-whatsapp-service\"" "\"mkt-x-service\"" "\"mkt-zalo-service\"" "\"pos-web\"")
fi
if [ ${#SERVICES[@]} -eq 0 ]; then
@@ -108,9 +156,10 @@ jobs:
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Login to Docker Hub
- name: Login to Harbor Registry
uses: docker/login-action@v3
with:
registry: ${{ secrets.DOCKER_REGISTRY }}
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
@@ -126,19 +175,51 @@ jobs:
["wallet-service"]="./services/wallet-service-net"
["catalog-service"]="./services/catalog-service-net"
["storage-service"]="./services/storage-service-net"
["booking-service"]="./services/booking-service-net"
["chat-service"]="./services/chat-service-net"
["social-service"]="./services/social-service-net"
["promotion-service"]="./services/promotion-service-net"
["membership-service"]="./services/membership-service-net"
["mining-service"]="./services/mining-service-net"
["mission-service"]="./services/mission-service-net"
["ads-manager-service"]="./services/ads-manager-service-net"
["ads-serving-service"]="./services/ads-serving-service-net"
["ads-billing-service"]="./services/ads-billing-service-net"
["ads-tracking-service"]="./services/ads-tracking-service-net"
["ads-analytics-service"]="./services/ads-analytics-service-net"
["mkt-facebook-service"]="./services/mkt-facebook-service-net"
["mkt-whatsapp-service"]="./services/mkt-whatsapp-service-net"
["mkt-x-service"]="./services/mkt-x-service-net"
["mkt-zalo-service"]="./services/mkt-zalo-service-net"
["pos-web"]="./apps/web-client-tpos-net"
)
declare -A IMAGE_MAP=(
["iam-service"]="goodgo/iam-service-net"
["merchant-service"]="goodgo/merchant-service-net"
["order-service"]="goodgo/order-service-net"
["fnb-engine"]="goodgo/fnb-engine-net"
["inventory-service"]="goodgo/inventory-service-net"
["wallet-service"]="goodgo/wallet-service-net"
["catalog-service"]="goodgo/catalog-service-net"
["storage-service"]="goodgo/storage-service-net"
["pos-web"]="goodgo/web-client-tpos-net"
["iam-service"]="harbor.techbi.org/goodgo/iam-service-net"
["merchant-service"]="harbor.techbi.org/goodgo/merchant-service-net"
["order-service"]="harbor.techbi.org/goodgo/order-service-net"
["fnb-engine"]="harbor.techbi.org/goodgo/fnb-engine-net"
["inventory-service"]="harbor.techbi.org/goodgo/inventory-service-net"
["wallet-service"]="harbor.techbi.org/goodgo/wallet-service-net"
["catalog-service"]="harbor.techbi.org/goodgo/catalog-service-net"
["storage-service"]="harbor.techbi.org/goodgo/storage-service-net"
["booking-service"]="harbor.techbi.org/goodgo/booking-service-net"
["chat-service"]="harbor.techbi.org/goodgo/chat-service-net"
["social-service"]="harbor.techbi.org/goodgo/social-service-net"
["promotion-service"]="harbor.techbi.org/goodgo/promotion-service-net"
["membership-service"]="harbor.techbi.org/goodgo/membership-service-net"
["mining-service"]="harbor.techbi.org/goodgo/mining-service-net"
["mission-service"]="harbor.techbi.org/goodgo/mission-service-net"
["ads-manager-service"]="harbor.techbi.org/goodgo/ads-manager-service-net"
["ads-serving-service"]="harbor.techbi.org/goodgo/ads-serving-service-net"
["ads-billing-service"]="harbor.techbi.org/goodgo/ads-billing-service-net"
["ads-tracking-service"]="harbor.techbi.org/goodgo/ads-tracking-service-net"
["ads-analytics-service"]="harbor.techbi.org/goodgo/ads-analytics-service-net"
["mkt-facebook-service"]="harbor.techbi.org/goodgo/mkt-facebook-service-net"
["mkt-whatsapp-service"]="harbor.techbi.org/goodgo/mkt-whatsapp-service-net"
["mkt-x-service"]="harbor.techbi.org/goodgo/mkt-x-service-net"
["mkt-zalo-service"]="harbor.techbi.org/goodgo/mkt-zalo-service-net"
["pos-web"]="harbor.techbi.org/goodgo/web-client-tpos-net"
)
echo "context=${CONTEXT_MAP[${{ matrix.service }}]}" >> $GITHUB_OUTPUT
@@ -180,7 +261,7 @@ jobs:
--project services/iam-service-net/src/IamService.Infrastructure/IamService.Infrastructure.csproj \
--startup-project services/iam-service-net/src/IamService.API/IamService.API.csproj
env:
ConnectionStrings__DefaultConnection: ${{ secrets.NEON_IAM_DATABASE_URL_STAGING }}
ConnectionStrings__DefaultConnection: ${{ secrets.REMOTE_IAM_DATABASE_URL_STAGING }}
- name: Run Merchant migrations
if: contains(needs.detect-changes.outputs.services, 'merchant-service')
@@ -189,7 +270,7 @@ jobs:
--project services/merchant-service-net/src/MerchantService.Infrastructure/MerchantService.Infrastructure.csproj \
--startup-project services/merchant-service-net/src/MerchantService.API/MerchantService.API.csproj
env:
ConnectionStrings__DefaultConnection: ${{ secrets.NEON_MERCHANT_DATABASE_URL_STAGING }}
ConnectionStrings__DefaultConnection: ${{ secrets.REMOTE_MERCHANT_DATABASE_URL_STAGING }}
- name: Run Order migrations
if: contains(needs.detect-changes.outputs.services, 'order-service')
@@ -198,7 +279,7 @@ jobs:
--project services/order-service-net/src/OrderService.Infrastructure/OrderService.Infrastructure.csproj \
--startup-project services/order-service-net/src/OrderService.API/OrderService.API.csproj
env:
ConnectionStrings__DefaultConnection: ${{ secrets.NEON_ORDER_DATABASE_URL_STAGING }}
ConnectionStrings__DefaultConnection: ${{ secrets.REMOTE_ORDER_DATABASE_URL_STAGING }}
- name: Run FnB Engine migrations
if: contains(needs.detect-changes.outputs.services, 'fnb-engine')
@@ -207,7 +288,7 @@ jobs:
--project services/fnb-engine-net/src/FnbEngine.Infrastructure/FnbEngine.Infrastructure.csproj \
--startup-project services/fnb-engine-net/src/FnbEngine.API/FnbEngine.API.csproj
env:
ConnectionStrings__DefaultConnection: ${{ secrets.NEON_FNB_DATABASE_URL_STAGING }}
ConnectionStrings__DefaultConnection: ${{ secrets.REMOTE_FNB_DATABASE_URL_STAGING }}
- name: Run Inventory migrations
if: contains(needs.detect-changes.outputs.services, 'inventory-service')
@@ -216,7 +297,7 @@ jobs:
--project services/inventory-service-net/src/InventoryService.Infrastructure/InventoryService.Infrastructure.csproj \
--startup-project services/inventory-service-net/src/InventoryService.API/InventoryService.API.csproj
env:
ConnectionStrings__DefaultConnection: ${{ secrets.NEON_INVENTORY_DATABASE_URL_STAGING }}
ConnectionStrings__DefaultConnection: ${{ secrets.REMOTE_INVENTORY_DATABASE_URL_STAGING }}
- name: Run Wallet migrations
if: contains(needs.detect-changes.outputs.services, 'wallet-service')
@@ -225,7 +306,7 @@ jobs:
--project services/wallet-service-net/src/WalletService.Infrastructure/WalletService.Infrastructure.csproj \
--startup-project services/wallet-service-net/src/WalletService.API/WalletService.API.csproj
env:
ConnectionStrings__DefaultConnection: ${{ secrets.NEON_WALLET_DATABASE_URL_STAGING }}
ConnectionStrings__DefaultConnection: ${{ secrets.REMOTE_WALLET_DATABASE_URL_STAGING }}
- name: Run Catalog migrations
if: contains(needs.detect-changes.outputs.services, 'catalog-service')
@@ -234,7 +315,7 @@ jobs:
--project services/catalog-service-net/src/CatalogService.Infrastructure/CatalogService.Infrastructure.csproj \
--startup-project services/catalog-service-net/src/CatalogService.API/CatalogService.API.csproj
env:
ConnectionStrings__DefaultConnection: ${{ secrets.NEON_CATALOG_DATABASE_URL_STAGING }}
ConnectionStrings__DefaultConnection: ${{ secrets.REMOTE_CATALOG_DATABASE_URL_STAGING }}
- name: Run Storage migrations
if: contains(needs.detect-changes.outputs.services, 'storage-service')
@@ -243,7 +324,124 @@ jobs:
--project services/storage-service-net/src/StorageService.Infrastructure/StorageService.Infrastructure.csproj \
--startup-project services/storage-service-net/src/StorageService.API/StorageService.API.csproj
env:
ConnectionStrings__DefaultConnection: ${{ secrets.NEON_STORAGE_DATABASE_URL_STAGING }}
ConnectionStrings__DefaultConnection: ${{ secrets.REMOTE_STORAGE_DATABASE_URL_STAGING }}
- name: Run Booking migrations
if: contains(needs.detect-changes.outputs.services, 'booking-service')
run: |
dotnet ef database update \
--project services/booking-service-net/src/BookingService.Infrastructure/BookingService.Infrastructure.csproj \
--startup-project services/booking-service-net/src/BookingService.API/BookingService.API.csproj
env:
ConnectionStrings__DefaultConnection: ${{ secrets.REMOTE_BOOKING_DATABASE_URL_STAGING }}
- name: Run Chat migrations
if: contains(needs.detect-changes.outputs.services, 'chat-service')
run: |
dotnet ef database update \
--project services/chat-service-net/src/ChatService.Infrastructure/ChatService.Infrastructure.csproj \
--startup-project services/chat-service-net/src/ChatService.API/ChatService.API.csproj
env:
ConnectionStrings__DefaultConnection: ${{ secrets.REMOTE_CHAT_DATABASE_URL_STAGING }}
- name: Run Social migrations
if: contains(needs.detect-changes.outputs.services, 'social-service')
run: |
dotnet ef database update \
--project services/social-service-net/src/SocialService.Infrastructure/SocialService.Infrastructure.csproj \
--startup-project services/social-service-net/src/SocialService.API/SocialService.API.csproj
env:
ConnectionStrings__DefaultConnection: ${{ secrets.REMOTE_SOCIAL_DATABASE_URL_STAGING }}
- name: Run Promotion migrations
if: contains(needs.detect-changes.outputs.services, 'promotion-service')
run: |
dotnet ef database update \
--project services/promotion-service-net/src/PromotionService.Infrastructure/PromotionService.Infrastructure.csproj \
--startup-project services/promotion-service-net/src/PromotionService.API/PromotionService.API.csproj
env:
ConnectionStrings__DefaultConnection: ${{ secrets.REMOTE_PROMOTION_DATABASE_URL_STAGING }}
- name: Run Membership migrations
if: contains(needs.detect-changes.outputs.services, 'membership-service')
run: |
dotnet ef database update \
--project services/membership-service-net/src/MembershipService.Infrastructure/MembershipService.Infrastructure.csproj \
--startup-project services/membership-service-net/src/MembershipService.API/MembershipService.API.csproj
env:
ConnectionStrings__DefaultConnection: ${{ secrets.REMOTE_MEMBERSHIP_DATABASE_URL_STAGING }}
- name: Run Mining migrations
if: contains(needs.detect-changes.outputs.services, 'mining-service')
run: |
dotnet ef database update \
--project services/mining-service-net/src/MiningService.Infrastructure/MiningService.Infrastructure.csproj \
--startup-project services/mining-service-net/src/MiningService.API/MiningService.API.csproj
env:
ConnectionStrings__DefaultConnection: ${{ secrets.REMOTE_MINING_DATABASE_URL_STAGING }}
- name: Run Mission migrations
if: contains(needs.detect-changes.outputs.services, 'mission-service')
run: |
dotnet ef database update \
--project services/mission-service-net/src/MissionService.Infrastructure/MissionService.Infrastructure.csproj \
--startup-project services/mission-service-net/src/MissionService.API/MissionService.API.csproj
env:
ConnectionStrings__DefaultConnection: ${{ secrets.REMOTE_MISSION_DATABASE_URL_STAGING }}
- name: Run Ads Manager migrations
if: contains(needs.detect-changes.outputs.services, 'ads-manager-service')
run: |
dotnet ef database update \
--project services/ads-manager-service-net/src/AdsManagerService.Infrastructure/AdsManagerService.Infrastructure.csproj \
--startup-project services/ads-manager-service-net/src/AdsManagerService.API/AdsManagerService.API.csproj
env:
ConnectionStrings__DefaultConnection: ${{ secrets.REMOTE_ADS_MANAGER_DATABASE_URL_STAGING }}
- name: Run Ads Serving migrations
if: contains(needs.detect-changes.outputs.services, 'ads-serving-service')
run: |
dotnet ef database update \
--project services/ads-serving-service-net/src/AdsServingService.Infrastructure/AdsServingService.Infrastructure.csproj \
--startup-project services/ads-serving-service-net/src/AdsServingService.API/AdsServingService.API.csproj
env:
ConnectionStrings__DefaultConnection: ${{ secrets.REMOTE_ADS_SERVING_DATABASE_URL_STAGING }}
- name: Run Ads Billing migrations
if: contains(needs.detect-changes.outputs.services, 'ads-billing-service')
run: |
dotnet ef database update \
--project services/ads-billing-service-net/src/AdsBillingService.Infrastructure/AdsBillingService.Infrastructure.csproj \
--startup-project services/ads-billing-service-net/src/AdsBillingService.API/AdsBillingService.API.csproj
env:
ConnectionStrings__DefaultConnection: ${{ secrets.REMOTE_ADS_BILLING_DATABASE_URL_STAGING }}
- name: Run Ads Tracking migrations
if: contains(needs.detect-changes.outputs.services, 'ads-tracking-service')
run: |
dotnet ef database update \
--project services/ads-tracking-service-net/src/AdsTrackingService.Infrastructure/AdsTrackingService.Infrastructure.csproj \
--startup-project services/ads-tracking-service-net/src/AdsTrackingService.API/AdsTrackingService.API.csproj
env:
ConnectionStrings__DefaultConnection: ${{ secrets.REMOTE_ADS_TRACKING_DATABASE_URL_STAGING }}
- name: Run Ads Analytics migrations
if: contains(needs.detect-changes.outputs.services, 'ads-analytics-service')
run: |
dotnet ef database update \
--project services/ads-analytics-service-net/src/AdsAnalyticsService.Infrastructure/AdsAnalyticsService.Infrastructure.csproj \
--startup-project services/ads-analytics-service-net/src/AdsAnalyticsService.API/AdsAnalyticsService.API.csproj
env:
ConnectionStrings__DefaultConnection: ${{ secrets.REMOTE_ADS_ANALYTICS_DATABASE_URL_STAGING }}
- name: Run Mkt Zalo migrations
if: contains(needs.detect-changes.outputs.services, 'mkt-zalo-service')
run: |
dotnet ef database update \
--project services/mkt-zalo-service-net/src/MktZaloService.Infrastructure/MktZaloService.Infrastructure.csproj \
--startup-project services/mkt-zalo-service-net/src/MktZaloService.API/MktZaloService.API.csproj
env:
ConnectionStrings__DefaultConnection: ${{ secrets.REMOTE_MKT_ZALO_DATABASE_URL_STAGING }}
# =========================================================================
# Deploy to Kubernetes
@@ -268,9 +466,11 @@ jobs:
kubectl apply -f deployments/staging/kubernetes/namespace.yaml
kubectl apply -f deployments/staging/kubernetes/configmap.yaml
- name: Deploy Redis
- name: Deploy Infrastructure
run: |
kubectl apply -f deployments/staging/kubernetes/redis.yaml
kubectl apply -f deployments/staging/kubernetes/rabbitmq.yaml
kubectl apply -f deployments/staging/kubernetes/minio.yaml
- name: Deploy services
run: |
@@ -285,6 +485,22 @@ jobs:
["wallet-service"]="wallet-service.yaml"
["catalog-service"]="catalog-service.yaml"
["storage-service"]="storage-service.yaml"
["booking-service"]="booking-service.yaml"
["chat-service"]="chat-service.yaml"
["social-service"]="social-service.yaml"
["promotion-service"]="promotion-service.yaml"
["membership-service"]="membership-service.yaml"
["mining-service"]="mining-service.yaml"
["mission-service"]="mission-service.yaml"
["ads-manager-service"]="ads-manager-service.yaml"
["ads-serving-service"]="ads-serving-service.yaml"
["ads-billing-service"]="ads-billing-service.yaml"
["ads-tracking-service"]="ads-tracking-service.yaml"
["ads-analytics-service"]="ads-analytics-service.yaml"
["mkt-facebook-service"]="mkt-facebook-service.yaml"
["mkt-whatsapp-service"]="mkt-whatsapp-service.yaml"
["mkt-x-service"]="mkt-x-service.yaml"
["mkt-zalo-service"]="mkt-zalo-service.yaml"
["pos-web"]="pos-web.yaml"
)
@@ -307,6 +523,10 @@ jobs:
run: |
kubectl apply -f deployments/staging/kubernetes/ingress.yaml
- name: Apply network policies
run: |
kubectl apply -f deployments/staging/kubernetes/network-policy.yaml
- name: Wait for rollouts
run: |
SERVICES='${{ needs.detect-changes.outputs.services }}'
@@ -320,6 +540,22 @@ jobs:
["wallet-service"]="wallet-service"
["catalog-service"]="catalog-service"
["storage-service"]="storage-service"
["booking-service"]="booking-service"
["chat-service"]="chat-service"
["social-service"]="social-service"
["promotion-service"]="promotion-service"
["membership-service"]="membership-service"
["mining-service"]="mining-service"
["mission-service"]="mission-service"
["ads-manager-service"]="ads-manager-service"
["ads-serving-service"]="ads-serving-service"
["ads-billing-service"]="ads-billing-service"
["ads-tracking-service"]="ads-tracking-service"
["ads-analytics-service"]="ads-analytics-service"
["mkt-facebook-service"]="mkt-facebook-service"
["mkt-whatsapp-service"]="mkt-whatsapp-service"
["mkt-x-service"]="mkt-x-service"
["mkt-zalo-service"]="mkt-zalo-service"
["pos-web"]="pos-web"
)