New page docs/steam-cooling.html (site /demos/steam-cooling/): the utility plant as a clickable process diagram. Steam side: raw water, softener and dosing, feed tank with heat-pump feedwater recovery, feed pumps, a bank of two 500 kg/h boilers (third for N+1 as an option), separator and metering, optional accumulator, blowdown, the 10 bar header with a valved, metered branch and trap per press, drip legs and condensate return. Cooling side: Newbilt's press outlets are open (max. 2 bar), so returns drain to a warm tank, pass the heat pump, an optional dry cooler and a plate heat exchanger to a cold buffer tank, and VFD pumps feed the 20 to 25 C header at ~10 bar to every press, the extruders and the central hydraulic oil cooler; the chiller loop (three 250 kW air-cooled modules at 40 C ambient, fourth as option) stays closed and clean. Galvanics cooling (12 to 20 C) is a separate circuit. Operating cases (launch, Duplex system 1, five presses, one module down) show demand against installed capacity; design basis with sources, equipment schedule, RFQ questions. Static SVG, no per-frame work. Design basis at Newbilt's per-machine figures: steam 750 to 900 kg/h, cooling 652.5 kW (625 presses, 15 extruders, 12.5 hydraulics), 305 to 540 l/min circulating. Also found: Newbilt's 53 l/min at ~60 C out is ~140 kW, above its 125 kW peak; listed as a re-quote question. Re-based in the same commit: - scale.md: electrical table (chiller bank ~210 to 325 kW electrical, plant peak ~430 to 700 kW, ~950 to 1,330 kW with electric steam), grid 800 to 1,000 kVA (1,250 to 1,600 with electric steam, Schedule 4 past 1,000 kW), tariff 4.5M to 6.8M THB/yr, battery ~1 h of chiller peak, boiler and chiller banks, biomass up to ~550 t/yr at 1.5 M records, utilities money line. - sustainability.md, biomass.md: same figures; electric steam 5.2M to 6.0M THB/yr mature, 1.6M to 1.8M early; fuel saving 4.0M to 5.4M. - utilities CSV: boiler bank, chiller bank with HX and tanks, softener and loop treatment re-sized; baseline 23.98M-41.63M -> 30.07M-51.33M. - total-investment.md: re-size as an added-scope row (+185k / +294k USD); headline 4.7M to 8.9M unchanged until the investment re-base. - pressing-line, equipment-suppliers, facility-security, fleet calculator (boiler 1000 kg/h, chiller 750 kW), plant page detail texts; README, landing page, build.sh.
Test site: cnxvinyl.lol
https://cnxvinyl.lol/ is the internal test site for this repository: demo
pages from docs/ (the plant operation page
first) and any static site we want to show by link. It runs on the same web
server as buildfor.life (Debian VPS s1, Caddy behind Cloudflare) and is
not a plant service; plant systems follow the
digital factory plan. Every page and file is
sent with noindex and robots.txt disallows everything; nothing is behind
a login unless basic_auth in the Caddyfile is switched on.
How it is built
public/is copied verbatim to the web root: the landing page (index.html),robots.txt, and any static site as its own directory (public/<name>/index.htmlis served at/<name>/).build.shassemblessite/dist:public/plus every entry in itsDEMOSlist, which copies a page out ofdocs/(for exampledocs/plant-operation.htmlto/demos/plant-operation/), so the docs stay the one source. It writesversion.txt(the commit) and fails on any internal link that does not resolve.- To add a demo: one line in
DEMOS, one entry on the landing page. To add a static site: drop its built output inpublic/<name>/and link it. - Local preview:
bash site/build.sh, then opensite/dist/index.html.
How it is deployed
.gitea/workflows/deploy-site.yml runs on every push to master that
touches site/, an HTML page under docs/, or the workflow itself, and on
demand (Actions tab, "Run workflow"). It builds, rsyncs site/dist into
the idle one of /var/www/cnxvinyl.lol and /var/www/cnxvinyl.lol-prev,
swaps them by rename (the blog's pattern), checks version.txt on the
server, purges the Cloudflare cache when the token is set, and finally
checks the public URL (warning only).
The deploy owns the whole web root: anything put into
/var/www/cnxvinyl.lol by hand disappears on the next deploy. Static sites
go into public/ instead.
One-time setup
- DNS in Cloudflare, both proxied (orange cloud):
cnxvinyl.lol CNAME s1.buildfor.lifeandwww CNAME cnxvinyl.lol(Cloudflare flattens the apex CNAME, so the site follows s1 if its address changes). SSL/TLS mode Full (strict): "Flexible" makes a redirect loop with Caddy. - Caddy on s1: append
Caddyfileto/etc/caddy/Caddyfile(the comments in it list the checks),caddy validate, thensystemctl reload caddy. Caddy gets the certificate the same way it does for the buildfor.life apex. - Web root: the deploy user must be able to create and rename
directories in
/var/www, as it already does for the blog. If not:sudo install -d -o <deploy user> /var/www/cnxvinyl.lol /var/www/cnxvinyl.lol-prevand make/var/wwwwritable for that user (the swap renames entries in it). - Secrets in Gitea (repo: Settings > Actions > Secrets, or user level so
every repo of the account gets them):
VPS_HOST,VPS_USER,VPS_SSH_KEY, optionallyVPS_PORT(default 22),VPS_KNOWN_HOSTS(output ofssh-keyscan -p <port> s1.buildfor.life, pins the host key),CLOUDFLARE_ZONE_IDandCLOUDFLARE_API_TOKEN(Zone > Cache Purge on cnxvinyl.lol). The names match the blog's workflow, so the blog's deploy key and values work unchanged: s1 only checks the key against the deploy user'sauthorized_keys, whichever repository sends it. Gitea secrets cannot be read back, so they are entered again here from the private key file; repo secrets set onB4L/buildfor_life_webdo not reach this repository, B4L organisation secrets only reach it if it moves into B4L. The blog key isdeploy@s1.b4l.co.th, fingerprintSHA256:o4w7HL+EsPI3MXbbcYWGn0EykN7qeLtYg0Tc9FI1a3s, and it is the only key in/home/deploy/.ssh/authorized_keyson s1 (sshd on port 2255, soVPS_PORTis 2255). The deploy log prints the fingerprint of the key inVPS_SSH_KEY; if it differs, the server answers "Permission denied (publickey)". If the private key is gone, make a new key instead:ssh-keygen -t ed25519 -N "" -C cnx_vinyl-deploy -f cnx_vinyl-deploy, public half into the deploy user's~/.ssh/authorized_keyson s1, private half intoVPS_SSH_KEY, then delete the local copy. - Runner: the job asks for
ubuntu-latest, the label the blog's runner serves. This repository is under a user account, not the B4L organisation, so a runner registered only for B4L does not pick it up; if the run stays "Waiting", register the runner for this repository or instance-wide, or move the repository into B4L. - Run the workflow once from the Actions tab and open
https://cnxvinyl.lol/.