diff --git a/workspace/_assets_/nav.css b/workspace/_assets_/nav.css index c8fa4ad..2a807b1 100644 --- a/workspace/_assets_/nav.css +++ b/workspace/_assets_/nav.css @@ -13,7 +13,7 @@ .wsnav-inner { - width: 57em; + width: 65em; margin: 0 auto; padding: 0.45rem 1.5rem; display: flex; diff --git a/workspace/_assets_/roject.svg b/workspace/_assets_/roject.svg new file mode 100644 index 0000000..9d45528 --- /dev/null +++ b/workspace/_assets_/roject.svg @@ -0,0 +1,277 @@ + + + +ROJECTROJECTROJECTROJECTROJECTCOMPUTER! ZOOM IN!COMPUTER! ZOOM IN!COMPUTER! ZOOM IN! diff --git a/workspace/_assets_/styles.css b/workspace/_assets_/styles.css index 85195ac..cf470c9 100644 --- a/workspace/_assets_/styles.css +++ b/workspace/_assets_/styles.css @@ -35,7 +35,7 @@ body .page { - max-width: 40em; + max-width: 50em; margin: 0 auto; } diff --git a/workspace/history/2026/07-July/12-Sunday/index.html b/workspace/history/2026/07-July/12-Sunday/index.html index 2af7f56..9f68076 100644 --- a/workspace/history/2026/07-July/12-Sunday/index.html +++ b/workspace/history/2026/07-July/12-Sunday/index.html @@ -14,8 +14,9 @@

Sunday, 12 July 2026

Roject — Session Summary

- Full project directory restructure — source/, build/app/, build/data/, - source/pages/ with a copy-pages build step. + Full project directory restructure and first production deployment — + source/, build/app/, build/data/, source/pages/; Roject live at + roject.rokojori.com via nginx + systemd on Server A.

@@ -64,6 +65,36 @@ +
+

First production deployment — roject.rokojori.com

+

+ Roject deployed to Server A and served publicly at + https://roject.rokojori.com. Stack: Node.js 20, + ts-node running source/server/index.ts managed + by a systemd service, nginx as TLS-terminating reverse proxy with a + Let's Encrypt certificate, port 3000 kept closed at the IONOS firewall. +

+

+ Several build gaps were discovered and fixed during the deploy: + component CSS files were never in source control (moved to + source/components/); vendor libraries were in the gitignored + build/app/vendor/ (moved to source/vendor/); + mkdirSync calls in the server lacked { recursive: true } + causing a crash on a fresh clone; and the library-ts browser + tsconfig.roject.json still referenced the old + public/ outDir instead of build/app/. + The copy script was also expanded to copy all non-TS static assets + (CSS, SVG, etc.) from all frontend source directories. +

+
+ roject.rokojori.com + systemd + nginx + Let's Encrypt + Node.js 20 +
+
+
@@ -91,6 +122,30 @@

+
+ systemd over PM2 +

+ systemd is already present on every Linux server and integrates with + journalctl for log management. PM2 is easier for day-to-day + Node.js process management but adds an extra global dependency. For a + single-service deployment systemd is sufficient and keeps the server + dependency surface minimal. +

+
+ +
+ Static assets belong in source/, not build/ +

+ CSS files, vendor libraries, and SVGs were historically placed directly + in public/ (gitignored) and never tracked. A fresh server + clone exposes this immediately — nothing in build/ exists + until the build runs, and the build can only copy what it finds in + source/. Moving all static assets to source/ + makes them first-class source files and ensures a clean deploy from any + fresh clone. +

+
+
Plain Node.js copy script, no npm dependency

@@ -121,7 +176,14 @@ source/library-ts/browser/tsconfig.roject.json — outDir updated
package.json — main and build script updated
.gitignore — replaced data/, storage/, public/ with build/
- source/server/ — all __dirname paths and library-ts imports updated + source/server/ — all __dirname paths and library-ts imports updated
+ source/components/*.css — moved from build/app/ into source control
+ source/vendor/ — vendor libs moved from build/app/ into source control
+ source/library-ts/browser/tsconfig.roject.json — outDir fixed in submodule, committed and pushed
+ scripts/copy-pages.js — expanded to copy all non-TS static assets from all frontend source dirs
+ source/server/db.ts, storage.ts — mkdirSync updated to use { recursive: true }
+ /etc/systemd/system/roject.service — new on Server A
+ /etc/nginx/sites-available/roject — new on Server A

diff --git a/workspace/history/index.html b/workspace/history/index.html index 2c63382..ba750e9 100644 --- a/workspace/history/index.html +++ b/workspace/history/index.html @@ -21,7 +21,7 @@

Sunday, 12 July 2026

-

Full directory restructure — source/, build/app/, build/data/db/, build/data/storage/, source/pages/ with copy-pages build step.

+

Full directory restructure and first production deployment — source/, build/, source/pages/; Roject live at roject.rokojori.com via nginx + systemd.

diff --git a/workspace/outline/index.html b/workspace/outline/index.html index c620bfc..bfd085f 100644 --- a/workspace/outline/index.html +++ b/workspace/outline/index.html @@ -10,8 +10,8 @@
-
- Rojects + Rojects
@@ -71,6 +71,14 @@ A reusable <confirm-dialog> component replaces browser confirm() for destructive actions (currently project deletion).

+

+ The app is deployed and publicly accessible at + https://roject.rokojori.com on Server A. nginx handles TLS + termination and reverse-proxies to the Node.js process managed by a + systemd service. Deployment is currently manual + (git pull && npm run build && systemctl restart roject); + CI automation is the remaining open item. +

@@ -79,23 +87,19 @@
-

1 — Production server + CI

+

1 — CI pipeline (server is live)

- Deploy the Node.js/Express app to a publicly reachable server and wire up a - CI pipeline that builds, tests, and deploys automatically on push. The app's - file-based storage and no-database design make it straightforward to host on - any VPS: nginx as reverse proxy, PM2 or a systemd service for the Node.js - process. CI can run as a self-hosted Gitea/Forgejo Actions runner (matching - the existing self-hosted git remote) or mirror to GitHub Actions. This is - infrastructure work rather than feature work — it should be done once and early - because everything else ships faster and more safely once a real deployment - target and regression-catching pipeline exist. + The server is deployed and running at https://roject.rokojori.com + (nginx + systemd + Let's Encrypt on Server A). What remains is automating the + deploy on push: a Gitea Actions runner installed on Server A registers with the + repo on community.rokojori.com and runs a workflow that pulls, + builds, and restarts the service on every push to main. This is the last piece + that turns the manual deploy into a proper CI/CD pipeline.

- nginx - PM2 / systemd - Gitea Actions - VPS + Gitea Actions runner + act_runner + auto-deploy on push