Configuration change control

Configuration change control

Production runbook for planned configuration changes on Pixop Prime (AWS Marketplace guest or KVM QCOW2 appliance). Pair with the control-plane map in Configuration. This document does not replace WAN firewall design (Network and transport) or transport fault isolation (Transport troubleshooting).

Version gate: Steps below may include relay-only validation (tsduckctl transport, bonded URI groups). Run pixop-version and skip relay workflows unless command -v tsduck-transport-info succeeds and your installed templates use TRANSPORT_BACKEND=relay. Features are capability-gated—not implied by a Marketplace product version label.

1. Change record and roles

Before any production edit, open a maintenance or change ticket that survives handover between NOC shifts.

FieldContent
Appliance identityHostname, cloud instance ID or KVM domain, management IP
Build baselineFull pixop-version output; note Marketplace vs KVM
Change ownerEngineer performing edits
VerifierSecond person or downstream receiver for on-air acceptance
Change classSee §2 (runtime UI, persisted save, nvencc.args, transport env/args, image digest, host OS, watchdog)
Files touchedPaths only—no secret values in the ticket
Pre-change config hashsha256sum of backed-up files (paths listed, not contents)
Planned windowStart/end UTC; rollback deadline
Acceptance criteriaExpected program number, resolution, colour signalling, bitrate band, audio continuity, SRT listener policy
Rollback planRestored file list + exact restart commands

Roles: The change owner edits configuration and executes restarts. The verifier runs read-only checks and downstream decode/viewing tests. Pixop support owns changes to healthcheck.env, systemd units, and qualified media-path flags outside marked operator blocks in nvencc.args.

2. Classify the change

Match your work to the smallest restart surface. Combining unrelated classes in one window complicates rollback.

ClassExamplesApply mechanismOutage character
A — UI runtimeTemporary grade tweak, ITM experimentREST runtime / UI (no Save)No restart; GPU load may change
B — UI Save (persisted)Site default restoration profileSave → params.jsonNo immediate restart; overrides CLI defaults on next Pixop start
C — Encoder outputResolution, --output-csp, VUI transfer, CBR kbps, YADIFEdit nvencc.args → pixopctl restartEnhanced output gap; ingest SRT unit not stopped by restart alone
D — Ingress transportPIPELINE_LATENCY, video/PCR PID, TRANSPORT_BACKEND, main.ingest.argsEdit files or tsduckctl --apply → tsduckctl restart mainIngest + mux gap
E — Egress transportEgress relay template, egress-main.env port/policytsduckctl restart egress-mainDownstream SRT gap only
F — Backbone bitrateTS_TARGET_BITRATE in network.env / main.envRestart TSDuck instances that consume the keyTS timing / buffer behavior change—validate with pixop-flow
G — Container imagePixop LIVE or TSDuck digestpixop-image-update --applyRestarts active units; use rollback only with local *_IMAGE_PREV
H — Host OS / NVIDIADriver, kernel, GPU swapNew tested AMI or QCOW2 appliance imageFull migration—not in-place driver patch on the guest
I — KVM hostVFIO, bridge, memlockOn the Ubuntu host: unpack the shipped installer archive, cd to the extract root, and run sudo ./scripts/pixop-install (see KVM deployment guide) — not a private git checkout on the guestGuest down during host maintenance
J — Watchdog policyPIXOP_HEALTHCHECK_RESTART, grace timersEdit healthcheck.env + support reviewAutomatic pixopctl recover may interrupt ingress during incidents

Native vs relay: On native SRT appliances, transport class D/E uses .env SRT keys (TRANSPORT_BACKEND=native or unset). On relay-capable appliances, default templates may use TRANSPORT_BACKEND=relay with *.ingest.args / *.egress.args. Setting relay without relay helpers fails at start—confirm binaries and templates before switching backends (Transport configuration).

--apply helpers: tsduckctl detect-video-pid main --apply and tsduckctl tune-latency main --apply rewrite ingress .env and restart main—treat as class D.

Pixop does not certify unverified “zero outage” configuration changes on a single encoder appliance.

3. Backup and restore strategy

What to back up privately

