[portfolio](https://geonwoo.kim/ko/portfolio) › 디핏

# 개발·인프라 운영

https://geonwoo.kim/ko/portfolio/deepeet-infra

기간: 2026.07 — 2026.10

백엔드·콘솔·수집기·에이전트 런타임이 저장소 19곳에 나뉘어 있습니다. vat로 여러 저장소에 걸친 변경과 저장소 사이 연동 규약을 관리하고, 바뀐 범위만 검증합니다. 서버는 Proxmox 한 대에 API·PostgreSQL·MinIO·Jenkins를 나눠 두고, 콘솔은 Vercel에 둡니다. 백업은 Cloudflare R2에 암호화해 보관하고 복원까지 확인합니다. 자격증명은 SOPS로 암호화해 관리합니다.

저장소 19곳의 변경을 vat로 묶고, 배포 뒤 실제 상태와 사업 기록까지 확인하는 절차

팀: 1인

역할: 저장소 간 연동 규약 · 영향 기반 검증 · 배포 절차 · 서버 구성 · 백업과 복원

만든 도구: [vat](https://geonwoo.kim/ko/portfolio#tools) · [orch](https://geonwoo.kim/ko/portfolio#tools)

Git · Python · Shell · Proxmox · Docker · Jenkins · PostgreSQL · MinIO · Cloudflare R2 · SOPS · Prometheus · Vercel

- 여러 저장소에 걸친 변경을 참여 커밋·검증·되돌릴 지점과 함께 묶는 기록
- 저장소 사이 연동 규약을 선언하고 기계로 검사하는 계약
- 기준 커밋과 현재 파일의 해시, 의존 관계로 검사를 고르고 영향이 불명확하면 막는 검증
- 코드 검증·푸시·배포·운영 재조회·사업 기록 반영까지 통과해야 끝나는 배포 절차
- 검증, 이미지 전송, 마이그레이션, 서비스 기동, 실행 중인 커밋 대조로 이어지는 Jenkins 배포
- PostgreSQL 덤프와 필요한 객체를 암호화해 Cloudflare R2에 보관하고, 격리된 환경에 복원해 확인하는 백업
- SOPS로 암호화해 Git에 두는 자격증명

## 다른 저장소가 읽는 테이블의 변경

문제: 수집기가 백엔드 테이블을 직접 읽는 SQL은 백엔드 마이그레이션이 바뀌면 조용히 깨질 수 있습니다.

해결: 수집기 SQL의 테이블·컬럼·타입·허용 값을 마이그레이션과 대조하고, 모양을 알 수 없는 동적 SQL은 막았습니다. 실제 DB 상태 검증과 구조 대조는 따로 돌립니다.

## 제품만 배포되고 남지 않는 기록

문제: 제품만 배포되고 사업 기록이 로컬에 남으면, 다음 작업자는 실제 배포 상태를 알 수 없습니다.

해결: 코드 검증과 푸시, 허용된 범위의 배포와 운영 재조회, 사업 기록 반영까지 통과해야 작업이 끝나게 했습니다.

## 복호화해 보지 않은 백업

문제: 백업 파일이 있어도 실제로 풀어 복원할 수 있는지는 알 수 없습니다.

해결: 백업은 오프사이트 사본을 만들고 복호화해 격리된 환경에 복원한 뒤에야 완료로 봅니다.

## 브라우저 좀비 프로세스가 다 쓴 PID

문제: 브라우저 자동화가 남긴 Chromium 하위 프로세스를 거두지 않아, 좀비 프로세스가 PID 한도를 다 썼습니다. 헬스 체크와 요청 처리 스레드를 만들 수 없었습니다.

해결: 컨테이너에 init 프로세스를 켜고, 배포 때 실제 설정에 켜져 있는지 확인하게 했습니다.


[소싱 데이터](https://geonwoo.kim/ko/portfolio/deepeet-sourcing) · [운영 콘솔·고객 응대](https://geonwoo.kim/ko/portfolio/deepeet-console)
