12 Commits

Author SHA1 Message Date
Alexander Bersenev
446682521b use newer Ubuntu and Python in Dockerfile 2022-05-09 00:05:24 +05:00
Alexander Bersenev
b26873176a compat with python3.10 2022-05-09 00:00:14 +05:00
Alexander Bersenev
6e8e8b63b2 add check if returned ipv6 address is correct 2021-03-02 17:04:54 +05:00
AlisonTNT
3b4f239cc1 Add Pysocks in Dockerfile (#239)
It's necessary if using upstream SOCKS5 proxy.
2020-09-29 18:29:49 +05:00
Erfan
0283d6264a set the home domain instead of IP (#231)
* set the home domain

set the home domain for the proxy, has an influence only on the log message

* fixed a bug
2020-08-09 13:51:43 +05:00
Erfan
15a8f607ca added ability to load time from local time set on original server (#230)
using this command the local time setting will be pushed to docker as a read-only file so you can use your local time
2020-06-20 15:59:25 +05:00
Alexander Bersenev
6076db9f8c add certificates to Dockerfile 2020-06-17 15:45:47 +05:00
Alexander Bersenev
6560a6c1d2 use new ubuntu 20.04 as base image 2020-04-28 16:20:33 +05:00
Peter Dave Hello
24479e68ab Add --no-install-recommends to apt-get in Dockerfile (#221)
Prevent to install unnecessary recommended packages, make it lighter.
2020-04-28 15:25:38 +05:00
Peter Dave Hello
6ecf0ec9ac Refactor Dockerfile with less layer and improved layer cache (#220) 2020-04-27 17:22:57 +05:00
Allineer
18a80e52cd metrics: broken pipe fix (#210)
I think, this fixes my issue #208.
2020-03-29 22:18:33 +05:00
Alexander Bersenev
ea3b8a44c3 restrict the logs size with 100MB 2020-03-17 03:11:13 +05:00
3 changed files with 34 additions and 18 deletions

View File

@@ -1,16 +1,14 @@
FROM python:3.8-slim-buster FROM ubuntu:22.04
RUN apt-get update && apt-get install -y libcap2-bin && rm -rf /var/lib/apt/lists/* RUN apt-get update && apt-get install --no-install-recommends -y python3 python3-uvloop python3-cryptography python3-socks libcap2-bin ca-certificates && rm -rf /var/lib/apt/lists/*
RUN setcap cap_net_bind_service=+ep /usr/local/bin/python3.8 RUN setcap cap_net_bind_service=+ep /usr/bin/python3.10
RUN pip3 --no-cache-dir install cryptography uvloop
COPY mtprotoproxy.py config.py /home/tgproxy/
RUN useradd tgproxy -u 10000 RUN useradd tgproxy -u 10000
RUN chown -R tgproxy:tgproxy /home/tgproxy
USER tgproxy USER tgproxy
WORKDIR /home/tgproxy/ WORKDIR /home/tgproxy/
COPY --chown=tgproxy mtprotoproxy.py config.py /home/tgproxy/
CMD ["python3", "mtprotoproxy.py"] CMD ["python3", "mtprotoproxy.py"]

View File

@@ -7,4 +7,10 @@ services:
volumes: volumes:
- ./config.py:/home/tgproxy/config.py - ./config.py:/home/tgproxy/config.py
- ./mtprotoproxy.py:/home/tgproxy/mtprotoproxy.py - ./mtprotoproxy.py:/home/tgproxy/mtprotoproxy.py
- /etc/localtime:/etc/localtime:ro
logging:
driver: "json-file"
options:
max-file: "10"
max-size: "10m"
# mem_limit: 1024m # mem_limit: 1024m

View File

@@ -196,6 +196,9 @@ def init_config():
# the next host to forward bad clients # the next host to forward bad clients
conf_dict.setdefault("MASK_HOST", conf_dict["TLS_DOMAIN"]) conf_dict.setdefault("MASK_HOST", conf_dict["TLS_DOMAIN"])
# set the home domain for the proxy, has an influence only on the log message
conf_dict.setdefault("MY_DOMAIN", False)
# the next host's port to forward bad clients # the next host's port to forward bad clients
conf_dict.setdefault("MASK_PORT", 443) conf_dict.setdefault("MASK_PORT", 443)
@@ -1722,6 +1725,7 @@ def make_metrics_pkt(metrics):
pkt_header_list = [] pkt_header_list = []
pkt_header_list.append("HTTP/1.1 200 OK") pkt_header_list.append("HTTP/1.1 200 OK")
pkt_header_list.append("Connection: close")
pkt_header_list.append("Content-Length: %d" % len(pkt_body)) pkt_header_list.append("Content-Length: %d" % len(pkt_body))
pkt_header_list.append("Content-Type: text/plain; version=0.0.4; charset=utf-8") pkt_header_list.append("Content-Type: text/plain; version=0.0.4; charset=utf-8")
pkt_header_list.append("Date: %s" % time.strftime("%a, %d %b %Y %H:%M:%S GMT", time.gmtime())) pkt_header_list.append("Date: %s" % time.strftime("%a, %d %b %Y %H:%M:%S GMT", time.gmtime()))
@@ -2082,6 +2086,10 @@ def init_ip_info():
my_ip_info["ipv4"] = get_ip_from_url(IPV4_URL1) or get_ip_from_url(IPV4_URL2) my_ip_info["ipv4"] = get_ip_from_url(IPV4_URL1) or get_ip_from_url(IPV4_URL2)
my_ip_info["ipv6"] = get_ip_from_url(IPV6_URL1) or get_ip_from_url(IPV6_URL2) my_ip_info["ipv6"] = get_ip_from_url(IPV6_URL1) or get_ip_from_url(IPV6_URL2)
# the server can return ipv4 address instead of ipv6
if my_ip_info["ipv6"] and ":" not in my_ip_info["ipv6"]:
my_ip_info["ipv6"] = None
if my_ip_info["ipv6"] and (config.PREFER_IPV6 or not my_ip_info["ipv4"]): if my_ip_info["ipv6"] and (config.PREFER_IPV6 or not my_ip_info["ipv4"]):
print_err("IPv6 found, using it for external communication") print_err("IPv6 found, using it for external communication")
@@ -2103,9 +2111,12 @@ def print_tg_info():
print("Since you have TLS only mode enabled the best port is 443", flush=True) print("Since you have TLS only mode enabled the best port is 443", flush=True)
print_default_warning = True print_default_warning = True
ip_addrs = [ip for ip in my_ip_info.values() if ip] if not config.MY_DOMAIN:
if not ip_addrs: ip_addrs = [ip for ip in my_ip_info.values() if ip]
ip_addrs = ["YOUR_IP"] if not ip_addrs:
ip_addrs = ["YOUR_IP"]
else:
ip_addrs = [config.MY_DOMAIN]
proxy_links = [] proxy_links = []
@@ -2276,21 +2287,21 @@ def create_servers(loop):
def create_utilitary_tasks(loop): def create_utilitary_tasks(loop):
tasks = [] tasks = []
stats_printer_task = asyncio.Task(stats_printer()) stats_printer_task = asyncio.Task(stats_printer(), loop=loop)
tasks.append(stats_printer_task) tasks.append(stats_printer_task)
if config.USE_MIDDLE_PROXY: if config.USE_MIDDLE_PROXY:
middle_proxy_updater_task = asyncio.Task(update_middle_proxy_info()) middle_proxy_updater_task = asyncio.Task(update_middle_proxy_info(), loop=loop)
tasks.append(middle_proxy_updater_task) tasks.append(middle_proxy_updater_task)
if config.GET_TIME_PERIOD: if config.GET_TIME_PERIOD:
time_get_task = asyncio.Task(get_srv_time()) time_get_task = asyncio.Task(get_srv_time(), loop=loop)
tasks.append(time_get_task) tasks.append(time_get_task)
get_cert_len_task = asyncio.Task(get_mask_host_cert_len()) get_cert_len_task = asyncio.Task(get_mask_host_cert_len(), loop=loop)
tasks.append(get_cert_len_task) tasks.append(get_cert_len_task)
clear_resolving_cache_task = asyncio.Task(clear_ip_resolving_cache()) clear_resolving_cache_task = asyncio.Task(clear_ip_resolving_cache(), loop=loop)
tasks.append(clear_resolving_cache_task) tasks.append(clear_resolving_cache_task)
return tasks return tasks
@@ -2312,9 +2323,10 @@ def main():
if sys.platform == "win32": if sys.platform == "win32":
loop = asyncio.ProactorEventLoop() loop = asyncio.ProactorEventLoop()
asyncio.set_event_loop(loop) else:
loop = asyncio.new_event_loop()
loop = asyncio.get_event_loop() asyncio.set_event_loop(loop)
loop.set_exception_handler(loop_exception_handler) loop.set_exception_handler(loop_exception_handler)
utilitary_tasks = create_utilitary_tasks(loop) utilitary_tasks = create_utilitary_tasks(loop)