P0.1 · Repositório da aplicação e pipeline
Depende de P0.0. Skills: `/gitlab-ecomsmart`, `/k8s-ecomsmart`.
O prompt
Leia as skills /gitlab-ecomsmart e /k8s-ecomsmart.
Crie o projeto radar — a aplicação dos micro SaaS de aquisição da EcomSmart (Raio-X da Loja, Radar de Preço, Radar de Anúncios). O planejamento está em apps.ecomsmart.com.br.
1. Repositório
Via API de https://gitlab.ecomsmart.com.br:
- Projeto
radarno gruposmarthub, privado, branch padrãomain - Container Registry habilitado
- Deploy Token de escopo apenas
read_registry, nomek8s-registry-pull. Guarde usuário e senha — é o que o kubelet usa. Nunca useCI_REGISTRY_PASSWORDpara isso: esse token só vale durante o job, e o pod falha em todo restart depois - Push mirror para
ecomsmart1/smarthub/radarno GitLab.com, seguindo o procedimento exato da skill (chave SSH gerada pelo próprio GitLab,ssh_known_hostsviassh-keyscan, branch alvo sem proteção contra force-push). Se o projeto não existir no GitLab.com, me avise em vez de criar
2. Esqueleto
Python 3.12, Django 5.x, Postgres, Redis, Celery.
radar/
manage.py
pyproject.toml
Dockerfile
.gitlab-ci.yml
config/
settings/{base,dev,prod}.py
celery.py urls.py wsgi.py asgi.py
apps/
tenants/ Loja, Usuario, Plano, Assinatura
conectores/ base abstrata e implementacoes
raiox/
preco/
anuncios/
atribuicao/ utm, gclid, fbclid, fbp, fbc
billing/ Stripe
roi/ ingestao de custo e receita
vendas/ fila do vendedor
core/ health, mixins, utils
templates/
static/
k8s/
base/{deployment,service,ingress,configmap,hpa}.yaml
overlays/producao/kustomization.yaml
tests/
Requisitos:
django-scopesinstalado comTenantManagerbase: toda query em modelo comlojaexige escopo explícito. Escreva o teste que prova que query sem escopo levanta exceção/healthz(liveness) e/readyz(readiness, checando Postgres e Redis)- Settings por variável de ambiente com
django-environ structlogcom saída JSON em produção — o cluster tem stack ELK no namespacelogging- Celery com Redis e
django-celery-beatcom agendador em banco
3. Dockerfile
Multi-stage, imagem final slim, usuário app não-root (uid 1000), gunicorn com WEB_CONCURRENCY por env. Entrypoint aceitando os modos web, worker e beat.
4. Kubernetes
Namespace producao. Kustomize com overlay producao.
Use os valores de requests que saírem do P0.0, não os valores nominais abaixo — o cluster está apertado.
| Deployment | Réplicas | Papel |
|---|---|---|
radar-web | 2 | gunicorn |
radar-worker | 2 | Celery |
radar-beat | 1 | Celery beat, strategy: Recreate |
- Probes em
/healthze/readyz imagePullSecretscom o Deploy Token- Migração como
initContainernoradar-web - Segredos só via Secret, nunca no manifesto
Postgres e Redis: confira com kubectl o que já existe e reaproveite, criando apenas banco e usuário novos. Me diga o que encontrou antes de decidir.
5. Pipeline
test → build → deploy.
- test:
ruff check,ruff format --check,pytestcom cobertura. Falha abaixo de 60% - build: kaniko ou buildah (não docker-in-docker) para
registry.ecomsmart.com.br/smarthub/radar:$CI_COMMIT_SHORT_SHAe:latest - deploy: só em
main,when: manualna primeira versão.export KUBECONFIG=$KUBECONFIG_ECOMSMART,kubectl apply -k,kubectl set image,kubectl rollout status --timeout=300s - Tags do runner:
self-hosted,kubernetes,deploy
Critérios de aceite
kubectl -n producao get pods -l app=radar-webmostra podsRunningeReadykubectl -n producao exec deploy/radar-web -- curl -s localhost:8000/readyzretorna 200- Pipeline verde do começo ao fim, com o link do job
- Teste de isolamento de tenant passa
- Mirror sincronizado no GitLab.com
Não invente credencial. Se faltar segredo, pare e pergunte.