프로덕션 인수 기준
이 페이지는 설치 담당자와 운영팀이 같은 기준으로 “운영 투입 가능”을 판단하기 위한 체크리스트입니다. 설치가 끝났다는 말은 서비스가 한 번 뜬 것이 아니라, 재시작/백업/헬스/보안/인수 증거가 모두 남았다는 뜻입니다.
1. Go / No-Go 기준
| 구분 | Go 기준 | No-Go |
|---|---|---|
| 배포 모드 | 신규 설치는 container_mode=true | 신규 박스에서 plantpulse.service native 운영 |
| systemd | plantpulse-edge.service active + enabled | active 지만 enabled 아님, 또는 restart loop |
| 헬스 | /api/v1/system/health HTTP 200 + components UP | HTTP 503, component DOWN, 응답 지연 지속 |
| 버전 | /api/v1/system/version 의 image_tag / build_date 기록 | tag 미확인, 이전 image 로 기동 |
| 네트워크 | WAN, PLC NIC, DNS/NTP, 플랫폼 API 도달성 확인 | PLC 망이 default route 보유, NTP 미동기 |
| 보안 | /etc/kopens/credentials.txt root 0600, 초기 admin 비밀번호 변경 완료 | 기본/공유 비밀번호 유지, 자격증명 전달 기록 없음 |
| 백업 | backup.sh 1회 성공 + .sha256 존재 | 백업 미실행, 백업이 같은 디스크에만 존재 |
| 복구성 | doctor.sh 또는 acceptance log 생성 | 장애 시 전달할 증거 없음 |
하나라도 No-Go 면 운영 투입하지 말고 설치 트러블슈팅 또는 컨테이너 모드 운영 가이드의 escalation 절차를 따릅니다.
2. 설치 전 승인 항목
설치 전 운영팀이 확인해야 할 값:
| 항목 | 예 |
|---|---|
EDGE_ID | EDGE_00303 |
SITE_ID | SITE_00001 |
| 플랫폼 host / API key | SERVER_HOST, SERVER_API_KEY |
| PLC NIC / WAN NIC | LAN1_IFACE, LAN2_IFACE |
| static IP / gateway / DNS | LAN1_IP, LAN2_IP, LAN2_GATEWAY, LAN2_DNS |
| image tag 정책 | latest 또는 고정 IMAGE_TAG=2026-YYYYMMDD |
| 초기 자격증명 정책 | random 생성 또는 운영팀 지정 |
| 외부 백업 위치 | NAS / S3 / 운영 백업 서버 |
자격증명은 채팅/메일 본문에 남기지 말고 root 전용 파일 또는 운영 비밀 저장소로 전달합니다.
3. Secret-safe 설치 env
비밀번호와 API key 를 shell history 에 남기지 않으려면 root 전용 env 파일을 사용합니다.
sudo -i
umask 077
install -m 600 /dev/null /root/pp-edge-install.env
${EDITOR:-vi} /root/pp-edge-install.env
파일 내용 예시:
export EDGE_ID=EDGE_00303
export SITE_ID=SITE_00001
export SERVER_HOST=192.168.0.41
export SERVER_API_KEY='<platform-api-key>'
export LAN1_IFACE=enp1s0
export LAN1_IP=192.168.100.10/24
export LAN2_IFACE=enp2s0
export LAN2_IP=192.168.0.10/24
export LAN2_GATEWAY=192.168.0.1
export LAN2_DNS=192.168.0.1
# export IMAGE_TAG=2026-20260524
실행:
sudo -i
set -a
. /root/pp-edge-install.env
set +a
cd /opt/kopens/install
bash install.sh
운영팀이 초기 비밀번호를 직접 지정하는 경우에도 같은 파일에 ADMIN_PASS, API_KEY, MQTT_PASS,
OPCUA_PASS, CERT_PASS 를 넣고 chmod 600 을 유지합니다. 공식 cert password key 는 CERT_PASS 하나만 사용합니다.
4. 인수 증거 수집
설치가 끝나면 아래 명령으로 비밀값을 제외한 증거 파일을 남깁니다.
sudo -i
OUT=/root/pp-edge-acceptance-$(date +%Y%m%d-%H%M%S).txt
{
echo "# PlantPulse Edge acceptance"
date -Is
echo
echo "## host"
hostnamectl
uname -a
timedatectl
echo
echo "## service"
systemctl is-enabled plantpulse-edge.service || true
systemctl is-active plantpulse-edge.service || true
systemctl status plantpulse-edge.service --no-pager | sed -n '1,40p'
echo
echo "## version"
curl -ks https://127.0.0.1/api/v1/system/version | python3 -m json.tool
echo
echo "## health"
curl -ks https://127.0.0.1/api/v1/system/health | python3 -m json.tool
echo
echo "## ports"
ss -lntp | grep -E ':(80|443|1883|1884|6379|7799|9042|1880|12000|12443)([[:space:]]|$)' || true
echo
echo "## storage"
df -h /opt /data1 2>/dev/null || df -h
echo
echo "## docker"
docker ps --filter name=plantpulse-edge --format 'table {{.Names}}\t{{.Image}}\t{{.Status}}'
} > "$OUT"
chmod 600 "$OUT"
sha256sum "$OUT" > "$OUT.sha256"
echo "$OUT"
인수 시 운영팀에 전달할 항목:
- acceptance text 파일 경로와 sha256
/data1/pp-backups/pe-backup-*.tar.zst와.sha256/tmp/pe-doctor-*.tar.zst와.sha256(문제 발생 시)- 게이트웨이 IP,
EDGE_ID,SITE_ID, image tag, 설치 일시 - 자격증명 전달 완료 여부 (비밀번호 원문은 별도 보안 절차)
5. 재시작 검증
운영 투입 전 한 번은 service restart 후 자동 복구를 확인합니다.
sudo systemctl restart plantpulse-edge.service
sleep 30
sudo bash /opt/kopens/install/bin/health.sh
curl -ks https://127.0.0.1/api/v1/system/health | python3 -m json.tool
PLC 연결이 이미 등록된 현장은 restart 후 수집 상태와 마지막 값 갱신까지 확인합니다.
6. 백업과 복구 준비
sudo bash /opt/kopens/install/bin/backup.sh
ls -lh /data1/pp-backups/
sha256sum /data1/pp-backups/pe-backup-*.tar.zst | tail -1
첫 백업은 외부 NAS/S3/운영 백업 서버로 복사합니다. 같은 디스크의 백업만으로는 장애 복구가 되지 않습니다.
7. 운영팀 인수 후 잠금
/etc/kopens/credentials.txt권한이0600 root인지 확인- 초기 admin 비밀번호 변경 완료
/root/pp-edge-install.env보존 정책 결정: 운영 비밀 저장소에 이관 후 박스에서 삭제하거나 root 0600 유지- 방화벽에서 WAN 노출이 필요한 포트만 허용
- 운영팀 연락처와 escalation 경로 등록
- 다음 점검일과 백업 검증일 예약