рдЯреЗрд▓реАрдЧреНрд░рд╛рдо MTProxy рдХреЗ рд╕рд╛рде 5.94 рдореАрдЯрд░ рдбреЙрдХрдЯрд░ рдЫрд╡рд┐

рдЬреИрд╕рд╛ рдХрд┐ рд╕рднреА рдиреЗ рдкрд╣рд▓реЗ рд╣реА рд╕реБрдирд╛ рд╣реИ , рдордИ рдХреЗ рдЕрдВрдд рдореЗрдВ рдЯреЗрд▓реАрдЧреНрд░рд╛рдо рдиреЗ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ MTProto рдкреНрд░реЙрдХреНрд╕реА (рдЙрд░реНрдл MTProxy) рд╕рд░реНрд╡рд░ рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛, рдЬреЛ рдирд┐рдореНрди рднрд╛рд╖рд╛ рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИред 2018 рдореЗрдВ, рдбреЙрдХрд░ рдХреЗ рдмрд┐рдирд╛ рдмрд╣реБрдд рдХреБрдЫ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╢реВрдиреНрдп-рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рд╕рдорд╛рди "рдЖрдзрд┐рдХрд╛рд░рд┐рдХ" рддрд░реАрдХреЗ рд╕реЗ рд╣реИред рд╕рдм рдХреБрдЫ рдареАрдХ рд╣реЛ рдЬрд╛рдПрдЧрд╛, рд▓реЗрдХрд┐рди рддреАрди "рдмрдЯреНрд╕" рдиреЗ рд░рд┐рд▓реАрдЬ рдХреА рдзрд╛рд░рдгрд╛ рдХреЛ рдереЛрдбрд╝рд╛ рдЦрд░рд╛рдм рдХрд░ рджрд┐рдпрд╛: рдЫрд╡рд┐ рдХрд╛ рд╡рдЬрди> 130 рдПрдордмреА (рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдЕрд▓реНрдкрд╛рдЗрди рдирд╣реАрдВ рд╣реИ, рд╕рд╛рдорд╛рдиреНрдп рдЕрд▓реНрдкрд╛рдЗрди рд╣реИ), "рд╢реВрдиреНрдп-рд╡рд┐рдиреНрдпрд╛рд╕" рдХреЗ рдХрд╛рд░рдг рдпрд╣ рд╣рдореЗрд╢рд╛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдХреЗрд╡рд▓ рдкрд░реНрдпрд╛рд╡рд░рдг рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рджреНрд╡рд╛рд░рд╛) рдФрд░ рд▓реЛрдЧ рдЕрднрд┐рдпрд╛рди рдХреЛ рднреВрд▓ рдЧрдП, рдбреЙрдХрд░рдлрд╛рдЗрд▓ рдХреЛ рдкреВрд░рд╛ рдХрд┐рдпрд╛ред



TL; DR рд╣рдо 5.94MB рдХреЗ рдЖрдХрд╛рд░ рдХреА 1-рдЗрди -1 рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рдЕрд▓реНрдкрд╛рдЗрди-рдЖрдзрд╛рд░рд┐рдд рдбреЙрдХрдЯрд░ рдЫрд╡рд┐ рдмрдирд╛рдпреЗрдВрдЧреЗ рдФрд░ рдЗрд╕реЗ рдпрд╣рд╛рдБ рдбрд╛рд▓реЗрдВрдЧреЗ (рдФрд░ рдпрд╣рд╛рдБ Dockerfile); рдЗрд╕рдХреЗ рд╕рд╛рде-рд╕рд╛рде, рд╣рдо рдпрд╣ рднреА рдкрддрд╛ рд▓рдЧрд╛рддреЗ рд╣реИрдВ рдХрд┐ рдЖрдк рдХрднреА-рдХрднреА рдПрд▓реНрдкрд╛рдЗрди рд╕реЙрдлрд╝реНрдЯрд╡реЗрдпрд░ рдХреЗ рд╕рд╛рде nippers рдФрд░ рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдорд┐рддреНрд░ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рд╣рдо рдЖрдХрд╛рд░ рдореЗрдВ рдереЛрдбрд╝рд╛ рд╕рд╛ рдЦреЗрд▓реЗрдВрдЧреЗ, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдордиреЛрд░рдВрдЬрди рдХреЗ рд▓рд┐рдПред

рдЫрд╡рд┐ рд╕рд╛рдордЧреНрд░реА


рдПрдХ рдмрд╛рд░ рдлрд┐рд░, рдХреНрдпреЛрдВрдХрд┐ рд╕рднреА рдЙрдкрджреНрд░рд╡ рдХреНрдпрд╛ рд╣реИ? рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рдЪрд┐рддреНрд░ рдЗрддрд┐рд╣рд╛рд╕ рдХрдорд╛рдВрдб рдХреЗ рд╕рд╛рде рдХреНрдпрд╛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ:

$ docker history --no-trunc --format "{{.Size}}\t{{.CreatedBy}}" telegrammessenger/proxy 

рдкрд░рддреЛрдВ рдХреЛ рдХреНрд░рдорд╢рдГ рдиреАрдЪреЗ рд╕реЗ рдКрдкрд░ рддрдХ рдкрдврд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ:



