# Troubleshooting Guide Common issues and their solutions for the Redmine-Gitea Sync Server. ## Table of Contents - [422 Errors](#422-errors) - [Connection Issues](#connection-issues) - [Sync Loop Issues](#sync-loop-issues) - [Performance Issues](#performance-issues) - [PM2 Issues](#pm2-issues) --- ## Label and Field Mapping Issues ### Issue: Priority/Tracker Not Syncing from Gitea to Redmine **Symptoms:** - Gitea labels like "bug", "High Priority" not mapping to Redmine fields - All Redmine issues default to Bug/Normal priority **Cause:** Gitea uses labels for everything, but Redmine has distinct `tracker_id` and `priority_id` fields. **Solution:** The server now automatically maps labels back to Redmine fields: **Tracker Mapping:** - `bug` label → Tracker ID 1 (Bug) - `feature` label → Tracker ID 2 (Feature) - `support` label → Tracker ID 3 (Support) **Priority Mapping:** - `Low Priority` → Priority ID 1 - `Normal Priority` → Priority ID 2 - `High Priority` → Priority ID 3 - `Urgent` → Priority ID 4 - `Immediate` → Priority ID 5 **Verification:** ```bash # Create issue in Gitea with labels "feature" and "High Priority" # Check Redmine - should show as Feature with High priority # Update to latest version git pull pm2 restart redmine-gitea-sync ``` ### Issue: Comments Not Syncing from Redmine to Gitea **Symptoms:** - Add note/journal in Redmine - Comment doesn't appear in Gitea - Gitea → Redmine comments work fine **Causes:** 1. Redmine webhook not configured for journal updates 2. Journal has no notes (only field changes) 3. Cache blocking the sync **Solutions:** 1. **Verify Redmine Webhook Events** - Go to: Administration → Settings → Repositories → Webhooks - Ensure "Issues updated" is checked - Redmine should send journals as part of issue updates 2. **Check Logs** ```bash pm2 logs redmine-gitea-sync # After adding a Redmine note, you should see: # "Processing Redmine issue #X" # "Synced Redmine journal #Y to Gitea comment on issue #Z" ``` 3. **Verify Journal Has Content** - Empty notes (only field changes) won't sync - Add actual text to the note/journal 4. **Check Journal Structure** ```bash # Enable debug logging pm2 start ecosystem.config.cjs --env development # Look for journal processing logs pm2 logs redmine-gitea-sync | grep journal ``` 5. **Clear Cache** ```bash curl -X POST http://localhost:3002/cache/clear ``` **Verification:** ```bash # 1. Add a note in Redmine with text content # 2. Watch logs pm2 logs redmine-gitea-sync # Should see: # [INFO] Processing Redmine issue #X # [INFO] Updating existing Gitea issue #Y # [INFO] Synced Redmine journal #Z to Gitea comment on issue #Y # 3. Check Gitea issue - comment should appear with: # [Redmine Journal #Z] # **username** commented: # # Your note text ``` --- ## 422 Errors ### Issue: "Request failed with status code 422" (Redmine → Gitea) **Symptoms:** ``` [ERROR] Redmine to Gitea sync failed: Request failed with status code 422 ``` **Cause:** Gitea API validation failure. The request payload contains invalid data. **Common Causes:** 1. **Invalid Label Format** - Labels must be set separately using label IDs, not in the issue creation payload - Fixed in v2.0.0+ 2. **Invalid Date Format** - Gitea expects ISO 8601 format: `2025-12-17T00:00:00Z` - Fixed in v2.0.0+ 3. **Invalid Assignee** - Must be a valid Gitea username (string) - User must exist in Gitea 4. **Invalid Milestone** - Must be a valid milestone ID (number) - Milestone must exist in the repository **Solutions:** 1. **Update to Latest Version** ```bash git pull npm install pm2 restart redmine-gitea-sync ``` 2. **Enable Verbose Logging** ```javascript // In ecosystem.config.cjs env: { LOG_LEVEL: 'debug', LOG_VERBOSE: 'true', } ``` Restart and check logs: ```bash pm2 restart redmine-gitea-sync --update-env pm2 logs redmine-gitea-sync ``` Look for: `Validation error details: {...}` 3. **Disable Problematic Features Temporarily** ```javascript // In ecosystem.config.cjs env: { SYNC_LABELS: 'false', SYNC_MILESTONES: 'false', } ``` 4. **Verify Assignee Exists** ```bash # Test if user exists in Gitea curl -H "Authorization: token YOUR_TOKEN" \ https://gitea.example.com/api/v1/users/username ``` 5. **Check Date Formats** - Ensure Redmine due dates are valid - Server will now auto-convert to ISO format **Verification:** ```bash # Watch logs in real-time pm2 logs redmine-gitea-sync # Create a test issue in Redmine # Should see: "Successfully synced Redmine issue #X to Gitea issue #Y" ``` ### Issue: "Due date is not a valid date" (Gitea → Redmine) **Symptoms:** ``` [ERROR] Gitea to Redmine sync failed: Request failed with status code 422 [ERROR] Validation error details: {"errors":["Due date is not a valid date"]} ``` **Cause:** Redmine expects dates in `YYYY-MM-DD` format (no time component), but Gitea sends ISO 8601 format with time. **Solution:** This is automatically fixed in v2.0.0+. The server now: - Extracts only the date portion from ISO timestamps - Validates dates before sending to Redmine - Handles invalid date formats gracefully with warnings **Manual Fix:** ```bash git pull pm2 restart redmine-gitea-sync ``` **Verification:** ```bash # Create issue in Gitea with due date # Watch logs - should see successful sync pm2 logs redmine-gitea-sync # Check Redmine - due date should appear correctly ``` --- ## Connection Issues ### Issue: Cannot Connect to Redmine **Symptoms:** ``` [ERROR] Redmine connection test failed ``` **Solutions:** 1. **Verify API URL** ```bash # Test Redmine API curl -H "X-Redmine-API-Key: YOUR_KEY" \ https://redmine.example.com/issues.json ``` 2. **Check API Key** - Log into Redmine - Go to: My Account → API access key - Verify key matches `REDMINE_API_KEY` in config 3. **Test Network Connectivity** ```bash # From server, test connection telnet redmine.example.com 443 ping redmine.example.com ``` 4. **Check Firewall** ```bash # Ensure outbound HTTPS is allowed sudo ufw status ``` 5. **Verify SSL Certificate** ```bash # Test SSL openssl s_client -connect redmine.example.com:443 ``` ### Issue: Cannot Connect to Gitea **Symptoms:** ``` [ERROR] Gitea connection test failed ``` **Solutions:** 1. **Verify API URL** - Should NOT include `/api/v1` - Correct: `https://gitea.example.com` - Incorrect: `https://gitea.example.com/api/v1` 2. **Check Token** ```bash # Test Gitea API curl -H "Authorization: token YOUR_TOKEN" \ https://gitea.example.com/api/v1/user ``` 3. **Verify Token Permissions** - Token must have: `repo`, `write:issue` - Regenerate token if needed 4. **Check Owner Name** ```bash # Verify owner exists curl -H "Authorization: token YOUR_TOKEN" \ https://gitea.example.com/api/v1/users/YOUR_OWNER ``` --- ## Sync Loop Issues ### Issue: Infinite Sync Loop **Symptoms:** - Issues constantly updating - High CPU usage - Logs showing rapid back-and-forth updates **Cause:** Cache not preventing loops properly. **Solutions:** 1. **Increase Cache TTL** ```javascript // In ecosystem.config.cjs env: { CACHE_TTL: '60000', // 60 seconds } ``` 2. **Clear Cache** ```bash curl -X POST http://localhost:3002/cache/clear ``` 3. **Verify Webhook Configuration** - Ensure webhooks are not triggering on every change - Check webhook logs in Redmine/Gitea 4. **Check for Multiple Instances** ```bash pm2 list # Should show only one instance ``` ### Issue: Updates Not Syncing **Symptoms:** - Changes made but not appearing on other platform - No errors in logs **Solutions:** 1. **Check Cache** ```bash # Cache might be blocking legitimate updates curl -X POST http://localhost:3002/cache/clear ``` 2. **Verify Webhooks Are Firing** ```bash # Watch logs pm2 logs redmine-gitea-sync # Make a change in Redmine # Should see: "Processing Redmine issue #X" ``` 3. **Test Webhooks Manually** ```bash # Test Redmine webhook curl -X POST http://localhost:3002/webhook/redmine \ -H "Content-Type: application/json" \ -d @test-payload.json # Test Gitea webhook curl -X POST http://localhost:3002/webhook/gitea \ -H "Content-Type: application/json" \ -d @gitea-payload.json ``` 4. **Check Network Connectivity** - Ensure Redmine/Gitea can reach sync server - Test from Redmine/Gitea servers: ```bash curl http://sync-server:3002/health ``` --- ## Performance Issues ### Issue: High Memory Usage **Symptoms:** ```bash pm2 list # Shows high memory usage (>300MB) ``` **Solutions:** 1. **Increase Memory Limit** ```javascript // In ecosystem.config.cjs max_memory_restart: '500M', ``` 2. **Check for Memory Leaks** ```bash pm2 monit # Watch memory over time ``` 3. **Reduce Cache Size** ```javascript env: { CACHE_TTL: '15000', // Reduce to 15 seconds } ``` 4. **Restart Regularly** ```javascript // In ecosystem.config.cjs cron_restart: '0 3 * * *', // Daily at 3 AM ``` ### Issue: Slow Sync Performance **Symptoms:** - Sync takes several seconds - Timeouts occurring **Solutions:** 1. **Increase Timeouts** ```javascript env: { REDMINE_TIMEOUT: '60000', GITEA_TIMEOUT: '60000', } ``` 2. **Reduce Retry Attempts** ```javascript env: { RETRY_ATTEMPTS: '2', RETRY_DELAY: '500', } ``` 3. **Check Network Latency** ```bash # Test latency ping redmine.example.com ping gitea.example.com ``` 4. **Disable Heavy Features** ```javascript env: { SYNC_LABELS: 'false', SYNC_MILESTONES: 'false', SYNC_CUSTOM_FIELDS: 'false', } ``` --- ## PM2 Issues ### Issue: Process Keeps Restarting **Symptoms:** ```bash pm2 list # Shows high restart count ``` **Solutions:** 1. **Check Error Logs** ```bash pm2 logs redmine-gitea-sync --err --lines 50 ``` 2. **Increase Restart Delay** ```javascript // In ecosystem.config.cjs restart_delay: 5000, max_restarts: 5, ``` 3. **Verify Configuration** ```bash # Test configuration node server.js # Should start without errors ``` ### Issue: PM2 Not Starting on Boot **Symptoms:** - Server boots but sync server not running **Solutions:** 1. **Regenerate Startup Script** ```bash pm2 unstartup pm2 startup pm2 save ``` 2. **Check Systemd Service** ```bash systemctl status pm2-yourusername journalctl -u pm2-yourusername -n 50 ``` 3. **Verify PM2 Save** ```bash pm2 save ls ~/.pm2/dump.pm2 ``` ### Issue: Logs Not Appearing **Symptoms:** ```bash pm2 logs redmine-gitea-sync # Shows no output ``` **Solutions:** 1. **Check Log Directory** ```bash ls -la ./logs/ # Should show error.log and out.log ``` 2. **Create Logs Directory** ```bash mkdir -p logs chmod 755 logs pm2 restart redmine-gitea-sync ``` 3. **Check Permissions** ```bash # Ensure PM2 user can write to logs chown -R $USER:$USER logs/ ``` 4. **Verify PM2 Config** ```javascript // In ecosystem.config.cjs error_file: './logs/error.log', out_file: './logs/out.log', ``` --- ## Webhook Issues ### Issue: Webhook Not Triggering **Symptoms:** - No logs when creating/updating issues - Changes not syncing **Solutions:** 1. **Verify Webhook URL** - Redmine: `http://your-server:3002/webhook/redmine` - Gitea: `http://your-server:3002/webhook/gitea` 2. **Check Webhook Status** - In Gitea: Repository → Settings → Webhooks - Look for delivery history and error messages 3. **Test Webhook Delivery** ```bash # From Redmine/Gitea server curl -X POST http://sync-server:3002/webhook/redmine \ -H "Content-Type: application/json" \ -d '{"payload":{"issue":{"id":1,"subject":"Test"}}}' ``` 4. **Check Firewall** ```bash # Ensure port 3002 is open sudo ufw status sudo ufw allow 3002/tcp ``` 5. **Use Reverse Proxy** - Configure Nginx to forward webhooks - Use HTTPS for production --- ## Project Mapping Issues ### Issue: Project Not Found **Symptoms:** ``` [WARN] No Gitea repo mapping found for Redmine project xyz [ERROR] Redmine project xyz not found ``` **Solutions:** 1. **Configure Project Mapping** ```javascript // In ecosystem.config.cjs env: { PROJECT_MAPPING: '{"GiteaRepo":"redmine-project-id"}', } ``` 2. **Verify Project Identifiers** ```bash # Check Redmine project identifier curl -H "X-Redmine-API-Key: KEY" \ https://redmine.example.com/projects/PROJECT_ID.json # Check Gitea repository name curl -H "Authorization: token TOKEN" \ https://gitea.example.com/api/v1/repos/OWNER/REPO ``` 3. **Use Automatic Mapping** - Leave `PROJECT_MAPPING` empty - Server will auto-convert names --- ## Debug Mode ### Enable Maximum Verbosity ```javascript // In ecosystem.config.cjs env: { NODE_ENV: 'development', LOG_LEVEL: 'debug', LOG_VERBOSE: 'true', } ``` Restart: ```bash pm2 restart redmine-gitea-sync --update-env ``` Or use development environment: ```bash pm2 start ecosystem.config.cjs --env development ``` ### View Detailed Logs ```bash # Real-time logs with timestamps pm2 logs redmine-gitea-sync --timestamp # Last 200 lines pm2 logs redmine-gitea-sync --lines 200 # Only errors pm2 logs redmine-gitea-sync --err # Follow and filter pm2 logs redmine-gitea-sync | grep ERROR ``` --- ## Getting Help ### Collect Debug Information ```bash # 1. Check server status curl http://localhost:3002/status # 2. Collect logs pm2 logs redmine-gitea-sync --lines 100 > debug.log # 3. Check configuration pm2 show redmine-gitea-sync # 4. Test connectivity curl -H "X-Redmine-API-Key: KEY" https://redmine.example.com/issues.json curl -H "Authorization: token TOKEN" https://gitea.example.com/api/v1/user # 5. Check process status pm2 list pm2 monit ``` ### Report an Issue When reporting issues, include: 1. Server status output 2. Relevant logs (last 50-100 lines) 3. Configuration (with sensitive data removed) 4. Steps to reproduce 5. Expected vs actual behavior ### Additional Resources - [README.md](README.md) - Full documentation - [PM2_GUIDE.md](PM2_GUIDE.md) - PM2 management - [API_DOCUMENTATION.md](API_DOCUMENTATION.md) - API reference - [DEPLOYMENT.md](DEPLOYMENT.md) - Deployment guide