diff --git a/README.md b/README.md index 48e8d9d..523bc83 100644 --- a/README.md +++ b/README.md @@ -1 +1,451 @@ Streaming radio Andgopink Navidrome + + +# Navichat Radio - Deployment Guide + +A complete guide to installing and running Navichat Radio on your own VPS or hosting server. + +## Prerequisites + +Before you begin, ensure your server has: + +- **Node.js** 18.x or higher +- **PostgreSQL** 13 or higher +- **Git** +- **npm** or **yarn** package manager +- **sudo** access for system-level installation + +### Installation on Ubuntu/Debian + +```bash +# Update system packages +sudo apt update && sudo apt upgrade -y + +# Install Node.js (18.x LTS) +curl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash - +sudo apt install -y nodejs + +# Install PostgreSQL +sudo apt install -y postgresql postgresql-contrib + +# Install Git +sudo apt install -y git +``` + +### Installation on CentOS/RHEL + +```bash +# Update system packages +sudo yum update -y + +# Install Node.js +curl -fsSL https://rpm.nodesource.com/setup_18.x | sudo bash - +sudo yum install -y nodejs + +# Install PostgreSQL +sudo yum install -y postgresql-server postgresql-contrib + +# Initialize and start PostgreSQL +sudo postgresql-setup initdb +sudo systemctl start postgresql +sudo systemctl enable postgresql + +# Install Git +sudo yum install -y git +``` + +## Step 1: Clone the Repository + +```bash +# Navigate to your desired directory +cd /var/www + +# Clone your GitHub repository +git clone https://github.com/Andgopink/radio1.git navichat-radio +cd navichat-radio +``` + +## Step 2: Set Up PostgreSQL Database + +```bash +# Switch to PostgreSQL user +sudo -u postgres psql + +# Create database and user +CREATE DATABASE navichat_radio; +CREATE USER navichat WITH PASSWORD 'your_secure_password_here'; +ALTER ROLE navichat SET client_encoding TO 'utf8'; +ALTER ROLE navichat SET default_transaction_isolation TO 'read committed'; +ALTER ROLE navichat SET default_transaction_deferrable TO on; +ALTER ROLE navichat SET default_transaction_read_uncommitted TO off; +GRANT ALL PRIVILEGES ON DATABASE navichat_radio TO navichat; +\q +``` + +**Note:** Replace `'your_secure_password_here'` with a strong, random password. + +## Step 3: Install Dependencies + +```bash +# Install Node.js dependencies +npm install + +# Build the frontend +npm run build +``` + +## Step 4: Configure Environment Variables + +Create a `.env` file in the project root: + +```bash +# Database Configuration +DATABASE_URL="postgresql://navichat:your_secure_password_here@localhost:5432/navichat_radio" +PGHOST="localhost" +PGPORT="5432" +PGUSER="navichat" +PGPASSWORD="your_secure_password_here" +PGDATABASE="navichat_radio" + +# Application Settings +NODE_ENV="production" +PORT=3000 + +# Navidrome Server Configuration (Optional - configure via Admin Panel) +# NAVIDROME_URL="http://your-navidrome-server:4533" +# NAVIDROME_USERNAME="your_navidrome_username" +``` + +## Step 5: Run Database Migrations + +```bash +# Generate and run migrations +npm run db:generate +npm run db:migrate +``` + +## Step 6: Start the Application + +### Option A: Direct Start (Development/Testing) + +```bash +# Start the production build +npm run start +``` + +The application will be available at `http://localhost:3000` + +### Option B: Using PM2 (Recommended for Production) + +```bash +# Install PM2 globally +sudo npm install -g pm2 + +# Create PM2 ecosystem file +cat > ecosystem.config.js << 'EOF' +module.exports = { + apps: [{ + name: 'navichat-radio', + script: './dist/server/index.js', + instances: 'max', + exec_mode: 'cluster', + env: { + NODE_ENV: 'production', + PORT: 3000 + }, + error_file: './logs/error.log', + out_file: './logs/out.log', + log_file: './logs/combined.log', + time_format: 'YYYY-MM-DD HH:mm:ss Z' + }] +}; +EOF + +# Create logs directory +mkdir -p logs + +# Start with PM2 +pm2 start ecosystem.config.js + +# Set PM2 to auto-restart on server reboot +pm2 startup +pm2 save +``` + +## Step 7: Set Up Reverse Proxy (Nginx) + +Create a new Nginx configuration file: + +```bash +sudo nano /etc/nginx/sites-available/navichat-radio +``` + +Add the following configuration: + +```nginx +upstream navichat_app { + server localhost:3000; +} + +server { + listen 80; + server_name yourdomain.com www.yourdomain.com; + + # Redirect HTTP to HTTPS (optional, recommended) + return 301 https://$server_name$request_uri; +} + +server { + listen 443 ssl http2; + server_name yourdomain.com www.yourdomain.com; + + # SSL certificates (see Step 8) + ssl_certificate /etc/letsencrypt/live/yourdomain.com/fullchain.pem; + ssl_certificate_key /etc/letsencrypt/live/yourdomain.com/privkey.pem; + + # SSL Configuration + ssl_protocols TLSv1.2 TLSv1.3; + ssl_ciphers HIGH:!aNULL:!MD5; + ssl_prefer_server_ciphers on; + + # Gzip compression + gzip on; + gzip_types text/plain text/css text/javascript application/json application/javascript; + gzip_vary on; + + # Reverse proxy configuration + location / { + proxy_pass http://navichat_app; + 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_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_cache_bypass $http_upgrade; + + # WebSocket support for chat + proxy_read_timeout 3600s; + proxy_send_timeout 3600s; + } + + # Security headers + add_header X-Frame-Options "SAMEORIGIN" always; + add_header X-Content-Type-Options "nosniff" always; + add_header X-XSS-Protection "1; mode=block" always; + add_header Referrer-Policy "no-referrer-when-downgrade" always; + add_header Content-Security-Policy "default-src 'self' http: https: data: blob: 'unsafe-inline'" always; +} +``` + +Enable the configuration: + +```bash +sudo ln -s /etc/nginx/sites-available/navichat-radio /etc/nginx/sites-enabled/ +sudo nginx -t +sudo systemctl restart nginx +``` + +## Step 8: SSL/HTTPS Setup (Let's Encrypt) + +```bash +# Install Certbot +sudo apt install -y certbot python3-certbot-nginx + +# Generate SSL certificate +sudo certbot certonly --nginx -d yourdomain.com -d www.yourdomain.com + +# Auto-renewal (should be automatic with certbot) +sudo systemctl enable certbot.timer +``` + +## Step 9: Configure Navidrome Server + +Access your application at `https://yourdomain.com` and: + +1. Navigate to `/login` (or use `/admin` if already configured) +2. Enter your admin credentials (default: `admin` / `admin`) +3. Go to the Admin Panel +4. Configure your Navidrome server details: + - **Navidrome URL**: `http://your-navidrome-server:4533` + - **Username**: Your Navidrome username + - Click "Test Connection" to verify + +## Step 10: Firewall Configuration + +```bash +# Allow HTTP and HTTPS traffic +sudo ufw allow 22/tcp # SSH +sudo ufw allow 80/tcp # HTTP +sudo ufw allow 443/tcp # HTTPS +sudo ufw enable +``` + +## Monitoring and Maintenance + +### Check Application Status (with PM2) + +```bash +# View running processes +pm2 status + +# View logs +pm2 logs navichat-radio + +# Restart application +pm2 restart navichat-radio + +# Stop application +pm2 stop navichat-radio +``` + +### Database Backups + +```bash +# Create a database backup +sudo -u postgres pg_dump navichat_radio > backup_$(date +%Y%m%d_%H%M%S).sql + +# Restore from backup +sudo -u postgres psql navichat_radio < backup_20240101_120000.sql +``` + +### Update Application + +```bash +# Pull latest changes +git pull origin main + +# Install dependencies +npm install + +# Rebuild frontend +npm run build + +# Restart application +pm2 restart navichat-radio +``` + +## Troubleshooting + +### Application won't start + +```bash +# Check Node.js version +node --version # Should be 18.x or higher + +# Check PostgreSQL connection +sudo -u postgres psql -c "SELECT version();" + +# View application logs +tail -f logs/error.log +``` + +### Database connection errors + +```bash +# Verify PostgreSQL is running +sudo systemctl status postgresql + +# Test database connection +psql "postgresql://navichat:password@localhost:5432/navichat_radio" +``` + +### Nginx proxy errors + +```bash +# Check Nginx configuration +sudo nginx -t + +# View Nginx error logs +sudo tail -f /var/log/nginx/error.log +``` + +### Port already in use + +```bash +# Check what's using port 3000 +sudo lsof -i :3000 + +# Kill process if needed +sudo kill -9 +``` + +## Performance Optimization + +### Enable Caching Headers (in Nginx) + +Add to your Nginx `location /` block: + +```nginx +# Cache static assets for 1 month +location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2|ttf|eot)$ { + expires 30d; + add_header Cache-Control "public, immutable"; +} + +# Don't cache HTML files +location ~* \.html?$ { + expires -1; + add_header Cache-Control "no-cache, must-revalidate"; +} +``` + +### Database Query Optimization + +PostgreSQL is already optimized for this application. Monitor performance: + +```bash +# Connect to PostgreSQL +sudo -u postgres psql navichat_radio + +# View slow queries +SELECT query, calls, mean_time FROM pg_stat_statements ORDER BY mean_time DESC LIMIT 10; +``` + +## Security Hardening + +### 1. Disable SSH Password Authentication + +Edit `/etc/ssh/sshd_config`: + +```bash +sudo nano /etc/ssh/sshd_config + +# Add or modify these lines: +PermitRootLogin no +PasswordAuthentication no +PubkeyAuthentication yes + +# Restart SSH +sudo systemctl restart sshd +``` + +### 2. Keep System Updated + +```bash +# Enable automatic security updates +sudo apt install -y unattended-upgrades +sudo dpkg-reconfigure -plow unattended-upgrades +``` + +### 3. Set Up Fail2Ban + +```bash +# Install Fail2Ban +sudo apt install -y fail2ban + +# Start and enable service +sudo systemctl start fail2ban +sudo systemctl enable fail2ban +``` + +## Support & Documentation + +- **GitHub Repository**: https://github.com/Andgopink/radio1 +- **Navidrome Documentation**: https://www.navidrome.org/docs/ +- **PostgreSQL Documentation**: https://www.postgresql.org/docs/ + +--- + +Your Navichat Radio instance is now deployed and ready to stream music! 🎵