рд╕рдмрд╕реЗ рдореЛрдЯреА рдПрдХ рдбреЗрдмрд┐рдпрди рдЬреЗрд╕реА рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рд╕реЗ рдореВрд▓ рдЫрд╡рд┐ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓реА рд╣реИ, рд╣рдореЗрдВ рдЗрд╕реЗ рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдирд╛ рд╣реИ (рдЕрд▓реНрдкрд╛рдЗрди: 3.6, рддреБрд▓рдирд╛ рдХреЗ рд▓рд┐рдП, рдЗрд╕рдХрд╛ рд╡рдЬрди 3.97MB рд╣реИ); рдЖрдпрд╛рдореЛрдВ рдХреЗ рдмрд╛рдж рдХрд░реНрд▓ рдФрд░ рддрд╛рдЬрд╛ рдкреНрд░рдорд╛рдг рдкрддреНрд░ рд╣реИрдВред рдпрд╣ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдЕрдиреНрдп рджреЛ рдлрд╛рдЗрд▓реЗрдВ рдФрд░ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдХрд╛ рдХреНрдпрд╛ рдорддрд▓рдм рд╣реИ, рд╣рдо рд░рди рдХрдорд╛рдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдЕрдВрджрд░ рджреЗрдЦреЗрдВрдЧреЗ, рд╕реАрдПрдордбреА рдХреЛ рдмреИрд╢ рдХреЗ рд╕рд╛рде рдмрджрд▓ рджреЗрдВрдЧреЗ (рдпрд╣ рдЖрдкрдХреЛ рд▓реЙрдиреНрдЪ рдХреА рдЧрдИ рдЫрд╡рд┐ рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдШреВрдордиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛, рдПрдХ рджреВрд╕рд░реЗ рдХреЛ рдФрд░ рдЕрдзрд┐рдХ рдмрд╛рд░реАрдХреА рд╕реЗ рдЬрд╛рдиреЗрдВрдЧреЗ, рдХреБрдЫ рдЕрдВрд╢реЛрдВ рдХреЛ рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдХреБрдЫ рдЙрдкрдпреЛрдЧреА рдХреЙрдкреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

 $ docker run -it --rm telegrammessenger/proxy /bin/bash 

рдЕрдм рд╣рдо рдЖрд╕рд╛рдиреА рд╕реЗ рдЗрд╕ рдШрдЯрдирд╛ рдХреА рддрд╕реНрд╡реАрд░ рдХреЛ рдлрд┐рд░ рд╕реЗ рд╕реНрдерд╛рдкрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ - рдЦреЛрдП рд╣реБрдП рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рдбреЙрдХрд░реАрдлрд╛рдЗрд▓ рдЬреИрд╕рд╛ рдХреБрдЫ:

 FROM debian:jessie-20180312 RUN set -eux \ && apt-get update \ && apt-get install -y --no-install-recommends curl ca-certificates \ && rm -rf /var/lib/apt/lists/* COPY ./mtproto-proxy /usr/local/bin RUN mkdir /data COPY ./secret/ /etc/telegram/ COPY ./run.sh /run.sh CMD ["/bin/sh", "-c", "/bin/bash /run.sh"] 

рдЬрд╣рд╛рдВ mtproto- рдкреНрд░реЙрдХреНрд╕реА рдПрдХ рд╕рдВрдХрд▓рд┐рдд рд╕рд░реНрд╡рд░ рд╣реИ, рдЧреБрдкреНрдд рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдХреЗрд╡рд▓ AES рдПрдиреНрдХреНрд░рд┐рдкреНрд╢рди рдХреБрдВрдЬреА рдХреЗ рд╕рд╛рде рд╣реИрд▓реЛ-рдЦреЛрдЬрдХрд░реНрддрд╛-рдХреИрд╕реЗ-рдЖрдк-рдХрд░ рд░рд╣реА рдлрд╝рд╛рдЗрд▓ рд╣реИ (рд╕рд░реНрд╡рд░ рдЖрджреЗрд╢ рджреЗрдЦреЗрдВ, рд╡рд╣рд╛рдБ, рд╡реИрд╕реЗ, рдПрдкреАрдЖрдИ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХреБрдВрдЬреА рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рд╕рд┐рдлрд╛рд░рд┐рд╢ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдЗрд╕ рддрд░рд╣ рд╕реЗ рд░рдЦреЗрдВ рд╢рд╛рдпрдж рд╕реНрдерд┐рддрд┐ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдЬрдм рдПрдкреАрдЖрдИ рднреА рдЕрд╡рд░реБрджреНрдз рд╣реИ), рдФрд░ рд░рди.рд╢ рдкреНрд░реЙрдХреНрд╕реА рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рднреА рддреИрдпрд╛рд░реА рдХрд░рддрд╛ рд╣реИред

рдореВрд▓ run.sh рдХреА рд╕рд╛рдордЧреНрд░реА
 #!/bin/bash if [ ! -z "$DEBUG" ]; then set -x; fi mkdir /data 2>/dev/null >/dev/null RANDOM=$(printf "%d" "0x$(head -c4 /dev/urandom | od -t x1 -An | tr -d ' ')") if [ -z "$WORKERS" ]; then WORKERS=2 fi echo "####" echo "#### Telegram Proxy" echo "####" echo SECRET_CMD="" if [ ! -z "$SECRET" ]; then echo "[+] Using the explicitly passed secret: '$SECRET'." elif [ -f /data/secret ]; then SECRET="$(cat /data/secret)" echo "[+] Using the secret in /data/secret: '$SECRET'." else if [[ ! -z "$SECRET_COUNT" ]]; then if [[ ! ( "$SECRET_COUNT" -ge 1 && "$SECRET_COUNT" -le 16 ) ]]; then echo "[F] Can generate between 1 and 16 secrets." exit 5 fi else SECRET_COUNT="1" fi echo "[+] No secret passed. Will generate $SECRET_COUNT random ones." SECRET="$(dd if=/dev/urandom bs=16 count=1 2>&1 | od -tx1 | head -n1 | tail -c +9 | tr -d ' ')" for pass in $(seq 2 $SECRET_COUNT); do SECRET="$SECRET,$(dd if=/dev/urandom bs=16 count=1 2>&1 | od -tx1 | head -n1 | tail -c +9 | tr -d ' ')" done fi if echo "$SECRET" | grep -qE '^[0-9a-fA-F]{32}(,[0-9a-fA-F]{32}){,15}$'; then SECRET="$(echo "$SECRET" | tr '[:upper:]' '[:lower:]')" SECRET_CMD="-S $(echo "$SECRET" | sed 's/,/ -S /g')" echo -- "$SECRET_CMD" > /data/secret_cmd echo "$SECRET" > /data/secret else echo '[F] Bad secret format: should be 32 hex chars (for 16 bytes) for every secret; secrets should be comma-separated.' exit 1 fi if [ ! -z "$TAG" ]; then echo "[+] Using the explicitly passed tag: '$TAG'." fi TAG_CMD="" if [[ ! -z "$TAG" ]]; then if echo "$TAG" | grep -qE '^[0-9a-fA-F]{32}$'; then TAG="$(echo "$TAG" | tr '[:upper:]' '[:lower:]')" TAG_CMD="-P $TAG" else echo '[!] Bad tag format: should be 32 hex chars (for 16 bytes).' echo '[!] Continuing.' fi fi curl -s https://core.telegram.org/getProxyConfig -o /etc/telegram/backend.conf || { echo '[F] Cannot download proxy configuration from Telegram servers.' exit 2 } CONFIG=/etc/telegram/backend.conf IP="$(curl -s -4 "https://digitalresistance.dog/myIp")" INTERNAL_IP="$(ip -4 route get 8.8.8.8 | grep '^8\.8\.8\.8\s' | grep -Po 'src\s+\d+\.\d+\.\d+\.\d+' | awk '{print $2}')" if [[ -z "$IP" ]]; then echo "[F] Cannot determine external IP address." exit 3 fi if [[ -z "$INTERNAL_IP" ]]; then echo "[F] Cannot determine internal IP address." exit 4 fi echo "[*] Final configuration:" I=1 echo "$SECRET" | tr ',' '\n' | while read S; do echo "[*] Secret $I: $S" echo "[*] tg:// link for secret $I auto configuration: tg://proxy?server=${IP}&port=443&secret=${S}" echo "[*] t.me link for secret $I: https://t.me/proxy?server=${IP}&port=443&secret=${S}" I=$(($I+1)) done [ ! -z "$TAG" ] && echo "[*] Tag: $TAG" || echo "[*] Tag: no tag" echo "[*] External IP: $IP" echo "[*] Make sure to fix the links in case you run the proxy on a different port." echo echo '[+] Starting proxy...' sleep 1 exec /usr/local/bin/mtproto-proxy -p 2398 -H 443 -M "$WORKERS" -C 60000 --aes-pwd /etc/telegram/hello-explorers-how-are-you-doing -u root $CONFIG --allow-skip-dh --nat-info "$INTERNAL_IP:$IP" $SECRET_CMD $TAG_CMD 

рд╕рднрд╛


CentOS 7 рдХреЗ рддрд╣рдд Habr├й рдкрд░ MTProxy рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХрддреНрд░рд┐рдд рд╣реИ , рд╣рдо рдЕрд▓реНрдкрд╛рдЗрди рдХреЗ рддрд╣рдд рдПрдХ рдЫрд╡рд┐ рдПрдХрддреНрд░ рдХрд░рдиреЗ рдФрд░ рдореЗрдЧрд╛рдмрд╛рдЗрдЯ, рд╡рд┐рдЬреНрдЮрд╛рдкрдиреЛрдВ, 130 рдХреЛ рдкрд░рд┐рдгрд╛рдореА docker рдЫрд╡рд┐ рдХреЛ рдмрдЪрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВрдЧреЗред

рдЕрд▓реНрдкрд╛рдЗрди рд▓рд┐рдирдХреНрд╕ рдХреА рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╡рд┐рд╢реЗрд╖рддрд╛ glibc рдХреЗ рдмрдЬрд╛рдп рдорд╕рд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рд╣реИред рджреЛрдиреЛрдВ рдорд╛рдирдХ рд╕реА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╣реИрдВред рдорд╕рд▓ рдЫреЛрдЯрд╛ рд╣реИ (рдЗрд╕рдореЗрдВ "рдорд╛рдирдХ" рдХрд╛ рдкрд╛рдВрдЪрд╡рд╛ рд╣рд┐рд╕реНрд╕рд╛ рдирд╣реАрдВ рд╣реИ), рд▓реЗрдХрд┐рди рд╡реЙрд▓реНрдпреВрдо рдФрд░ рдкрд░рдлреЙрд░реНрдореЗрдВрд╕ (рдХрдо рд╕реЗ рдХрдо рд╡рд╛рджрд╛ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ) рдпрд╣ рддрдп рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдХрдм рдбреЙрдХрдЯрд░ рдЖрдПред рдФрд░ рдЕрд▓реНрдкрд╛рдЗрди рдкрд░ рдЧреНрд▓рд┐рдмрд┐рдЪ рдбрд╛рд▓рдирд╛ рдирд╕реНрд▓реАрдп рд░реВрдк рд╕реЗ рд╕рд╣реА рдирд╣реАрдВ рд╣реИ, рдЪрд╛рдЪрд╛ рдЬреИрдХрдм рдЬрд┐рд░реБрдЯрдХрд╛ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рд╕рдордЭреЗрдВрдЧреЗ ред

рд╣рдо рдирд┐рд░реНрднрд░рддрд╛ рдХреЛ рдЕрд▓рдЧ рдХрд░рдиреЗ рдФрд░ рдкреНрд░рдпреЛрдЧ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рддрдВрддреНрд░рддрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП docker рдореЗрдВ рдирд┐рд░реНрдорд╛рдг рдХрд░реЗрдВрдЧреЗ, рдЗрд╕рд▓рд┐рдП рдПрдХ рдирдпрд╛ Dockerfile рдмрдирд╛рдПрдВ:

 FROM alpine:3.6 RUN apk add --no-cache git make gcc musl-dev linux-headers openssl-dev RUN git clone --single-branch --depth 1 https://github.com/TelegramMessenger/MTProxy.git /mtproxy/sources RUN cd /mtproxy/sources \ && make -j$(getconf _NPROCESSORS_ONLN) 

рдирд┐рд░реНрднрд░рддрд╛ рдореЗрдВ рд╕реЗ, рдЬреАрдЖрдИрдЯреА рдХрд╛рдо рдореЗрдВ рдЖрдПрдЧрд╛ (рдФрд░ рди рдХреЗрд╡рд▓ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХреЛ рдХреНрд▓реЛрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореЗрдХ рдлрд╝рд╛рдЗрд▓ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП рд╢рд╛ рдХрдо рд╕рдВрд▓рдЧреНрди рдХрд░реЗрдЧрд╛), рдореЗрдХ, рдЬреАрд╕реАрд╕реА рдФрд░ рд╣реЗрдбрд░ рдлрд╛рдЗрд▓реЗрдВ (рдиреНрдпреВрдирддрдо рд╕реЗрдЯ рдХреЛ рдЕрдиреБрднрд╡ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛)ред рд╣рдо рдХреЗрд╡рд▓ 1 рдкреНрд░рддрд┐рдмрджреНрдз рдХреА рдЧрд╣рд░рд╛рдИ рдХреЗ рд╕рд╛рде рдорд╛рд╕реНрдЯрд░ рд╢рд╛рдЦрд╛ рдХреЛ рдХреНрд▓реЛрди рдХрд░рддреЗ рд╣реИрдВ (рд╣рдореЗрдВ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЗрддрд┐рд╣рд╛рд╕ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ)ред рдЦреИрд░, -j рд╕реНрд╡рд┐рдЪ рдХреЗ рд╕рд╛рде рд╕рдВрдХрд▓рди рдХрд░рддреЗ рд╕рдордп рд╕рднреА рд╣реЛрд╕реНрдЯ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВред рдкреБрдирд░реНрдирд┐рд░реНрдорд╛рдг рдХреЗ рджреМрд░рд╛рди рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдХреИрд╢рд┐рдВрдЧ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореИрдВрдиреЗ рдЬрд╛рдирдмреВрдЭрдХрд░ рдЗрд╕реЗ рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдкрд░рддреЛрдВ рдореЗрдВ рддреЛрдбрд╝ рджрд┐рдпрд╛ (рдЖрдорддреМрд░ рдкрд░ рдЗрдирдореЗрдВ рд╕реЗ рдмрд╣реБрдд рд╕рд╛рд░реЗ рд╣реИрдВ)ред

рд╣рдо рдмрд┐рд▓реНрдб рдХрдорд╛рдВрдб рдЪрд▓рд╛рдПрдВрдЧреЗ (рдбреЙрдХрд░реАрдлрд╛рдЗрд▓ рдХреЗ рд╕рд╛рде рдбрд╛рдпрд░реЗрдХреНрдЯрд░реА рдореЗрдВ рд╣реЛрдВрдЧреЗ):

 $ docker build -t mtproxy:test . 

рдФрд░ рдпрд╣рд╛рдБ рдкрд╣рд▓реА рд╕рдорд╕реНрдпрд╛ рд╣реИ:

 In file included from ./net/net-connections.h:34:0, from mtproto/mtproto-config.c:44: ./jobs/jobs.h:234:23: error: field 'rand_data' has incomplete type struct drand48_data rand_data; ^~~~~~~~~ 

рджрд░рдЕрд╕рд▓, рдЗрд╕рдХреЗ рдмрд╛рдж рд╡рд╛рд▓реЗ рд╕рднреА рдЗрд╕рд╕реЗ рдЬреБрдбрд╝реЗ рд░рд╣реЗрдВрдЧреЗред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЬреЛ рд╕реНрд╡рдпрдВ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рдирд╣реАрдВ рд╣реИрдВ, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рдВрдХрд▓рдХ drand48_aata рд╕рдВрд░рдЪрдирд╛ рдХреА рдШреЛрд╖рдгрд╛ рдХреА рдХрдореА рдкрд░ рд╢рдкрде рд▓реЗрддрд╛ рд╣реИред рджреВрд╕рд░реЗ, musl рдбреЗрд╡рд▓рдкрд░реНрд╕ рдиреЗ рдереНрд░реЗрдб-рд╕реЗрдл рд░реИрдВрдбрдо рдлрд╝рдВрдХреНрд╢рдВрд╕ (_r рдкреЛрд╕реНрдЯрдлрд┐рдХреНрд╕ рдХреЗ рд╕рд╛рде) рдФрд░ рдЙрдирд╕реЗ рдЬреБрдбрд╝реА рд╣рд░ рдЪреАрдЬрд╝ рдкрд░ (рд╕рдВрд░рдЪрдирд╛рдУрдВ рд╕рд╣рд┐рдд) рд░рди рдмрдирд╛рдПред рдФрд░ рдЯреЗрд▓реАрдЧреНрд░рд╛рдо рдХреЗ рдбреЗрд╡рд▓рдкрд░реНрд╕, рдмрджрд▓реЗ рдореЗрдВ, рдЙрди рдкреНрд░рдгрд╛рд▓рд┐рдпреЛрдВ рдХреЗ рд╕рдВрдХрд▓рди рдХреЗ рд╕рд╛рде рдкрд░реЗрд╢рд╛рди рдирд╣реАрдВ рд╣реБрдП, рдЬрд╣рд╛рдВ random_r рдФрд░ рдЗрд╕рдХреЗ рд╕рдордХрдХреНрд╖реЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ (рдХрдИ OS рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдореЗрдВ рдЖрдк HAVE_RANDOM_R рдзреНрд╡рдЬ рдпрд╛ рдЗрд╕рдХреЗ рдордирдорд╛рдиреЗ рдврдВрдЧ рд╕реЗ рдЙрдкрд╕реНрдерд┐рддрд┐ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ (рдЗрд╕ рд╕рдореВрд╣ рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреА рдЕрдиреБрдкрд╕реНрдерд┐рддрд┐ рдХреЛ рдЖрдорддреМрд░ рдкрд░ рдСрдЯреЛ-рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рдирдХрд░реНрддрд╛ рдореЗрдВ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ)ред

рдареАрдХ рд╣реИ, рдЕрдм рд╣рдо рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЧреНрд▓рд┐рдмреЗрдХ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВрдЧреЗ? рдирд╣реАрдВ! рд╣рдо glibc рд╕реЗ рдиреНрдпреВрдирддрдо рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╡рд╛рд▓реЗ рдХреЙрдкреА рдХрд░реЗрдВрдЧреЗ рдФрд░ MTProxy рд╕реНрд░реЛрддреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреИрдЪ рдмрдирд╛рдПрдВрдЧреЗред

Random_r рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдо рдмреИрдХрдЯреНрд░реЗрд╕ рдлрд╝рдВрдХреНрд╢рди (execinfo.h) рдХреЗ рд╕рд╛рде рдПрдХ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдкрдХрдбрд╝рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдЕрдкрд╡рд╛рдж рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рд╕реНрдЯреИрдХ рдмреИрдХрдЯреНрд░реЗрд╕ рдХреЛ рдЖрдЙрдЯрдкреБрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ: рдЖрдк рдЗрд╕реЗ libunwind рд╕реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╕рд╛рде рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рдЗрд╕рдХреЗ рд▓рд╛рдпрдХ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдХреЙрд▓ рдХреЛ рдЬрд╛рдБрдЪ рдХреЗ рд▓рд┐рдП рдЬрд╛рдБрдЪ рдХрд░ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ред __GLIBC__ред

Random_compat.patch рдкреИрдЪ рд╕рд╛рдордЧреНрд░реА
 Index: jobs/jobs.h IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- jobs/jobs.h (revision cdd348294d86e74442bb29bd6767e48321259bec) +++ jobs/jobs.h (date 1527996954000) @@ -28,6 +28,8 @@ #include "net/net-msg.h" #include "net/net-timers.h" +#include "common/randr_compat.h" + #define __joblocked #define __jobref Index: common/server-functions.c IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- common/server-functions.c (revision cdd348294d86e74442bb29bd6767e48321259bec) +++ common/server-functions.c (date 1527998325000) @@ -35,7 +35,9 @@ #include <arpa/inet.h> #include <assert.h> #include <errno.h> +#ifdef __GLIBC__ #include <execinfo.h> +#endif #include <fcntl.h> #include <getopt.h> #include <grp.h> @@ -168,6 +170,7 @@ } void print_backtrace (void) { +#ifdef __GLIBC__ void *buffer[64]; int nptrs = backtrace (buffer, 64); kwrite (2, "\n------- Stack Backtrace -------\n", 33); @@ -178,6 +181,7 @@ kwrite (2, s, strlen (s)); kwrite (2, "\n", 1); } +#endif } pthread_t debug_main_pthread_id; Index: common/randr_compat.h IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- common/randr_compat.h (date 1527998264000) +++ common/randr_compat.h (date 1527998264000) @@ -0,0 +1,72 @@ +/* + The GNU C Library is free software. See the file COPYING.LIB for copying + conditions, and LICENSES for notices about a few contributions that require + these additional notices to be distributed. License copyright years may be + listed using range notation, eg, 2000-2011, indicating that every year in + the range, inclusive, is a copyrightable year that would otherwise be listed + individually. +*/ + +#pragma once + +#include <endian.h> +#include <pthread.h> + +struct drand48_data { + unsigned short int __x[3]; /* Current state. */ + unsigned short int __old_x[3]; /* Old state. */ + unsigned short int __c; /* Additive const. in congruential formula. */ + unsigned short int __init; /* Flag for initializing. */ + unsigned long long int __a; /* Factor in congruential formula. */ +}; + +union ieee754_double +{ + double d; + + /* This is the IEEE 754 double-precision format. */ + struct + { +#if __BYTE_ORDER == __BIG_ENDIAN + unsigned int negative:1; + unsigned int exponent:11; + /* Together these comprise the mantissa. */ + unsigned int mantissa0:20; + unsigned int mantissa1:32; +#endif /* Big endian. */ +#if __BYTE_ORDER == __LITTLE_ENDIAN + /* Together these comprise the mantissa. */ + unsigned int mantissa1:32; + unsigned int mantissa0:20; + unsigned int exponent:11; + unsigned int negative:1; +#endif /* Little endian. */ + } ieee; + + /* This format makes it easier to see if a NaN is a signalling NaN. */ + struct + { +#if __BYTE_ORDER == __BIG_ENDIAN + unsigned int negative:1; + unsigned int exponent:11; + unsigned int quiet_nan:1; + /* Together these comprise the mantissa. */ + unsigned int mantissa0:19; + unsigned int mantissa1:32; +#else + /* Together these comprise the mantissa. */ + unsigned int mantissa1:32; + unsigned int mantissa0:19; + unsigned int quiet_nan:1; + unsigned int exponent:11; + unsigned int negative:1; +#endif + } ieee_nan; +}; + +#define IEEE754_DOUBLE_BIAS 0x3ff /* Added to exponent. */ + +int drand48_r (struct drand48_data *buffer, double *result); +int lrand48_r (struct drand48_data *buffer, long int *result); +int mrand48_r (struct drand48_data *buffer, long int *result); +int srand48_r (long int seedval, struct drand48_data *buffer); \ No newline at end of file Index: Makefile IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- Makefile (revision cdd348294d86e74442bb29bd6767e48321259bec) +++ Makefile (date 1527998107000) @@ -40,6 +40,7 @@ DEPENDENCE_NORM := $(subst ${OBJ}/,${DEP}/,$(patsubst %.o,%.d,${OBJECTS})) LIB_OBJS_NORMAL := \ + ${OBJ}/common/randr_compat.o \ ${OBJ}/common/crc32c.o \ ${OBJ}/common/pid.o \ ${OBJ}/common/sha1.o \ Index: common/randr_compat.c IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- common/randr_compat.c (date 1527998213000) +++ common/randr_compat.c (date 1527998213000) @@ -0,0 +1,120 @@ +/* + The GNU C Library is free software. See the file COPYING.LIB for copying + conditions, and LICENSES for notices about a few contributions that require + these additional notices to be distributed. License copyright years may be + listed using range notation, eg, 2000-2011, indicating that every year in + the range, inclusive, is a copyrightable year that would otherwise be listed + individually. +*/ + +#include <stddef.h> +#include "common/randr_compat.h" + +int __drand48_iterate (unsigned short int xsubi[3], struct drand48_data *buffer) { + uint64_t X; + uint64_t result; + + /* Initialize buffer, if not yet done. */ + if (!buffer->__init == 0) + { + buffer->__a = 0x5deece66dull; + buffer->__c = 0xb; + buffer->__init = 1; + } + + /* Do the real work. We choose a data type which contains at least + 48 bits. Because we compute the modulus it does not care how + many bits really are computed. */ + + X = (uint64_t) xsubi[2] << 32 | (uint32_t) xsubi[1] << 16 | xsubi[0]; + + result = X * buffer->__a + buffer->__c; + + xsubi[0] = result & 0xffff; + xsubi[1] = (result >> 16) & 0xffff; + xsubi[2] = (result >> 32) & 0xffff; + + return 0; +} + +int __erand48_r (unsigned short int xsubi[3], struct drand48_data *buffer, double *result) { + union ieee754_double temp; + + /* Compute next state. */ + if (__drand48_iterate (xsubi, buffer) < 0) + return -1; + + /* Construct a positive double with the 48 random bits distributed over + its fractional part so the resulting FP number is [0.0,1.0). */ + + temp.ieee.negative = 0; + temp.ieee.exponent = IEEE754_DOUBLE_BIAS; + temp.ieee.mantissa0 = (xsubi[2] << 4) | (xsubi[1] >> 12); + temp.ieee.mantissa1 = ((xsubi[1] & 0xfff) << 20) | (xsubi[0] << 4); + + /* Please note the lower 4 bits of mantissa1 are always 0. */ + *result = temp.d - 1.0; + + return 0; +} + +int __nrand48_r (unsigned short int xsubi[3], struct drand48_data *buffer, long int *result) { + /* Compute next state. */ + if (__drand48_iterate (xsubi, buffer) < 0) + return -1; + + /* Store the result. */ + if (sizeof (unsigned short int) == 2) + *result = xsubi[2] << 15 | xsubi[1] >> 1; + else + *result = xsubi[2] >> 1; + + return 0; +} + +int __jrand48_r (unsigned short int xsubi[3], struct drand48_data *buffer, long int *result) { + /* Compute next state. */ + if (__drand48_iterate (xsubi, buffer) < 0) + return -1; + + /* Store the result. */ + *result = (int32_t) ((xsubi[2] << 16) | xsubi[1]); + + return 0; +} + +int drand48_r (struct drand48_data *buffer, double *result) { + return __erand48_r (buffer->__x, buffer, result); +} + +int lrand48_r (struct drand48_data *buffer, long int *result) { + /* Be generous for the arguments, detect some errors. */ + if (buffer == NULL) + return -1; + + return __nrand48_r (buffer->__x, buffer, result); +} + +int mrand48_r (struct drand48_data *buffer, long int *result) { + /* Be generous for the arguments, detect some errors. */ + if (buffer == NULL) + return -1; + + return __jrand48_r (buffer->__x, buffer, result); +} + +int srand48_r (long int seedval, struct drand48_data *buffer) { + /* The standards say we only have 32 bits. */ + if (sizeof (long int) > 4) + seedval &= 0xffffffffl; + + buffer->__x[2] = seedval >> 16; + buffer->__x[1] = seedval & 0xffffl; + buffer->__x[0] = 0x330e; + + buffer->__a = 0x5deece66dull; + buffer->__c = 0xb; + buffer->__init = 1; + + return 0; +} \ No newline at end of file 

рдЗрд╕реЗ ./patches рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдбрд╛рд▓реЗрдВ рдФрд░ рдлреНрд▓рд╛рдИ рдкрд░ рдкреИрдЪ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░реЗ рдбреЙрдХрд░реАрдлрд╝рд╛рдЗрд▓ рдХреЛ рдереЛрдбрд╝рд╛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░реЗрдВ:

 FROM alpine:3.6 COPY ./patches /mtproxy/patches RUN apk add --no-cache --virtual .build-deps \ git make gcc musl-dev linux-headers openssl-dev \ && git clone --single-branch --depth 1 https://github.com/TelegramMessenger/MTProxy.git /mtproxy/sources \ && cd /mtproxy/sources \ && patch -p0 -i /mtproxy/patches/randr_compat.patch \ && make -j$(getconf _NPROCESSORS_ONLN) \ && cp /mtproxy/sources/objs/bin/mtproto-proxy /mtproxy/ \ && rm -rf /mtproxy/{sources,patches} \ && apk add --no-cache --virtual .rundeps libcrypto1.0 \ && apk del .build-deps 

рдЕрдм рдЗрдХрдЯреНрдареЗ mtproto- рдкреНрд░реЙрдХреНрд╕реА рдмрд╛рдЗрдирд░реА рдХреЛ рдХрдо рд╕реЗ рдХрдо рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рд╣рдо рдЖрдЧреЗ рдмрдврд╝ рд╕рдХрддреЗ рд╣реИрдВред

рдкрдВрдЬреАрдХрд░рдг


рдпрд╣ рдореВрд▓ run.sh рдХреЛ docker-entrypoint.sh рдореЗрдВ рдмрджрд▓рдиреЗ рдХрд╛ рд╕рдордп рд╣реИред рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рдпрд╣ рддрд░реНрдХрд╕рдВрдЧрдд рд╣реИ рдЬрдм "рдЕрдирд┐рд╡рд╛рд░реНрдп рдмрд╛рдзреНрдпрдХрд╛рд░реА" рдПрдирдЯреНрд░рд╛рдпрдкрдВрдЯ рдореЗрдВ рдЪрд▓рд╛ рдЬрд╛рддрд╛ рд╣реИ (рдпрд╣ рд╣рдореЗрд╢рд╛ рдмрд╛рд╣рд░ рд╕реЗ рдЕрддрд┐рднрд╛рд░рд┐рдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИ), рдФрд░ рдбреЙрдХреНрдпреВрдореЗрдВрдЯ рдХрд┐рдП рдЧрдП рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рд╕реАрдПрдордбреА рдореЗрдВ рдЕрдзрд┐рдХрддрдо рдлрд┐рдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддрд░реНрдХ (рдПрдХ рдирд╛рд╕рдордЭ рдХреЗ рд░реВрдк рдореЗрдВ + рдбрд┐рдЬрд┐рдЯрд▓ рдЪрд░)ред

рд╣рдо рдЕрдкрдиреА рдЕрд▓реНрдкрд╛рдЗрди рдЫрд╡рд┐ рдореЗрдВ рдмреИрд╢ рдФрд░ рдлреБрд▓ рдЧреНрд░реАрдк рд╕реНрдерд╛рдкрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рдореИрдВ рдмрд╛рдж рдореЗрдВ рд╕рдордЭрд╛рдКрдВрдЧрд╛) рд╕рд┐рд░рджрд░реНрдж рд╕реЗ рдмрдЪрдиреЗ рдФрд░ рдореВрд▓ рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╣рдорд╛рд░реА рд▓рдШреБ рдЫрд╡рд┐ рдХреЛ рдЕрдкрдорд╛рдирд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдХрд╕рд╛рдПрдЧрд╛, рдЗрд╕рд▓рд┐рдП рд╣рдо рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ, рдЙрд╕рдХреА рдорд╛рдВ, рдмреЛрдиреНрд╕рд╛рдИ рдХреЛ рдмрдбрд╝рд╛ рдХрд░реЗрдВрдЧреЗред

