源文件:09-test-site-node20.v4.sohophp.app.md

# 09. Test Site: node20.v4.sohophp.app

This document records the second live reference site used to validate the toolkit.

# Site identity

  • domain: node20.v4.sohophp.app
  • Node version: 20
  • selected port: 20101
  • repo: /srv/git/node20.v4.sohophp.app
  • site root: /var/www/node20/node20.v4.sohophp.app
  • service: node-site@node20.v4.sohophp.app.service
  • provisioning path: bootstrap-node-site

# Files

  • env metadata: /etc/node-sites/node20.v4.sohophp.app.env
  • nginx vhost: /etc/nginx/conf.d/node20.v4.sohophp.app.conf
  • shared env: /var/www/node20/node20.v4.sohophp.app/shared/.env.local

# Verified behavior

The site has been verified to return:

  • Node version v20.20.2
  • release cwd under releases/<timestamp>
  • shared env value SITE_GREETING=hello-from-bootstrap-node20
  • APP_URL=http://node20.v4.sohophp.app
  • deployed_by=bootstrap-node-site

# Example successful bootstrap command


sudo bootstrap-node-site \


  --domain node20.v4.sohophp.app \


  --node-version 20 \


  --force \


  --site-greeting hello-from-bootstrap-node20 \


  --app-url http://node20.v4.sohophp.app


# Example local checks


curl -fsS http://127.0.0.1:20101/healthz


curl -fsS --resolve node20.v4.sohophp.app:80:127.0.0.1 http://node20.v4.sohophp.app/


systemctl status node-site@node20.v4.sohophp.app.service --no-pager


# Why this site matters

It proves the following chain works end-to-end for Node20 specifically:

  • bootstrap-generated repo skeleton
  • package-lock generation for npm ci
  • release deploy
  • shared env linking
  • build env loading
  • runtime env loading
  • fnm version selection
  • systemd startup
  • Nginx reverse proxy over HTTP

# Notes

At verification time, this domain did not resolve publicly yet, so the reference validation used local host-header probing over HTTP rather than public DNS + HTTPS.