AssetWhy
/etc/pixop-live/nvencc.argsEncoder output contract
/etc/pixop-live/tsduck/*.envSRT secrets and PID/latency keys
/etc/pixop-live/tsduck/*.ingest.args, *.egress.argsRelay templates (no live passphrase in file)
/var/lib/pixop-live/parameters/params.jsonPersisted picture profile—not in pack-config

Store backups on the appliance or jump host in a root-only directory. Do not email tarballs containing passphrases or JWTs.

What packers are (and are not)

  • pixop-pack-config — Sanitized copy of /etc/pixop-live with redaction; no license.jwt / Pulse / Docker bodies; does not capture params.json (lives under /var/lib/pixop-live/parameters/).
  • pixop-support-bundle — Full diagnostic archive; nests pack-config; still not a production restore source for secrets or params.json.

Private backup (example)

Run as root on the guest (sudo -i or root shell). Use pixopctl / tsduckctl without extra sudo — the wrappers self-elevate when needed. Reading /etc/pixop-live and writing under /root requires root. Replace CHG-12345 with your ticket id. Record paths and hashes in the change ticket, not file contents.

BKROOT="/root/pixop-config-backup/CHG-12345-$(date -u +%Y%m%dT%H%M%SZ)"
install -d -m 0700 "$BKROOT"
[[ -f /etc/pixop-live/nvencc.args ]] && cp -a /etc/pixop-live/nvencc.args "$BKROOT/"
[[ -f /etc/pixop-live/network.env ]] && cp -a /etc/pixop-live/network.env "$BKROOT/"
[[ -d /etc/pixop-live/tsduck ]] && cp -a /etc/pixop-live/tsduck "$BKROOT/"
if [[ -f /var/lib/pixop-live/parameters/params.json ]]; then
  cp -a /var/lib/pixop-live/parameters/params.json "$BKROOT/"
fi
find "$BKROOT" -type f ! -name SHA256SUMS -print0 | sort -z | xargs -0 -r sha256sum > "$BKROOT/SHA256SUMS"
chmod -R u=rwX,go= "$BKROOT"

Restore (example)

Only after stopping the change window and notifying downstream. Run as root on the guest. The block below only restores files; restarts are separate so a single-file rollback does not restart the whole stack.

BKROOT="/root/pixop-config-backup/CHG-12345-20261021T120000Z"   # your path
sha256sum -c "$BKROOT/SHA256SUMS"

[[ -f "$BKROOT/nvencc.args" ]] && cp -a "$BKROOT/nvencc.args" /etc/pixop-live/nvencc.args
[[ -f "$BKROOT/network.env" ]] && cp -a "$BKROOT/network.env" /etc/pixop-live/network.env
[[ -d "$BKROOT/tsduck" ]] && cp -a "$BKROOT/tsduck/." /etc/pixop-live/tsduck/
if [[ -f "$BKROOT/params.json" ]]; then
  install -d -m 2750 -o 1001 -g pixop /var/lib/pixop-live/parameters
  cp -a "$BKROOT/params.json" /var/lib/pixop-live/parameters/params.json
  chown 1001:pixop /var/lib/pixop-live/parameters/params.json
  chmod 0640 /var/lib/pixop-live/parameters/params.json
fi

Restart only what you restored (match §2 class):

Restored assetTypical restartNotes
nvencc.args onlypixopctl restartEnhanced output gap; ingest SRT unit not stopped by restart alone
params.json only(none) or pixopctl restartClass B: overrides apply on next Pixop start; restart only if you must clear runtime vs persisted immediately
tsduck/*.env / *.ingest.args / *.egress.args (ingress)tsduckctl restart mainRestoring SRT secrets drops and renegotiates ingest sessions
Egress transport files onlytsduckctl restart egress-mainDownstream SRT gap only
network.env (TS_TARGET_BITRATE, multicast)tsduckctl restart main and any instance that reads backbone keys (often main + egress-main)Class F — validate with pixop-flow
Multiple classesCombine the rows above — do not run the full trio unless every layer was restored

After transport restores, run tsduckctl credentials locally to verify the credential sheet—do not print passphrases into tickets or log collectors.

Image rollback: Use pixop-image-update rollback live|tsduck only when LIVE_IMAGE_PREV / TSDUCK_IMAGE_PREV in env files points at a locally present digest (pixop-image-update).

4. Dry-run and on-air acceptance

Pre-change baseline (read-only)

pixop-version
pixop-preflight
pixop-stack status
tsduckctl check main
tsduckctl check egress-main
pixopctl health
pixop-flow --secs 5

When command -v tsduck-transport-info succeeds:

tsduckctl transport main
tsduckctl transport egress-main

Interpretation:

CheckConfirmsDoes not prove
pixop-preflightHost, images, config presence, UID 1001 write probe under parameters/End-to-end video quality
pixop-flowUDP payload Mbps on internal stages when a sender is activePicture processing correctness
pixopctl healthPrometheus text from local HTTP metricsDownstream IRD compliance
tsduckctl checkUnit active + listener/bind policy per transport modeSRT peer connected or encrypted session health
curl -sS http://127.0.0.1:8080/v1/metrics.jsonProcessing counters when fedWAN reachability

For SRT, tsduckctl check may report listener bound while the caller peer is offline—that is expected in listener mode.

Post-change acceptance

Repeat baseline commands. With active contribution:

  1. Confirm pixop-flow shows motion on Ingress -> Pixop, Pixop -> replacement, and Final merged TS / egress stages as applicable.
  2. Verify downstream decoder: correct program, resolution, chroma, and HDR/SDR signalling vs your ticket.
  3. For class C metadata changes, remember VUI flags in nvencc.args set signalling; actual tone mapping may still require UI/params.json alignment (Live output and encoding, Picture processing).

Rollback by class

ClassRollback
ARevert runtime sliders or restart Pixop to last Saved profile
BRestore params.json from backup; pixopctl restart if you need immediate CLI override clearing
CRestore nvencc.args; pixopctl restart
D/E/FRestore tsduck tree + network.env; tsduckctl restart affected instances
Gpixop-image-update rollback per target
H/IRevert to previous appliance image / VM snapshot per disaster-recovery plan

Emergency: Return to last known-good backup under a named ticket—avoid “factory reset” or copying another customer’s /etc tree. pixopctl recover is for wedged pipelines, not routine rollback (Monitoring and health signals).

5. Security and operational hazards

  • No inline secrets in tickets, chat, or runbook copies: JWT, SRT passphrases, Pulse passwords, Docker Hub tokens.
  • Restrict TCP 8080 to management CIDRs; UI and metrics are HTTP without TLS on the guest.
  • Review pixop-pack-config / support bundle tarballs before upload; redaction is best-effort.
  • PIXOP_HEALTHCHECK_RESTART=1 (default in healthcheck.env) can schedule pixopctl recover during prolonged unhealthy metrics—account for that in change timelines.
  • Heavy pixop-process file jobs contend for GPU with live enhancement; avoid batch loads during the same window as class C or picture changes.

6. Worked examples (no secrets)

Example A — Output HDR signalling to SDR VUI (class C)

Goal: Downstream chain expects BT.709 SDR signalling on the enhanced HEVC elementary stream.

  1. Back up nvencc.args (§3).
  2. In the operator colour block, disable the active HLG group and enable the commented SDR BT.709 group per Live output and encoding—one complete profile only.
  3. pixopctl restart.
  4. Accept: downstream VUI reports BT.709; verify picture appearance separately—if the source was HDR, you may still need UI tone-mapping / ITM changes (class A/B), not encoder flags alone.

Example B — Ingress video PID realignment (class D)

Goal: Replacement merge targets the correct video PID after a source lineup change.

  1. With stable inbound MPEG-TS, run read-only: tsduckctl detect-video-pid main --secs 10 (no --apply).
  2. If the result is unambiguous, run tsduckctl detect-video-pid main --secs 10 --apply (updates ORIGINAL_VIDEO_PID / INPUT_PCR_PID and restarts ingress).
  3. Accept: pixop-flow shows replacement traffic; downstream program video returns; re-check audio PIDs if your workflow carries separate audio rules.

Example C — Pipeline latency tune (class D)

  1. tsduckctl tune-latency main (report only).
  2. If recommendation differs from PIPELINE_LATENCY in main.env, apply during a negotiated window: tsduckctl tune-latency main --apply.
  3. Accept: end-to-end latency within agreed bound; no elevated pixop-flow exit 3 (backbone bitrate pressure against TS_TARGET_BITRATE).

Related


Did this page help you?