рдЪрд▓рд┐рдП рд╢реЗрдмрдВрдЧ рд╕реЗ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ, #!/bin/bash рдЬрдЧрд╣ #!/bin/bash with #!/bin/sh ред рдЕрд▓реНрдкрд╛рдЗрди рд░рд╛рдЦ рдХреЗ рд▓рд┐рдП рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд▓рдЧрднрдЧ рд╕рднреА рдмреИрд╢ рдХреЛ рдкрдЪрд╛рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реИ "рдЬреИрд╕рд╛ рдХрд┐" рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдо рдЕрднреА рднреА рдПрдХ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рддреЗ рд╣реИрдВ - рдЕрдЬреНрдЮрд╛рдд рдХрд╛рд░рдгреЛрдВ рд╕реЗ, рдЙрд╕рдиреЗ рдХрд┐рд╕реА рдПрдХ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдХреЛрд╖реНрдардХ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдиреЗ рд╕реЗ рдЗрдирдХрд╛рд░ рдХрд░ рджрд┐рдпрд╛, рдЗрд╕рд▓рд┐рдП рд╣рдо рддреБрд▓рдирд╛рддреНрдордХ рддрд░реНрдХ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдХреЗ рдЗрд╕рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░реЗрдВрдЧреЗ:



рдЕрдм рд╣рдо grep рдХреЗ рд╕рд╛рде рдПрдХ рддрд╕рд▓реАрдо рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЬреЛ рдХрд┐ рдмрд┐рдЬреАрдмреЙрдХреНрд╕ рдбрд┐рд▓реАрд╡рд░реА рдореЗрдВ рд╕рд╛рдорд╛рдиреНрдп рд╕реЗ рдереЛрдбрд╝рд╛ рдЕрд▓рдЧ рд╣реИ (рдФрд░, рд╡реИрд╕реЗ, рдмрд╣реБрдд рдзреАрдореА, рдЖрдкрдХреА рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ рдзреНрдпрд╛рди рд░рдЦреЗрдВ)ред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╡рд╣ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ {,15} рдХреЛ рдирд╣реАрдВ рд╕рдордЭрддрд╛ рд╣реИ, рдЙрд╕реЗ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ {0,15} рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рджреВрд╕рд░реЗ, рдпрд╣ -P рдлреНрд▓реИрдЧ (рдкрд░реНрд▓ рд╕реНрдЯрд╛рдЗрд▓) рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд (-E) рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдкрд░ рдЪреБрдкрдЪрд╛рдк рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЛ рдкрдЪрд╛рддрд╛ рд╣реИред

