First Init
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
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
This commit is contained in:
+274
@@ -0,0 +1,274 @@
|
||||
# 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
|
||||
Reference in New Issue
Block a user