Back to catalog

tzurot-deployment

Railway deployment operations for Tzurot v3 - Service management, log analysis, environment variables, health checks, and troubleshooting. Use when deploying, debugging production issues, or managing Railway infrastructure.

  • Category: discovered
  • Tags: github, community
  • Version: 1.0.0
  • Author: walid
  • Downloads: 0
  • GitHub stars: 6
  • Updated: 2025-11-21

Download the latest version (v1.0.0) from this page.

SKILL.md

---
name: tzurot-deployment
description: Railway deployment operations for Tzurot v3 - Service management, log analysis, environment variables, health checks, and troubleshooting. Use when deploying, debugging production issues, or managing Railway infrastructure.
lastUpdated: '2025-11-19'
---

# Deployment Skill - Tzurot v3

> **Critical Context**: Tzurot v3 is deployed on Railway in development environment for private testing. NOT open to public yet (requires BYOK implementation).

## 🎯 Use This Skill When

- Deploying changes to Railway
- Checking service logs
- Managing environment variables
- Debugging production issues
- Verifying service health
- Rolling back deployments
- Managing Railway infrastructure

## 🚂 Railway CLI Reference

> **IMPORTANT**: Always consult `docs/reference/RAILWAY_CLI_REFERENCE.md` before running Railway commands. AI training data may be outdated for Railway CLI 4.5.3.

## Core Deployment Operations

### 1. Service Status Checks

```bash
# Check all services status
railway status

# Check specific service
railway status --service api-gateway
railway status --service ai-worker
railway status --service bot-client

# Check deployment history
railway deploy --service api-gateway
```

### 2. Viewing Logs

**Pattern**: Always use correlation IDs to trace requests across services.

```bash
# Tail logs for a service (last 50 lines, follow mode)
railway logs --service api-gateway --tail 50

# Tail logs for ai-worker
railway logs --service ai-worker --tail 50

# Tail logs for bot-client
railway logs --service bot-client --tail 50

# Search logs for specific pattern
railway logs --service api-gateway | grep "ERROR"

# Find logs with correlation ID (trace request across services)
railway logs --service api-gateway | grep "requestId:abc123"
railway logs --service ai-worker | grep "requestId:abc123"
```

**Log Analysis Tips**:

- Look for correlation IDs to trace requests end-to-end
- Check for ERROR level logs first
- Use timestamps to correlate events across services
- See `tzurot-observability` skill for log structure details

### 3. Environment Variables

**Pattern**: Use Railway dashboard for sensitive values, CLI for non-sensitive.

```bash
# List all environment variables for a service
railway variables --service api-gateway

# Set environment variable
railway variables set OPENROUTER_API_KEY=sk-or-v1-... --service ai-worker

# Set multiple variables
railway variables set \
  AI_PROVIDER=openrouter \
  LOG_LEVEL=info \
  --service ai-worker

# Delete environment variable
railway variables delete OLD_VAR_NAME --service ai-worker
```

**Security Reminder**: See `tzurot-security` skill for secret management best practices.

### 4. Health Checks

```bash
# API Gateway health endpoint
curl https://api-gateway-development-83e8.up.railway.app/health

# Expected response:
# {
#   "status": "healthy",
#   "timestamp": "2025-11-19T14:30:00.000Z",
#   "services": {
#     "database": "connected",
#     "redis": "connected"
#   }
# }
```

**Troubleshooting Unhealthy Services**:

1. Check logs: `railway logs --service <service-name> --tail 100`
2. Verify environment variables: `railway variables --service <service-name>`
3. Check database/Redis connectivity
4. Review recent deployments: `railway status --service <service-name>`

### 5. Deployment Workflow

**Standard Deployment Process**:

1. **Merge PR to develop** (Railway auto-deploys):

   ```bash
   gh pr merge <PR-number> --rebase
   ```

2. **Verify deployment started**:

   ```bash
   railway status --service api-gateway
   # Look for "Deploying" status
   ```

3. **Monitor deployment logs**:

   ```bash
   railway logs --service api-gateway --tail 100
   # Watch for "Server started" or deployment errors
   ```

4. **Verify health endpoint**:

   ```bash
   curl https://api-gateway-development-83e8.up.railway.app/health
   ```

5. **Check all services are healthy**:
   ```bash
   railway status  # Should show all services as "Running"
   ```

**Auto-Deploy Configuration**:

