AutoVoice now ships a canonical bootstrap flow for Jetson Thor:
scripts/setup_jetson_thor.shThe script assumes the existing autovoice-thor conda environment and the shared bootstrap in scripts/common_env.sh. It does not create a new environment. Instead it:
- activates the canonical interpreter
- verifies required dependencies and TensorRT
- prepares runtime directories under
data/,logs/, the pretrained bootstrap directory, andreports/platform/ - bootstraps the companion MySQL, PostgreSQL, and Qdrant containers when Docker is available
- initializes both the MySQL metadata schema and PostgreSQL profile schema
- brings up the bundled
docker-compose.yamlbackend/frontend stack - optionally downloads pretrained and SOTA model assets
- optionally installs the bundled systemd unit
- runs the CUDA and latency validation wrapper
scripts/setup_jetson_thor.sh --output-dir reports/platformThe pretrained model host directory is explicit and operator-owned:
export AUTOVOICE_PRETRAINED_DIR=/srv/autovoice/models/pretrained
python scripts/setup_sota_models.py --models-dir "$AUTOVOICE_PRETRAINED_DIR"If AUTOVOICE_PRETRAINED_DIR is unset, bootstrap scripts use repo-local
models/pretrained as a host default. The compose stack always mounts the
selected host directory into the stable container path /app/models/pretrained.
SECRET_KEY is required by compose; scripts/setup_jetson_thor.sh derives it
from SECRET_KEY, then AUTOVOICE_SECRET_FLASK_SECRET_KEY, and otherwise
generates an ephemeral local bootstrap secret.
Useful flags:
--dry-run: print the actions without executing them--skip-model-download: keep existing model assets untouched--skip-service-setup: skip dependency-container bootstrap, schema init, compose bring-up, and systemd checks--skip-systemd: skip the systemd unit install step--skip-latency-validation: skip the multi-pipeline latency benchmark wrapper
The setup flow writes its outputs under reports/platform/ by default:
jetson-dependency-audit.txtdependency-audit.jsonhardware-lane-gates.jsonall-latency-report.md
You can rerun the validation independently:
scripts/validate_cuda_stack.sh --pipeline all --output-dir reports/platform
python scripts/run_completion_matrix.py --output-dir reports/completion/latest
python scripts/validate_release_candidate.py --base-url http://127.0.0.1:5000 --report-dir reports/platform
python scripts/validate_hosted_deployment.py --skip-dns --skip-tls --vhost-file /etc/apache2/sites-available/autovoice.giggadev.com.conf
python scripts/validate_benchmark_dashboard.py- Expected web port:
5000 - Common companion ports checked during setup:
3306(MySQL),5432(Postgres),6333(Qdrant) - Compose stack source:
docker-compose.yaml - Compose images:
autovoice-backend:${AUTOVOICE_IMAGE_TAG:-local},autovoice-frontend:${AUTOVOICE_IMAGE_TAG:-local}, pinned Prometheus and Grafana images requirements.lockadditionally records the digest-pinned image references for backend base image, frontend builder/runtime images, and monitoring images. CI enforces this viascripts/check_dependency_contract.py.- Durable app state: compose sets
DATA_DIR=/app/dataand persists canonical state directories with named volumes, includingapp_state,voice_profiles,samples,trained_models,checkpoints, upload/output folders, YouTube/separation staging folders, and swarm run/memory folders - Systemd unit source:
config/systemd/autovoice.service - Root privileges are only required if you want the setup script to install the service unit
The live AutoVoice app on this host is served behind Apache and the existing
autovoice.service backend:
- backend service:
autovoice.service - backend bind:
127.0.0.1:10600 - frontend document root:
frontend/dist - Apache vhost files:
/etc/apache2/sites-available/autovoice.giggadev.com.conf/etc/apache2/sites-available/autovoice.giggadev.com-le-ssl.conf
Apache serves the built frontend directly from frontend/dist and reverse
proxies /api, /socket.io, /health, and /ready to the backend on
127.0.0.1:10600. The /ready proxy must be defined before the frontend SPA
fallback so public readiness returns backend JSON instead of index.html.
Because AutoVoice accepts large multipart audio uploads, Apache's ModSecurity
request-body limit must be raised above the default 13,107,200 bytes on the
live host. The current production host is configured with:
SecRequestBodyLimit 262144000
If this limit is reset during a host rebuild, the upload APIs will fail before
the app sees the request, typically as 413 Request Entity Too Large on:
/api/v1/convert/workflows/api/v1/karaoke/upload- profile sample/song upload endpoints
The current vhost accepts both hostnames:
autovoice.giggadev.comautovoice.giggahost.com
For public HTTPS on autovoice.giggahost.com, the host still needs two
external prerequisites outside the repo:
- DNS for
autovoice.giggahost.commust resolve to this server - the active Let's Encrypt certificate must include
autovoice.giggahost.com - every enabled Apache vhost must reference existing certificate files, because
one unrelated missing certificate path can block
apache2ctl configtestand prevent AutoVoice reloads
The hosted preflight inventories every enabled Apache SSLCertificateFile and
SSLCertificateKeyFile. This catches the failure mode where Apache is serving a
valid certificate from memory but the referenced /etc/letsencrypt/live/...
directory has been deleted or broken on disk. If the check fails, recreate the
missing Let's Encrypt live path with certbot certonly --webroot for the
affected hostname, run sudo apache2ctl configtest, then reload Apache.
Release-candidate status is commit-specific. Do not infer current readiness from
mutable reports/*/latest files unless the embedded git SHA matches the
candidate HEAD. Use current-truth.md for the local,
private, public, and commercial readiness vocabulary.
The repo now ships two executable validation lanes:
- GitHub Actions
release-candidate: on a self-hosted Jetson runner, validate compose config, boot the realdocker-compose.yamlbackend/frontend stack, and runscripts/validate_release_candidate.py - GitHub Actions
jetson-nightly: runscripts/validate_cuda_stack.sh --pipeline allon a self-hosted Jetson runner
Release-candidate validation now requires benchmark evidence artifacts under
reports/benchmarks/latest/ to be structurally valid and to carry provenance
for the candidate commit being validated. A stale dashboard or release-evidence
pair from another git SHA no longer satisfies the RC gate.
The canonical production completion matrix is:
python scripts/run_completion_matrix.py --full --base-url http://127.0.0.1:10001Use the default smoke mode for local development when frontend browser tooling,
Docker, public DNS/TLS, or Jetson TensorRT hardware are intentionally
unavailable. Smoke mode still writes reports/completion/latest/completion_matrix.json
and records unavailable lanes explicitly instead of hiding them.
HQ-SVC is not part of the supported production dependency contract because its
upstream runtime requires fairseq and related optional packages. The CUDA
validation lane records that support boundary in hardware-lane-gates.json; to
exercise it intentionally, install the HQ-SVC experimental dependency set,
restore the HQ-SVC assets, set AUTOVOICE_HQSVC_FULL=1, and rerun the hardware
validation on CUDA.
MeanVC remains an experimental live lane. scripts/validate_cuda_stack.sh --pipeline all
runs it only when its runtime assets are present and AUTOVOICE_MEANVC_FULL=1
is set; otherwise it emits an explicit realtime_meanvc gate with
owner=model-runtime and the action to run scripts/prepare_meanvc_assets.py
and opt into the full MeanVC lane instead of failing supported hardware lanes
with an unexplained environment error.
Post-release public production monitoring is handled by
.github/workflows/production-monitoring.yml. It runs a nightly health smoke
against https://autovoice.giggahost.com and a weekly full workflow proof that
uploads tracked audio fixtures, trains a minimal LoRA, queues conversion,
downloads output artifacts, and archives evidence under reports/production_smoke.
Run the same checks manually with:
python scripts/run_production_smoke.py --mode health
python scripts/run_production_smoke.py --mode full --timeout-seconds 1800Rollback drills are dry-run by default and write a machine-readable command plan:
python scripts/run_rollback_drill.py \
--base-url https://autovoice.giggahost.com \
--output reports/platform/rollback-drill.jsonThe hosted preflight lane is machine-checkable:
python scripts/validate_hosted_deployment.py \
--hostname autovoice.giggahost.com \
--backend-port 10600 \
--vhost-file /etc/apache2/sites-available/autovoice.giggadev.com.conf \
--vhost-file /etc/apache2/sites-available/autovoice.giggadev.com-le-ssl.confUse --skip-dns or --skip-tls only for local/dry-run checks where public
records or certificates are intentionally unavailable.
Current-head hardware release evidence is generated separately from the smoke matrix and fails closed when Jetson/CUDA lanes are not actually executed:
python scripts/run_hardware_release_evidence.py --executeThe runner writes immutable artifacts under reports/release-evidence/<timestamp>-<git-sha>/
and mirrors the latest decision to reports/release-evidence/latest/release_decision.json.
Use --dry-run --allow-blocked only to prove preflight/report generation on
non-Jetson developer machines; a dry-run decision is never release-ready.
Rollback criteria for a release candidate are simple:
/api/v1/healthis not healthy/readyis not ready/api/v1/metricsdoes not respond- compose config is invalid
- Jetson CUDA/TensorRT validation fails on the target hardware lane
For broader production guidance, monitoring, and Docker notes, see deployment-guide.md.