mirror of
https://github.com/Such-Software/wownerogue.git
synced 2026-10-20 07:38:34 +02:00
- Add alertService.js with Resend email alerts for low balance, disconnects, failed payouts - Update admin.html with full dashboard UI (stats, charts, tables, payout retry) - Add wallet balance to /health endpoint - Add getBalance() and checkTransactionStatus() to walletRPCService - Fix payoutRetryService query and add alert integration - Update .env.example with alert config (RESEND_API_KEY, ADMIN_EMAIL, etc) - Reorganize docs: move TODO.md, LOGS_AND_BACKUP.md to docs/ - Extract deployment guide from README to docs/DEPLOY.md - Consolidate TEMP_TODO.md into docs/TODO.md
403 lines
9.3 KiB
Markdown
403 lines
9.3 KiB
Markdown
# Production Deployment Guide
|
|
|
|
This guide covers deploying Wownerogue to a production environment.
|
|
|
|
---
|
|
|
|
## Prerequisites
|
|
|
|
- Node.js 22.x LTS or later
|
|
- PostgreSQL 12+
|
|
- Wownero or Monero wallet-rpc running and synced
|
|
- A domain with SSL certificate (via reverse proxy)
|
|
|
|
---
|
|
|
|
## Deployment Checklist
|
|
|
|
- [ ] Set `NODE_ENV=production`
|
|
- [ ] Configure TLS via reverse proxy (Nginx/Caddy)
|
|
- [ ] Set secure database credentials
|
|
- [ ] Configure wallet-rpc with authentication
|
|
- [ ] Set `ADMIN_API_KEY` for admin endpoints
|
|
- [ ] Firewall: expose only 80/443
|
|
- [ ] Protect `/admin.html` with basic auth
|
|
- [ ] Set up database backups (see [LOGS_AND_BACKUP.md](./LOGS_AND_BACKUP.md))
|
|
- [ ] Configure log rotation
|
|
- [ ] Run database migrations
|
|
|
|
---
|
|
|
|
## Create Dedicated User
|
|
|
|
Create an isolated system user for security:
|
|
|
|
```bash
|
|
# Create system user with no login shell and dedicated home
|
|
sudo useradd --system --shell /usr/sbin/nologin --home-dir /var/www/wownerogue --create-home wownerogue
|
|
|
|
# Create .ssh directory for deploy key
|
|
sudo mkdir -p /var/www/wownerogue/.ssh
|
|
sudo chmod 700 /var/www/wownerogue/.ssh
|
|
sudo chown wownerogue:wownerogue /var/www/wownerogue/.ssh
|
|
|
|
# Create log directory
|
|
sudo mkdir -p /var/log/wownerogue
|
|
sudo chown wownerogue:wownerogue /var/log/wownerogue
|
|
```
|
|
|
|
---
|
|
|
|
## Setup Deploy Key and Clone Repository
|
|
|
|
Generate an SSH deploy key for the wownerogue user:
|
|
|
|
```bash
|
|
# Generate deploy key (as root, since user has no shell)
|
|
sudo ssh-keygen -t ed25519 -C "wownerogue-deploy" -f /var/www/wownerogue/.ssh/id_ed25519 -N ""
|
|
|
|
# Set correct ownership and permissions
|
|
sudo chown wownerogue:wownerogue /var/www/wownerogue/.ssh/id_ed25519*
|
|
sudo chmod 600 /var/www/wownerogue/.ssh/id_ed25519
|
|
sudo chmod 644 /var/www/wownerogue/.ssh/id_ed25519.pub
|
|
|
|
# Display the public key
|
|
sudo cat /var/www/wownerogue/.ssh/id_ed25519.pub
|
|
```
|
|
|
|
Add the deploy key to GitHub:
|
|
1. Go to your repository → **Settings** → **Deploy keys**
|
|
2. Click **Add deploy key**
|
|
3. Paste the public key from the command above
|
|
4. Leave "Allow write access" unchecked (read-only is sufficient)
|
|
5. Click **Add key**
|
|
|
|
Configure SSH for GitHub:
|
|
|
|
```bash
|
|
# Create SSH config for the wownerogue user
|
|
sudo tee /var/www/wownerogue/.ssh/config << 'EOF'
|
|
Host github.com
|
|
HostName github.com
|
|
User git
|
|
IdentityFile ~/.ssh/id_ed25519
|
|
IdentitiesOnly yes
|
|
StrictHostKeyChecking accept-new
|
|
EOF
|
|
|
|
sudo chown wownerogue:wownerogue /var/www/wownerogue/.ssh/config
|
|
sudo chmod 600 /var/www/wownerogue/.ssh/config
|
|
```
|
|
|
|
Clone the repository:
|
|
|
|
```bash
|
|
# Clone as the wownerogue user (replace YOUR_USERNAME with your GitHub username)
|
|
sudo -u wownerogue git clone git@github.com:YOUR_USERNAME/wownerogue.git /var/www/wownerogue/app
|
|
```
|
|
|
|
---
|
|
|
|
## Install Node.js
|
|
|
|
Install Node.js LTS using NodeSource (run as root):
|
|
|
|
```bash
|
|
# Install Node.js 22.x LTS (or check https://nodejs.org for current LTS)
|
|
curl -fsSL https://deb.nodesource.com/setup_22.x | bash -
|
|
apt-get install -y nodejs
|
|
|
|
# Verify installation
|
|
node --version
|
|
npm --version
|
|
```
|
|
|
|
Install dependencies and audit for vulnerabilities:
|
|
|
|
```bash
|
|
cd /var/www/wownerogue/app/src
|
|
sudo -u wownerogue npm install
|
|
|
|
# Check for known vulnerabilities
|
|
sudo -u wownerogue npm audit
|
|
|
|
# Auto-fix vulnerabilities where possible
|
|
sudo -u wownerogue npm audit fix
|
|
```
|
|
|
|
---
|
|
|
|
## Set File Permissions
|
|
|
|
```bash
|
|
# Set ownership of application files
|
|
sudo chown -R wownerogue:wownerogue /var/www/wownerogue
|
|
|
|
# Restrict permissions (owner only, no world access)
|
|
sudo chmod 750 /var/www/wownerogue
|
|
sudo chmod 640 /var/www/wownerogue/app/src/.env
|
|
```
|
|
|
|
**Database permissions** - create a restricted PostgreSQL role:
|
|
|
|
```sql
|
|
-- Create role with minimal privileges
|
|
CREATE USER wownerogue WITH PASSWORD 'secure-password-here';
|
|
CREATE DATABASE wownerogue OWNER wownerogue;
|
|
|
|
-- Revoke dangerous permissions
|
|
REVOKE CREATE ON SCHEMA public FROM wownerogue;
|
|
|
|
-- Grant only what's needed
|
|
GRANT CONNECT ON DATABASE wownerogue TO wownerogue;
|
|
GRANT USAGE ON SCHEMA public TO wownerogue;
|
|
GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA public TO wownerogue;
|
|
GRANT USAGE, SELECT ON ALL SEQUENCES IN SCHEMA public TO wownerogue;
|
|
```
|
|
|
|
**Filesystem isolation** (optional, for extra hardening):
|
|
|
|
```bash
|
|
# Prevent the user from accessing other users' home directories
|
|
sudo chmod 700 /home/*
|
|
|
|
# Mount application directory with noexec for uploads (if applicable)
|
|
# Add to /etc/fstab if using separate partition
|
|
```
|
|
|
|
---
|
|
|
|
## Database Setup
|
|
|
|
### Run Migrations
|
|
|
|
Database migrations run automatically on server start (via `databaseManager.runMigrations()`), but you can also run them manually:
|
|
|
|
```bash
|
|
cd /var/www/wownerogue/app/src
|
|
|
|
# Source environment variables
|
|
source .env
|
|
|
|
# Run migrations manually if needed
|
|
psql -h $DB_HOST -U $DB_USER -d $DB_NAME -f migrations/001_initial_schema.sql
|
|
# ... repeat for each migration file in order
|
|
```
|
|
|
|
### Database Reset (Development Only)
|
|
|
|
```bash
|
|
npm run db:drop # Drop all tables
|
|
npm run db:create # Recreate schema
|
|
```
|
|
|
|
---
|
|
|
|
## systemd Service
|
|
|
|
Save to `/etc/systemd/system/wownerogue.service`:
|
|
|
|
```ini
|
|
[Unit]
|
|
Description=Wownerogue Game Server
|
|
After=network.target postgresql.service
|
|
|
|
[Service]
|
|
Type=simple
|
|
User=wownerogue
|
|
Group=wownerogue
|
|
# Adjust paths if you cloned to a different location
|
|
WorkingDirectory=/var/www/wownerogue/app/src
|
|
EnvironmentFile=/var/www/wownerogue/app/src/.env
|
|
ExecStart=/usr/bin/node index.js
|
|
Restart=on-failure
|
|
RestartSec=10
|
|
|
|
# Security hardening
|
|
NoNewPrivileges=yes
|
|
ProtectSystem=strict
|
|
ProtectHome=yes
|
|
PrivateTmp=yes
|
|
ReadWritePaths=/var/www/wownerogue /var/log/wownerogue
|
|
|
|
[Install]
|
|
WantedBy=multi-user.target
|
|
```
|
|
|
|
Enable and start:
|
|
|
|
```bash
|
|
# Create .env from example first!
|
|
sudo -u wownerogue cp /var/www/wownerogue/app/src/.env.example /var/www/wownerogue/app/src/.env
|
|
sudo vim /var/www/wownerogue/app/src/.env # Edit with your settings
|
|
|
|
# Enable and start service
|
|
sudo systemctl daemon-reload
|
|
sudo systemctl enable wownerogue
|
|
sudo systemctl start wownerogue
|
|
sudo systemctl status wownerogue
|
|
```
|
|
|
|
The systemd hardening options:
|
|
- `NoNewPrivileges` - prevents privilege escalation
|
|
- `ProtectSystem=strict` - mounts filesystem read-only except allowed paths
|
|
- `ProtectHome=yes` - hides /home, /root, /run/user
|
|
- `PrivateTmp=yes` - isolates /tmp
|
|
- `ReadWritePaths` - whitelists writable directories
|
|
|
|
---
|
|
|
|
## Reverse Proxy (Nginx Proxy Manager)
|
|
|
|
If using Nginx Proxy Manager:
|
|
|
|
1. **Add Proxy Host**
|
|
- Domain Names: `yourdomain.com`
|
|
- Scheme: `http`
|
|
- Forward Hostname/IP: Your server's LAN IP (e.g., `192.168.1.100`)
|
|
- Forward Port: `3000`
|
|
- Enable "Websockets Support" toggle
|
|
|
|
2. **SSL Tab**
|
|
- Request a new SSL certificate
|
|
- Enable "Force SSL"
|
|
|
|
3. **Advanced Tab** - Paste this config for WebSocket support:
|
|
|
|
```nginx
|
|
location /socket.io/ {
|
|
proxy_pass http://192.168.1.100:3000;
|
|
proxy_http_version 1.1;
|
|
proxy_set_header Upgrade $http_upgrade;
|
|
proxy_set_header Connection "upgrade";
|
|
proxy_set_header Host $host;
|
|
proxy_set_header X-Real-IP $remote_addr;
|
|
proxy_read_timeout 86400s;
|
|
proxy_send_timeout 86400s;
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
## Updating the Deployment
|
|
|
|
```bash
|
|
cd /var/www/wownerogue/app
|
|
sudo -u wownerogue git pull
|
|
cd src && sudo -u wownerogue npm install
|
|
sudo -u wownerogue npm audit fix
|
|
sudo systemctl restart wownerogue
|
|
```
|
|
|
|
---
|
|
|
|
## Multi-Instance Deployment
|
|
|
|
To run multiple instances (e.g., Wownero on port 3000 and Monero stagenet on port 3001):
|
|
|
|
### Directory Structure
|
|
|
|
```
|
|
/var/www/
|
|
├── wownerogue/ # Wownero instance (port 3000)
|
|
│ └── app/src/.env
|
|
└── monerogue/ # Monero instance (port 3001)
|
|
└── app/src/.env
|
|
```
|
|
|
|
### Configuration Differences
|
|
|
|
| Setting | Wownero Instance | Monero Instance |
|
|
|---------|------------------|-----------------|
|
|
| `PORT` | 3000 | 3001 |
|
|
| `CRYPTO_TYPE` | WOW | XMR |
|
|
| `MONERO_NETWORK` | mainnet | stagenet |
|
|
| `DB_NAME` | wownerogue | monerogue_stagenet |
|
|
| `PRIMARY_WALLET_ENDPOINT` | http://127.0.0.1:34570 | http://127.0.0.1:38070 |
|
|
| `PRIMARY_RPC_ENDPOINT` | http://127.0.0.1:34568 | http://127.0.0.1:38081 |
|
|
|
|
### Separate systemd Service
|
|
|
|
Create `/etc/systemd/system/monerogue.service`:
|
|
|
|
```ini
|
|
[Unit]
|
|
Description=Monerogue Game Server (Stagenet)
|
|
After=network.target postgresql.service
|
|
|
|
[Service]
|
|
Type=simple
|
|
User=monerogue
|
|
WorkingDirectory=/var/www/monerogue/app/src
|
|
EnvironmentFile=/var/www/monerogue/app/src/.env
|
|
ExecStart=/usr/bin/node index.js
|
|
Restart=on-failure
|
|
RestartSec=10
|
|
|
|
[Install]
|
|
WantedBy=multi-user.target
|
|
```
|
|
|
|
---
|
|
|
|
## Monitoring
|
|
|
|
### Check Service Status
|
|
|
|
```bash
|
|
systemctl status wownerogue
|
|
journalctl -u wownerogue -f # Follow logs
|
|
```
|
|
|
|
### Health Endpoint
|
|
|
|
```bash
|
|
curl http://localhost:3000/health
|
|
```
|
|
|
|
Returns server uptime, memory usage, wallet status, and balance.
|
|
|
|
### Admin Dashboard
|
|
|
|
Access `/admin.html` with your `ADMIN_API_KEY` for:
|
|
- Wallet balance and connection status
|
|
- Pending/failed payouts
|
|
- Game statistics
|
|
- User search
|
|
|
|
---
|
|
|
|
## Troubleshooting
|
|
|
|
### Server Won't Start
|
|
|
|
```bash
|
|
# Check logs for errors
|
|
journalctl -u wownerogue -n 50
|
|
|
|
# Verify environment file
|
|
sudo -u wownerogue cat /var/www/wownerogue/app/src/.env
|
|
|
|
# Test database connection
|
|
psql -h localhost -U wownerogue -d wownerogue -c "SELECT 1;"
|
|
```
|
|
|
|
### Wallet RPC Issues
|
|
|
|
```bash
|
|
# Test wallet RPC directly
|
|
curl -u user:password -X POST http://127.0.0.1:34570/json_rpc \
|
|
-d '{"jsonrpc":"2.0","id":"0","method":"get_balance"}' \
|
|
-H 'Content-Type: application/json'
|
|
```
|
|
|
|
### Database Migrations
|
|
|
|
If migrations fail, check the `migrations` table:
|
|
|
|
```sql
|
|
SELECT * FROM migrations ORDER BY id;
|
|
```
|
|
|
|
Migrations are tracked by name to prevent duplicate execution.
|