Production Acceptance Criteria
This page is a checklist for installation personnel and the operations team to determine "readiness for production" based on the same set of criteria. Completion of installation does not simply mean the service has started once; it means that restart, backup, health, security, and acceptance evidence have all been recorded.
1. Go / No-Go Criteria
| Category | Go Criteria | No-Go |
|---|---|---|
| Deployment Mode | plantpulse-edge.service manages containers | Service is not registered |
| systemd | plantpulse-edge.service active + enabled | active but not enabled, or restart loop |
| Health | /api/v1/system/health HTTP 200 + components UP | HTTP 503, component DOWN, persistent response delay |
| Version | /api/v1/system/version's image_tag / build_date recorded | tag unverified, started with previous image |
| Network | WAN, PLC NIC, DNS/NTP, Platform API reachability verified | PLC network has default route, NTP not synchronized |
| Security | /etc/kopens/credentials.txt root 0600, initial admin password change completed | Default/shared password maintained, no record of credential delivery |
| Backup | backup.sh 1 success + .sha256 exists | Backup not executed, backup exists only on the same disk |
| Recoverability | doctor.sh or acceptance log generated | No evidence to provide during failure |
If any item is No-Go, do not deploy to production and follow the escalation procedure in Installation Troubleshooting or Container Mode Operation.
2. Pre-Installation Approval Items
Values the operations team must verify before installation:
| Item | Example |
|---|---|
EDGE_ID | EDGE_00303 |
SITE_ID | SITE_00001 |
| Platform host / API key | SERVER_HOST, SERVER_API_KEY |
| PLC NIC / WAN NIC | NET1_IFACE, NET2_IFACE |
| static IP / gateway / DNS | NET1_IP, NET2_IP, NET2_GATEWAY, NET2_DNS |
| image tag policy | latest or fixed IMAGE_TAG=2026-YYYYMMDD |
| Initial credential policy | random generation or specified by operations team |
| External backup location | NAS / S3 / Operations backup server |
Credentials must not be left in chat or email bodies; they must be delivered via a root-only file or an operations secret store.
3. Secret-safe Installation env
To prevent passwords and API keys from being left in the shell history, use a root-only env file.
sudo -i
umask 077
install -m 600 /dev/null /root/pp-edge-install.env
${EDITOR:-vi} /root/pp-edge-install.env
Example file content:
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 NET1_IFACE=enp1s0
export NET1_IP=192.168.100.10/24
export NET2_IFACE=enp2s0
export NET2_IP=192.168.0.10/24
export NET2_GATEWAY=192.168.0.1
export NET2_DNS=192.168.0.1
# export IMAGE_TAG=2026.11-20261103-1006
Execution:
sudo -i
set -a
. /root/pp-edge-install.env
set +a
cd /opt/kopens/install
bash install.sh
Even if the operations team specifies the initial password, include ADMIN_PASS, API_KEY, MQTT_PASS, OPCUA_PASS, and CERT_PASS in the same file and maintain chmod 600. Use only CERT_PASS for the official cert password key.
4. Acceptance Evidence Collection
After installation, save the evidence files (excluding secret values) using the following command.
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|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"
Items to be delivered to the operations team during acceptance:
- Acceptance text file path and sha256
/data1/pp-backups/pe-backup-*.tar.zstand.sha256/tmp/pe-doctor-*.tar.zstand.sha256(in case of problems)- Gateway IP,
EDGE_ID,SITE_ID, image tag, installation date/time - Confirmation of credential delivery (actual passwords follow separate security procedures)
5. Restart Verification
Before production deployment, verify automatic recovery after a service restart at least once.
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
For sites where PLC connections are already registered, verify the collection status and the last value update after the restart.
6. Backup and Recovery Preparation
sudo bash /opt/kopens/install/bin/backup.sh
ls -lh /data1/pp-backups/
sha256sum /data1/pp-backups/pe-backup-*.tar.zst | tail -1
Copy the first backup to an external NAS, S3, or operations backup server. Backups existing only on the same disk are insufficient for disaster recovery.
7. Lock-down After Operations Acceptance
- Verify that
/etc/kopens/credentials.txtpermission is0600 root - Complete initial admin password change
- Decide on
/root/pp-edge-install.envretention policy: delete from box after transferring to operations secret store or maintain root 0600 - Allow only ports requiring WAN exposure in the firewall
- Register operations team contact information and escalation paths
- Schedule the next inspection date and backup verification date