소개
The Riverside Archive는 PostgreSQL에 연결할 수 있지만 일회성 가져오기가 끝나기 전에 카탈로그 웹사이트가 시작됩니다. 빠진 업무 의존성을 추가하세요. 카탈로그는 가져오기가 성공한 뒤에만 열리고, 입력이 잘못되면 시작되지 않은 상태로 남아야 합니다.
먼저 Wait for the Archive Database를 완료하거나 YAML, 상태 검사, Compose 프로젝트, 로그, 범위를 제한한 새 데이터 재시작을 알고 있어야 합니다. SQL이나 애플리케이션 프로그래밍은 필요하지 않습니다. 이 실습은 독립적인 데이터베이스, 소스 데이터, 참조 서비스를 준비하므로 이전 VM 파일은 필요하지 않습니다. 제공된 초기 데이터베이스에는 이미 올바른 최종 TCP 상태 검사가 있습니다.
Workstation, Reference Archive, Your Archive, Collection Notes를 사용하세요. 기록은 합성 자료입니다. 공개된 지연은 교육용 상태를 드러내며, 결과를 결정하는 것은 실제 준비 상태와 가져오기 종료 상태입니다. 읽기와 일반적인 실수를 포함해 약 45분을 예상하세요. 이는 저자의 예상 시간입니다.
가져오기 성공 후에만 열기
이 단계에서는 완료된 가져오기를 카탈로그의 시작 조건으로 설정하고 실제 실패가 이를 차단함을 입증한 뒤 원래 입력으로 복구합니다.
데이터베이스와 업무 준비 상태 비교하기
Reference Archive에서 시작하세요. Market morning을 검색하고 일치하는 레코드 두 개를 모두 열어 서로 다른 녹취록을 다운로드합니다. Back to collection으로 돌아가 Ferry voices를 살펴보세요. Your Archive는 사용할 수 없지만 Collection Notes는 가져온 행을 읽지 않고도 컬렉션을 이미 설명할 수 있습니다.
Workstation으로 전환하세요. 시작 위치는 /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
데이터베이스는 healthy가 되고 importer는 실제 작업을 마칩니다. 하지만 catalog는 너무 일찍 테이블을 읽으려다가 relation "entries" does not exist 같은 오류로 종료했습니다. 데이터베이스가 연결을 받는다고 해서 애플리케이션 데이터가 존재하는 것은 아닙니다. 웹사이트에는 의도적으로 숨은 시작 재시도가 없으므로 이 요구를 의존성으로 표현해야 합니다.
이 환경은 앞선 가이드 실습과 같은 네 역할과 포트 관계를 사용합니다. db에는 이미 TCP 상태 검사가 있고 importer는 service_healthy를 기다립니다. 남은 문제는 catalog.depends_on.importer.condition: service_started입니다. 공개된 6초 교육 지연과 실제 트랜잭션이 아직 남아 있어도 가져오기 프로세스가 시작되는 즉시 catalog 실행을 허용합니다.
실제 소비 서비스의 시작 조건 설정하기
해당 조건을 service_completed_successfully로 바꾸세요. 이는 프로세스가 끝났다는 사실만이 아닌 성공적인 완료를 확인합니다. 0이 아닌 가져오기 상태는 catalog를 차단해야 합니다. 일회성 importer의 Exited 0은 올바른 상태이며 Running으로 유지하거나 끝없는 재시작 정책을 지정하면 안 됩니다. 정적 컬렉션 안내에는 가져온 테이블이 필요하지 않으므로 welcome은 독립적으로 두세요.
전체 리터럴 히어 도큐먼트는 제공된 모든 설정과 기존 데이터베이스 상태 검사를 보존합니다. 앞선 실습처럼 >는 compose.yaml만 교체하며 따옴표로 감싼 표시는 내용을 그대로 유지합니다.
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
해석에 실패하면 서비스를 시작하기 전에 표시된 블록을 사용해 보고된 들여쓰기를 수정하세요. 제공된 앱, importer, CSV, 인증, 포트를 변경하지 마세요.
실패한 가져오기가 카탈로그를 열 수 없음을 입증하기
compose.bad.yaml은 importer가 별도의 잘못된 CSV를 가리키게 하는 제공된 오버라이드입니다. 실제 PostgreSQL 테이블이 정수를 요구하는 곳에 레코드 ID가 텍스트를 포함합니다. importer는 실제 트랜잭션을 사용하고 데이터베이스의 0이 아닌 상태를 전달하며 성공한 척하지 않습니다. 원래의 유효한 시나리오는 온전히 유지됩니다.
먼저 앞서 배운 대로 학습자 볼륨을 확인하고 프로젝트/과정 라벨을 검증하세요.
docker volume inspect archive_data --format '{{json .Labels}}'
com.docker.compose.project: archive와 labex.course: dk04가 예상됩니다. 다음 명령은 잘못된 입력 테스트가 이전에 가져온 테이블을 빌려 쓸 수 없도록 이 프로젝트의 일회용 교육 데이터만 의도적으로 제거합니다.
docker compose -p archive down --volumes
두 -f 인수는 일반 설정과 제공된 오버라이드를 그 순서로 병합합니다. 다음 시작은 importer가 0이 아닌 상태로 종료하므로 명령 자체가 종료 상태 1을 반환하며 실패할 것으로 의도적으로 예상됩니다.
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
잘못된 정수 오류를 읽으세요. 데이터베이스는 healthy로 남을 수 있고 importer는 0이 아닌 코드로 Exited이며, catalog는 한 번도 시작되지 않은 Created여야 합니다. welcome 서비스는 계속 실행됩니다. catalog가 시작한 뒤 충돌하는 것은 다른 결과입니다. 실패한 가져오기를 소비하도록 허용된 것이기 때문입니다.
Your Archive로 전환하여 새로고침하세요. 카탈로그를 이용할 수 없어야 합니다. Collection Notes로 전환하면 독립적인 페이지는 여전히 작동합니다. 이는 연출된 성공 화면이 아닌 실제 서비스 상태입니다.
유효한 입력으로 복구하여 레코드 사용하기
Workstation으로 전환하세요. 정리 전에 같은 과정 볼륨 라벨을 다시 확인합니다.
docker volume inspect archive_data --format '{{json .Labels}}'
docker compose -f compose.yaml -f compose.bad.yaml -p archive down --volumes
원래의 유효한 입력으로 돌아가려면 오버라이드 없이 시작하세요. 이 새 데이터 저장소는 처음부터 가져와야 합니다.
docker compose -p archive up -d --pull never --no-build
docker compose -p archive ps -a
docker compose -p archive logs importer
데이터베이스 Healthy, importer Exited 0, 두 웹 역할 Running이 예상됩니다. 일반적인 경로 누락이나 YAML 실수는 명시된 작업 디렉터리로 돌아가 compose config 또는 서비스 로그를 읽고 수정 가능한 설정을 고친 뒤 이 과정 범위의 재시작만 반복하세요. 문제를 숨기려고 소스 행을 수정하거나 오류를 억제하거나 VM을 초기화하지 마세요.
Your Archive로 전환하여 새로고침합니다. Market morning을 검색하면 ID, 연도, 분류, 이야기가 서로 다른 두 레코드가 나타나야 합니다. 각각 열어 Download transcript를 사용하고 Back to collection으로 돌아오세요. Ferry를 검색하고 Ferry voices를 열어 녹취록을 다운로드합니다. 검색을 지워 네 레코드 전체를 표시하세요. The shared garden과 그 다운로드도 살펴봅니다. 알 수 없는 레코드 URL은 연결 실패나 사용할 수 없는 카탈로그와 구별되는 Record not found를 표시해야 합니다.
완성된 카탈로그는 서로 다른 두 Market morning 레코드를 포함하여 네 식별값을 모두 유지합니다.

