VM hosting (Option A)
Production layout on the app VM:
| Service | systemd unit | Listen | Process |
|---|---|---|---|
| Dart API | cyberhybridhub-api |
0.0.0.0:3000 |
dart run bin/server.dart in server/ |
| Flutter web | cyberhybridhub-web |
0.0.0.0:80 |
scripts/web_static_server.dart → build/web |
OpenWrt / HAProxy terminates HTTPS on :443 and should proxy:
/→10.10.101.106:80(Flutter static)/v1,/hubs→10.10.101.106:3000(API + SignalR)
Port 3000 is not published on the WAN. See haproxy-openwrt.example.cfg.
Local development uses ./startup.sh (API 3000, web 8080, localhost-only).
API URL for Flutter web builds
Set the same public origin the browser uses (no :3000 on WAN):
| File | Variable |
|---|---|
hosting/hosting.env |
API_PUBLIC_URL=https://cyberhybridhub.com |
server/.env |
API_BASE_URL=https://cyberhybridhub.com (optional; used if hosting unset) |
Build (reads hosting → server → default):
./scripts/build-production-web.sh
Verify baked URL:
grep -o 'https://cyberhybridhub.com[^"]*' build/web/main.dart.js | head -5
Should show https://cyberhybridhub.com for API calls, not :3000.
First-time setup
cd /home/chh/cyberhybridhub.com
cp server/.env.example server/.env
nano server/.env
cp hosting/hosting.env.example hosting/hosting.env
nano hosting/hosting.env
source scripts/flutter-env.sh
./scripts/deploy-production.sh
chmod +x hosting/install-systemd.sh scripts/*.sh
./hosting/install-systemd.sh
OpenWrt HAProxy
Copy hosting/haproxy-openwrt.example.cfg into /etc/haproxy.cfg (merge with mygit rules), then:
haproxy -c -f /etc/haproxy.cfg && /etc/init.d/haproxy reload
curl -skI https://cyberhybridhub.com/v1/me/profile | head -3
Updates
git pull
./scripts/deploy-production.sh
sudo systemctl restart cyberhybridhub-api cyberhybridhub-web
Firebase authorized domains
./scripts/check-firebase-auth-domains.sh
Must include cyberhybridhub.com (and www.cyberhybridhub.com if used).
Legacy Fresh app
The old unit cyberhybridhub.service pointed at /home/chh/publish/server on port 80.
install-systemd.sh stops and disables it when installing the Flutter units.