Files
FunASR/docs/operations/funasr-com-site-release.md
T
2026-10-02 00:02:05 +00:00

8.6 KiB

FunASR.com product-site release

Production record

  • Released: 2026-10-01 (Asia/Shanghai; verified at 2026-09-30T21:57:20Z)
  • Source commit: 460f00675499924fec0a14bdbeb7125ed505dbb2
  • Product release: 20260930T211757Z
  • Previous release: 20260918T065924Z
  • Current link: /root/FunASR/web-pages/current
  • Release root: /root/FunASR/web-pages/releases
  • Backup root: /root/FunASR/web-pages/backups/product-site-20260930T211757Z
  • Build archive SHA-256: 408cc357883dfcae935faef87c95765cdfe249f5ff5916295c87d950b0f49221
  • Release manifest SHA-256: d381634a0c25df10096cdd1befe2a03d4b4c3d968f8ff06ce7292a57acd56f8b
  • Active Nginx SHA-256: 4450f8616438fdf095728c12f50e0fa878a5afd6ccb63cd1cd4af4cc91f88233

The source checkout used for the build matches the source commit's tree 73c82edb750f4e91253468779633fbf3200f7bfb. The release ID was allocated during backup preparation, before the verified publication time above. This release publishes the merged speech-to-speech / SenseVoice source-install guide and bilingual ecosystem entries; it does not publish a new speech model or Python package.

Backup evidence

The pre-release site and Nginx configuration were archived before the atomic switch.

Artifact SHA-256
live-dist.tar.gz 1df646e40da3ccdba3a254b6878aff40faf857be4d20d69c398bd07f1467d6ff
nginx.conf 4450f8616438fdf095728c12f50e0fa878a5afd6ccb63cd1cd4af4cc91f88233
build.tar.gz 408cc357883dfcae935faef87c95765cdfe249f5ff5916295c87d950b0f49221

The previous release remains intact at 20260918T065924Z; its 206 pages passed the production validator before switching. The old release's file hashes were checked again immediately before deployment. No rollback was needed or exercised for this release. The existing Nginx master was gracefully reloaded, with its PID/start identity and configuration unchanged; no model service was restarted.

Verification

  • Exact-source GitHub Actions Product site run 36747934507 passed all three jobs: legacy document links, build/validation, and browser checks. All five workflows on the release source commit completed successfully.
  • Native pre-release checks: 521 product-site tests passed; selected root documentation tests had 100 passes and one collection skip because Sphinx was absent. The separate hosted legacy-document-link job passed.
  • The 117-page product build plus preserved legacy routes passed validation for 206 total HTML pages on ind-gpu8, in production staging, and in the release script's copied staging tree. All 206 pre-existing HTML routes remain present.
  • All 273 deployed files match the transferred per-file SHA-256 inventory. The archive is 8,470,216 bytes. Its output is byte-identical to the earlier browser-tested build.
  • Thirteen public routes returned HTTP 200 with response bodies matching the release files: both homepages, ecosystem pages, community guides, deployment indexes, blog indexes and llama.cpp guides, plus /donors.html.
  • A separate Chromium run from ind-gpu8 against the public domain passed four cases: Chinese/English at 1365px desktop and 390px mobile widths. It verified the integration card, localized guide link/anchor, pinned source recipe, no horizontal overflow and no JavaScript errors. Non-site requests were blocked; no audio/model conversation was run.
  • All thirteen checked HTML responses are no-cache and include X-Frame-Options, X-Content-Type-Options, and HSTS headers.

The previous and new deployment-manifest.json files have the same checksum despite different HTML content. That manifest checksum alone does not prove publication freshness. Verify the actual Chinese guide, English guide, and per-file hashes when checking this release. Both guides must contain source revision 9e2ed1099190a4e4bc8a972b4a3488949ff1b9f6 and the explicit v1.0.0 exclusion.

Release commands

The host runs an existing manually started Nginx master rather than the failed systemd unit. Discover its PID before each operation:

pgrep -a nginx

Deploy a new validated output directory:

