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
275 lines
5.9 KiB
Markdown
275 lines
5.9 KiB
Markdown
# 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`](./DOMAIN-MIGRATION-CHECKLIST.md) and [`MIGRATION-SUMMARY.md`](./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
|
|
|
|
```bash
|
|
npm install
|
|
```
|
|
|
|
### 2. Build the Application
|
|
|
|
```bash
|
|
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
|
|
|
|
```bash
|
|
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:
|
|
|
|
```env
|
|
# 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`:
|
|
|
|
```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:
|
|
|
|
```bash
|
|
docker build -t workroot-website .
|
|
docker run -p 10000:10000 workroot-website
|
|
```
|
|
|
|
### Option 2: PM2 Process Manager
|
|
|
|
Install PM2 globally:
|
|
|
|
```bash
|
|
npm install -g pm2
|
|
```
|
|
|
|
Create `ecosystem.config.cjs`:
|
|
|
|
```javascript
|
|
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:
|
|
|
|
```bash
|
|
pm2 start ecosystem.config.cjs
|
|
pm2 save
|
|
pm2 startup # Enable auto-start on system boot
|
|
```
|
|
|
|
### Option 3: Direct Node.js
|
|
|
|
```bash
|
|
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)
|
|
|
|
```bash
|
|
# 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`):
|
|
|
|
```nginx
|
|
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
|
|
```bash
|
|
# 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
|