install_coturn_on_aws_ec2.sh 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175
  1. #!/bin/bash
  2. #####################################################################################
  3. ############## purpose : install coturn as a server ########
  4. ############## verification on aws : tested & verified on aws ec2 ########
  5. ############## platform : aws ec2 ########
  6. ############## aws ubuntu version : ubuntu 22.04 LTS ########
  7. ############## coturn base version : 4.6.3 ########
  8. ############## dependent tools : installs prometheus client as well ########
  9. ############## file permissions : chmod 777 install_coturn_on_aws_ec2.sh #####
  10. ############## run command : ./install_coturn_on_aws_ec2.sh ########
  11. ############## developer : [email protected] ########
  12. #####################################################################################
  13. coturn_package="https://github.com/coturn/coturn/archive/refs/tags/4.6.3.tar.gz"
  14. coturn_version="4.6.3"
  15. if [ "$#" -eq 0 ]
  16. then
  17. echo "coturn version is not supplied as argument, installing below version as default."
  18. echo "default coturn package: $coturn_package"
  19. else
  20. coturn_package="https://github.com/coturn/coturn/archive/refs/tags/$1.tar.gz"
  21. coturn_version="$1"
  22. echo "installing coturn package: $coturn_package"
  23. fi
  24. echo "--------> this script installs coturn server version $1 on aws ec2 instance..."
  25. echo "--------> create user turnserver..."
  26. sudo adduser --gecos "" --disabled-password turnserver
  27. echo "--------> updating packages..."
  28. sudo DEBIAN_FRONTEND=noninteractive apt-get -y update
  29. sudo DEBIAN_FRONTEND=noninteractive apt-get -y upgrade
  30. ### install all dependent packages
  31. echo "--------> installing dependent packages..."
  32. sudo DEBIAN_FRONTEND=noninteractive apt-get install -y gcc make openssl-dev build-essential pkg-config libsystemd-dev musl-dev sqlite
  33. sudo DEBIAN_FRONTEND=noninteractive apt-get install -y libssl-dev libsqlite3-dev libevent-dev libpq-dev libmysqlclient-dev libhiredis-dev libmicrohttpd-dev
  34. ### download prometheus client libraries
  35. echo "--------> installing prometheus client..."
  36. wget https://github.com/digitalocean/prometheus-client-c/releases/download/v0.1.3/libprom-dev-0.1.3-Linux.deb
  37. wget https://github.com/digitalocean/prometheus-client-c/releases/download/v0.1.3/libpromhttp-dev-0.1.3-Linux.deb
  38. sudo dpkg -i prometheus-client/libprom-dev-0.1.3-Linux.deb
  39. sudo dpkg -i prometheus-client/libpromhttp-dev-0.1.3-Linux.deb
  40. ### download coturn source code
  41. echo "--------> downloading coturn $coturn_package"
  42. wget "$coturn_package"
  43. tar -xf "$coturn_version.tar.gz"
  44. cd "coturn-$coturn_version"
  45. ./configure
  46. ### compile & install coturn
  47. make
  48. echo "--------> installing coturn ..."
  49. sudo make install
  50. sudo bash -c "cat > /etc/default/coturn << EOL
  51. TURNSERVER_ENABLED=1
  52. EXTRA_OPTIONS=-v
  53. EOL"
  54. echo "--------> generating random key for realm..."
  55. secret_key=$(bash -c 'openssl rand -hex 32')
  56. ### fetch ec2 public ip and private ip using metadata token (applicable for v2 version of metadata)
  57. echo "--------> retrieving public & private ips of ec2 instance..."
  58. aws_token=$(bash -c 'curl -s -X PUT "http://instance-data/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600"')
  59. public_ip=$(bash -c 'curl -s -H "X-aws-ec2-metadata-token:'$aws_token'" -X GET "http://instance-data/latest/meta-data/public-ipv4"')
  60. private_ip=$(bash -c 'curl -s -H "X-aws-ec2-metadata-token:'$aws_token'" -X GET "http://instance-data/latest/meta-data/local-ipv4"')
  61. echo "--------> public ip: $public_ip, private ip: $private_ip"
  62. sudo bash -c "mv /etc/turnserver.conf /etc/turnserver.conf.original"
  63. ### create configuration file for coturn with basic expected parameters
  64. ### change below values as per your requirement.. like ports, username, password, etc.
  65. echo "--------> applying new config changes..."
  66. sudo bash -c "cat > /etc/turnserver.conf << EOL
  67. listening-port=3478
  68. tls-listening-port=5349
  69. # allow only TLSv1.2+
  70. no-tlsv1
  71. no-tlsv1_1
  72. userdb=/usr/local/var/db/turndb
  73. no-cli
  74. min-port=45000
  75. max-port=65535
  76. log-file=/var/log/turnserver/turnserver.log
  77. verbose
  78. fingerprint
  79. realm=${secret_key}
  80. lt-cred-mech
  81. user=username:password
  82. external-ip=${public_ip}/${private_ip}
  83. new-log-timestamp
  84. new-log-timestamp-format \"%FT%T%z\"
  85. log-binding
  86. prometheus
  87. EOL"
  88. ### make coturn as auto recoverable by making it as a service
  89. sudo bash -c "cat > /lib/systemd/system/coturn.service << EOL
  90. [Unit]
  91. Description=coTURN STUN Server
  92. Documentation=man:coturn(1) man:turnadmin(1) man:turnserver(1)
  93. After=network.target
  94. [Service]
  95. User=turnserver
  96. Group=turnserver
  97. Type=notify
  98. EnvironmentFile=/etc/default/coturn
  99. ExecStart=/usr/local/bin/turnserver -c /etc/turnserver.conf --pidfile=
  100. Restart=on-failure
  101. InaccessibleDirectories=/home
  102. PrivateTmp=yes
  103. LimitCORE=infinity
  104. LimitNOFILE=1000000
  105. LimitNPROC=60000
  106. LimitRTPRIO=infinity
  107. LimitRTTIME=7000000
  108. [Install]
  109. WantedBy=multi-user.target
  110. EOL"
  111. ### memory based database configurations
  112. sudo bash -c "sudo mkdir -p /var/lib/turn/turndb"
  113. sudo bash -c "sudo chown turnserver:turnserver /var/lib/turn/turndb"
  114. ### apply log rotation policy to avoid "disk full" issues
  115. echo "--------> setting log rotation policy..."
  116. sudo bash -c "sudo mkdir -p /var/log/turnserver"
  117. sudo bash -c "sudo chown turnserver:turnserver /var/log/turnserver"
  118. sudo bash -c "cat > /etc/logrotate.d/coturn << EOL
  119. /var/log/turnserver/*.log
  120. {
  121. rotate 7
  122. daily
  123. missingok
  124. notifempty
  125. compress
  126. postrotate
  127. /bin/systemctl kill -s HUP coturn.service
  128. endscript
  129. }
  130. EOL"
  131. sudo ufw allow 80/tcp
  132. sudo ufw allow 443/tcp
  133. sudo ufw allow 3478/udp
  134. sudo ufw allow 5349/tcp
  135. #Running coTURN on privileged port 443
  136. sudo bash -c "setcap cap_net_bind_service=+ep /usr/local/bin/turnserver"
  137. sudo bash -c "sudo chown turnserver:turnserver /etc/default/coturn"
  138. sudo bash -c "sudo chown turnserver:turnserver /etc/turnserver.conf"
  139. echo "--------> starting coturn as a service..."
  140. sudo systemctl enable coturn.service
  141. sudo systemctl daemon-reload
  142. sudo systemctl restart coturn.service
  143. echo "--------> coturn is running successfully..."
  144. ####
  145. echo "------ verification steps after installation -------"
  146. echo "a. check with command: ps -eaf | grep turnserver"
  147. echo "b. check with command: systemctl status coturn"
  148. echo "c. check configuration: cat /etc/turnserver.conf"
  149. echo "----------------------------------------------------"
  150. ####