# Webhook Setup with Pangolin ## Overview Pangolin provides secure tunneling similar to Cloudflare Tunnel, allowing you to expose your webhook endpoint without opening firewall ports or making your entire application public. --- ## Architecture ``` Internet → Pangolin Edge → Pangolin Agent → Pulse App (Internal) No open ports! Port 3100 ``` **Benefits:** - ✅ No firewall changes needed - ✅ No public IP required - ✅ Automatic SSL/TLS - ✅ Only webhook endpoint exposed - ✅ Built-in DDoS protection - ✅ Zero Trust security --- ## Prerequisites 1. **Pangolin Account** - Active Pangolin subscription - Access to Pangolin dashboard 2. **Domain/Subdomain** - Example: `webhooks.yourdomain.com` - DNS managed by Pangolin or pointed to Pangolin 3. **Pulse Application Running** - Accessible on internal network (e.g., `localhost:3100`) --- ## Setup Steps ### **Step 1: Install Pangolin Agent** On the server running Pulse: ```bash # Download Pangolin agent (adjust URL for your version) curl -O https://download.pangolin.com/agent/latest/pangolin-agent-linux-amd64 # Make executable chmod +x pangolin-agent-linux-amd64 sudo mv pangolin-agent-linux-amd64 /usr/local/bin/pangolin-agent # Verify installation pangolin-agent --version ``` ### **Step 2: Authenticate Pangolin Agent** ```bash # Login to Pangolin pangolin-agent login # Follow the prompts to authenticate # This will open a browser window or provide a URL ``` ### **Step 3: Create Tunnel Configuration** Create `/etc/pangolin/config.yml`: ```yaml # Pangolin Tunnel Configuration for Pulse Webhooks # Tunnel name name: pulse-webhooks # Ingress rules - define what gets exposed ingress: # Webhook endpoint - the only exposed path - hostname: webhooks.yourdomain.com path: /api/webhooks/autotask service: http://localhost:3100 # Optional: Webhook logs endpoint (for monitoring) - hostname: webhooks.yourdomain.com path: /api/webhooks/logs service: http://localhost:3100 # Optional: Webhook stats endpoint (for monitoring) - hostname: webhooks.yourdomain.com path: /api/webhooks/stats service: http://localhost:3100 # Catch-all - deny everything else - service: http_status:404 # Security settings security: # Rate limiting rateLimit: enabled: true requestsPerMinute: 100 burstSize: 20 # Optional: IP whitelist for Autotask # Get Autotask IP ranges from their documentation # ipWhitelist: # - "1.2.3.4/24" # - "5.6.7.8/24" # Logging logging: level: info file: /var/log/pangolin/tunnel.log ``` ### **Step 4: Create Tunnel** ```bash # Create tunnel with configuration sudo pangolin-agent tunnel create \ --config /etc/pangolin/config.yml \ --name pulse-webhooks # This will output a tunnel ID - save it! # Example: tun_abc123xyz ``` ### **Step 5: Configure DNS** In Pangolin dashboard or via CLI: ```bash # Route your subdomain to the tunnel pangolin-agent dns create \ --hostname webhooks.yourdomain.com \ --tunnel pulse-webhooks ``` Or in Pangolin dashboard: 1. Go to DNS settings 2. Add CNAME record: `webhooks.yourdomain.com` → `.pangolin.io` ### **Step 6: Start Tunnel** **Option A: Run in foreground (for testing)** ```bash sudo pangolin-agent tunnel run pulse-webhooks ``` **Option B: Install as systemd service (recommended)** Create `/etc/systemd/system/pangolin-tunnel.service`: ```ini [Unit] Description=Pangolin Tunnel for Pulse Webhooks After=network.target [Service] Type=simple User=root ExecStart=/usr/local/bin/pangolin-agent tunnel run pulse-webhooks --config /etc/pangolin/config.yml Restart=always RestartSec=5 StandardOutput=journal StandardError=journal [Install] WantedBy=multi-user.target ``` Enable and start: ```bash sudo systemctl daemon-reload sudo systemctl enable pangolin-tunnel sudo systemctl start pangolin-tunnel sudo systemctl status pangolin-tunnel ``` ### **Step 7: Verify Tunnel** ```bash # Check tunnel status pangolin-agent tunnel list # Test endpoint curl https://webhooks.yourdomain.com/api/webhooks/autotask # Expected: {"status":"active"...} ``` --- ## Alternative: Minimal Configuration If you prefer a simpler setup without a config file: ```bash # Create and start tunnel in one command pangolin-agent tunnel \ --hostname webhooks.yourdomain.com \ --url http://localhost:3100 \ --path /api/webhooks/autotask ``` --- ## Security Configuration ### **1. Path-Based Access Control** Only expose specific paths in `config.yml`: ```yaml ingress: # Allow webhook endpoint - hostname: webhooks.yourdomain.com path: /api/webhooks/autotask service: http://localhost:3100 # Block everything else - service: http_status:404 ``` ### **2. Rate Limiting** Protect against abuse: ```yaml security: rateLimit: enabled: true requestsPerMinute: 100 # Adjust based on expected traffic burstSize: 20 # Allow bursts of 20 requests ``` ### **3. IP Whitelisting (Optional)** If you have Autotask's IP ranges: ```yaml security: ipWhitelist: - "1.2.3.4/24" # Autotask IP range 1 - "5.6.7.8/24" # Autotask IP range 2 ``` ### **4. Request Headers** Add security headers: ```yaml ingress: - hostname: webhooks.yourdomain.com path: /api/webhooks/autotask service: http://localhost:3100 headers: X-Frame-Options: DENY X-Content-Type-Options: nosniff X-XSS-Protection: "1; mode=block" ``` --- ## Monitoring ### **View Tunnel Logs** ```bash # Systemd journal sudo journalctl -u pangolin-tunnel -f # Or log file (if configured) tail -f /var/log/pangolin/tunnel.log ``` ### **Tunnel Statistics** ```bash # Get tunnel stats pangolin-agent tunnel stats pulse-webhooks # List active connections pangolin-agent tunnel connections pulse-webhooks ``` ### **Webhook Logs** Monitor webhook processing: ```bash # Via API (if exposed) curl https://webhooks.yourdomain.com/api/webhooks/logs?limit=10 # Via database docker exec pulse-postgres psql -U pulse_user -d pulse_autotask -c \ "SELECT event_id, entity_type, status, processing_time_ms FROM webhook_logs ORDER BY received_at DESC LIMIT 10;" ``` --- ## Testing ### **1. Health Check** ```bash curl https://webhooks.yourdomain.com/api/webhooks/autotask ``` Expected response: ```json { "status": "active", "endpoint": "/api/webhooks/autotask", "message": "Autotask webhook receiver is ready" } ``` ### **2. Test Webhook POST** ```bash curl -X POST https://webhooks.yourdomain.com/api/webhooks/autotask \ -H "Content-Type: application/json" \ -d '{ "eventId": "test_pangolin_123", "eventType": "create", "entityType": "Tickets", "entityId": 99999, "eventTimestamp": "2026-01-24T10:00:00Z", "entity": { "id": 99999, "title": "Test Ticket via Pangolin" } }' ``` Expected response: ```json { "success": true, "eventId": "test_pangolin_123", "action": "created", "processingTime": 45 } ``` ### **3. Verify Path Blocking** ```bash # These should return 404 curl https://webhooks.yourdomain.com/ curl https://webhooks.yourdomain.com/admin curl https://webhooks.yourdomain.com/api/sync ``` ### **4. Test Rate Limiting** ```bash # Send 150 requests quickly for i in {1..150}; do curl -s https://webhooks.yourdomain.com/api/webhooks/autotask > /dev/null echo "Request $i" done # Should see rate limit errors after ~100 requests ``` --- ## Configure Autotask Once your Pangolin tunnel is working: 1. **Log in to Autotask** as administrator 2. **Navigate to:** Admin → Features & Settings → API & Integrations → Webhooks 3. **Create New Webhook:** - **Name:** `Pulse - Tickets` (or entity name) - **Endpoint URL:** `https://webhooks.yourdomain.com/api/webhooks/autotask` - **Entity Type:** Select entity (e.g., Tickets) - **Events:** ✅ Create, ✅ Update - **Include Entity Data:** ✅ **Enable this!** - **Active:** ✅ Enabled 4. **Test Webhook** from Autotask UI 5. **Verify** in Pulse webhook logs Repeat for each entity: Companies, Tasks, Projects, Time Entries, Contacts --- ## Troubleshooting ### **Tunnel Not Starting** **Check 1: Agent Status** ```bash pangolin-agent status ``` **Check 2: Configuration** ```bash # Validate config file pangolin-agent tunnel validate --config /etc/pangolin/config.yml ``` **Check 3: Logs** ```bash sudo journalctl -u pangolin-tunnel -n 50 ``` ### **Webhooks Not Received** **Check 1: Tunnel is Running** ```bash pangolin-agent tunnel list # Should show pulse-webhooks as "active" ``` **Check 2: DNS Resolution** ```bash nslookup webhooks.yourdomain.com # Should resolve to Pangolin edge ``` **Check 3: Pulse App is Accessible** ```bash # Test from same server curl http://localhost:3100/api/webhooks/autotask # Should return health check response ``` **Check 4: Webhook Logs** ```bash # Check if webhooks are being received but failing docker exec pulse-postgres psql -U pulse_user -d pulse_autotask -c \ "SELECT * FROM webhook_logs WHERE status = 'failed' ORDER BY received_at DESC LIMIT 5;" ``` ### **502 Bad Gateway** Pulse app is not reachable from Pangolin agent: ```bash # Verify Pulse app is running docker ps | grep pulse-app # Check port netstat -tlnp | grep 3100 # Test direct connection curl http://localhost:3100/api/webhooks/autotask ``` **Fix:** Ensure `service: http://localhost:3100` in config matches your Pulse app's actual address and port. ### **Rate Limiting Issues** If legitimate webhooks are being rate limited: ```yaml # Increase limits in config.yml security: rateLimit: enabled: true requestsPerMinute: 200 # Increased from 100 burstSize: 50 # Increased from 20 ``` Then restart tunnel: ```bash sudo systemctl restart pangolin-tunnel ``` --- ## Advanced Configuration ### **Multiple Paths** Expose additional endpoints if needed: ```yaml ingress: # Webhook receiver - hostname: webhooks.yourdomain.com path: /api/webhooks/autotask service: http://localhost:3100 # Monitoring endpoints (optional) - hostname: webhooks.yourdomain.com path: /api/webhooks/logs service: http://localhost:3100 # Optional: Add authentication auth: type: basic username: admin password: ${WEBHOOK_ADMIN_PASSWORD} - hostname: webhooks.yourdomain.com path: /api/webhooks/stats service: http://localhost:3100 auth: type: basic username: admin password: ${WEBHOOK_ADMIN_PASSWORD} ``` ### **Custom Domain** If using your own domain (not Pangolin subdomain): 1. Add CNAME in your DNS provider: ``` webhooks.yourdomain.com → .pangolin.io ``` 2. Update Pangolin configuration: ```bash pangolin-agent dns create \ --hostname webhooks.yourdomain.com \ --tunnel pulse-webhooks \ --custom-domain ``` ### **High Availability** Run multiple Pangolin agents for redundancy: **Server 1:** ```bash pangolin-agent tunnel run pulse-webhooks --config /etc/pangolin/config.yml ``` **Server 2:** ```bash pangolin-agent tunnel run pulse-webhooks --config /etc/pangolin/config.yml ``` Pangolin will automatically load balance between agents. --- ## Performance Optimization ### **Connection Pooling** ```yaml # In config.yml performance: connectionPool: maxConnections: 100 keepAliveTimeout: 60s ``` ### **Compression** ```yaml # Enable compression for responses compression: enabled: true minSize: 1024 # Only compress responses > 1KB ``` ### **Caching** ```yaml # Cache health check responses cache: enabled: true rules: - path: /api/webhooks/autotask method: GET ttl: 60s ``` --- ## Maintenance ### **Update Pangolin Agent** ```bash # Download latest version curl -O https://download.pangolin.com/agent/latest/pangolin-agent-linux-amd64 # Stop service sudo systemctl stop pangolin-tunnel # Replace binary sudo mv pangolin-agent-linux-amd64 /usr/local/bin/pangolin-agent sudo chmod +x /usr/local/bin/pangolin-agent # Start service sudo systemctl start pangolin-tunnel # Verify pangolin-agent --version ``` ### **Rotate Credentials** ```bash # Re-authenticate pangolin-agent logout pangolin-agent login # Restart tunnel sudo systemctl restart pangolin-tunnel ``` ### **Backup Configuration** ```bash # Backup config sudo cp /etc/pangolin/config.yml /etc/pangolin/config.yml.backup # Backup tunnel info pangolin-agent tunnel info pulse-webhooks > ~/pangolin-tunnel-info.txt ``` --- ## Cost Optimization Pangolin typically charges based on: - Number of tunnels - Bandwidth usage - Number of requests **Tips to minimize costs:** 1. **Use rate limiting** to prevent abuse 2. **Enable compression** to reduce bandwidth 3. **Cache static responses** (health checks) 4. **Monitor usage** regularly 5. **Use single tunnel** for all webhook endpoints --- ## Security Best Practices 1. ✅ **Only expose webhook endpoint** - block all other paths 2. ✅ **Enable rate limiting** - prevent DDoS 3. ✅ **Use HTTPS only** - Pangolin provides this automatically 4. ✅ **Monitor logs** - watch for suspicious activity 5. ✅ **IP whitelist** - if Autotask provides IP ranges 6. ✅ **Keep agent updated** - apply security patches 7. ✅ **Rotate credentials** - periodically re-authenticate --- ## Summary **Pangolin Setup for Pulse Webhooks:** 1. ✅ Install Pangolin agent 2. ✅ Create tunnel configuration (expose only `/api/webhooks/autotask`) 3. ✅ Start tunnel as systemd service 4. ✅ Configure DNS to point to tunnel 5. ✅ Test endpoint 6. ✅ Configure webhooks in Autotask 7. ✅ Monitor logs and statistics **Result:** - Webhook endpoint accessible at `https://webhooks.yourdomain.com/api/webhooks/autotask` - No firewall changes needed - No open ports - Automatic SSL/TLS - Rest of application remains private --- ## Support For Pangolin-specific issues: - Pangolin Documentation: Check your Pangolin dashboard - Pangolin Support: Contact via your support channel For Pulse webhook issues: - Check webhook logs: `/api/webhooks/logs` - Review database: `webhook_logs` table - See main documentation: `WEBHOOK_SETUP.md`