Resolução de Problemas
Cada caso abaixo já foi encontrado em produção ou em pré-produção.
Diagnóstico rápido
cd ~/pch-sig
F=docker-compose.prod.yml # ou docker-compose.preprod.yml
docker compose -f $F ps
docker exec pch_backend curl -s http://127.0.0.1:8000/api/health
docker logs pch_backend --since 15m 2>&1 | grep -iE "error|exception" | tail -20
df -h / && free -m
Todos os pedidos respondem 500
Depois de um cache:clear lançado com docker exec (root). A cache é recriada com root como proprietário e o php-fpm (www-data) deixa de poder escrever os proxies Doctrine:
Your proxy directory "/app/var/cache/prod/doctrine/orm/Proxies" must be writable
O comando tinha mostrado [OK], e qualquer verificação feita como root funciona: é enganador.
docker compose -f $F up -d --no-deps backend # o entrypoint limpa a cache e repõe os direitos
# ou
docker exec pch_backend sh -c 'chown -R www-data:www-data /app/var'
Regra: qualquer comando de consola executa-se com docker exec -u www-data, e qualquer verificação faz-se com o utilizador real.
500 no início de sessão (« Unable to create a signed JWT »): a chave JWT privada não é legível por www-data, ou a frase-passe de .env.prod não a abre. As chaves estão montadas só de leitura a partir de ~/pch-sig/backend/config/jwt: corrigir os direitos no anfitrião (proprietário 82:82, ou seja www-data da imagem, e modo 600 para a chave privada), não no contentor. Ver Autenticação JWT.
A correção implantada não está ativa
Um build Docker falhado deixa o contentor antigo em funcionamento, saudável. Verificar no contentor uma cadeia própria do código novo (docker exec pch_backend grep -c "…" /app/src/…) e ler ~/build-backend.log. O build lança-se destacado (nohup) para que uma quebra de SSH não o interrompa.
Contentores inesperados (pch-sig-database-1, pch-sig-mailer-1)
O docker compose foi lançado sem -f: arrancou o esqueleto Symfony (compose.yaml). Pará-los com docker compose -f compose.yaml down e depois relançar a aplicação com o -f certo.
Backend em reinício permanente
docker logs pch_backend --tail 50
exec /usr/local/bin/docker-entrypoint.sh: no such file or directory: fins de linha Windows no script.sed -i 's/\r$//' backend/docker/*.sh, depois reconstruir.Unable to read the "/app/.env" environment file:backend/.envausente no momento do build.- Migração falhada: a mensagem SQL está no registo; corrigir a migração e reimplantar.
KeyError: 'ContainerConfig'
Compose v1 (docker-compose) com Docker Engine 28. Instalar o plugin v2 (docker-compose-plugin) e usar docker compose.
Certificado inválido (« TRAEFIK DEFAULT CERT »)
O DNS do nome não existia quando o Traefik pediu o certificado. Verificar nslookup <nome>, depois docker restart pch_traefik para relançar o pedido. Ler docker logs pch_traefik | grep -i acme.
E-mails não recebidos
docker exec pch_backend php bin/console messenger:failed:show: mensagens falhadas e motivo.- Em pré-produção, é normal: o SMTP está inacessível de propósito.
535 Authentication failed: palavra-passe da contanoreply@ucp-pch.orgalterada na OVH sem atualizar.env.prod.
KoboToolbox (pré-produção): os seus e-mails passam pelo relé da produção. docker logs smtp_relay na produção indica status=sent ou o motivo. Se o relé arrancou uma vez com uma palavra-passe errada, mantém-na em duplicado: docker compose -f docker-compose.yml down -v && … up -d em ~/smtp-relay.
Ecrã vazio ou versão antiga depois da implantação
- Forçar o recarregamento (Ctrl+Shift+R); o service worker atualiza-se no recarregamento seguinte.
- Verificar que os ficheiros servidos contêm a alteração (procurar em todos os chunks de
frontend/build/static/js). - Consola do navegador: um recurso bloqueado pela CSP aparece como « Refused to connect »; acrescentar o domínio a
nginx/frontend.confse a chamada for legítima.
Um utilizador não vê nenhum dado
Quase nunca é um erro: a conta não está vinculada a nenhuma instituição ou a nenhum projeto (compartimentação). Verificar em Definições → Utilizadores. Uma conta pode estar autorizada (permissões) sem estar vinculada.
O assistente Bemba não cita a documentação
docker exec -u www-data pch_backend php bin/console app:assistant:indexer --etat
Índice vazio: o build da documentação não está montado (/app/documentation-build) ou a indexação não correu. Relançar app:assistant:indexer.
O Survey Solutions deixou de sincronizar
A ligação é lida na tabela survey_solutions_config (não nas variáveis de ambiente). Verificar a palavra-passe guardada e depois Testar a ligação a partir do ecrã de sincronização.
Disco cheio
docker system df
docker image prune -f && docker builder prune -af
du -sh ~/backups
Informações a juntar a um pedido de suporte
Hora exata, utilizador em causa, ecrã, mensagem mostrada e o excerto correspondente de docker logs pch_backend (sem palavra-passe nem token).