Compare commits

...

6 Commits

Author SHA1 Message Date
Flowseal 50d539c718 update release footer 2026-10-31 11:47:17 +03:00
partoftheworlD 694077ef7d Improved Dockerfile entrypoint readability (#1503) 2026-10-31 10:24:43 +03:00
Flowseal 87a9320e61 answers update 2026-10-31 09:43:09 +03:00
Flowseal 86191badf4 Log format unification 2026-10-31 09:37:41 +03:00
hir-lol 19cdbd9d6f Анализ логов в Issues (#1436) 2026-10-31 09:34:49 +03:00
Flowseal dc2c4c03f6 Restore win7 compatability 2026-10-30 20:38:49 +03:00
15 changed files with 188 additions and 33 deletions
+23
View File
@@ -0,0 +1,23 @@
### Проверьте две вещи:
- вы на последней версии: [Releases](https://github.com/Flowseal/tg-ws-proxy/releases)
- запускали по инструкции для своей ОС: [Быстрый старт](https://github.com/Flowseal/tg-ws-proxy#навигация)
## Решение частых проблем:
**Q**: Не запускается, падает с ошибкой, не работает как раньше после обновления?
**A**:
1. Удалите всё в папке Temp (или хотя бы всё, что начинается с _MEI)
2. Запускайте от имени админа
3. Попробуйте Win7 версию (если вы пользователь Windows)
4. Попробуйте отключить антивирус (если помогло, то добавьте exe в исключения). Не забудьте включить антивирус обратно.
###
**Q**: Не грузит медиа? (фото/видео/стикеры)
**A**: Удалите в настройках прокси в поле **DC → IP** всё, кроме `4:149.154.167.220`. Если это не помогло, полностью очистите это поле.
#### Если проблема решена, то закройте Issue
### Если проблема осталась, пожалуйста, приложите по возможности логи.
Сделать это можно через иконку в трее -> Пкм -> Открыть логи. Сохраните логи в файл и приложите его сюда.
+10
View File
@@ -0,0 +1,10 @@
## У вас не включен CF-прокси, включите его в настройках.
Если в логах будет **TimeoutError**, то:
Timeout error при CF-прокси - проблема с вашей стороны. РКН/сторонние впны/прокси и т.п.
1. Попробуйте поставить галочку "Выключить TLS для CF-прокси и CF-worker" в настройках. Если не поможет, уберите.
2. Если используете запрет, попробуйте его выключить и проверьте работу. Если работает, то добавьте в файл `list-exclude-user`: **`co.uk`**
3. Если не помогло, то уберите запись из прошлого пункта и добавьте в файл `list-general-user`: **`co.uk`**
4. Попробуйте настроить https://github.com/Flowseal/tg-ws-proxy/blob/main/docs/RU/CfWorker.md
+4
View File
@@ -0,0 +1,4 @@
Проверьте включенли WARP/VPN, если выключены то:
1. Если используете запрет, добавьте в файл `list-general-user`: **`co.uk`**
2. Попробуйте настроить https://github.com/Flowseal/tg-ws-proxy/blob/main/docs/RU/CfWorker.md
+5
View File
@@ -0,0 +1,5 @@
Timeout error при CF-прокси - проблема с вашей стороны. РКН/сторонние впны/прокси и т.п.
1. Попробуйте поставить галочку "Выключить TLS для CF-прокси и CF-worker" в настройках. Если не поможет, уберите.
2. Если используете запрет, попробуйте его выключить и проверьте работу. Если работает, то добавьте в файл `list-exclude-user`: **`co.uk`**
3. Если не помогло, то уберите запись из прошлого пункта и добавьте в файл `list-general-user`: **`co.uk`**
@@ -0,0 +1,6 @@
Timeout error при CF-прокси - проблема с вашей стороны. РКН/сторонние впны/прокси и т.п.
1. Попробуйте поставить галочку "Выключить TLS для CF-прокси и CF-worker" в настройках. Если не поможет, уберите.
2. Если используете запрет, попробуйте его выключить и проверьте работу. Если работает, то добавьте в файл `list-exclude-user`: **`co.uk`**
3. Если не помогло, то уберите запись из прошлого пункта и добавьте в файл `list-general-user`: **`co.uk`**
4. Попробуйте настроить https://github.com/Flowseal/tg-ws-proxy/blob/main/docs/RU/CfWorker.md
+3
View File
@@ -0,0 +1,3 @@
Указан **неверный секрет** в настройках прокси в телеграме
`Лкм` по иконке в трее -> **Открыть в Telegram**
+65
View File
@@ -0,0 +1,65 @@
import os
from time import sleep
import urllib.request as request
url = os.environ["LOG_URL"]
path_answer = ".github/scripts/answers"
for _ in range(0,3):
try:
with request.urlopen(url,timeout=30.0) as r:
log_bytes = r.read()
break
except Exception:
sleep(5.0)
else:
print(str(path_answer + "/default.md"))
exit()
log_old = log_bytes.decode("utf-8",errors="replace").splitlines()
worker_end = False
cfproxy_end = False
log = []
for line in reversed(log_old):
line = line[20:]
log.append(line)
if "CF proxy: enabled" in line:
cfproxy_end = True
elif "CF worker: enabled" in line:
worker_end = True
elif "INFO tg-ws-tray Starting proxy" in line:
break
secret_false = 0
timeouterror = 0
reset_error = 0
for line in log :
if "(wrong secret or proto)" in line:
secret_false += 1
if secret_false >= 10:
print(str(path_answer + "/wrong_secret.md"))
break
elif "TimeoutError" in line:
timeouterror += 1
if timeouterror >= 20:
if cfproxy_end is False:
print(str(path_answer + "/no_cfproxy.md"))
break
if worker_end is False:
print(str(path_answer + "/timeout_no_worker.md"))
else:
print(str(path_answer + "/timeout.md"))
break
elif "ConnectionResetError" in line:
reset_error += 1
if reset_error >= 20:
print(str(path_answer + "/reset_error.md"))
break
else:
if cfproxy_end is True:
print(str(path_answer + "/default.md"))
else:
print(str(path_answer + "/no_cfproxy.md"))
+1 -1
View File
@@ -664,7 +664,7 @@ jobs:
> [!TIP] > [!TIP]
> Не можете скачать? > Не можете скачать?
> Добавьте `185.199.109.133 release-assets.githubusercontent.com` в hosts или воспользуйтесь зеркалом: https://sourceforge.net/projects/tg-ws-proxy.mirror/files/ > Воспользуйтесь зеркалом: https://sourceforge.net/projects/tg-ws-proxy.mirror/files/
files: | files: |
dist/TgWsProxy_windows.exe dist/TgWsProxy_windows.exe
dist/TgWsProxy_windows_arm64.exe dist/TgWsProxy_windows_arm64.exe
+41 -24
View File
@@ -6,37 +6,54 @@ on:
permissions: permissions:
issues: write issues: write
contents: read
jobs: jobs:
comment: comment:
if: contains(github.event.issue.labels.*.name, 'bug') if: contains(github.event.issue.labels.*.name, 'bug')
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- name: Check for availability log file
id: log
env:
ISSUE_BODY: ${{ github.event.issue.body }}
run: |
if [[ "$ISSUE_BODY" =~ (https://github\.com/user-attachments/files/[^[:space:]]+\.log) ]]; then
echo "found=true" >> "$GITHUB_OUTPUT"
echo "url=${BASH_REMATCH[1]}" >> "$GITHUB_OUTPUT"
echo "Log file found"
else
echo "found=false" >> "$GITHUB_OUTPUT"
echo "Log file not found"
fi
- name: Install python
if: steps.log.outputs.found == 'true'
uses: actions/setup-python@v6
with:
python-version: "3.14"
- name: Clone folder
uses: actions/checkout@v4
with:
sparse-checkout: |
.github/scripts/*
sparse-checkout-cone-mode: false
- name: Start check log
if: steps.log.outputs.found == 'true'
id: comment
env:
LOG_URL: ${{ steps.log.outputs.url }}
run: |
{
echo "com<<EOF"
python .github/scripts/check_log.py
echo "EOF"
} >> "$GITHUB_OUTPUT"
- name: Comment on new issue - name: Comment on new issue
uses: peter-evans/create-or-update-comment@v5 uses: peter-evans/create-or-update-comment@v5
with: with:
issue-number: ${{ github.event.issue.number }} issue-number: ${{ github.event.issue.number }}
body: | body-path: ${{ steps.log.outputs.found == 'true' && steps.comment.outputs.com || '.github/scripts/answers/default.md' }}
### Проверьте две вещи:
- вы на последней версии: [Releases](https://github.com/Flowseal/tg-ws-proxy/releases)
- запускали по инструкции для своей ОС: [Быстрый старт](https://github.com/Flowseal/tg-ws-proxy#навигация)
## Решение частых проблем:
**Q**: Не запускается, падает с ошибкой, не работает как раньше после обновления?
**A**:
1. Удалите всё в папке Temp (или хотя бы всё, что начинается с _MEI)
2. Запускайте от имени админа
3. Попробуйте Win7 версию (если вы пользователь Windows)
4. Попробуйте отключить антивирус (если помогло, то добавьте exe в исключения). Не забудьте включить антивирус обратно.
###
**Q**: Не грузит медиа? (фото/видео/стикеры)
**A**: Удалите в настройках прокси в поле **DC → IP** всё, кроме `4:149.154.167.220`. Если это не помогло, полностью очистите это поле.
#### Если проблема решена, то закройте Issue
### Если проблема осталась, пожалуйста, приложите по возможности логи.
Сделать это можно через иконку в трее -> Пкм -> Открыть логи. Сохраните логи в файл и приложите его сюда.
+13 -1
View File
@@ -45,5 +45,17 @@ USER app
EXPOSE 1443/tcp EXPOSE 1443/tcp
ENTRYPOINT ["/usr/bin/tini", "--", "/bin/sh", "-lc", "set -eu; args=\"--host ${TG_WS_PROXY_HOST} --port ${TG_WS_PROXY_PORT}\"; for dc in ${TG_WS_PROXY_DC_IPS}; do args=\"$args --dc-ip $dc\"; done; if [ -n \"${TG_WS_PROXY_SECRET}\" ]; then args=\"$args --secret ${TG_WS_PROXY_SECRET}\"; fi; if [ -n \"${TG_WS_PROXY_CF_WORKER}\" ]; then args=\"$args --cfproxy-worker-domain ${TG_WS_PROXY_CF_WORKER}\"; fi; if [ \"${TG_WS_PROXY_NO_SECURE}\" = \"True\" ]; then args=\"$args --no-secure \"; fi; exec /opt/venv/bin/python -u proxy/tg_ws_proxy.py $args \"$@\"", "--"] ENTRYPOINT ["/usr/bin/tini", "--", "/bin/sh", "-lc", "set -eu; args=\"\
--host ${TG_WS_PROXY_HOST} \
--port ${TG_WS_PROXY_PORT}\"; \
for dc in ${TG_WS_PROXY_DC_IPS}; \
do args=\"$args --dc-ip $dc\"; \
done; \
if [ -n \"${TG_WS_PROXY_SECRET}\" ]; \
then args=\"$args --secret ${TG_WS_PROXY_SECRET}\"; fi; \
if [ -n \"${TG_WS_PROXY_CF_WORKER}\" ]; \
then args=\"$args --cfproxy-worker-domain ${TG_WS_PROXY_CF_WORKER}\"; fi; \
if [ \"${TG_WS_PROXY_NO_SECURE}\" = \"True\" ]; \
then args=\"$args --no-secure \"; fi; \
exec /opt/venv/bin/python -u proxy/tg_ws_proxy.py $args \"$@\"", "--"]
CMD [] CMD []
+2 -1
View File
@@ -12,6 +12,7 @@ import logging
from typing import Dict, FrozenSet, NamedTuple, Optional, Tuple from typing import Dict, FrozenSet, NamedTuple, Optional, Tuple
from .stats import stats from .stats import stats
from .utils import set_x25519
try: try:
from cryptography.hazmat.primitives.asymmetric.x25519 import X25519PrivateKey from cryptography.hazmat.primitives.asymmetric.x25519 import X25519PrivateKey
@@ -272,7 +273,7 @@ async def probe_appdata_len(domain: str, port: int = 443,
writer = None writer = None
try: try:
ctx = ssl.create_default_context() ctx = ssl.create_default_context()
ctx.set_ecdh_curve('X25519') set_x25519(ctx)
ctx.check_hostname = False ctx.check_hostname = False
ctx.verify_mode = ssl.CERT_NONE ctx.verify_mode = ssl.CERT_NONE
ctx.minimum_version = ssl.TLSVersion.TLSv1_3 ctx.minimum_version = ssl.TLSVersion.TLSv1_3
-1
View File
@@ -695,7 +695,6 @@ def main():
log_max_mb=args.log_max_mb, log_max_mb=args.log_max_mb,
backups=args.log_backups, backups=args.log_backups,
) )
fh.setFormatter(log_fmt)
fh.addFilter(DomainCensorFilter()) fh.addFilter(DomainCensorFilter())
root.addHandler(fh) root.addHandler(fh)
+8 -1
View File
@@ -143,13 +143,20 @@ class _PinnedHTTPSHandler(urllib.request.HTTPSHandler):
return super().https_open(req) return super().https_open(req)
def set_x25519(context: ssl.SSLContext) -> None:
try:
context.set_ecdh_curve('X25519')
except Exception:
pass
def create_ssl_context(*, check_hostname: bool = True) -> ssl.SSLContext: def create_ssl_context(*, check_hostname: bool = True) -> ssl.SSLContext:
bundle_dir = getattr(sys, '_MEIPASS', None) bundle_dir = getattr(sys, '_MEIPASS', None)
cafile = (os.path.join(bundle_dir, 'certifi', 'cacert.pem') cafile = (os.path.join(bundle_dir, 'certifi', 'cacert.pem')
if bundle_dir else certifi.where()) if bundle_dir else certifi.where())
context = ssl.create_default_context(cafile=cafile) context = ssl.create_default_context(cafile=cafile)
context.load_default_certs() context.load_default_certs()
context.set_ecdh_curve('X25519') set_x25519(context)
context.check_hostname = check_hostname context.check_hostname = check_hostname
return context return context
+7 -2
View File
@@ -1,4 +1,4 @@
"""Shared construction of the rotating log file handler. """Shared construction and formatting of the rotating log file handler.
Centralizes the rotation invariant so both the tray and the CLI log paths Centralizes the rotation invariant so both the tray and the CLI log paths
behave identically and the file can never grow without bound (issue #885). behave identically and the file can never grow without bound (issue #885).
@@ -31,9 +31,14 @@ def build_log_handler(
""" """
max_bytes = max(_MIN_BYTES, int(log_max_mb * 1024 * 1024)) max_bytes = max(_MIN_BYTES, int(log_max_mb * 1024 * 1024))
backup_count = max(_MIN_BACKUPS, int(backups)) backup_count = max(_MIN_BACKUPS, int(backups))
return logging.handlers.RotatingFileHandler( handler = logging.handlers.RotatingFileHandler(
path, path,
maxBytes=max_bytes, maxBytes=max_bytes,
backupCount=backup_count, backupCount=backup_count,
encoding="utf-8", encoding="utf-8",
) )
handler.setFormatter(logging.Formatter(
"%(asctime)s %(levelname)-5s %(name)s %(message)s",
datefmt="%Y-%m-%d %H:%M:%S",
))
return handler
-2
View File
@@ -225,7 +225,6 @@ def save_config(cfg: dict) -> None:
# logging # logging
_LOG_FMT_FILE = "%(asctime)s %(levelname)-5s %(name)s %(message)s"
_LOG_FMT_CONSOLE = "%(asctime)s %(levelname)-5s %(message)s" _LOG_FMT_CONSOLE = "%(asctime)s %(levelname)-5s %(message)s"
@@ -238,7 +237,6 @@ def setup_logging(verbose: bool = False, log_max_mb: float = 5) -> None:
fh = build_log_handler(str(LOG_FILE), log_max_mb=log_max_mb, backups=1) fh = build_log_handler(str(LOG_FILE), log_max_mb=log_max_mb, backups=1)
fh.setLevel(logging.DEBUG) fh.setLevel(logging.DEBUG)
fh.setFormatter(logging.Formatter(_LOG_FMT_FILE, datefmt="%Y-%m-%d %H:%M:%S"))
fh.addFilter(DomainCensorFilter()) fh.addFilter(DomainCensorFilter())
root.addHandler(fh) root.addHandler(fh)