diff --git a/.gitea/workflows/kub-deploy.yml b/.gitea/workflows/kub-deploy.yml new file mode 100644 index 0000000..4f58900 --- /dev/null +++ b/.gitea/workflows/kub-deploy.yml @@ -0,0 +1,81 @@ +name: Build and Deploy to Kubernetes + +on: + push: + branches: + - kub-stage + +env: + REGISTRY: 194.5.195.53:30080 + IMAGE_NAME: admin/frontoffice + K8S_SERVER: 194.5.195.53 + +jobs: + build-and-deploy: + runs-on: ubuntu-latest + container: + image: 194.5.195.53:32082/docker-sshpass:latest + options: --privileged + steps: + - name: Start Docker daemon + run: | + mkdir -p /etc/docker + cat > /etc/docker/daemon.json << 'DAEMON' + { + "insecure-registries": ["194.5.195.53:30080", "194.5.195.53:32500", "194.5.195.53:32082"] + } + DAEMON + echo "🚀 Starting Docker daemon..." + dockerd --iptables=false --ip6tables=false --bridge=none --storage-driver=vfs & + + # Wait up to 3 minutes for Docker to be ready + for i in $(seq 1 90); do + if docker info >/dev/null 2>&1; then + echo "✅ Docker daemon is ready (attempt $i)" + docker version + break + else + echo "⏳ Waiting for Docker daemon... (attempt $i/90)" + sleep 2 + fi + done + + # Final check + if ! docker info >/dev/null 2>&1; then + echo "❌ Docker daemon failed to start after 3 minutes" + exit 1 + fi + + - name: Checkout code + run: | + git clone --depth 1 --branch kub-stage http://gitea-svc:3000/admin/FrontOffice.git . + + - name: Login to Docker registries + run: | + echo "${{ secrets.REGISTRY_PASSWORD }}" | docker login 194.5.195.53:32082 -u admin --password-stdin + echo "${{ secrets.REGISTRY_PASSWORD }}" | docker login ${{ env.REGISTRY }} -u admin --password-stdin + + - name: Build Docker Image + run: | + cd src + DOCKER_BUILDKIT=0 docker build --network host -t ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:latest -f FrontOffice.Main/Dockerfile . + + - name: Push to Registry + run: | + docker push ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:latest + + - name: Deploy to Kubernetes + run: | + export SSHPASS="${{ secrets.SERVER_PASSWORD }}" + + # Copy K8s manifests to server + sshpass -e scp -o StrictHostKeyChecking=no k8s/staging/frontoffice-deployment.yaml root@${{ env.K8S_SERVER }}:/tmp/frontoffice-deployment.yaml + + # Apply manifests and restart + sshpass -e ssh -o StrictHostKeyChecking=no root@${{ env.K8S_SERVER }} " + kubectl apply -f /tmp/frontoffice-deployment.yaml && + kubectl rollout restart deployment/frontoffice && + kubectl rollout status deployment/frontoffice --timeout=180s && + rm -f /tmp/frontoffice-deployment.yaml + " + echo "✅ Deployed!" diff --git a/.gitea/workflows/prod-deploy.yml b/.gitea/workflows/prod-deploy.yml index f235184..350f256 100644 --- a/.gitea/workflows/prod-deploy.yml +++ b/.gitea/workflows/prod-deploy.yml @@ -69,8 +69,15 @@ jobs: - name: Deploy to Production run: | export SSHPASS="${{ secrets.SERVER_PASSWORD }}" + + # Copy K8s manifests to server + sshpass -e scp -o StrictHostKeyChecking=no k8s/production/frontoffice-deployment.yaml root@${{ env.K8S_SERVER }}:/tmp/frontoffice-deployment.yaml + + # Apply manifests and restart sshpass -e ssh -o StrictHostKeyChecking=no root@${{ env.K8S_SERVER }} " - kubectl set image deployment/frontoffice frontoffice=${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ github.sha }} - kubectl rollout status deployment/frontoffice --timeout=300s + kubectl apply -f /tmp/frontoffice-deployment.yaml && + kubectl rollout restart deployment/frontoffice && + kubectl rollout status deployment/frontoffice --timeout=300s && + rm -f /tmp/frontoffice-deployment.yaml " echo "✅ Deployed to Production!" diff --git a/k8s/production/frontoffice-deployment.yaml b/k8s/production/frontoffice-deployment.yaml new file mode 100644 index 0000000..15111ac --- /dev/null +++ b/k8s/production/frontoffice-deployment.yaml @@ -0,0 +1,56 @@ +--- +# FrontOffice (Blazor Server) production. +apiVersion: apps/v1 +kind: Deployment +metadata: + name: frontoffice + namespace: default + labels: + app: frontoffice + environment: production +spec: + replicas: 1 + selector: + matchLabels: + app: frontoffice + template: + metadata: + labels: + app: frontoffice + spec: + containers: + - name: frontoffice + image: 194.5.195.53:30080/admin/frontoffice:prod + imagePullPolicy: Always + ports: + - containerPort: 80 + name: http + env: + - name: ASPNETCORE_ENVIRONMENT + value: "Production" + resources: + requests: + memory: "256Mi" + cpu: "250m" + limits: + memory: "512Mi" + cpu: "500m" + imagePullSecrets: + - name: gitea-registry-secret + +--- +apiVersion: v1 +kind: Service +metadata: + name: frontoffice-svc + namespace: default + labels: + app: frontoffice +spec: + selector: + app: frontoffice + ports: + - port: 80 + targetPort: 80 + name: http + type: ClusterIP diff --git a/k8s/staging/frontoffice-deployment.yaml b/k8s/staging/frontoffice-deployment.yaml index 88b5cf3..989e9a2 100644 --- a/k8s/staging/frontoffice-deployment.yaml +++ b/k8s/staging/frontoffice-deployment.yaml @@ -28,10 +28,6 @@ spec: env: - name: ASPNETCORE_ENVIRONMENT value: "Staging" - - name: GW_URL - value: "https://cms.se.kbs1.ir" - - name: GwUrl - value: "https://cms.se.kbs1.ir" resources: requests: memory: "256Mi" diff --git a/src/FrontOffice.Main/Dockerfile b/src/FrontOffice.Main/Dockerfile index 7773778..b7a1691 100644 --- a/src/FrontOffice.Main/Dockerfile +++ b/src/FrontOffice.Main/Dockerfile @@ -25,7 +25,6 @@ COPY ["FrontOffice.Main/staging-ca.crt", "/usr/local/share/ca-certificates/stagi RUN update-ca-certificates ENV ASPNETCORE_URLS=http://+:80 -ENV GW_URL=https://cms.se.kbs1.ir EXPOSE 80 ENTRYPOINT ["dotnet", "FrontOffice.Main.dll"]