# Troubleshooting Guide > **Note**: This guide focuses on debugging the GoodGo Microservices Platform in a local development environment (Docker Compose). ## Table of Contents 1. [General Diagnosis](#general-diagnosis) 2. [Infrastructure Issues](#infrastructure-issues) - [Database (Neon/PostgreSQL)](#database-neonpostgresql) - [Redis](#redis) - [Traefik Gateway](#traefik-gateway) 3. [Service Issues](#service-issues) - [Service Fails to Start](#service-fails-to-start) - [Prisma/Database Errors](#prismadatabase-errors) - [Authentication Errors](#authentication-errors) 4. [Debugging Tools](#debugging-tools) 5. [FAQ](#faq) --- ## General Diagnosis When something goes wrong, follow this checklist: 1. **Check Service Status**: ```bash cd deployments/local docker-compose ps ``` *All services should be `Up` or `Running`.* 2. **Check Logs**: ```bash # View logs for a specific service docker-compose logs -f # View last 100 lines for all docker-compose logs --tail=100 ``` 3. **Check Connectivity**: * Can you reach the Gateway? `curl http://localhost/health` * Can you reach the Dashboard? http://localhost:8080 ### Troubleshooting Flowchart ```mermaid flowchart TD Start([ Issue Detected]) --> CheckStatus{Check Service
Status} CheckStatus -->|All Running| CheckLogs[ Check Logs] CheckStatus -->|Some Down| IdentifyService[ Identify Failed
Service] IdentifyService --> ServiceType{Service Type?} ServiceType -->|Infrastructure| InfraCheck[ Infrastructure
Check] ServiceType -->|Application| AppCheck[ Application
Check] InfraCheck --> DBCheck{Database?} InfraCheck --> RedisCheck{Redis?} InfraCheck --> TraefikCheck{Traefik?} DBCheck -->|Yes| DBSolution[ Check DATABASE_URL
Verify Neon connection
Check IP whitelist] RedisCheck -->|Yes| RedisSolution[ Restart Redis
Check port mapping
Verify connection string] TraefikCheck -->|Yes| TraefikSolution[ Check labels
Verify PathPrefix
Check health status] AppCheck --> ErrorType{Error Type?} ErrorType -->|Config| ConfigFix[ Check .env variables
Run init-project.sh] ErrorType -->|Prisma| PrismaFix[ Check migrations
Regenerate client
Reset database] ErrorType -->|Auth| AuthFix[ Check token expiry
Verify keys
Sync Docker time] CheckLogs --> LogAnalysis{Log Shows
Error?} LogAnalysis -->|Yes| ErrorType LogAnalysis -->|No| ConnCheck[ Check Connectivity] ConnCheck --> GatewayTest{Gateway
Reachable?} GatewayTest -->|No| TraefikCheck GatewayTest -->|Yes| ServiceTest{Service
Reachable?} ServiceTest -->|No| AppCheck ServiceTest -->|Yes| Resolved([ Issue Resolved]) DBSolution --> Restart[ Restart Services] RedisSolution --> Restart TraefikSolution --> Restart ConfigFix --> Restart PrismaFix --> Restart AuthFix --> Restart Restart --> Verify{Issue
Fixed?} Verify -->|Yes| Resolved Verify -->|No| DeepDebug[ Deep Debugging
Required] DeepDebug --> ContainerShell[Access Container Shell] DeepDebug --> PrismaStudio[Use Prisma Studio] DeepDebug --> RedisInspect[Inspect Redis] DeepDebug --> APITest[Direct API Testing] style Start fill:#1a1a2e,color:#fff style Resolved fill:#0f3460,color:#fff style CheckStatus fill:#16213e,color:#fff style ServiceType fill:#16213e,color:#fff style ErrorType fill:#16213e,color:#fff style DBCheck fill:#16213e,color:#fff style RedisCheck fill:#16213e,color:#fff style TraefikCheck fill:#16213e,color:#fff style GatewayTest fill:#16213e,color:#fff style ServiceTest fill:#16213e,color:#fff style Verify fill:#16213e,color:#fff style LogAnalysis fill:#16213e,color:#fff style InfraCheck fill:#1a1a40,color:#fff style AppCheck fill:#1a1a40,color:#fff style DBSolution fill:#0f4c75,color:#fff style RedisSolution fill:#0f4c75,color:#fff style TraefikSolution fill:#0f4c75,color:#fff style ConfigFix fill:#0f4c75,color:#fff style PrismaFix fill:#0f4c75,color:#fff style AuthFix fill:#0f4c75,color:#fff style Restart fill:#3282b8,color:#fff style DeepDebug fill:#1b262c,color:#fff style IdentifyService fill:#1a1a40,color:#fff style CheckLogs fill:#1a1a40,color:#fff style ConnCheck fill:#1a1a40,color:#fff style ContainerShell fill:#0f3460,color:#fff style PrismaStudio fill:#0f3460,color:#fff style RedisInspect fill:#0f3460,color:#fff style APITest fill:#0f3460,color:#fff ``` --- ## Infrastructure Issues ### Database (Neon/PostgreSQL) **Problem**: `P1001: Can't reach database server` or `Connection timed out` * **Cause 1**: Internet connectivity issues (Neon is cloud-based). * **Cause 2**: Incorrect `DATABASE_URL` in `.env`. * **Cause 3**: IP address blocked by Neon. **Solution**: 1. Verify internet connection: `ping neon.tech`. 2. Check `deployments/local/.env.local`. The URL should look like: `postgres://user:pass@ep-xyz.aws.neon.tech/neondb` 3. Go to Neon Dashboard -> Settings, ensure "Allow all IPs" or add your current IP. **Problem**: `P1003: Database does not exist` * **Reason**: You are connecting to the wrong database name. * **Fix**: Check the end of your connection string (e.g., `/neondb` usually). If you are using a custom DB name, ensure it exists in Neon. ### Redis **Problem**: `Redis connection refused` or `ECONNREFUSED` * **Cause**: Redis container is not running or port mapping is wrong. **Solution**: 1. Check Redis status: `docker-compose ps redis`. 2. Restart Redis: `docker-compose restart redis`. 3. Check logs: `docker-compose logs redis`. 4. Connection string from services: * **Inside Docker**: `redis:6379` * **From Host**: `localhost:6379` ### Traefik Gateway **Problem**: `404 Not Found` when accessing APIs (e.g., `http://localhost/api/v1/auth`) * **Cause**: Service is down or Labels are misconfigured. **Solution**: 1. Check Traefik Dashboard at http://localhost:8080. * Look for "HTTP Routers" and "Services". * If your service is missing, check `docker-compose.yml` labels. 2. Verify `PathPrefix` in labels matches your request. ```yaml - "traefik.http.routers.iam.rule=PathPrefix(`/api/v1/auth`)" ``` 3. Check if the service passed health checks (Health status in dashboard). **Problem**: `Bad Gateway` or `Gateway Timeout` * **Cause**: Service is crashing or taking too long to respond. * **Fix**: Check the specific service logs (`docker-compose logs iam-service`). --- ## Service Issues ### Service Fails to Start **Symptom**: Container status is `Exited (1)` or `Restarting`. **Debugging**: 1. Check logs immediately: ```bash docker-compose logs iam-service ``` 2. **Common Error**: `Config validation error` * **Fix**: Check environment variables. Using `./scripts/setup/init-project.sh` ensures `.env` exists. 3. **Common Error**: `PrismaClientInitializationError` * **Fix**: Database connectivity issue (see Infrastructure section). ### Prisma/Database Errors **Error**: `P2025: Record to update not found` * **Fix**: Logic error. Ensure the ID exists before updating. **Error**: `P2002: Unique constraint failed` * **Fix**: You are trying to insert duplicate data (e.g., same email). **Error**: `Migration failed` * **Fix**: 1. Delete `prisma/migrations` folder (only in dev!). 2. Reset database: `pnpm prisma migrate reset`. 3. Regenerate client: `pnpm prisma generate`. ### Authentication Errors **Problem**: `401 Unauthorized` despite valid token * **Cause 1**: Token expired. * **Cause 2**: Public key mismatch (Service can't verify token signed by IAM). * **Cause 3**: Clock skew (Docker time vs Host time). **Solution**: 1. Check server logs for JWT verification errors. 2. Restart services to refresh keys. 3. Sync Docker time: restart Docker Desktop. --- ## Debugging Tools ### 1. Accessing Container Shell To inspect files or run commands inside a running container: ```bash docker-compose exec iam-service sh # or /bin/bash ``` ### 2. Inspecting Database (via Prisma Studio) Use Prisma Studio to view/edit data visually: ```bash pnpm --filter @goodgo/iam-service prisma studio # Opens http://localhost:5555 ``` ### 3. Inspecting Redis ```bash docker-compose exec redis redis-cli > PING PONG > KEYS * 1) "user:123:session" ``` ### 4. Direct API Testing Use `curl` or Postman. ```bash # Health Check curl -v http://localhost/api/v1/auth/health/live # Login (example) curl -X POST http://localhost/api/v1/auth/login \ -H "Content-Type: application/json" \ -d '{"email":"admin@example.com", "password":"password"}' ``` --- ## FAQ **Q: Why is my change not reflecting?** A: If you changed `.env` or `docker-compose.yml`, you must restart: ```bash docker-compose down && docker-compose up -d ``` If you changed code, hot-reloading (nodemon) should pick it up. If not, restart container. **Q: How do I reset everything?** A: Be careful, this deletes all data! ```bash docker-compose down -v # -v removes volumes (Redis data, etc.) ``` **Q: My computer is slow when running everything.** A: Docker consumes RAM. 1. Stop unused services (e.g., `future-service`). 2. Increase Docker resource limits in Docker Desktop settings. --- ## Quick Tips ### Debugging Shortcuts ```bash # Quick health check all services docker-compose ps | grep -v "Up" # Tail logs for all services docker-compose logs -f --tail=50 # Restart specific service without rebuilding docker-compose restart iam-service # Rebuild and restart service docker-compose up -d --build iam-service # Check resource usage docker stats --no-stream # Clean up unused resources docker system prune -a --volumes ``` ### Common Error Patterns | Error Pattern | Likely Cause | Quick Fix | |--------------|--------------|-----------| | `ECONNREFUSED` | Service not running | `docker-compose restart ` | | `P1001` | Database unreachable | Check `DATABASE_URL` and internet | | `P2002` | Duplicate entry | Check unique constraints | | `401 Unauthorized` | Token expired/invalid | Refresh token or re-login | | `404 Not Found` | Wrong route/service down | Check Traefik dashboard | | `502 Bad Gateway` | Service crashed | Check service logs | | `Config validation error` | Missing env vars | Run `init-project.sh` | ### Log Analysis Tips **What to look for in logs:** - `Server listening on port XXXX` = Service started successfully - `Warning:` = Non-critical issues - `Error:` = Critical issues requiring attention - `Trace:` = Detailed execution flow **Useful grep patterns:** ```bash # Find all errors docker-compose logs | grep -i error # Find specific service errors docker-compose logs iam-service | grep -i "error\|failed" # Find database connection issues docker-compose logs | grep -i "prisma\|database\|p1001\|p1003" # Find auth issues docker-compose logs | grep -i "unauthorized\|401\|jwt\|token" ``` ### Resource Management **Recommended Docker Resources:** - **RAM**: Minimum 4GB, Recommended 8GB - **CPU**: Minimum 2 cores, Recommended 4 cores - **Disk**: Minimum 10GB free space **Check resource usage:** ```bash # Overall system docker system df # Per container docker stats --no-stream --format "table {{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}}" ``` **Cleanup commands:** ```bash # Remove stopped containers docker container prune # Remove unused images docker image prune -a # Remove unused volumes ( deletes data!) docker volume prune # Nuclear option ( removes everything!) docker system prune -a --volumes ``` ### Best Practices 1. **Always check logs first** before making changes 2. **Use Traefik Dashboard** (http://localhost:8080) to verify routing 3. **Keep `.env.local` updated** with correct credentials 4. **Don't delete volumes** unless you want to lose data 5. **Restart Docker Desktop** if experiencing weird networking issues 6. **Use `docker-compose down && up`** after `.env` changes 7. **Keep services running** you're actively developing 8. **Stop services** you're not using to save resources ### Visual Indicators When reading logs, look for these patterns: - `[INFO]` = Normal operation - `[WARN]` = Something to watch - `[ERROR]` = Needs immediate attention - `[DEBUG]` = Detailed information - `[TRACE]` = Very detailed execution flow ### Related Resources - [Local Deployment Guide](./local-deployment.md) - Setup instructions - [Development Guide](./development.md) - Development workflow - [Kubernetes Local Guide](./kubernetes-local.md) - K8s troubleshooting - [Neon Database Guide](./neon-database.md) - Database management