first commit
This commit is contained in:
commit
dc401edc2e
260
turn.yml
Normal file
260
turn.yml
Normal file
@ -0,0 +1,260 @@
|
||||
---
|
||||
- name: turn
|
||||
hosts: all
|
||||
tasks:
|
||||
|
||||
- name: Create /home/docker/turn.{{inventory_hostname}} dir
|
||||
ansible.builtin.file:
|
||||
path: /home/docker/turn.{{inventory_hostname}}
|
||||
owner: root
|
||||
group: docker
|
||||
state: directory
|
||||
mode: '0550'
|
||||
|
||||
- name: Create /home/docker/turn.{{inventory_hostname}}/coturn dir
|
||||
ansible.builtin.file:
|
||||
path: /home/docker/turn.{{inventory_hostname}}/coturn
|
||||
owner: nobody
|
||||
group: docker
|
||||
state: directory
|
||||
mode: '0550'
|
||||
|
||||
- name: /home/docker/turn.{{inventory_hostname}}/coturn/turnserver.conf
|
||||
blockinfile:
|
||||
path: /home/docker/turn.{{inventory_hostname}}/coturn/turnserver.conf
|
||||
mode: "0400"
|
||||
owner: nobody
|
||||
group: root
|
||||
create: yes
|
||||
marker: "# {mark} ANSIBLE MANAGED BLOCK"
|
||||
block: |
|
||||
use-auth-secret
|
||||
realm=turn.{{inventory_hostname}}
|
||||
listening-port=3479
|
||||
tls-listening-port=5349
|
||||
min-port=49160
|
||||
max-port=49200
|
||||
verbose
|
||||
allow-loopback-peers
|
||||
log-file=stdout
|
||||
new-log-timestamp
|
||||
tls-listening-port=5349
|
||||
cert=/etc/coturn/cert.pem
|
||||
pkey=/etc/coturn/key.pem
|
||||
backup: yes
|
||||
|
||||
- name: /home/docker/turn.{{inventory_hostname}}/genpw.sh (generate Random PW for Turn)
|
||||
blockinfile:
|
||||
path: /home/docker/turn.{{inventory_hostname}}/genpw.sh
|
||||
create: yes
|
||||
mode: 0550
|
||||
owner: root
|
||||
group: docker
|
||||
marker: "# {mark} ANSIBLE MANAGED BLOCK"
|
||||
block: |
|
||||
cd /home/docker/turn.{{inventory_hostname}}
|
||||
turn_secret=$(pwgen -s 32 1)
|
||||
turn_cli_secret=$(pwgen -s 32 1)
|
||||
|
||||
[ -f env ] || echo "TURN_SECRET=!TURN_SECRET!
|
||||
TURN_CLI_SECRET=!TURN_CLI_SECRET!
|
||||
" >env
|
||||
|
||||
chmod 440 env
|
||||
chown root:docker env
|
||||
sed -i "s/\!TURN_SECRET\!/$turn_secret/g" env
|
||||
sed -i "s/\!TURN_CLI_SECRET\!/$turn_cli_secret/g" env
|
||||
|
||||
. ./env
|
||||
grep -q 'static-auth-secret=' coturn/turnserver.conf || echo "static-auth-secret=$TURN_SECRET" >>coturn/turnserver.conf
|
||||
grep -q 'cli-password=' coturn/turnserver.conf || echo "cli-password=$TURN_CLI_SECRET" >>coturn/turnserver.conf
|
||||
backup: yes
|
||||
validate: /bin/bash -n %s
|
||||
notify: run genpw.sh
|
||||
|
||||
- name: /home/docker/turn.{{inventory_hostname}}/genpw.sh shebang
|
||||
lineinfile:
|
||||
path: /home/docker/turn.{{inventory_hostname}}/genpw.sh
|
||||
insertbefore: BOF
|
||||
line: "#!/bin/bash -e"
|
||||
|
||||
- name: Gen initial passwords if not exists
|
||||
ansible.builtin.shell: ./genpw.sh
|
||||
args:
|
||||
chdir: /home/docker/turn.{{inventory_hostname}}
|
||||
creates: /home/docker/turn.{{inventory_hostname}}/env
|
||||
|
||||
- name: /home/docker/turn.{{inventory_hostname}}/newip.sh (define external and local IP in turnserver.conf)
|
||||
blockinfile:
|
||||
path: /home/docker/turn.{{inventory_hostname}}/newip.sh
|
||||
create: yes
|
||||
mode: 0550
|
||||
owner: root
|
||||
group: docker
|
||||
marker: "# {mark} ANSIBLE MANAGED BLOCK"
|
||||
block: |
|
||||
. /etc/bash/gaboshlib.include
|
||||
cd /home/docker/turn.{{inventory_hostname}}/coturn
|
||||
|
||||
local_ip=$(ip route get 1 | grep " src " | head -n1 | cut -d" " -f7)
|
||||
g_valid_ipv4 "$local_ip" || g_echo_error_exit "Invalid local_ip $local_ip"
|
||||
external_ip=$(curl -s https://checkipv4.dedyn.io)
|
||||
g_valid_ipv4 "$local_ip" || g_echo_error_exit "Invalid external_ip $external_ip"
|
||||
if ! grep -q "external-ip=$local_ip/$external_ip" turnserver.conf
|
||||
then
|
||||
sed -i '/^external-ip=.*/d' turnserver.conf
|
||||
echo "external-ip=$local_ip/$external_ip" >>turnserver.conf
|
||||
fi
|
||||
[ -f /home/docker/turn.{{inventory_hostname}}/docker-compose.yml ] && \
|
||||
docker compose -f /home/docker/turn.{{inventory_hostname}}/docker-compose.yml restart
|
||||
exit 0
|
||||
backup: yes
|
||||
validate: /bin/bash -n %s
|
||||
notify: run newip.sh
|
||||
|
||||
- name: /home/docker/turn.{{inventory_hostname}}/newip.sh shebang
|
||||
lineinfile:
|
||||
path: /home/docker/turn.{{inventory_hostname}}/newip.sh
|
||||
insertbefore: BOF
|
||||
line: "#!/bin/bash -e"
|
||||
|
||||
- name: Update external and local IP in turnserver.conf
|
||||
ansible.builtin.shell: ./newip.sh
|
||||
args:
|
||||
chdir: /home/docker/turn.{{inventory_hostname}}
|
||||
changed_when: false
|
||||
|
||||
- name: /home/docker/turn.{{inventory_hostname}}/docker-compose.yml Container Configuration
|
||||
blockinfile:
|
||||
path: /home/docker/turn.{{inventory_hostname}}/docker-compose.yml
|
||||
create: yes
|
||||
mode: 0440
|
||||
owner: root
|
||||
group: docker
|
||||
marker: "# {mark} ANSIBLE MANAGED BLOCK"
|
||||
block: |
|
||||
version: '3.6'
|
||||
services:
|
||||
|
||||
turn.{{inventory_hostname}}:
|
||||
image: coturn/coturn:latest
|
||||
restart: unless-stopped
|
||||
volumes:
|
||||
- /etc/localtime:/etc/localtime:ro
|
||||
- ./coturn:/etc/coturn
|
||||
ports:
|
||||
- 49160-49200:49160-49200/udp
|
||||
- 5349:5349
|
||||
- 5349:5349/udp
|
||||
|
||||
# Workaround for getting a letsencrypt-cert by traefik
|
||||
turn.{{inventory_hostname}}--ssl:
|
||||
image: nginx:latest
|
||||
restart: unless-stopped
|
||||
volumes:
|
||||
- ./htdocs:/usr/share/nginx/html:ro
|
||||
- /etc/localtime:/etc/localtime:ro
|
||||
networks:
|
||||
- traefik
|
||||
labels:
|
||||
- traefik.enable=true
|
||||
# HTTPS
|
||||
- traefik.http.routers.turn-{{ ansible_facts['hostname'] }}.rule=Host(`turn.{{inventory_hostname}}`)
|
||||
- traefik.http.routers.turn-{{ ansible_facts['hostname'] }}.entrypoints=https
|
||||
- traefik.http.routers.turn-{{ ansible_facts['hostname'] }}.tls=true
|
||||
# Proxy to service-port
|
||||
- traefik.http.services.turn-{{ ansible_facts['hostname'] }}.loadbalancer.server.port=80
|
||||
- traefik.http.routers.turn-{{ ansible_facts['hostname'] }}.service=turn-{{ ansible_facts['hostname'] }}
|
||||
# cert via letsencrypt
|
||||
- traefik.http.routers.turn-{{ ansible_facts['hostname'] }}.tls.certresolver=letsencrypt
|
||||
# activate secHeaders@file
|
||||
- traefik.http.routers.turn-{{ ansible_facts['hostname'] }}.middlewares=secHeaders@file
|
||||
# Traefik network
|
||||
- traefik.docker.network=traefik
|
||||
|
||||
networks:
|
||||
traefik:
|
||||
external: true
|
||||
|
||||
notify: Restart turn
|
||||
|
||||
- name: /usr/local/sbin/autoupdate.d/turn.update (workaround for valid ssl-certs)
|
||||
blockinfile:
|
||||
path: /usr/local/sbin/autoupdate.d/turn.update
|
||||
mode: "0400"
|
||||
owner: root
|
||||
group: root
|
||||
create: yes
|
||||
marker: "# {mark} ANSIBLE MANAGED BLOCK"
|
||||
block: |
|
||||
# take letsencrypt-certs from traefik
|
||||
cd /home/docker/turn.{{inventory_hostname}}/coturn
|
||||
# cleanup
|
||||
rm -f key.pem cert.pem
|
||||
touch key.pem cert.pem
|
||||
chown nobody key.pem cert.pem
|
||||
chmod 400 key.pem cert.pem
|
||||
# run ssl-container
|
||||
docker compose -f /home/docker/turn.{{inventory_hostname}}/docker-compose.yml up turn.defiant.dedyn.io--ssl -d
|
||||
# get cert
|
||||
function getcert {
|
||||
cat /home/docker/traefik/letsencrypt/acme.json | jq -r ".letsencrypt.Certificates[] | select(.domain.main==\"turn.{{inventory_hostname}}\") | .certificate" | base64 -d >cert.pem
|
||||
}
|
||||
|
||||
function getkey {
|
||||
cat /home/docker/traefik/letsencrypt/acme.json | jq -r ".letsencrypt.Certificates[] | select(.domain.main==\"turn.{{inventory_hostname}}\") | .key" | base64 -d >key.pem
|
||||
}
|
||||
getkey
|
||||
getcert
|
||||
until [ -s cert.pem ]
|
||||
do
|
||||
getcert
|
||||
sleep 31
|
||||
done
|
||||
until [ -s key.pem ]
|
||||
do
|
||||
getkey
|
||||
sleep 32
|
||||
done
|
||||
docker compose -f /home/docker/turn.{{inventory_hostname}}/docker-compose.yml down
|
||||
docker compose -f /home/docker/turn.{{inventory_hostname}}/docker-compose.yml up -d
|
||||
backup: yes
|
||||
validate: /bin/bash -n %s
|
||||
notify: run turn.update
|
||||
|
||||
- name: Allow turn for audio/video tcp
|
||||
community.general.ufw:
|
||||
rule: allow
|
||||
port: '5349'
|
||||
proto: tcp
|
||||
|
||||
- name: Allow turn for audio/video udp
|
||||
community.general.ufw:
|
||||
rule: allow
|
||||
port: '5349'
|
||||
proto: udp
|
||||
|
||||
handlers:
|
||||
- name: run genpw.sh
|
||||
ansible.builtin.shell: ./genpw.sh
|
||||
args:
|
||||
chdir: /home/docker/turn.{{inventory_hostname}}
|
||||
notify: Restart turn
|
||||
|
||||
- name: run newip.sh
|
||||
ansible.builtin.shell: ./newip.sh
|
||||
args:
|
||||
chdir: /home/docker/turn.{{inventory_hostname}}
|
||||
notify: Restart turn
|
||||
|
||||
- name: run turn.update
|
||||
ansible.builtin.shell: bash /usr/local/sbin/autoupdate.d/turn.update
|
||||
notify: Restart turn
|
||||
|
||||
|
||||
- name: Restart turn
|
||||
ansible.builtin.shell: docker-compose up -d
|
||||
args:
|
||||
chdir: /home/docker/turn.{{inventory_hostname}}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user