julien-infra-jokers
Complete management for Jokers Hockey website - deployment, build checks, database migrations (Drizzle ORM), and PM2 process management. Use for any Jokers site operation.
When & Why to Use This Skill
This Claude skill provides comprehensive infrastructure management and deployment automation for the Jokers Hockey website. It streamlines the entire DevOps lifecycle, including automated build checks, Drizzle ORM database migrations, and PM2 process management, ensuring high availability and consistent performance for web operations.
Use Cases
- 1. Automated Production Deployment: Streamline the push-to-production workflow by automating Git pulls, dependency installations, build processes, and server restarts via PM2.
- 2. Database Schema Management: Execute safe database migrations using Drizzle ORM and perform automated PostgreSQL backups to ensure data integrity during updates.
- 3. Build Verification & QA: Conduct pre-deployment TypeScript checks and bundle size audits to identify errors and optimize performance before code reaches the live server.
- 4. System Monitoring & Troubleshooting: Monitor real-time PM2 logs, perform health checks, and execute rapid rollbacks or service reloads to minimize downtime during incidents.
| name | julien-infra-jokers |
|---|---|
| description | Complete management for Jokers Hockey website - deployment, build checks, database migrations (Drizzle ORM), and PM2 process management. Use for any Jokers site operation. |
| license | Apache-2.0 |
Jokers Hockey - Infrastructure Management
Complete infrastructure management for the Jokers Hockey website.
Quick Reference
| Component | Details |
|---|---|
| Server | srv759970.hstgr.cloud (69.62.108.82) |
| User | automation |
| Path | /var/www/jokers |
| PM2 Process | jokers-hockey |
| Port | 5020 |
| URL | https://jokers.srv759970.hstgr.cloud |
| Database | PostgreSQL (localhost:5432/jokers_prod) |
| ORM | Drizzle |
1. Deployment
Quick Deploy (Git)
ssh automation@69.62.108.82
cd /var/www/jokers
git pull origin main
npm install
npm run db:push
npm run build
pm2 restart jokers-hockey
Pre-Deployment Checks
# Local: verify build works
npm run check
npm run build
ls -la dist/
Verify Deployment
pm2 status jokers-hockey
pm2 logs jokers-hockey --lines 50
curl -I https://jokers.srv759970.hstgr.cloud
Rollback
git log --oneline -5
git checkout <previous-commit>
npm install && npm run build
pm2 restart jokers-hockey
2. Build Verification
Full Build Check
# TypeScript compilation
npm run check
# Clean build
rm -rf dist/ && npm run build
# Verify output
ls -la dist/
ls -la dist/public/assets/
Expected Structure
dist/
├── index.js (server ~5KB)
└── public/
├── index.html
└── assets/
├── index-[hash].css (~70KB)
└── index-[hash].js (~350KB)
Quality Checks
# No debug code
grep -r "console.log\|debugger" client/src/ || echo "Clean"
# Security audit
npm audit --production
# Bundle sizes (should be < 500KB JS, < 100KB CSS)
du -sh dist/public/assets/*.js
du -sh dist/public/assets/*.css
3. Database (Drizzle ORM)
Schema Location
- Schema:
shared/schema.ts - Config:
drizzle.config.ts
Push Schema Changes
# Development (direct apply)
npm run db:push
# Production
ssh automation@69.62.108.82
cd /var/www/jokers
git pull origin main
npm run db:push
pm2 restart jokers-hockey
Schema Example
import { pgTable, serial, text, timestamp } from "drizzle-orm/pg-core";
export const news = pgTable("news", {
id: serial("id").primaryKey(),
title: text("title").notNull(),
content: text("content").notNull(),
publishedAt: timestamp("published_at").defaultNow(),
});
Backup Before Changes
docker exec postgresql-shared pg_dump -U postgres jokers_prod > backup_$(date +%Y%m%d).sql
Verify Database
ssh automation@69.62.108.82
docker exec -it postgresql-shared psql -U postgres -d jokers_prod
\dt # list tables
\d table_name # describe table
\q
4. PM2 Management
Status & Monitoring
ssh automation@69.62.108.82
pm2 status jokers-hockey
pm2 show jokers-hockey
pm2 monit # live dashboard
Logs
pm2 logs jokers-hockey --lines 100
pm2 logs jokers-hockey --err # errors only
pm2 flush jokers-hockey # clear logs
Process Control
pm2 restart jokers-hockey
pm2 stop jokers-hockey
pm2 start jokers-hockey
pm2 reload jokers-hockey # zero-downtime
PM2 Config
File: /var/www/jokers/ecosystem.config.cjs
module.exports = {
apps: [{
name: 'jokers-hockey',
script: './dist/index.js',
instances: 1,
env: { NODE_ENV: 'production', PORT: 5020 },
max_memory_restart: '500M',
}]
}
Save Configuration
pm2 save # after any changes
5. Troubleshooting
Site Down
pm2 status jokers-hockey
pm2 logs jokers-hockey --lines 100
pm2 restart jokers-hockey
curl -I https://jokers.srv759970.hstgr.cloud
Build Fails
npm run check # TypeScript errors
rm -rf node_modules/.vite && npm install
npm run build
Database Connection
echo $DATABASE_URL
docker exec postgresql-shared psql -U postgres -d jokers_prod -c "SELECT version();"
Port Conflict
netstat -tulpn | grep :5020
502 Bad Gateway
pm2 restart jokers-hockey
sudo nginx -t
sudo tail -f /var/log/nginx/jokers_ssl_error.log
6. Health Check Script
#!/bin/bash
echo "=== Jokers Health Check ==="
pm2 status jokers-hockey | grep online && echo "PM2: OK"
curl -sI https://jokers.srv759970.hstgr.cloud | grep "200\|301" && echo "HTTP: OK"
netstat -tulpn | grep :5020 && echo "Port: OK"
docker exec postgresql-shared psql -U postgres -d jokers_prod -c "SELECT 1;" && echo "DB: OK"
Security Notes
- Never commit .env files
- DATABASE_URL stored server-side only
- SSL auto-renews via Let's Encrypt
- Always test locally before deploying