77 lines
2.4 KiB
Markdown
77 lines
2.4 KiB
Markdown
|
|
# HAProxy WebSocket Configuration Fix
|
||
|
|
|
||
|
|
## Issue
|
||
|
|
WebSocket connections open but messages aren't received by the Android client.
|
||
|
|
|
||
|
|
## Root Cause
|
||
|
|
The HAProxy `defaults` section has `option http-server-close` which closes the connection after the HTTP response. This breaks WebSocket upgrade because HAProxy closes the connection before it can be upgraded to the WebSocket protocol.
|
||
|
|
|
||
|
|
## Solution
|
||
|
|
Add `no option http-server-close` to the `alfred_mobile_app-backend` backend to override the default and keep the connection open for WebSocket upgrade.
|
||
|
|
|
||
|
|
## Complete Backend Configuration
|
||
|
|
|
||
|
|
```haproxy
|
||
|
|
backend alfred_mobile_app-backend
|
||
|
|
option forwardfor
|
||
|
|
no option http-server-close
|
||
|
|
timeout tunnel 3600s
|
||
|
|
timeout server 3600s
|
||
|
|
# Pass the real client IP to backend (from proxy headers or direct connection)
|
||
|
|
# This is crucial for container-level logging and security tools
|
||
|
|
http-request add-header X-CLIENT-IP %[var(txn.real_ip)]
|
||
|
|
http-request set-header X-Real-IP %[var(txn.real_ip)]
|
||
|
|
http-request set-header X-Forwarded-For %[var(txn.real_ip)]
|
||
|
|
http-request set-header X-Forwarded-Proto https if { ssl_fc }
|
||
|
|
|
||
|
|
server alfred_app_proxy 192.168.1.169:18790 check
|
||
|
|
```
|
||
|
|
|
||
|
|
## Changes Made
|
||
|
|
|
||
|
|
1. **Added:** `no option http-server-close`
|
||
|
|
- Overrides the global default
|
||
|
|
- Keeps connection open after HTTP upgrade response
|
||
|
|
|
||
|
|
2. **Already added:** `timeout tunnel 3600s`
|
||
|
|
- Keeps WebSocket tunnel open for 1 hour
|
||
|
|
|
||
|
|
3. **Already added:** `timeout server 3600s`
|
||
|
|
- Prevents server timeout on long connections
|
||
|
|
|
||
|
|
## Testing
|
||
|
|
|
||
|
|
After applying this change:
|
||
|
|
1. Reload HAProxy configuration
|
||
|
|
2. Kill Alfred Mobile app
|
||
|
|
3. Open app fresh
|
||
|
|
4. WebSocket should connect and receive messages
|
||
|
|
5. Connection should stay open
|
||
|
|
|
||
|
|
## Alternative: TCP Mode (if HTTP mode still has issues)
|
||
|
|
|
||
|
|
If the above doesn't work, you can switch the entire backend to TCP mode for pure passthrough:
|
||
|
|
|
||
|
|
```haproxy
|
||
|
|
backend alfred_mobile_app-backend
|
||
|
|
mode tcp
|
||
|
|
timeout tunnel 3600s
|
||
|
|
timeout server 3600s
|
||
|
|
|
||
|
|
server alfred_app_proxy 192.168.1.169:18790 check
|
||
|
|
```
|
||
|
|
|
||
|
|
**Note:** TCP mode loses HTTP header manipulation (X-CLIENT-IP, X-Real-IP, etc.) but guarantees WebSocket works.
|
||
|
|
|
||
|
|
## HAProxy WebSocket Documentation
|
||
|
|
|
||
|
|
From HAProxy docs:
|
||
|
|
> For WebSocket connections, use `no option http-server-close` or switch to `mode tcp` to prevent HAProxy from closing the connection after the upgrade response.
|
||
|
|
|
||
|
|
## Status
|
||
|
|
|
||
|
|
- [x] Identified issue
|
||
|
|
- [ ] Applied fix
|
||
|
|
- [ ] Tested connection
|
||
|
|
- [ ] Verified messages flow
|