- **Branch**: `develop` (feature branches do NOT auto-deploy)
- **Trigger**: Push to `develop` branch on GitHub
- **Services**: All 3 services (bot-client, api-gateway, ai-worker) deploy independently

### 6. Rolling Back Deployments

**If deployment breaks production**:

```bash
# 1. Check deployment history
railway status --service api-gateway

# 2. Identify last known good commit
git log --oneline -10

# 3. Revert to previous commit (creates new commit)
git revert HEAD
git push origin develop

# 4. Railway will auto-deploy the revert

# OR: Force deploy a specific commit (use with caution)
# See docs/reference/RAILWAY_CLI_REFERENCE.md for correct syntax
```

**Alternative**: Use GitHub to revert the PR merge commit and push to `develop`.

### 7. Manual Deployments

**When auto-deploy fails or you need to redeploy**:

```bash
# Redeploy without code changes (useful for env var updates)
railway up --service api-gateway

# Deploy from current branch (use with caution - usually deploy from develop)
railway up --service ai-worker
```

**⚠️ Warning**: Manual deployments from feature branches can cause inconsistencies. Always deploy from `develop` in production.

## Common Operations

### Restarting a Service

```bash
# Restart a service (useful for picking up new env vars)
railway restart --service bot-client
```

**When to restart**:

- After changing environment variables
- Service is stuck (check logs first!)
- Memory leak suspected (check metrics)

### Database Operations

```bash
# Connect to PostgreSQL database
railway run psql

# Run Prisma migrations
railway run npx prisma migrate deploy

# Generate Prisma client (after schema changes)
railway run npx prisma generate

# View database in Prisma Studio (local only, connects to Railway DB)
npx prisma studio
```

### Redis Operations

```bash
# Connect to Redis CLI (if Redis CLI is installed)
railway run redis-cli

# Common Redis commands:
# - PING (test connection)
# - KEYS * (list all keys - don't use in production!)
# - GET key_name
# - DEL key_name
# - FLUSHDB (clear all keys - DANGEROUS!)
```

## Troubleshooting Guide

### Service Won't Start

**Symptoms**: Service shows "Crashed" or "Failed" status

**Steps**:

1. Check logs for errors:

   ```bash
   railway logs --service <service-name> --tail 100
   ```

2. Common issues:
   - **Missing environment variables**: Check `railway variables --service <service-name>`
   - **Database connection failed**: Verify `DATABASE_URL` is set
   - **Redis connection failed**: Verify `REDIS_URL` is set
   - **Port already in use**: Check for duplicate deployments
   - **Build failed**: Check build logs for TypeScript/dependency errors

3. Verify environment variables are set:
   ```bash
   railway variables --service <service-name> | grep -E "(DATABASE_URL|REDIS_URL|DISCORD_TOKEN)"
   ```

### Slow Response Times

**Symptoms**: API responses taking >5 seconds, timeouts

**Steps**:

1. Check service logs for slow operations:

   ```bash
   railway logs --service api-gateway | grep "duration"
   ```

2. Check database query performance:

   ```bash
   railway logs --service ai-worker | grep "prisma"
   ```

3. Check BullMQ job processing times:

   ```bash
   railway logs --service ai-worker | grep "job completed"
   ```

4. Verify Railway service resources (use Railway dashboard):
   - CPU usage
   - Memory usage
   - Active connections

### Discord Bot Not Responding

**Symptoms**: Bot appears online but doesn't respond to commands

**Steps**:

1. Check bot-client logs:

   ```bash
   railway logs --service bot-client --tail 50
   ```

2. Verify webhook creation (should see "Webhook created" in logs)

3. Check API Gateway is reachable:

   ```bash
   curl https://api-gateway-development-83e8.up.railway.app/health
   ```

4. Verify Discord token is set:

   ```bash
   railway variables --service bot-client | grep DISCORD_TOKEN
   ```

5. Check if bot has proper permissions in Discord server

### Database Migrations Failed

**Symptoms**: Service crashes after deployment with Prisma errors

**Steps**:

1. Check migration status:

   ```bash
   railway run npx prisma migrate status
   ```

2. Apply missing migrations:

   ```bash
   railway run npx prisma migrate deploy
   ```

3. If migrations are corrupted, see `docs/migration/` for recovery procedures

### Memory Leaks

**Symptoms**: Service memory usage gradually increases, eventual crash

**Steps**:

1. Monitor memory usage in Railway dashboard

