Fix asterisk.sh: symlink→cp, management script mount, TURN_SERVER, ports
- Replace symlink with real cp for easy-asterisk-v0.10.0.sh: Docker COPY doesn't reliably follow symlinks; using a real copy is safer. - Add ./easy-asterisk.sh:/usr/local/bin/easy-asterisk:ro bind mount so the management script can be updated without rebuilding the image. - Add TURN_SERVER to .env (empty in LAN-only mode, domain:3478 in FQDN mode) and reference it in compose instead of building the value inline — fixes malformed "":3478 in LAN-only mode. - Add provisioning ports 8088/8089 to UFW rules; these are Asterisk's built-in HTTP server for Linphone XML provisioning (not the web admin, not Caddy). - Document in README that Caddy has no role in calls: SIP/RTP use host networking. Caddy only proxies the web admin (8080). Provisioning ports (8088/8089) must be accessed directly, not through Caddy. https://claude.ai/code/session_014CCYqVwW6d6f5dw1qRokYt
This commit is contained in:
+34
-12
@@ -197,10 +197,10 @@ install_asterisk() {
|
|||||||
|
|
||||||
log_success "Source files copied"
|
log_success "Source files copied"
|
||||||
|
|
||||||
# ── The Dockerfile expects these paths inside the build context ───────────
|
# The Dockerfile COPYs easy-asterisk-v0.10.0.sh (the versioned name).
|
||||||
# vendor Dockerfile: COPY easy-asterisk-v0.10.0.sh → /usr/local/bin/easy-asterisk
|
# We keep easy-asterisk.sh as the canonical name and make a real copy
|
||||||
# We copy as easy-asterisk.sh locally, so symlink the expected filename for the build
|
# with the versioned filename so Docker COPY works reliably (no symlinks).
|
||||||
ln -sf easy-asterisk.sh "$EA_DIR/easy-asterisk-v0.10.0.sh"
|
cp "$EA_DIR/easy-asterisk.sh" "$EA_DIR/easy-asterisk-v0.10.0.sh"
|
||||||
|
|
||||||
# ── FQDN setup ────────────────────────────────────────────────────────────
|
# ── FQDN setup ────────────────────────────────────────────────────────────
|
||||||
echo ""
|
echo ""
|
||||||
@@ -264,6 +264,8 @@ services:
|
|||||||
- asterisk-logs:/var/log/asterisk
|
- asterisk-logs:/var/log/asterisk
|
||||||
- asterisk-spool:/var/spool/asterisk
|
- asterisk-spool:/var/spool/asterisk
|
||||||
- asterisk-lib:/var/lib/asterisk
|
- asterisk-lib:/var/lib/asterisk
|
||||||
|
# Bind-mount the management script so updates don't require a rebuild
|
||||||
|
- ./easy-asterisk.sh:/usr/local/bin/easy-asterisk:ro
|
||||||
environment:
|
environment:
|
||||||
- DOMAIN_NAME=${DOMAIN_NAME}
|
- DOMAIN_NAME=${DOMAIN_NAME}
|
||||||
- ENABLE_TLS=${ENABLE_TLS:-y}
|
- ENABLE_TLS=${ENABLE_TLS:-y}
|
||||||
@@ -272,7 +274,7 @@ services:
|
|||||||
- HAS_VLANS=${HAS_VLANS:-n}
|
- HAS_VLANS=${HAS_VLANS:-n}
|
||||||
- VLAN_SUBNETS=${VLAN_SUBNETS:-}
|
- VLAN_SUBNETS=${VLAN_SUBNETS:-}
|
||||||
- TURN_ENABLED=${TURN_ENABLED:-y}
|
- TURN_ENABLED=${TURN_ENABLED:-y}
|
||||||
- TURN_SERVER=${DOMAIN_NAME}:${TURN_PORT:-3478}
|
- TURN_SERVER=${TURN_SERVER}
|
||||||
- TURN_USERNAME=${TURN_USERNAME:-easyasterisk}
|
- TURN_USERNAME=${TURN_USERNAME:-easyasterisk}
|
||||||
- TURN_PASSWORD=${TURN_PASSWORD}
|
- TURN_PASSWORD=${TURN_PASSWORD}
|
||||||
- RTP_START=${RTP_START:-10000}
|
- RTP_START=${RTP_START:-10000}
|
||||||
@@ -347,6 +349,10 @@ VLAN_SUBNETS=
|
|||||||
TURN_USERNAME=easyasterisk
|
TURN_USERNAME=easyasterisk
|
||||||
TURN_PASSWORD=$TURN_PASSWORD
|
TURN_PASSWORD=$TURN_PASSWORD
|
||||||
|
|
||||||
|
# TURN server address — auto-set based on FQDN or LAN mode above
|
||||||
|
# LAN-only: leave empty (coturn not used). FQDN mode: domain:port
|
||||||
|
TURN_SERVER=$( [[ "$LAN_ONLY" == "true" ]] && echo "" || echo "${DOMAIN_NAME}:3478" )
|
||||||
|
|
||||||
# TURN port (change to 3479 if 3478 conflicts with UniFi controller or Mattermost)
|
# TURN port (change to 3479 if 3478 conflicts with UniFi controller or Mattermost)
|
||||||
TURN_PORT=3478
|
TURN_PORT=3478
|
||||||
|
|
||||||
@@ -369,18 +375,22 @@ ENV
|
|||||||
# ── UFW firewall rules ────────────────────────────────────────────────────
|
# ── UFW firewall rules ────────────────────────────────────────────────────
|
||||||
if command -v ufw >/dev/null 2>&1 && ufw status 2>/dev/null | grep -q "Status: active"; then
|
if command -v ufw >/dev/null 2>&1 && ufw status 2>/dev/null | grep -q "Status: active"; then
|
||||||
log_info "Opening UFW ports for Asterisk..."
|
log_info "Opening UFW ports for Asterisk..."
|
||||||
ufw allow 5060/udp comment "Asterisk SIP UDP" >/dev/null
|
ufw allow 5060/udp comment "Asterisk SIP UDP" >/dev/null
|
||||||
ufw allow 5060/tcp comment "Asterisk SIP TCP" >/dev/null
|
ufw allow 5060/tcp comment "Asterisk SIP TCP" >/dev/null
|
||||||
ufw allow 5061/tcp comment "Asterisk SIP TLS" >/dev/null
|
ufw allow 5061/tcp comment "Asterisk SIP TLS" >/dev/null
|
||||||
ufw allow 8080/tcp comment "Asterisk web admin" >/dev/null
|
ufw allow 8080/tcp comment "Asterisk web admin" >/dev/null
|
||||||
ufw allow 3478/udp comment "coturn STUN/TURN UDP" >/dev/null
|
ufw allow 8088/tcp comment "Asterisk HTTP provision" >/dev/null
|
||||||
ufw allow 3478/tcp comment "coturn STUN/TURN TCP" >/dev/null
|
ufw allow 8089/tcp comment "Asterisk HTTPS provision" >/dev/null
|
||||||
|
ufw allow 3478/udp comment "coturn STUN/TURN UDP" >/dev/null
|
||||||
|
ufw allow 3478/tcp comment "coturn STUN/TURN TCP" >/dev/null
|
||||||
ufw allow 10000:20000/udp comment "Asterisk RTP media" >/dev/null
|
ufw allow 10000:20000/udp comment "Asterisk RTP media" >/dev/null
|
||||||
ufw allow 49152:49252/udp comment "coturn TURN relay" >/dev/null
|
ufw allow 49152:49252/udp comment "coturn TURN relay" >/dev/null
|
||||||
log_success "UFW rules added"
|
log_success "UFW rules added"
|
||||||
else
|
else
|
||||||
log_info "UFW not active — open these ports manually if needed:"
|
log_info "UFW not active — open these ports manually if needed:"
|
||||||
log_info " 5060/udp+tcp, 5061/tcp, 8080/tcp, 3478/udp+tcp"
|
log_info " 5060/udp+tcp, 5061/tcp"
|
||||||
|
log_info " 8080/tcp (web admin), 8088/tcp, 8089/tcp (provisioning)"
|
||||||
|
log_info " 3478/udp+tcp (STUN/TURN)"
|
||||||
log_info " 10000-20000/udp (RTP), 49152-49252/udp (TURN relay)"
|
log_info " 10000-20000/udp (RTP), 49152-49252/udp (TURN relay)"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
@@ -421,6 +431,17 @@ for Linphone (remote provisioning) or Baresip (manual).
|
|||||||
- **LAN/VPN**: UDP, no encryption — local network or WireGuard/Tailscale
|
- **LAN/VPN**: UDP, no encryption — local network or WireGuard/Tailscale
|
||||||
- **FQDN**: TLS + SRTP + coturn TURN relay — works from anywhere
|
- **FQDN**: TLS + SRTP + coturn TURN relay — works from anywhere
|
||||||
|
|
||||||
|
## Caddy and phone calls
|
||||||
|
Asterisk uses **host networking** — SIP signaling and RTP media connect
|
||||||
|
directly to the server, completely bypassing Caddy. Do NOT put SIP ports
|
||||||
|
behind a reverse proxy (Contact header rewriting will break registration).
|
||||||
|
|
||||||
|
Caddy only handles the **web admin** (port 8080) for HTTPS browser access.
|
||||||
|
|
||||||
|
The **provisioning server** (ports 8088/8089) is Asterisk's built-in HTTP
|
||||||
|
server for Linphone XML config delivery. Access it directly by IP/domain,
|
||||||
|
not through Caddy — SIP clients fetch it at startup before registering.
|
||||||
|
|
||||||
## Router port forwards (FQDN mode)
|
## Router port forwards (FQDN mode)
|
||||||
| Port | Protocol | Service |
|
| Port | Protocol | Service |
|
||||||
|------|----------|---------|
|
|------|----------|---------|
|
||||||
@@ -428,6 +449,7 @@ for Linphone (remote provisioning) or Baresip (manual).
|
|||||||
| 3478 | UDP+TCP | STUN/TURN |
|
| 3478 | UDP+TCP | STUN/TURN |
|
||||||
| 10000-20000 | UDP | RTP media |
|
| 10000-20000 | UDP | RTP media |
|
||||||
| 49152-49252 | UDP | TURN relay |
|
| 49152-49252 | UDP | TURN relay |
|
||||||
|
| 8088 | TCP | Provisioning (Linphone XML) — optional |
|
||||||
|
|
||||||
## TURN credentials (for SIP clients behind strict NAT)
|
## TURN credentials (for SIP clients behind strict NAT)
|
||||||
- Server: \${DOMAIN_NAME}:3478
|
- Server: \${DOMAIN_NAME}:3478
|
||||||
|
|||||||
Reference in New Issue
Block a user