PYTHONPATH=/root/.cache/funasr-ops/product-site-python \
NGINX_MASTER_PID=<master-pid> \
VALIDATOR=/root/FunASR/web-pages/ops/product-site/validate.py \
PYTHON_BIN=python3 \
/root/FunASR/web-pages/ops/product-site/deploy-product-site.sh \
  /path/to/validated-output YYYYMMDDTHHMMSSZ

Roll back to a product-site release:

PYTHONPATH=/root/.cache/funasr-ops/product-site-python \
NGINX_MASTER_PID=<master-pid> \
VALIDATOR=/root/FunASR/web-pages/ops/product-site/validate.py \
PYTHON_BIN=python3 \
/root/FunASR/web-pages/ops/product-site/rollback-product-site.sh YYYYMMDDTHHMMSSZ

Restore the pre-release Nginx configuration only if the new configuration is implicated:

cp -a /root/FunASR/web-pages/backups/product-site-20260930T211757Z/nginx.conf /etc/nginx/nginx.conf
nginx -t
kill -HUP <master-pid>

Monitoring

Visible repository, documentation, and release links use the fixed /go/github, /go/docs, and /go/releases routes. The JSON-LD codeRepository value remains the direct GitHub URL so attribution does not change search metadata. Redirect targets are defined only in web-pages/nginx/conversion-map.conf; never accept a target from a query parameter.

For each new release, check after one hour and again after 24 hours, recording completion once. For release 20260930T211757Z, both checks are complete; the follow-up record reports passing static checks with legacy-upstream and log-rotation warnings. Do not repeat these completed windows as pending work.

Before reading logs, discover the serving master and verify its PID, command and start identity. A failed systemd unit or an empty PID file does not mean that the manually started master has stopped. Set NGINX_MASTER_PID to the freshly verified master, then inspect log descriptors and file metadata without sending signals:

set -eu
master_pid=${NGINX_MASTER_PID:?set the verified Nginx master PID}
case "$master_pid" in
  ''|*[!0-9]*) printf '%s\n' 'NGINX_MASTER_PID must be numeric' >&2; exit 2 ;;
esac
ps -p "$master_pid" -o pid=,ppid=,lstart=,args=
find "/proc/$master_pid/fd" -maxdepth 1 -type l -lname '/var/log/nginx/*' \
  -printf '%f -> %l\n' -exec stat -Lc '%d:%i %s %n' {} \;
stat -Lc '%d:%i %s %n' /var/log/nginx/error.log /var/log/nginx/funasr-conversions.log

Compare device/inode identities, not just filenames. After rotation, live descriptors may still reference .log.1 or deleted files while the current .log paths are empty. Empty files are not evidence of no requests or errors. Read the actual open logs and relevant rotated and compressed history for the chosen time interval; do not draw a health conclusion if that coverage is missing. Use equal-duration before/after windows and retain aggregate status/upstream counts only, not visitor addresses or raw requests. Filter known validation traffic when possible, but remaining requests are not organic traffic by default and do not establish star-growth attribution.

The 2026-10-02 read-only inspection found an empty configured PID file while the manual master was alive. The packaged rotation selector could not find that master in test mode, and its init-script helper is written to return success unconditionally. The event that emptied the PID file was not established. Repairing process ownership or log reopening is a separate operational action: do not rewrite the PID file, restart the working master, or invoke service actions during acceptance.

Check legacy upstream errors separately. Existing WebSocket error-page routing converts upstream 502/503/504 failures into 302 redirects, so zero visible 5xx is not proof of backend health. Confirm the upstream/listener against the current configuration; do not attribute pre-existing backend timeouts to a static release.

Header probes supplement, but do not replace, the page-body hashes, indexed-route, asset, mobile-layout and fixed-redirect checks described above:

curl --max-time 15 -fsSI https://www.funasr.com/
curl --max-time 15 -fsSI https://www.funasr.com/deploy/vllm.html
curl --max-time 15 -fsSI https://www.funasr.com/blog/

Investigate elevated 5xx responses, missing indexed routes, mobile overflow, missing assets, invalid conversion redirects or failed static validation. Roll back when the static release is implicated, after checking the current release and retained backup; do not roll back healthy static content solely because a legacy backend or log-rotation path is unhealthy.