Operations
Deployment guide
Stand the dashboard up on a fresh Ubuntu/Debian VPS, either with the bundled installer or step by step, and reach it on the server's IP.
Prerequisites
- A Linux VPS (Ubuntu or Debian assumed below) with root/sudo.
- The project folder uploaded to the server.
- Outbound internet from the server (for npm, and for live Polymarket data).
Option A — automated
From inside the project directory:
cd weather-dashboard
sudo bash deploy/setup.sh
This installs Node and nginx, deploys to /opt/weather-dashboard, creates a
service user, enables the service on boot, configures nginx, and opens the firewall. When
it finishes it prints the URL. Open http://<server-ip>/.
Option B — manual
1. Install Node 18+ and nginx
curl -fsSL https://deb.nodesource.com/setup_20.x | sudo bash -
sudo apt-get install -y nodejs nginx
2. Deploy files and install dependencies
sudo mkdir -p /opt/weather-dashboard
sudo cp -r server.js package.json public /opt/weather-dashboard/
cd /opt/weather-dashboard
sudo npm install --omit=dev
sudo useradd --system --no-create-home wdash
sudo chown -R wdash:wdash /opt/weather-dashboard
3. Run it as a service
sudo cp deploy/weather-dashboard.service /etc/systemd/system/
sudo systemctl daemon-reload
sudo systemctl enable --now weather-dashboard
systemctl status weather-dashboard
The app now listens on 127.0.0.1:3000.
4. Put nginx in front
sudo cp deploy/nginx.conf /etc/nginx/sites-available/weather-dashboard
sudo ln -sf /etc/nginx/sites-available/weather-dashboard /etc/nginx/sites-enabled/
sudo rm -f /etc/nginx/sites-enabled/default
sudo nginx -t && sudo systemctl reload nginx
5. Open the firewall
sudo ufw allow OpenSSH
sudo ufw allow 80/tcp
sudo ufw enable
Browse to http://<server-ip>/.
Running without nginx
To let Node bind port 80 directly, edit the systemd unit:
Environment=PORT=80
Environment=HOST=0.0.0.0
AmbientCapabilities=CAP_NET_BIND_SERVICE
Then sudo systemctl daemon-reload && sudo systemctl restart weather-dashboard.
Adding HTTPS
Point a domain at the IP, then:
sudo apt install certbot python3-certbot-nginx
sudo certbot --nginx
Certbot rewrites the nginx config for TLS; nothing else changes.
Updating content later
- Replace
public/forecasting.htmlorpublic/forecasts.json— the server re-reads them on the next request, no restart needed. - Drop in optional files (
actuals.json,ensemble.json, per-continent variants) whenever you have them. - Regenerate these docs with
python3 build_docs.pyafter editing content.
Logs
journalctl -u weather-dashboard -f follows the service log.Forecasting dashboard documentation · Meteo Bulgaria EOOD · 2026