рд╣рдорд╛рд░реЗ рдЖрд╢реНрд░рд┐рддреЛрдВ рдореЗрдВ, рдХреЗрд╡рд▓ рдХрд░реНрд▓ рд░рд╣рддрд╛ рд╣реИ (рдмрд┐рдЬреАрдмреЙрдХреНрд╕ рд╕реЗ рдЫреВрдЯ рдХреЗ рд╕рд╛рде рдЗрд╕реЗ рдмрджрд▓рдиреЗ рдХрд╛ рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИ) рдФрд░ рд▓рд┐рдмрдХреНрд░реЗрдкреНрдЯреЛ (рдпрд╣ рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ, рдЗрд╕ рд╡рд┐рдзрд╛рдирд╕рднрд╛ рдореЗрдВ рд╕реАрдзреЗ рдЦреБрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ)ред

рдПрдХ рдЦреВрдмрд╕реВрд░рдд рдорд▓реНрдЯреА-рд╕реНрдЯреЗрдЬ рдмрд┐рд▓реНрдб рдбреЙрдХрд░ рдореЗрдВ рдХреБрдЫ рд╕рд╛рд▓ рдкрд╣рд▓реЗ рджрд┐рдЦрд╛рдИ рджрд┐рдпрд╛ рдерд╛, рдпрд╣ рдЖрджрд░реНрд╢ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЧреЛ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдпрд╛ рдЙрди рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЬрд╣рд╛рдВ рд╡рд┐рдзрд╛рдирд╕рднрд╛ рдЬрдЯрд┐рд▓ рд╣реИ рдФрд░ рдЕрдВрддрд┐рдо рд╕рдлрд╛рдИ рдХрд░рдиреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЫрд╡рд┐ рд╕реЗ рдХрд▓рд╛рдХреГрддрд┐рдпреЛрдВ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИред рд╣рдо рдЗрд╕рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдЕрдкрдиреЗ рдмреЛрдиреНрд╕рд╛рдИ рдХреЛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░реЗрдВрдЧреЗ, рдЗрд╕рд╕реЗ рдереЛрдбрд╝реА рдмрдЪрдд рд╣реЛрдЧреАред

 FROM alpine:3.6 #         ( ) RUN apk add --no-cache --virtual .build-deps \ # ... ,    && make -j$(getconf _NPROCESSORS_ONLN) FROM alpine:3.6 #   ,  ,   WORKDIR /mtproxy COPY --from=0 /mtproxy/sources/objs/bin/mtproto-proxy . #          #          

