# Build Guide - IPTV Streaming Application ## Quick Start ### Docker Build & Run ```bash # Build the Docker image docker-compose build # Start the container docker-compose up -d # View logs docker-compose logs -f # Stop the container docker-compose down ``` Access the application at: **http://localhost:12345** --- ## PWA Deployment ### 1. Build for Production ```bash # Build optimized production bundle docker-compose build --no-cache # Or build frontend separately cd frontend npm run build ``` ### 2. Generate PWA Icons Replace placeholder icons in `frontend/public/icons/` with actual icons: **Required sizes:** - 72x72, 96x96, 128x128, 144x144, 152x152, 192x192, 384x384, 512x512 **Tools:** - [PWA Asset Generator](https://github.com/onderceylan/pwa-asset-generator) - [RealFaviconGenerator](https://realfavicongenerator.net/) ```bash # Install PWA asset generator npm install -g pwa-asset-generator # Generate icons from source image pwa-asset-generator source-icon.png frontend/public/icons --icon-only --manifest frontend/public/manifest.json ``` ### 3. Android APK Build #### Prerequisites - Node.js 18+ - Android Studio or Capacitor CLI #### Steps ```bash # Install Capacitor npm install -g @capacitor/cli @capacitor/core @capacitor/android # Initialize Capacitor in frontend directory cd frontend npx cap init StreamFlow tv.streamflow.app # Add Android platform npx cap add android # Build frontend npm run build # Copy web assets to Android npx cap copy android # Open in Android Studio npx cap open android ``` **In Android Studio:** 1. Build → Generate Signed Bundle / APK 2. Select APK 3. Create keystore (first time) or use existing 4. Build Release APK 5. APK will be in `frontend/android/app/build/outputs/apk/release/` #### Alternative: Cordova Build ```bash # Install Cordova npm install -g cordova # Create Cordova project cordova create streamflow tv.streamflow.app StreamFlow # Copy built files to www/ cp -r frontend/dist/* streamflow/www/ # Add Android platform cd streamflow cordova platform add android # Build APK cordova build android --release # Sign APK (optional) jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 \ -keystore my-release-key.keystore \ platforms/android/app/build/outputs/apk/release/app-release-unsigned.apk \ alias_name ``` ### 4. Linux AppImage Build #### Prerequisites - Node.js 18+ - Electron - electron-builder #### Steps ```bash # Install Electron globally npm install -g electron electron-builder # Create Electron wrapper cd /home/iulian/projects/tv mkdir electron-app cd electron-app # Initialize package.json cat > package.json << 'EOF' { "name": "streamflow", "version": "1.0.0", "description": "IPTV Streaming Application", "main": "main.js", "scripts": { "start": "electron .", "build": "electron-builder --linux AppImage" }, "build": { "appId": "tv.streamflow.app", "productName": "StreamFlow", "linux": { "target": ["AppImage"], "category": "AudioVideo", "icon": "../frontend/public/icons/icon-512x512.png" } }, "devDependencies": { "electron": "^28.0.0", "electron-builder": "^24.9.0" } } EOF # Create main.js cat > main.js << 'EOF' const { app, BrowserWindow } = require('electron'); const path = require('path'); function createWindow() { const mainWindow = new BrowserWindow({ width: 1280, height: 720, webPreferences: { nodeIntegration: false, contextIsolation: true }, icon: path.join(__dirname, '../frontend/public/icons/icon-512x512.png') }); // Load from Docker container mainWindow.loadURL('http://localhost:12345'); // Uncomment for development // mainWindow.webContents.openDevTools(); } app.whenReady().then(createWindow); app.on('window-all-closed', () => { if (process.platform !== 'darwin') { app.quit(); } }); app.on('activate', () => { if (BrowserWindow.getAllWindows().length === 0) { createWindow(); } }); EOF # Install dependencies npm install # Build AppImage npm run build ``` **Output:** `electron-app/dist/StreamFlow-1.0.0.AppImage` **Run AppImage:** ```bash chmod +x StreamFlow-1.0.0.AppImage ./StreamFlow-1.0.0.AppImage ``` --- ## Testing PWA Features ### 1. Test Service Worker ```bash # Start production server docker-compose up -d # Open browser dev tools # Application tab → Service Workers # Should see service-worker.js registered ``` ### 2. Test Offline Functionality 1. Open http://localhost:12345 2. Open DevTools → Network tab 3. Check "Offline" checkbox 4. Refresh page 5. Static assets should load from cache ### 3. Test Install Prompt **Desktop:** - Chrome/Edge: Click install icon in address bar - Firefox: Menu → Install **Mobile:** - Chrome Android: "Add to Home Screen" - iOS Safari: Share → Add to Home Screen ### 4. Lighthouse PWA Audit ```bash # Install Lighthouse npm install -g lighthouse # Run audit lighthouse http://localhost:12345 --view --preset=desktop ``` **Target scores:** - Performance: 90+ - PWA: 100 - Accessibility: 90+ --- ## Build Optimization ### 1. Reduce Bundle Size ```javascript // vite.config.js optimizations export default { build: { rollupOptions: { output: { manualChunks: { 'vendor-react': ['react', 'react-dom', 'react-router-dom'], 'vendor-mui': ['@mui/material', '@emotion/react', '@emotion/styled'], 'vendor-utils': ['zustand', 'i18next', 'react-i18next'] } } }, chunkSizeWarningLimit: 600 } }; ``` ### 2. Enable Compression ```nginx # Add to nginx.conf (if using nginx) gzip on; gzip_types text/css application/javascript application/json image/svg+xml; gzip_min_length 1000; # Brotli compression brotli on; brotli_types text/css application/javascript application/json; ``` ### 3. Image Optimization ```bash # Optimize PWA icons npm install -g sharp-cli # Convert to WebP for file in frontend/public/icons/*.png; do sharp -i "$file" -o "${file%.png}.webp" done ``` --- ## Security Hardening ### 1. HTTPS Setup (Production) ```bash # Generate SSL certificate openssl req -x509 -nodes -days 365 -newkey rsa:2048 \ -keyout ssl/nginx.key -out ssl/nginx.crt # Update docker-compose.yml services: app: ports: - "12345:12345" - "12346:12346" # HTTPS port volumes: - ./ssl:/app/ssl:ro ``` ### 2. Content Security Policy Add to `frontend/index.html`: ```html ``` ### 3. Rate Limiting Already implemented in backend: ```javascript // backend/server.js const rateLimit = require('express-rate-limit'); const limiter = rateLimit({ windowMs: 15 * 60 * 1000, // 15 minutes max: 100 // 100 requests per windowMs }); app.use('/api/', limiter); ``` --- ## Debugging ### 1. Backend Logs ```bash # View live logs docker-compose logs -f app # Filter by level docker-compose logs app | grep ERROR ``` ### 2. Frontend Development ```bash # Run frontend dev server cd frontend npm run dev # Opens at http://localhost:5173 # Hot reload enabled ``` ### 3. Database Inspection ```bash # Access container docker exec -it tv-app-1 sh # Open SQLite database sqlite3 /app/data/iptv.db # View tables .tables # Query users SELECT * FROM users; ``` ### 4. Network Issues ```bash # Test backend API curl -X POST http://localhost:12345/api/auth/register \ -H "Content-Type: application/json" \ -d '{"username":"test","email":"test@test.com","password":"test123"}' # Test health endpoint curl http://localhost:12345/health ``` --- ## Performance Tuning ### 1. Node.js Memory Optimization ```dockerfile # Update Dockerfile CMD ["node", "--max-old-space-size=512", "server.js"] ``` ### 2. Database Indexing ```sql -- Run in SQLite console CREATE INDEX idx_channels_playlist ON channels(playlist_id); CREATE INDEX idx_channels_group ON channels(group_title); CREATE INDEX idx_epg_channel_time ON epg_programs(channel_id, start_time); CREATE INDEX idx_favorites_user ON favorites(user_id); ``` ### 3. Caching Strategy ```javascript // Update service-worker.js for aggressive caching const CACHE_NAME = 'streamflow-v1'; const CACHE_URLS = [ '/', '/index.html', '/assets/index.js', '/assets/index.css', // Add static assets ]; // Cache-first strategy for assets self.addEventListener('fetch', (event) => { if (event.request.url.includes('/assets/')) { event.respondWith( caches.match(event.request) .then(response => response || fetch(event.request)) ); } }); ``` --- ## Continuous Deployment ### 1. GitHub Actions CI/CD Create `.github/workflows/build.yml`: ```yaml name: Build & Deploy on: push: branches: [main] jobs: build: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - name: Build Docker image run: docker-compose build - name: Run tests run: docker-compose run app npm test - name: Push to registry run: | docker tag tv-app:latest myregistry/tv-app:latest docker push myregistry/tv-app:latest ``` ### 2. Auto-versioning ```bash # Update version in package.json npm version patch # 1.0.0 → 1.0.1 npm version minor # 1.0.0 → 1.1.0 npm version major # 1.0.0 → 2.0.0 # Rebuild with new version docker-compose build ``` --- ## Troubleshooting ### Common Issues **Issue:** Port 12345 already in use ```bash # Find process using port sudo lsof -i :12345 # Kill process kill -9 ``` **Issue:** Permission denied on data directory ```bash # Fix permissions sudo chown -R 1001:1001 backend/data chmod 755 backend/data ``` **Issue:** Frontend not loading ```bash # Rebuild frontend cd frontend rm -rf dist node_modules npm install npm run build # Rebuild container docker-compose build --no-cache docker-compose up -d ``` **Issue:** Service worker not updating ```bash # Clear browser cache # In DevTools: Application → Clear storage → Clear site data # Or update service worker version # Edit frontend/public/service-worker.js const CACHE_NAME = 'streamflow-v2'; // Increment version ``` --- ## Production Deployment ### 1. Environment Variables Create `.env` file: ```bash NODE_ENV=production PORT=12345 JWT_SECRET=your-secure-secret-here-change-this DATABASE_PATH=/app/data/iptv.db LOG_LEVEL=info RATE_LIMIT_MAX=100 CORS_ORIGIN=https://yourdomain.com ``` ### 2. Docker Swarm Deployment ```bash # Initialize swarm docker swarm init # Deploy stack docker stack deploy -c docker-compose.yml streamflow # Scale services docker service scale streamflow_app=3 # Update service docker service update --image tv-app:latest streamflow_app ``` ### 3. Kubernetes Deployment ```yaml # kubernetes/deployment.yaml apiVersion: apps/v1 kind: Deployment metadata: name: streamflow spec: replicas: 3 selector: matchLabels: app: streamflow template: metadata: labels: app: streamflow spec: containers: - name: streamflow image: tv-app:latest ports: - containerPort: 12345 volumeMounts: - name: data mountPath: /app/data volumes: - name: data persistentVolumeClaim: claimName: streamflow-pvc ``` --- ## Support For issues or questions: 1. Check logs: `docker-compose logs -f` 2. Review error messages in browser console 3. Verify port 12345 is accessible 4. Ensure Docker has sufficient resources (2GB+ RAM) **Happy Streaming! 🎬**