julien-infra-jokers

majiayu000's avatarfrom majiayu000

Complete management for Jokers Hockey website - deployment, build checks, database migrations (Drizzle ORM), and PM2 process management. Use for any Jokers site operation.

⭐5stars🔀1forks📁View on GitHub🕐Updated Jan 11, 2026

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.
namejulien-infra-jokers
descriptionComplete management for Jokers Hockey website - deployment, build checks, database migrations (Drizzle ORM), and PM2 process management. Use for any Jokers site operation.
licenseApache-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