рдмреЛрдиреНрд╕рд╛рдИ рдХреЛ рдмреЛрдиреНрд╕рд╛рдИ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП - рд▓рд┐рдмрд╛рд╕рд┐рдкреНрдЯреЛ рдЗрдВрд╕реНрдЯреЙрд▓реЗрд╢рди рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдПрдВред рдирд┐рд░реНрдорд╛рдг рдХрд░рддреЗ рд╕рдордп, рд╣рдореЗрдВ рдУрдкрдирд╕реНрд▓реЗ-рджреЗрд╡ рдкреИрдХреЗрдЬ рд╕реЗ рд╣реЗрдбрд░ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереА, рдЬреЛ рдХрд┐ рдирд┐рд░реНрднрд░рддрд╛ рдореЗрдВ libcrypto рдЦреАрдВрдЪреЗрдЧрд╛ рдФрд░ рд╣рдорд╛рд░реА рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп libcrypto.so.1.0.0 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдУрд░ рдЙрдиреНрдореБрдЦ рд╣реЛрдЧрд╛ред рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХрдорд╛рддреНрд░ рдирд┐рд░реНрднрд░рддрд╛ рд╣реИ, рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ рдЕрд▓реНрдкрд╛рдЗрди рдореЗрдВ рдкреВрд░реНрд╡рд╕реНрдерд╛рдкрд┐рдд рд╣реИ (рд╕рдВрд╕реНрдХрд░рдг 3.6 рдореЗрдВ рдпрд╣ libcrypto.so.41, 3.7 - libcrypto.so.42 рд╣реИ, рдпрд╣ / lib / рдореЗрдВ рд╣реИ)ред рд╡реЗ рдореБрдЭреЗ рдЕрдм рдбрд╛рдВрдЯрддреЗ рд╣реИрдВ, рдпрд╣ рд╕рдмрд╕реЗ рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдЗрд╕рдХреЗ рд▓рд╛рдпрдХ рд╣реИ рдФрд░ рд╣рдо рдЕрднреА рднреА рдореМрдЬреВрджрд╛ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд╣рд┐рд╖реНрдгреБрддрд╛ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ (рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдмреЗрд╣рддрд░ рддрд░реАрдХрд╛ рд╣реИ, рддреЛ рдореИрдВ рд╕рд╣рд░реНрд╖ рдкреАрдЖрд░ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реВрдВ)ред

рдЕрдВрддрд┐рдо рд╕реНрдкрд░реНрд╢ рдФрд░ рдкрд░рд┐рдгрд╛рдо:

рдбреЙрдХрдЯрд░ рд╣рдм
GitHub

рдореИрдВ рдХрд┐рд╕реА рднреА рд╕рд▓рд╛рд╣ рдФрд░ рдпреЛрдЧрджрд╛рди рдХреЗ рд▓рд┐рдП рдЖрднрд╛рд░реА рд░рд╣реВрдВрдЧрд╛ред

Source: https://habr.com/ru/post/hi413881/


All Articles