## Problem and outcome / 问题与结果 Self-hosting currently requires assembling a Server installation, while App port mappings can use the wrong external port or remain active after cancellation. This phase adds a verified Linux x64 Server image and Compose recipe, and repairs the existing NAT-PMP dependencies so mapping results, cancellation and cleanup follow the gateway response and request lifetime. The image wraps the exact verified Server archive and is tested before publication. Version tags retain their original image; `latest` follows the latest published GitHub release. The two scoped dependency replacements retain upstream source, tests and licenses, with their removal criteria documented in `internal/thirdparty/README.md`. Planned release: **v1.3.0** (compatible Docker distribution feature plus NAT fixes). ## Release notes ### 中文 - 新增 Linux x64 Docker 镜像与 Compose 部署方式,内置网页、信令和 STUN,可按需开启 SFU 兜底。提供部署、更新与备份教程。 - 修复 App 的 NAT-PMP 端口映射:正确使用路由器分配的外部端口,并在关闭时尝试删除映射。 - NAT-PMP 请求会随取消或超时结束,避免连接尝试结束后继续在后台重试。 已有配置和房间数据格式保持兼容,更新无需迁移。 ### English - Added a Linux x64 Docker image and Compose setup with the Web UI, signaling, STUN and optional SFU fallback, plus deployment, update and backup guides. - Fixed App NAT-PMP mappings to use the external port assigned by the router and attempt mapping removal on shutdown. - NAT-PMP requests now stop on cancellation or timeout, preventing retries from continuing after a connection attempt has ended. Existing configuration and room data formats remain compatible; no migration is required. ## Verification / 验证 [Candidate CI](https://github.com/TNTcraftHIM/Piik/actions/runs/34761969362) passed for `1d8de6c4690434cd2cf44fbdee4f45b1776432fa`. The final two files changed after that run are documentation only (`docs/todo.md` and `docs/verification-status.md`), with repository hygiene checked separately. - Web type checks, unit tests and production build; Go core tests, vet and target builds; NAT and media-edge race detection. - Actual packaged-image checks with Docker Compose: production startup, embedded Web, UDP STUN, optional SFU startup, retained room authority across recreation, diagnostic ZIP export, non-root/read-only execution and clean shutdown. - Windows x64, Linux x64 and macOS arm64 App packaging. - Scoped NAT dependency regressions cover assigned ports, renewal, deletion, cancellation, lost replies and PCPv6 composition using real local UDP endpoints. The publishing pipeline reruns the image checks for the merged release revision. First publication also requires making the GHCR package public and checking anonymous pulls of its version and `latest` tags. Representative physical routers, public-media networks and operator-specific HTTPS/firewall settings remain outside the container smoke test. ## Impact / 影响 No signaling, native-control or storage-format change. Existing App/Server installations remain compatible. Docker supports `linux/amd64` in this phase; its default is P2P, and SFU remains an explicit deployment option. Existing deployments keep their configuration. README, bilingual self-hosting guides, container maintenance, versioning, dependency provenance and NAT evidence are updated. Completed feedback is removed from TODO; ongoing network evidence remains tracked there.
6.7 KiB
Verification Status
Last updated: 2026-09-13
This file owns physical evidence limits that change how the product may be described. Status owns the execution/deployment index. Product modules own behavior; research owns measurements; Git owns completed implementation and obsolete package history.
Current Evidence
Windows App and Browser are the owner's primary acceptance targets. Current Go packages embed their Web assets and do not run a Node backend. The current contract is Browser/server v23, Native control v9 and capture v7.
Bounded current checks cover:
- Native H264/VP8 output, compatible encoding reuse, different weak-budget grouping, keyframe-safe retarget and independent retirement;
- Windows live/paused/quiet-source settings, source replacement and subsequent sharing, including media-object continuity where required;
- Native H264 SFU video and decoded Opus through a profile change and closure;
- Browser-to-App fanout and App-exit fallback;
- concurrent Native sessions with independent media and retirement;
- complete large encoded access-unit transport and bounded queue/cache behavior;
- Linux container startup as non-root with a read-only filesystem, memory/SQLite restart semantics, diagnostics export, STUN and listener lifecycle; and
- public embedded-SFU H264/VP8, audio, live profile changes and closure after the coordinated production cutover.
The owner confirmed Windows 10 whole-display capture resolved. Chromium WebRTC/IP-handling policy explains the verified local-media failure; it is a Browser policy limitation, not a Vivaldi-specific transport workaround.
NAT traversal and Auto codec selection are implemented features, not unfinished functionality. On 2026-09-09 the owner confirmed that the new NAT traversal is useful in actual use. That field confirmation is accepted; it does not claim a population success percentage or identify which candidate won without a trace. Neither a statistical NAT campaign nor exhaustive Auto hardware benchmarking is required to close this phase. Investigate further only from a new failure or a measured improvement worth its implementation and maintenance cost.
Candidate Evidence Boundary
The 2026-09-11 functional test acceptance used two genuine Windows App packages and matching Server source/Web builds under the same private contract. Both App/Site version directions delivered decoded 1080p H264 from an isolated native test window. Replacing the Server process preserved SQLite Host authority, private code-entry policy, Viewer grant/password authorization and App configuration. Already-open Host/Viewer pages reauthenticated without reloading and completed subsequent sharing. Exact measured identity belongs to the package descriptors and local structured acceptance result; Git retains the preparation history.
This is bounded single-machine Windows evidence. The local Server executables were built for Windows from the matching source; this run did not execute the Linux release archives. Process replacement used a forced stop on Windows and does not promise uninterrupted media. It does not cover game/audio endurance, storage faults or the wider device/network matrix.
The first public release passed real Server/three-platform App packaging and GitHub/Gitee publication, including anonymous mirror checksum verification. These packaging checks do not establish physical macOS/Linux capture or expand the device/network evidence below. Status owns current publication and activation state.
Remaining Device And Network Acceptance
The following are broader coverage and endurance tasks, not automatically new implementation mechanisms:
- heterogeneous public-network P2P and multi-hop Browser/Native/SFU-fed relays;
- Native IPv6 direct connections across separate networks with usable IPv6; local dual-stack checks establish socket and candidate behavior only;
- Host/Viewer TUN/VPN combinations, migration and all-UDP-blocked bounded failure;
- two-room public SFU load, real-game audio/video synchronization and sustained packet loss/recovery;
- weaker Hosts at 720p30, 1080p30 and 1080p60, CPU/GPU contention, thermals, long-running resources and the 20-Viewer bound; and
- physical mobile autoplay, background/lock, page reclamation, rotation, Wi-Fi/cellular migration and relay survival.
A short 20-Viewer topology run from an earlier revision proves only its tested invariants; it is not current-contract endurance or a public-network quality guarantee. A direct postflight with both endpoints on one machine proves public signaling and local media, not restricted-NAT traversal.
macOS/Linux physical capture/audio/recovery remains explicitly deferred by the owner. Linux producer compilation and older Mac SDK/package evidence do not prove the current Windows multi-output adaptation contract on those platforms.
Adaptation Boundaries
The encoder-pool research retains both successful and unsuccessful observations:
- A prolonged shaped-network run recovered original output about 1.5 seconds after release and stayed near 30 fps; an earlier twelve-second observation missed recovery. The cause of that difference is not established.
- H264's stock QP adaptation can take tens of seconds to restore full size.
- Extreme single-core VP8 overload produced multi-second encode gaps that reset the stock CPU detector's samples. That result does not establish normal-device or Browser parity and does not authorize custom CPU thresholds.
- Equal effective demands can share; incompatible demands may need more encoders. Extra fallback outputs, buffers and recovery keyframes have real costs.
- The 360-to-187 encode-call result compares a bounded prototype with independent encoders. It is not an old-versus-new Native product CPU benchmark.
The earlier borrowed-child Browser experiment failed independent quality and accounting. The independent producer in ADR-0014 now has bounded H264/VP8 direct/relay, weak-path, lifecycle and A/V evidence on the acceptance candidate; its research owns results and limits. The owner authorized its release on 2026-09-09. Browser relay shares local outputs among its direct children; it still re-encodes received media. Native/SFU healthy forwarding remains encoded.
Interpretation
Configuration/unit/loopback checks prove their named invariants. Physical results belong to the tested revision, device and workload. Missing counters remain unknown. A new diagnostic collector must be checked in a real exported report, including retention and failed-collector information; logging a method call alone does not establish useful evidence. Browser/OS suspension remains a physical limit rather than a keepalive guarantee.