entrypoint.sh 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. #!/bin/sh
  2. if [ ! -z "$DEBUG" ]; then set -x; fi
  3. mkdir /data 2>/dev/null >/dev/null
  4. RANDOM=$(printf "%d" "0x$(head -c4 /dev/urandom | od -t x1 -An | tr -d ' ')")
  5. if [ -z "$WORKERS" ]; then
  6. WORKERS=1
  7. fi
  8. SECRET_CMD=""
  9. if [ ! -z "$SECRET" ]; then
  10. echo "[+] Using the explicitly passed secret: '$SECRET'."
  11. elif [ -f /data/secret ]; then
  12. SECRET="$(cat /data/secret)"
  13. echo "[+] Using the secret in /data/secret: '$SECRET'."
  14. else
  15. if [[ ! -z "$SECRET_COUNT" ]]; then
  16. if [[ "$SECRET_COUNT" -le 1 || "$SECRET_COUNT" -ge 16 ]]; then
  17. echo "[F] Can generate between 1 and 16 secrets."
  18. exit 5
  19. fi
  20. else
  21. SECRET_COUNT="1"
  22. fi
  23. echo "[+] No secret passed. Will generate $SECRET_COUNT random ones."
  24. SECRET="$(dd if=/dev/urandom bs=16 count=1 2>&1 | od -tx1 | head -n1 | tail -c +9 | tr -d ' ')"
  25. for pass in $(seq 2 $SECRET_COUNT); do
  26. SECRET="$SECRET,$(dd if=/dev/urandom bs=16 count=1 2>&1 | od -tx1 | head -n1 | tail -c +9 | tr -d ' ')"
  27. done
  28. fi
  29. if echo "$SECRET" | grep -qE '^[0-9a-fA-F]{32}(,[0-9a-fA-F]{32}){0,15}$'; then
  30. SECRET="$(echo "$SECRET" | tr '[:upper:]' '[:lower:]')"
  31. SECRET_CMD="-S $(echo "$SECRET" | sed 's/,/ -S /g')"
  32. echo -- "$SECRET_CMD" > /data/secret_cmd
  33. echo "$SECRET" > /data/secret
  34. else
  35. echo '[F] Bad secret format: should be 32 hex chars (for 16 bytes) for every secret; secrets should be comma-separated.'
  36. exit 1
  37. fi
  38. if [ ! -z "$TAG" ]; then
  39. echo "[+] Using the explicitly passed tag: '$TAG'."
  40. fi
  41. TAG_CMD=""
  42. if [[ ! -z "$TAG" ]]; then
  43. if echo "$TAG" | grep -qE '^[0-9a-fA-F]{32}$'; then
  44. TAG="$(echo "$TAG" | tr '[:upper:]' '[:lower:]')"
  45. TAG_CMD="-P $TAG"
  46. else
  47. echo '[!] Bad tag format: should be 32 hex chars (for 16 bytes).'
  48. echo '[!] Continuing.'
  49. fi
  50. fi
  51. REMOTE_CONFIG=/data/proxy-multi.conf
  52. curl -s https://core.telegram.org/getProxyConfig -o ${REMOTE_CONFIG} || {
  53. echo '[F] Cannot download proxy configuration from Telegram servers.'
  54. exit 2
  55. }
  56. REMOTE_SECRET=/data/proxy-secret
  57. curl -s https://core.telegram.org/getProxySecret -o ${REMOTE_SECRET} || {
  58. echo '[F] Cannot download proxy secret from Telegram servers.'
  59. exit 5
  60. }
  61. if [ ! -z "$EXTERNAL_IP" ]; then
  62. echo "[+] Using the explicitly passed external IP: ${EXTERNAL_IP}."
  63. else
  64. EXTERNAL_IP="$(curl -s -4 "ipv4.icanhazip.com")"
  65. if [[ -z "$EXTERNAL_IP" ]]; then
  66. echo "[F] Cannot determine external IP address."
  67. exit 3
  68. else
  69. echo "[+] Using the detected external IP: ${EXTERNAL_IP}."
  70. fi
  71. fi
  72. if [ ! -z "$INTERNAL_IP" ]; then
  73. echo "[+] Using the explicitly passed internal IP: ${INTERNAL_IP}."
  74. else
  75. INTERNAL_IP="$(ip -4 route get 8.8.8.8 | grep '^8\.8\.8\.8\s' | grep -Eo 'src\s+\d+\.\d+\.\d+\.\d+' | awk '{print $2}')"
  76. if [[ -z "$INTERNAL_IP" ]]; then
  77. echo "[F] Cannot determine internal IP address."
  78. exit 4
  79. else
  80. echo "[+] Using the detected internal IP: ${INTERNAL_IP}."
  81. fi
  82. fi
  83. echo "[*] Final configuration:"
  84. I=1
  85. echo "$SECRET" | tr ',' '\n' | while read S; do
  86. echo "[*] Secret $I: $S"
  87. echo "[*] tg:// link for secret $I auto configuration: tg://proxy?server=${EXTERNAL_IP}&port=443&secret=${S}"
  88. echo "[*] t.me link for secret $I: https://t.me/proxy?server=${EXTERNAL_IP}&port=443&secret=${S}"
  89. I=$(($I+1))
  90. done
  91. [ ! -z "$TAG" ] && echo "[*] Tag: $TAG" || echo "[*] Tag: no tag"
  92. echo "[*] External IP: ${EXTERNAL_IP}"
  93. echo "[*] Make sure to fix the links in case you run the proxy on a different port."
  94. echo
  95. echo '[+] Starting proxy...'
  96. sleep 1
  97. # start mtproto-proxy
  98. exec mtproto-proxy "$@" --aes-pwd ${REMOTE_SECRET} --user root ${REMOTE_CONFIG} --nat-info "$INTERNAL_IP:$EXTERNAL_IP" ${SECRET_CMD} ${TAG_CMD}