Collection Notes로 전환하세요. 독립적인 환영 페이지가 계속 이용 가능해야 합니다. Reference Archive도 원래의 전체 컬렉션을 계속 제공해야 합니다. 최종 아카이브를 실행해 두세요. 검사는 먼저 실제 데이터베이스, 완료된 가져오기, 전체 업무 결과를 관찰합니다. 그다음 공개된 교육 지연 값을 다르게 하고 잘못된 가져오기 샘플을 사용하여 별도의 일회용 새 데이터 저장소에서 변경하지 않은 상태/의존성 선택을 실행합니다. 이 fixture들은 실제 아카이브를 초기화하거나 수정하지 않습니다. 별도의 격리 테스트는 데이터베이스 서버가 전혀 없는 상태에서 변경하지 않은 상태 명령도 실행합니다. 이 명령은 사용할 수 없는 엔드포인트를 거부해야 합니다.
요약
사용 가능한 데이터베이스와 성공적으로 생성된 카탈로그를 구분했습니다. 소비 서비스는 이제 importer의 종료 상태 0을 기다리고, 실제 가져오기 실패 후에는 시작되지 않은 상태로 남으며, 유효한 입력을 복원하면 완전한 새 카탈로그를 엽니다. 독립적인 환영 페이지는 내내 사용할 수 있습니다.



