# Source: pwnedworker/templates/deployment-web.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: pwnedworker-web
  labels:
    app.kubernetes.io/name: pwnedworker
    app.kubernetes.io/instance: pwnedworker
    app.kubernetes.io/managed-by: Helm
    helm.sh/chart: pwnedworker-0.1.0
    app.kubernetes.io/component: web
spec:
  replicas: 1
  selector:
    matchLabels:
      app.kubernetes.io/name: pwnedworker
      app.kubernetes.io/instance: pwnedworker
      app.kubernetes.io/component: web
  template:
    metadata:
      labels:
        app.kubernetes.io/name: pwnedworker
        app.kubernetes.io/instance: pwnedworker
        app.kubernetes.io/component: web
    spec:
      serviceAccountName: pwnedworker
      nodeSelector:
        kubernetes.io/arch: amd64
      # O entrypoint roda "migrate" logo no start e MORRE se o banco ainda não
      # aceita conexão. No Compose isso é resolvido por
      # "depends_on: condition: service_healthy"; no Kubernetes não há
      # equivalente, e sem este init o Pod entra em CrashLoopBackOff em toda
      # instalação nova, até o backoff chegar a 5 minutos.
      initContainers:
        - name: wait-for-db
          image: "registry.7dev.net.br/pwnedworker/app:0.1.15"
          imagePullPolicy: IfNotPresent
          command:
            - "sh"
            - "-c"
            - |
              until python -c "
              import os, django
              os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'pwnedworker.settings')
              django.setup()
              from django.db import connection
              connection.ensure_connection()
              "; do echo "aguardando o banco aceitar conexao..."; sleep 3; done
          envFrom:
            - configMapRef:
                name: pwnedworker
            - secretRef:
                name: pwnedworker
      containers:
        - name: web
          image: "registry.7dev.net.br/pwnedworker/app:0.1.15"
          imagePullPolicy: IfNotPresent
          # Usa o entrypoint padrão da imagem (docker/entrypoint-web.sh):
          # migração + provisionamento do usuário inicial + Gunicorn.
          ports:
            - name: http
              containerPort: 8000
          envFrom:
            - configMapRef:
                name: pwnedworker
            - secretRef:
                name: pwnedworker
          # startupProbe protege a fase de inicialização: o entrypoint aplica
          # a migração e provisiona a conta inicial ANTES de o Gunicorn
          # escutar. Sem ela, a liveness (que começa a contar em 15s) mata o
          # container no meio da migração e o Pod nunca estabiliza. Enquanto
          # esta probe não passa, liveness e readiness ficam suspensas.
          # 30 tentativas x 5s = até 150s de margem para migrar.
          startupProbe:
            httpGet:
              path: /health
              port: http
              httpHeaders:
                - name: Host
                  value: SUBSTITUA.suaempresa.com.br
            periodSeconds: 5
            failureThreshold: 30
          # Readiness checa banco e Redis: falhando, o Pod sai do
          # balanceamento sem ser reiniciado.
          readinessProbe:
            httpGet:
              path: /ready
              port: http
              httpHeaders:
                - name: Host
                  value: SUBSTITUA.suaempresa.com.br
            initialDelaySeconds: 5
            periodSeconds: 10
          # Liveness NÃO toca dependência externa de propósito: se o banco
          # cair, reiniciar o container não resolve e só geraria laço de
          # restart.
          livenessProbe:
            httpGet:
              path: /health
              port: http
              httpHeaders:
                - name: Host
                  value: SUBSTITUA.suaempresa.com.br
            initialDelaySeconds: 15
            periodSeconds: 20
          resources:
            limits:
              cpu: 500m
              memory: 1Gi
            requests:
              cpu: 250m
              memory: 512Mi
