| # Mummy Card Game - Deployment Guide | |
| This guide covers multiple ways to deploy your Mummy Card Game for use outside localhost. | |
| --- | |
| ## Table of Contents | |
| 1. [Quick Deploy with Render (Recommended)](#option-1-render-recommended---free) | |
| 2. [Deploy with Railway](#option-2-railway) | |
| 3. [Deploy with Hugging Face Spaces](#option-3-hugging-face-spaces) | |
| 4. [Deploy with Fly.io](#option-4-flyio) | |
| 5. [Deploy with VPS (DigitalOcean/AWS)](#option-5-vps-digitalocean-aws-etc) | |
| 6. [Local Network (LAN Party)](#option-6-local-network-lan-party) | |
| --- | |
| ## Prerequisites | |
| Before deploying, you need to prepare your project: | |
| ### Step 1: Update Server to Serve Static Files | |
| First, modify your server to serve the built client files in production. | |
| Edit `server/src/index.ts`: | |
| ```typescript | |
| import express from 'express'; | |
| import { createServer } from 'http'; | |
| import { Server } from 'socket.io'; | |
| import cors from 'cors'; | |
| import path from 'path'; | |
| import { fileURLToPath } from 'url'; | |
| import { RoomManager } from './rooms/RoomManager.js'; | |
| import { setupSocketHandlers } from './socket/handlers.js'; | |
| import type { ServerToClientEvents, ClientToServerEvents } from '../../shared/types.js'; | |
| const __filename = fileURLToPath(import.meta.url); | |
| const __dirname = path.dirname(__filename); | |
| const app = express(); | |
| app.use(cors()); | |
| // Serve static files from client build | |
| const clientPath = path.join(__dirname, '../../client/dist'); | |
| app.use(express.static(clientPath)); | |
| const httpServer = createServer(app); | |
| const io = new Server<ClientToServerEvents, ServerToClientEvents>(httpServer, { | |
| cors: { | |
| origin: '*', // Allow all origins in production | |
| methods: ['GET', 'POST'], | |
| }, | |
| }); | |
| const roomManager = new RoomManager(); | |
| io.on('connection', (socket) => { | |
| console.log(`Player connected: ${socket.id}`); | |
| setupSocketHandlers(io, socket, roomManager); | |
| socket.on('disconnect', () => { | |
| console.log(`Player disconnected: ${socket.id}`); | |
| roomManager.handleDisconnect(socket.id, io); | |
| }); | |
| }); | |
| // Serve index.html for all non-API routes (SPA support) | |
| app.get('*', (req, res) => { | |
| res.sendFile(path.join(clientPath, 'index.html')); | |
| }); | |
| const PORT = process.env.PORT || 3001; | |
| httpServer.listen(PORT, () => { | |
| console.log(`🎮 Mummy Card Game Server running on port ${PORT}`); | |
| }); | |
| ``` | |
| ### Step 2: Update Vite Build Config | |
| Edit `client/vite.config.ts` to set the correct output directory: | |
| ```typescript | |
| import { defineConfig } from 'vite'; | |
| import react from '@vitejs/plugin-react'; | |
| import path from 'path'; | |
| export default defineConfig({ | |
| plugins: [react()], | |
| publicDir: path.resolve(__dirname, '../Assests'), | |
| resolve: { | |
| alias: { | |
| '@': path.resolve(__dirname, './src'), | |
| '@shared': path.resolve(__dirname, '../shared'), | |
| }, | |
| }, | |
| build: { | |
| outDir: 'dist', | |
| emptyOutDir: true, | |
| }, | |
| server: { | |
| port: 5173, | |
| proxy: { | |
| '/socket.io': { | |
| target: 'http://localhost:3001', | |
| ws: true, | |
| }, | |
| }, | |
| }, | |
| }); | |
| ``` | |
| ### Step 3: Create Root package.json | |
| Create a `package.json` in the root `Web` folder: | |
| ```json | |
| { | |
| "name": "mummy-card-game", | |
| "version": "1.0.0", | |
| "scripts": { | |
| "install:all": "cd client && npm install && cd ../server && npm install", | |
| "build:client": "cd client && npm run build", | |
| "build:server": "cd server && npm run build", | |
| "build": "npm run build:client && npm run build:server", | |
| "start": "cd server && npm start", | |
| "dev": "cd server && npm run dev" | |
| }, | |
| "engines": { | |
| "node": ">=18.0.0" | |
| } | |
| } | |
| ``` | |
| --- | |
| ## Option 1: Render (Recommended - Free) | |
| Render offers free hosting for web services with WebSocket support. | |
| ### Step 1: Push to GitHub | |
| ```bash | |
| # In the Web folder | |
| git init | |
| git add . | |
| git commit -m "Initial commit" | |
| git branch -M main | |
| git remote add origin https://github.com/YOUR_USERNAME/mummy-card-game.git | |
| git push -u origin main | |
| ``` | |
| ### Step 2: Create Render Account | |
| 1. Go to [render.com](https://render.com) | |
| 2. Sign up with GitHub | |
| ### Step 3: Create Web Service | |
| 1. Click **"New +"** → **"Web Service"** | |
| 2. Connect your GitHub repository | |
| 3. Configure: | |
| - **Name**: `mummy-card-game` | |
| - **Region**: Choose closest to you | |
| - **Branch**: `main` | |
| - **Root Directory**: Leave empty (or `Web` if repo has parent folder) | |
| - **Runtime**: `Node` | |
| - **Build Command**: `cd client && npm install && npm run build && cd ../server && npm install && npm run build` | |
| - **Start Command**: `cd server && npm start` | |
| - **Instance Type**: Free | |
| 4. Click **"Create Web Service"** | |
| ### Step 4: Wait for Build | |
| - Build takes 2-5 minutes | |
| - Your app will be available at: `https://mummy-card-game.onrender.com` | |
| ### Note on Free Tier | |
| - Free services spin down after 15 minutes of inactivity | |
| - First request after spin-down takes ~30 seconds | |
| - Upgrade to paid ($7/month) for always-on | |
| --- | |
| ## Option 2: Railway | |
| Railway offers simple deployment with generous free tier. | |
| ### Step 1: Push to GitHub (same as above) | |
| ### Step 2: Create Railway Account | |
| 1. Go to [railway.app](https://railway.app) | |
| 2. Sign up with GitHub | |
| ### Step 3: Deploy | |
| 1. Click **"New Project"** | |
| 2. Select **"Deploy from GitHub repo"** | |
| 3. Choose your repository | |
| 4. Railway auto-detects Node.js | |
| ### Step 4: Configure | |
| 1. Go to **Settings** → **General** | |
| 2. Set **Root Directory**: `/` (or where Web folder is) | |
| 3. Go to **Settings** → **Build** | |
| 4. Set **Build Command**: `cd client && npm install && npm run build && cd ../server && npm install && npm run build` | |
| 5. Set **Start Command**: `cd server && npm start` | |
| ### Step 5: Generate Domain | |
| 1. Go to **Settings** → **Networking** | |
| 2. Click **"Generate Domain"** | |
| 3. Your app is live! | |
| --- | |
| ## Option 3: Hugging Face Spaces | |
| Hugging Face Spaces offers free hosting with Docker support and WebSockets. | |
| ### Step 1: Create Hugging Face Account | |
| 1. Go to [huggingface.co](https://huggingface.co) | |
| 2. Sign up for free | |
| ### Step 2: Create a New Space | |
| 1. Click your profile → **"New Space"** | |
| 2. Configure: | |
| - **Space name**: `mummy-card-game` | |
| - **License**: Choose one (e.g., MIT) | |
| - **SDK**: Select **"Docker"** | |
| - **Hardware**: CPU basic (free) | |
| 3. Click **"Create Space"** | |
| ### Step 3: Create Dockerfile | |
| Create a `Dockerfile` in the `Web` folder: | |
| ```dockerfile | |
| FROM node:18-alpine | |
| # Create app user (required by HF Spaces) | |
| RUN addgroup -g 1000 appgroup && adduser -u 1000 -G appgroup -D appuser | |
| WORKDIR /app | |
| # Copy package files | |
| COPY client/package*.json ./client/ | |
| COPY server/package*.json ./server/ | |
| # Install dependencies | |
| RUN cd client && npm install | |
| RUN cd server && npm install | |
| # Copy source code | |
| COPY . . | |
| # Build client and server | |
| RUN cd client && npm run build | |
| RUN cd server && npm run build | |
| # Change ownership | |
| RUN chown -R appuser:appgroup /app | |
| # Switch to non-root user | |
| USER appuser | |
| # Hugging Face Spaces uses port 7860 | |
| ENV PORT=7860 | |
| EXPOSE 7860 | |
| # Start server | |
| CMD ["node", "server/dist/index.js"] | |
| ``` | |
| ### Step 4: Update Server Port (Optional) | |
| The server already uses `process.env.PORT`, so it will automatically use port 7860 on HF Spaces. | |
| ### Step 5: Push to Hugging Face | |
| **Option A: Using Git (Recommended)** | |
| ```bash | |
| # Clone your HF Space | |
| git clone https://huggingface.co/spaces/YOUR_USERNAME/mummy-card-game | |
| cd mummy-card-game | |
| # Copy your project files | |
| # (copy all files from Web folder here) | |
| # Push to HF | |
| git add . | |
| git commit -m "Initial deployment" | |
| git push | |
| ``` | |
| **Option B: Upload via Web Interface** | |
| 1. Go to your Space → **Files** tab | |
| 2. Click **"Add file"** → **"Upload files"** | |
| 3. Upload all project files maintaining folder structure: | |
| - `Dockerfile` | |
| - `client/` folder | |
| - `server/` folder | |
| - `shared/` folder | |
| - `Assests/` folder | |
| ### Step 6: Wait for Build | |
| - Hugging Face will automatically build and deploy | |
| - Build takes 3-5 minutes | |
| - Your app will be at: `https://YOUR_USERNAME-mummy-card-game.hf.space` | |
| ### Step 7: Check Logs (if issues) | |
| 1. Go to your Space | |
| 2. Click the **"Logs"** button (three dots menu) | |
| 3. Check for any build or runtime errors | |
| ### Hugging Face Tips | |
| **Persistent Storage**: Free tier doesn't have persistent storage, meaning game rooms are lost on restart. This is fine for a card game. | |
| **Sleep Mode**: Free Spaces sleep after inactivity. First access after sleep takes ~30 seconds. | |
| **Custom Domain**: You can add a custom domain in Space settings. | |
| ### Alternative: README.md Configuration | |
| Instead of uploading files directly, you can create a `README.md` with YAML frontmatter: | |
| ```yaml | |
| --- | |
| title: Mummy Card Game | |
| emoji: 🎴 | |
| colorFrom: yellow | |
| colorTo: red | |
| sdk: docker | |
| app_port: 7860 | |
| --- | |
| ``` | |
| Place this at the root of your Space repository. | |
| --- | |
| ## Option 4: Fly.io | |
| Fly.io provides excellent WebSocket support and global edge deployment. | |
| ### Step 1: Install Fly CLI | |
| ```bash | |
| # Windows (PowerShell) | |
| pwsh -Command "iwr https://fly.io/install.ps1 -useb | iex" | |
| # Or with npm | |
| npm install -g flyctl | |
| ``` | |
| ### Step 2: Login | |
| ```bash | |
| fly auth login | |
| ``` | |
| ### Step 3: Create fly.toml | |
| Create `fly.toml` in the `Web` folder: | |
| ```toml | |
| app = "mummy-card-game" | |
| primary_region = "iad" | |
| [build] | |
| builder = "heroku/buildpacks:20" | |
| [env] | |
| PORT = "8080" | |
| NODE_ENV = "production" | |
| [http_service] | |
| internal_port = 8080 | |
| force_https = true | |
| auto_stop_machines = true | |
| auto_start_machines = true | |
| min_machines_running = 0 | |
| [[services]] | |
| internal_port = 8080 | |
| protocol = "tcp" | |
| [[services.ports]] | |
| handlers = ["http"] | |
| port = 80 | |
| [[services.ports]] | |
| handlers = ["tls", "http"] | |
| port = 443 | |
| ``` | |
| ### Step 4: Create Dockerfile | |
| Create `Dockerfile` in the `Web` folder: | |
| ```dockerfile | |
| FROM node:18-alpine | |
| WORKDIR /app | |
| # Copy package files | |
| COPY client/package*.json ./client/ | |
| COPY server/package*.json ./server/ | |
| # Install dependencies | |
| RUN cd client && npm install | |
| RUN cd server && npm install | |
| # Copy source code | |
| COPY . . | |
| # Build client and server | |
| RUN cd client && npm run build | |
| RUN cd server && npm run build | |
| # Expose port | |
| EXPOSE 8080 | |
| # Start server | |
| CMD ["node", "server/dist/index.js"] | |
| ``` | |
| ### Step 5: Deploy | |
| ```bash | |
| fly launch | |
| fly deploy | |
| ``` | |
| Your app will be at: `https://mummy-card-game.fly.dev` | |
| --- | |
| ## Option 5: VPS (DigitalOcean, AWS, etc.) | |
| For full control, deploy to a VPS. | |
| ### Step 1: Create VPS | |
| 1. Create a Ubuntu 22.04 droplet/instance | |
| 2. SSH into your server | |
| ### Step 2: Install Node.js | |
| ```bash | |
| curl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash - | |
| sudo apt-get install -y nodejs | |
| ``` | |
| ### Step 3: Clone and Build | |
| ```bash | |
| git clone https://github.com/YOUR_USERNAME/mummy-card-game.git | |
| cd mummy-card-game/Web | |
| # Install and build | |
| cd client && npm install && npm run build | |
| cd ../server && npm install && npm run build | |
| ``` | |
| ### Step 4: Install PM2 (Process Manager) | |
| ```bash | |
| sudo npm install -g pm2 | |
| ``` | |
| ### Step 5: Start with PM2 | |
| ```bash | |
| cd server | |
| pm2 start dist/index.js --name mummy-game | |
| pm2 save | |
| pm2 startup | |
| ``` | |
| ### Step 6: Setup Nginx (Optional - for domain/SSL) | |
| ```bash | |
| sudo apt install nginx | |
| sudo nano /etc/nginx/sites-available/mummy-game | |
| ``` | |
| Add: | |
| ```nginx | |
| server { | |
| listen 80; | |
| server_name yourdomain.com; | |
| location / { | |
| proxy_pass http://localhost:3001; | |
| proxy_http_version 1.1; | |
| proxy_set_header Upgrade $http_upgrade; | |
| proxy_set_header Connection 'upgrade'; | |
| proxy_set_header Host $host; | |
| proxy_cache_bypass $http_upgrade; | |
| } | |
| } | |
| ``` | |
| Enable and restart: | |
| ```bash | |
| sudo ln -s /etc/nginx/sites-available/mummy-game /etc/nginx/sites-enabled/ | |
| sudo nginx -t | |
| sudo systemctl restart nginx | |
| ``` | |
| ### Step 7: Setup SSL with Let's Encrypt | |
| ```bash | |
| sudo apt install certbot python3-certbot-nginx | |
| sudo certbot --nginx -d yourdomain.com | |
| ``` | |
| --- | |
| ## Option 6: Local Network (LAN Party) | |
| Play with friends on the same WiFi network. | |
| ### Step 1: Find Your IP Address | |
| ```bash | |
| # Windows | |
| ipconfig | |
| # Look for "IPv4 Address" under your WiFi adapter (e.g., 192.168.1.100) | |
| # Mac/Linux | |
| ifconfig | |
| # or | |
| ip addr | |
| ``` | |
| ### Step 2: Update Server CORS | |
| In `server/src/index.ts`, update CORS: | |
| ```typescript | |
| const io = new Server<ClientToServerEvents, ServerToClientEvents>(httpServer, { | |
| cors: { | |
| origin: '*', // Allow all | |
| methods: ['GET', 'POST'], | |
| }, | |
| }); | |
| ``` | |
| ### Step 3: Build and Run | |
| ```bash | |
| # Build client | |
| cd client | |
| npm run build | |
| # Start server | |
| cd ../server | |
| npm run build | |
| npm start | |
| ``` | |
| ### Step 4: Connect | |
| - Your device: `http://localhost:3001` | |
| - Other devices on network: `http://YOUR_IP:3001` (e.g., `http://192.168.1.100:3001`) | |
| ### Tip: Allow Through Firewall | |
| Windows: | |
| ```powershell | |
| # Run as Administrator | |
| netsh advfirewall firewall add rule name="Mummy Game" dir=in action=allow protocol=TCP localport=3001 | |
| ``` | |
| --- | |
| ## Troubleshooting | |
| ### WebSocket Connection Failed | |
| - Ensure your hosting supports WebSockets | |
| - Check if server CORS allows your domain | |
| - Verify the client is connecting to the correct URL | |
| ### Build Fails | |
| - Check Node.js version (needs 18+) | |
| - Run `npm install` in both client and server folders | |
| - Check for TypeScript errors: `npm run build` | |
| ### Assets Not Loading | |
| - Ensure `Assests` folder is copied to `client/dist` after build | |
| - Or configure Vite to copy it (already done via `publicDir`) | |
| ### Free Tier Limits | |
| - Render: 750 hours/month free | |
| - Railway: $5 credit/month | |
| - Fly.io: 3 shared VMs free | |
| --- | |
| ## Quick Commands Reference | |
| ```bash | |
| # Local development | |
| cd server && npm run dev # Start server (dev mode) | |
| cd client && npm run dev # Start client (dev mode) | |
| # Production build | |
| cd client && npm run build | |
| cd server && npm run build | |
| cd server && npm start | |
| # Or with root package.json | |
| npm run build | |
| npm start | |
| ``` | |
| --- | |
| ## Sharing with Friends | |
| Once deployed, share your URL: | |
| 1. **Render**: `https://your-app-name.onrender.com` | |
| 2. **Railway**: `https://your-app-name.up.railway.app` | |
| 3. **Fly.io**: `https://your-app-name.fly.dev` | |
| 4. **Custom VPS**: `https://yourdomain.com` | |
| 5. **LAN**: `http://YOUR_LOCAL_IP:3001` | |
| Players just need to open the link in their browser - no installation required! | |