Files
CompanySite/DEPLOYMENT.md
T
Clintchiz d402256547
Deploy to Production / Build & Verify (push) Failing after 5m56s
Ping Search Engines / Notify Search Engines (push) Successful in 2s
Deploy to Production / Pre-Deploy Tests (push) Has been skipped
Deploy to Production / Deploy to Railway (push) Has been skipped
Deploy to Production / Deploy to Render (push) Has been skipped
Deploy to Production / Deploy to VPS (PM2) (push) Has been skipped
Deploy to Production / Deploy to Fly.io (push) Has been skipped
Deploy to Production / Post-Deploy Verification (push) Has been skipped
Deploy to Production / Notify on Failure (push) Successful in 2s
E2E Test Suite / Critical User Journeys (push) Has been skipped
E2E Test Suite / API Integration Tests (push) Has been skipped
E2E Test Suite / Smoke Tests (P0) (push) Failing after 11m26s
E2E Test Suite / Form Interaction Tests (push) Failing after 11m42s
E2E Test Suite / Destructive & Chaos Tests (push) Failing after 12m2s
E2E Test Suite / Cross-Browser Regression (chromium) (push) Failing after 16m14s
E2E Test Suite / Cross-Browser Regression (webkit) (push) Failing after 17m45s
E2E Test Suite / Cross-Browser Regression (firefox) (push) Failing after 25m23s
E2E Test Suite / Security Header Tests (push) Failing after 7m55s
E2E Test Suite / Test Report Summary (push) Failing after 20s
E2E Test Suite / Mobile Device Tests (push) Failing after 2h49m9s
Uptime Monitor / Health & Response Time (push) Failing after 2s
Uptime Monitor / SSL Certificate (push) Successful in 2s
Uptime Monitor / Send Alerts (push) Failing after 3s
Uptime Monitor / Record Uptime Success (push) Has been skipped
First Init
2026-03-21 16:46:46 +05:30

5.9 KiB

Deployment Guide

This Astro application is configured for SSR (Server-Side Rendering) deployment using the Node.js adapter.

📋 Domain Migration: For domain migration from workroot.com to workroot.in, see DOMAIN-MIGRATION-CHECKLIST.md and MIGRATION-SUMMARY.md

Server Configuration

The application is configured to run with the following settings:

  • Host: 0.0.0.0 (accepts connections from all network interfaces)
  • Port: 10000 (configurable via PORT environment variable)

Quick Start

1. Install Dependencies

npm install

2. Build the Application

npm run build

This will generate the production build in the dist/ directory with:

  • dist/server/ - Server-side code and SSR entry point
  • dist/client/ - Static assets and client-side JavaScript

3. Start the Production Server

npm start

The server will start on http://0.0.0.0:10000

Environment Variables

Create a .env file in the root directory to customize the server configuration:

# Server host (default: 0.0.0.0)
HOST=0.0.0.0

# Server port (default: 10000)
PORT=10000

# Node environment
NODE_ENV=production

Production Deployment Options

Option 1: Docker Deployment

Create a Dockerfile:

FROM node:20-alpine

WORKDIR /app

# Copy package files
COPY package*.json ./

# Install dependencies
RUN npm ci --only=production

# Copy built application
COPY dist ./dist
COPY server.mjs ./

# Expose port
EXPOSE 10000

# Set environment
ENV NODE_ENV=production
ENV HOST=0.0.0.0
ENV PORT=10000

# Start server
CMD ["node", "server.mjs"]

Build and run:

docker build -t workroot-website .
docker run -p 10000:10000 workroot-website

Option 2: PM2 Process Manager

Install PM2 globally:

npm install -g pm2

Create ecosystem.config.cjs:

module.exports = {
  apps: [{
    name: 'workroot-website',
    script: './server.mjs',
    instances: 'max',
    exec_mode: 'cluster',
    env: {
      NODE_ENV: 'production',
      HOST: '0.0.0.0',
      PORT: 10000
    }
  }]
};

Start with PM2:

pm2 start ecosystem.config.cjs
pm2 save
pm2 startup  # Enable auto-start on system boot

Option 3: Direct Node.js

NODE_ENV=production node server.mjs

Platform-Specific Deployments

Render.com

  1. Connect your repository
  2. Set build command: npm run build
  3. Set start command: npm start
  4. Set environment variable: PORT=10000

Railway.app

  1. Connect your repository
  2. Railway will auto-detect the build and start commands
  3. The app will automatically use the PORT environment variable

DigitalOcean App Platform

  1. Create a new app from your repository
  2. Set build command: npm run build
  3. Set run command: npm start
  4. Configure port: 10000

VPS (Ubuntu/Debian)

# Install Node.js 20
curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash -
sudo apt-get install -y nodejs

# Clone repository
git clone <your-repo-url>
cd workroot-website

# Install dependencies and build
npm ci --only=production
npm run build

# Install PM2
sudo npm install -g pm2

# Start with PM2
pm2 start server.mjs --name workroot-website
pm2 save
pm2 startup

# Setup nginx reverse proxy (optional)
sudo apt install nginx

Nginx configuration (/etc/nginx/sites-available/workroot):

server {
    listen 80;
    server_name workroot.in www.workroot.in;
    return 301 https://workroot.in$request_uri;
}

server {
    listen 443 ssl http2;
    server_name workroot.in;

    ssl_certificate /etc/letsencrypt/live/workroot.in/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/workroot.in/privkey.pem;

    # Security headers
    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
    add_header X-Frame-Options "SAMEORIGIN" always;
    add_header X-Content-Type-Options "nosniff" always;

    location / {
        proxy_pass http://localhost:10000;
        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;
        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;
    }
}

Health Check

The server includes graceful shutdown handlers for SIGTERM and SIGINT signals.

You can verify the server is running by accessing:

  • http://localhost:10000 (local)
  • http://0.0.0.0:10000 (all interfaces)

Performance Optimization

The application includes:

  • Image optimization with Sharp (WebP conversion)
  • HTML compression
  • CSS code splitting
  • Manual chunk splitting for better caching
  • Lazy loading for images
  • Prefetch with viewport strategy

Security Considerations

  1. Always use HTTPS in production (use a reverse proxy like nginx)
  2. Set proper CORS headers if serving APIs
  3. Keep dependencies updated: npm audit fix
  4. Use environment variables for sensitive configuration
  5. Enable rate limiting for API endpoints
  6. Set proper CSP headers

Monitoring

Consider adding monitoring tools:

  • PM2 Plus: For production monitoring
  • New Relic: Application performance monitoring
  • Sentry: Error tracking
  • LogDNA/Datadog: Log aggregation

Troubleshooting

Port already in use

# Find process using port 10000
lsof -i :10000  # macOS/Linux
netstat -ano | findstr :10000  # Windows

# Kill the process
kill -9 <PID>

Server not accessible

  • Verify firewall rules allow port 10000
  • Check that HOST is set to 0.0.0.0 for external access
  • Ensure the build completed successfully

Static assets not loading

  • Verify dist/client/ directory exists
  • Check that the server.mjs is in the project root
  • Ensure build command ran successfully