Register dta_blog in app_catalog (type: node-static, repo Ditch_The_Agent/dta_blog, default branch main, webroot /var/www/{env}.blog.realpath.app/html). Reuses roles/app-deploy/tasks/node_static.yml (npm ci then npm run build:<env>); the blog's package.json copies dist/ to that webroot after python3 build.py --env <env>.
Add prod 8086 / beta 8087host_apps on adama, roslin, starbuck, apollo, and ai-server-4080 (those ports were free vs 8080–8085 / 8088).
Optional nginx error_page 404 /404.html for this app only (error_page_404 catalog field); other static apps keep the SPA try_files fallback.
Document NPM/DNS (blog.realpath.app → :8086, beta.blog.realpath.app → :8087), no realpath.app/blog mount, and UFW staying LAN/NPM-only.
Test plan
Confirm 8086/8087 unused on app hosts before first deploy.
./scripts/deploy.sh --app dta_blog --env beta --ref main publishes /var/www/beta.blog.realpath.app/html.
./scripts/deploy.sh --app dta_blog --env prod --ref main publishes /var/www/prod.blog.realpath.app/html.
Until dta_blog#1 is on main, use --ref issue-1-static-blog so the SSG (not the stub README) is built.
NPM + DNS + TLS: blog.realpath.app → :8086, beta.blog.realpath.app → :8087. Do not reverse-proxy onto realpath.app/blog.
Prod HTML has article text, Tianji id cmtvvmf562afjzqumwt1yh2y8, links to https://realpath.app/.
Beta HTML has Tianji id cmtvvn6z62agdzqumtk8xijpy, links to https://beta.realpath.app/, demo posts present.
Catalog + host_apps on all webservers (prod 8086 / beta 8087) with webroots
under /var/www/{env}.blog.realpath.app/html. Nginx serves the SSG 404 page
instead of SPA index fallback.
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Summary
dta_bloginapp_catalog(type: node-static, repoDitch_The_Agent/dta_blog, default branchmain, webroot/var/www/{env}.blog.realpath.app/html). Reusesroles/app-deploy/tasks/node_static.yml(npm cithennpm run build:<env>); the blog'spackage.jsoncopiesdist/to that webroot afterpython3 build.py --env <env>.host_appson adama, roslin, starbuck, apollo, and ai-server-4080 (those ports were free vs 8080–8085 / 8088).error_page 404 /404.htmlfor this app only (error_page_404catalog field); other static apps keep the SPAtry_filesfallback.blog.realpath.app→:8086,beta.blog.realpath.app→:8087), norealpath.app/blogmount, and UFW staying LAN/NPM-only.Test plan
./scripts/deploy.sh --app dta_blog --env beta --ref mainpublishes/var/www/beta.blog.realpath.app/html../scripts/deploy.sh --app dta_blog --env prod --ref mainpublishes/var/www/prod.blog.realpath.app/html.main, use--ref issue-1-static-blogso the SSG (not the stub README) is built.blog.realpath.app→:8086,beta.blog.realpath.app→:8087. Do not reverse-proxy ontorealpath.app/blog.cmtvvmf562afjzqumwt1yh2y8, links tohttps://realpath.app/.cmtvvn6z62agdzqumtk8xijpy, links tohttps://beta.realpath.app/, demo posts present.https://blog.realpath.app/sitemap.xml,robots.txt,llms.txtreturn 200.Catalog + host_apps on all webservers (prod 8086 / beta 8087) with webroots under /var/www/{env}.blog.realpath.app/html. Nginx serves the SSG 404 page instead of SPA index fallback.