Introdução
O Riverside Archive consegue se conectar ao PostgreSQL, mas seu site de catálogo inicia antes de a importação única terminar. Adicione a dependência de negócio ausente: o catálogo só pode abrir depois de uma importação bem-sucedida e deve permanecer sem iniciar se a entrada for inválida.
Conclua primeiro Wait for the Archive Database ou conheça seu YAML, suas verificações de integridade, projetos Compose, logs e reinicialização restrita com dados novos. Não é necessário conhecer SQL nem programar aplicações. Este laboratório prepara um banco de dados, dados de origem e referência independentes; arquivos de VMs anteriores não são necessários. O banco de dados inicial fornecido já tem a verificação correta de integridade do TCP final.
Use Workstation, Reference Archive, Your Archive e Collection Notes. Os registros são sintéticos. Atrasos informados expõem estados de treinamento; a prontidão real e os status de saída da importação determinam o resultado. Reserve cerca de 45 minutos para leitura e erros comuns; essa é uma estimativa do autor.
Abra somente após uma importação bem-sucedida
Nesta etapa, você condicionará o catálogo à conclusão de uma importação, comprovará que uma falha real o bloqueia e fará a recuperação com a entrada original.
Compare a prontidão do banco de dados com a do negócio
Comece em Reference Archive. Pesquise Market morning, abra os dois registros correspondentes e baixe suas transcrições distintas. Volte com Back to collection e examine Ferry voices. Your Archive está indisponível, enquanto Collection Notes já consegue explicar a coleção sem ler nenhuma linha importada.
Mude para Workstation, que inicia em /home/labex/project/archive-opening:
cd /home/labex/project/archive-opening
cat compose.yaml
docker compose -p archive ps -a
docker compose -p archive logs importer catalog
O banco de dados fica saudável e o importador termina seu trabalho real. Mas o catálogo tentou ler a tabela cedo demais e encerrou com um erro como relation "entries" does not exist. Um banco de dados aceitar conexões não significa que os dados da aplicação existam. O site deliberadamente não tem novas tentativas ocultas na inicialização; portanto a dependência deve expressar esse requisito.
Este ambiente usa as mesmas quatro funções e relações de portas do laboratório guiado anterior. db já tem uma verificação de integridade TCP e importer aguarda service_healthy. O problema restante é catalog.depends_on.importer.condition: service_started. Ele permite que o catálogo inicie assim que o processo de importação começa, enquanto seu atraso didático informado de seis segundos e sua transação real ainda estão por ocorrer.
Condicione o consumidor real
Substitua essa condição por service_completed_successfully. Isso verifica a conclusão bem-sucedida, não apenas que o processo terminou: um status de importação diferente de zero deve bloquear o catálogo. Um importador de execução única Exited 0 está correto e não deve ser mantido Running nem receber uma política de reinício infinito. Mantenha welcome independente porque suas notas estáticas da coleção não precisam da tabela importada.
O here-document literal completo preserva todas as configurações fornecidas e a verificação existente de integridade do banco de dados. Como no laboratório anterior, > substitui somente compose.yaml; o marcador entre aspas mantém o conteúdo literal:
cat > compose.yaml <<'COMPOSE'
services:
db:
image: dk04-postgres:16
environment:
POSTGRES_USER: archivist
POSTGRES_PASSWORD: training-archive
POSTGRES_DB: archive
TRAINING_DB_DELAY: "8"
volumes:
- data:/var/lib/postgresql/data
- ./scenario/slow-init.sh:/docker-entrypoint-initdb.d/10-training-delay.sh:ro
healthcheck:
test: ["CMD", "pg_isready", "-h", "127.0.0.1", "-U", "archivist", "-d", "archive"]
interval: 1s
timeout: 2s
retries: 40
importer:
image: dk04-archive:1
entrypoint: ["python3", "-B", "/app/importer.py"]
environment:
PGHOST: db
PGUSER: archivist
PGPASSWORD: training-archive
PGDATABASE: archive
TRAINING_IMPORT_DELAY: "6"
volumes:
- ./scenario:/scenario:ro
depends_on:
db:
condition: service_healthy
catalog:
image: dk04-archive:1
entrypoint: ["python3", "-B", "/app/archive.py", "catalog"]
environment:
PGHOST: db
PGUSER: archivist
PGPASSWORD: training-archive
PGDATABASE: archive
ARCHIVE_TITLE: "The Riverside Archive"
ports:
- "8090:8080"
depends_on:
importer:
condition: service_completed_successfully
welcome:
image: dk04-archive:1
entrypoint: ["python3", "-B", "/app/archive.py", "notes"]
environment:
ARCHIVE_TITLE: "The Riverside Archive"
ports:
- "8091:8080"
volumes:
data:
labels:
labex.course: dk04
COMPOSE
docker compose -p archive config
Se a análise falhar, corrija a indentação indicada usando o bloco mostrado antes de iniciar os serviços. Mantenha a aplicação, o importador, o CSV, a autenticação e as portas fornecidos inalterados.
Comprove que uma importação com falha não pode abrir o catálogo
compose.bad.yaml é uma sobreposição fornecida que aponta o importador para um CSV inválido separado. Seu ID de registro contém texto onde a tabela PostgreSQL real exige um inteiro. O importador usa uma transação real e propaga o status diferente de zero do banco de dados; não finge sucesso. O cenário válido original permanece intacto.
Primeiro examine o volume do aluno e confirme os rótulos de projeto/curso conforme ensinado anteriormente:
docker volume inspect archive_data --format '{{json .Labels}}'
Espere com.docker.compose.project: archive e labex.course: dk04. O próximo comando remove deliberadamente apenas os dados descartáveis de treinamento deste projeto para que o teste de entrada inválida não tome emprestada uma tabela importada anteriormente:
docker compose -p archive down --volumes
Dois argumentos -f mesclam a configuração normal e essa sobreposição fornecida, nessa ordem. Espera-se deliberadamente que a próxima inicialização falhe com status nativo 1 porque o importador encerra com status diferente de zero:
docker compose -f compose.yaml -f compose.bad.yaml -p archive up -d --pull never --no-build
docker compose -f compose.yaml -f compose.bad.yaml -p archive ps -a
docker compose -f compose.yaml -f compose.bad.yaml -p archive logs importer
Leia o erro de inteiro inválido. O banco de dados pode continuar saudável, o importador está Exited com código diferente de zero, e o catálogo deve estar Created, sem nunca ter iniciado. O serviço de boas-vindas continua em execução. Um catálogo que inicia e depois falha é um resultado diferente: ele recebeu permissão para consumir uma importação com falha.
Mude para Your Archive e recarregue: nenhum catálogo deve estar disponível. Mude para Collection Notes: sua página independente ainda funciona. Esses são estados reais dos serviços, não uma exibição de sucesso encenada.
Recupere com a entrada válida e use os registros
Mude para Workstation. Verifique novamente os mesmos rótulos do volume do curso antes da limpeza:
docker volume inspect archive_data --format '{{json .Labels}}'
docker compose -f compose.yaml -f compose.bad.yaml -p archive down --volumes
Inicie sem a sobreposição para voltar à entrada válida original. Esse novo armazenamento de dados deve importar do zero:
docker compose -p archive up -d --pull never --no-build
docker compose -p archive ps -a
docker compose -p archive logs importer
Espere banco de dados Healthy, importador Exited 0 e as duas funções web Running. Para um erro comum de caminho ausente ou YAML, volte ao diretório de trabalho indicado, leia compose config ou o log do serviço, corrija a configuração editável e repita somente a reinicialização restrita deste curso. Não edite linhas da origem, suprima erros nem redefina a VM para esconder o problema.
Mude para Your Archive e recarregue. Pesquise Market morning: devem aparecer dois registros com IDs, anos, categorias e histórias diferentes. Abra cada um e use Download transcript, voltando com Back to collection. Pesquise Ferry, abra Ferry voices e baixe sua transcrição. Limpe a pesquisa para mostrar os quatro registros. Examine também The shared garden e seu download. Uma URL de registro desconhecida deve mostrar Record not found, diferente de uma falha de conexão ou de um catálogo indisponível.
O catálogo completo mantém as quatro identidades, inclusive os dois registros diferentes de Market morning:

Mude para Collection Notes: sua página independente de boas-vindas deve continuar disponível. Reference Archive ainda deve oferecer a coleção original completa. Mantenha seu arquivo final em execução. As verificações primeiro observam seu banco de dados real, a importação concluída e os resultados completos do negócio. Depois executam suas escolhas inalteradas de integridade/dependências em armazenamentos de dados novos, separados e descartáveis, com diferentes atrasos didáticos informados e uma amostra de importação inválida. Esses cenários de teste nunca inicializam nem reparam seu arquivo real. Um teste isolado separado também executa seu comando de integridade inalterado sem nenhum servidor de banco de dados; ele deve rejeitar esse destino indisponível.
Resumo
Você distinguiu um banco de dados utilizável de um catálogo produzido com sucesso. Agora, o consumidor aguarda o status de saída 0 do importador, permanece sem iniciar após uma falha real de importação e abre um catálogo novo completo depois de restaurar a entrada válida. A página independente de boas-vindas permanece útil durante todo o processo.