2. Check for unclosed connections:

   ```bash
   railway logs --service ai-worker | grep "connection"
   ```

3. Look for growing caches or queues:

   ```bash
   railway logs --service bot-client | grep "cache"
   ```

4. Temporary fix: Restart service

   ```bash
   railway restart --service <service-name>
   ```

5. Long-term fix: Investigate code for resource leaks

## Railway-Specific Patterns

### Private Networking

Railway services communicate via private networking (no public internet):

```typescript
// ✅ CORRECT - Use Railway-provided URLs (internal networking)
const GATEWAY_URL = process.env.GATEWAY_URL; // e.g., "http://api-gateway.railway.internal"

// ❌ WRONG - Don't use public URLs for internal communication
const GATEWAY_URL = 'https://api-gateway-development-83e8.up.railway.app';
```

### Environment Variable Injection

Railway automatically injects service URLs:

```typescript
// Railway provides these automatically:
const DATABASE_URL = process.env.DATABASE_URL; // PostgreSQL addon
const REDIS_URL = process.env.REDIS_URL; // Redis addon
const GATEWAY_URL = process.env.GATEWAY_URL; // Service reference
```

**No need to manually configure these** - Railway handles it.

### Service Dependencies

**Startup Order**: Services start in parallel, handle connection retries:

```typescript
// ✅ GOOD - Retry database connection on startup
async function connectWithRetry(maxAttempts = 5) {
  for (let attempt = 1; attempt <= maxAttempts; attempt++) {
    try {
      await prisma.$connect();
      logger.info('Database connected');
      return;
    } catch (error) {
      logger.warn({ attempt, maxAttempts }, 'Database connection failed, retrying...');
      await new Promise(resolve => setTimeout(resolve, 2000 * attempt));
    }
  }
  throw new Error('Database connection failed after max attempts');
}
```

See `tzurot-async-flow` skill for retry patterns.

## Cost Optimization

### Development Environment

- **Plan**: Hobby (free tier with credits)
- **Services**: 3 services (bot-client, api-gateway, ai-worker)
- **Addons**: PostgreSQL, Redis

**Cost Monitoring**:

- Check usage in Railway dashboard
- Set up billing alerts (if available)
- Monitor AI API costs (OpenRouter/Gemini) separately

**⚠️ Warning**: Without BYOK, bot owner pays for all AI API usage. Implement rate limiting and token budgeting (see `tzurot-security` skill).

### Production Considerations (Future)

- Implement BYOK (Bring Your Own Key) before public launch
- Add admin commands for usage monitoring
- Set up proper rate limiting per guild/user
- Consider autoscaling for api-gateway and ai-worker

## Deployment Checklist

**Before Every Deployment**:

- [ ] ✅ Tests passing (`pnpm test`)
- [ ] ✅ Linting passing (`pnpm lint`)
- [ ] ✅ PR approved and merged to `develop`
- [ ] ✅ Verified no secrets committed (see `tzurot-security`)

**After Deployment**:

- [ ] ✅ All services show "Running" status
- [ ] ✅ Health endpoint returns 200 OK
- [ ] ✅ No ERROR logs in first 5 minutes
- [ ] ✅ Discord bot responds to test command
- [ ] ✅ Database migrations applied successfully (if any)

## Railway Dashboard

**Useful Sections**:

- **Deployments**: View build logs and deployment history
- **Metrics**: CPU, memory, bandwidth usage
- **Variables**: Manage environment variables (easier than CLI for viewing)
- **Logs**: Alternative to CLI for log viewing (with filtering)
- **Settings**: Service configuration, custom domains, sleep settings

**Dashboard URL**: https://railway.app/project/[project-id]

## Related Skills

- **tzurot-observability** - Log analysis and correlation IDs
- **tzurot-security** - Secret management and environment variables
- **tzurot-git-workflow** - Deployment triggers and branch strategy
- **tzurot-docs** - Update CURRENT_WORK.md after deployments

## References

- Railway CLI Reference: `docs/reference/RAILWAY_CLI_REFERENCE.md`
- Railway deployment guide: `docs/deployment/RAILWAY_DEPLOYMENT.md`
- Project README: `README.md#deployment`
- Railway official docs: https://docs.railway.app/

## Red Flags - When to Consult This Skill

- About to deploy to Railway
- Service is down or unhealthy
- Need to check production logs
- Environment variables need updating
- Database migration needed
- Performance issues in production
- Cost concerns or billing alerts