auto-sync: 2026-04-18 18:00:01
This commit is contained in:
@@ -136,3 +136,6 @@
|
||||
{"op": "delete", "id": "proj_home_assistant", "timestamp": "2026-04-18T14:44:22.703342+00:00"}
|
||||
{"op": "create", "entity": {"id": "proj_ha_availability_dashboard", "type": "Project", "properties": {"name": "HA Availability Dashboard", "status": "active", "description": "Дашборд доступности устройств в Home Assistant", "folder": "tasks/ha-availability-dashboard/", "doc_path": "tasks/ha-availability-dashboard/PROJECT.md"}, "created": "2026-04-18T14:46:16.652373+00:00"}, "timestamp": "2026-04-18T14:46:16.652373+00:00"}
|
||||
{"op": "create", "entity": {"id": "task_ha_availability_dashboard_setup", "type": "Task", "properties": {"title": "Привести HA Availability Dashboard к стандарту проекта", "status": "active", "project": "proj_ha_availability_dashboard", "folder": "tasks/ha-availability-dashboard/TASKS/active/setup/", "doc_path": "tasks/ha-availability-dashboard/TASKS/active/setup/TASK.md"}, "created": "2026-04-18T14:46:16.652373+00:00"}, "timestamp": "2026-04-18T14:46:16.652373+00:00"}
|
||||
{"op": "delete", "id": "proj_mtproxy", "timestamp": "2026-04-18T14:51:47.300166+00:00"}
|
||||
{"op": "delete", "id": "task_mtproxy_setup", "timestamp": "2026-04-18T14:51:47.300166+00:00"}
|
||||
{"op": "delete", "id": "proj_ruvpn_xray", "timestamp": "2026-04-18T14:57:49.775527+00:00"}
|
||||
|
||||
@@ -1,96 +0,0 @@
|
||||
{
|
||||
"log": {
|
||||
"loglevel": "warning"
|
||||
},
|
||||
"inbounds": [
|
||||
{
|
||||
"tag": "socks-in",
|
||||
"protocol": "socks",
|
||||
"listen": "127.0.0.1",
|
||||
"port": 10808,
|
||||
"settings": {
|
||||
"auth": "noauth",
|
||||
"udp": true
|
||||
}
|
||||
},
|
||||
{
|
||||
"tag": "http-in",
|
||||
"protocol": "http",
|
||||
"listen": "127.0.0.1",
|
||||
"port": 10809,
|
||||
"settings": {}
|
||||
}
|
||||
],
|
||||
"outbounds": [
|
||||
{
|
||||
"tag": "proxy",
|
||||
"protocol": "vless",
|
||||
"settings": {
|
||||
"vnext": [
|
||||
{
|
||||
"address": "185.130.212.192",
|
||||
"port": 443,
|
||||
"users": [
|
||||
{
|
||||
"id": "d3a2fae8-d703-4b2f-8d94-afb016d57640",
|
||||
"encryption": "none",
|
||||
"flow": "xtls-rprx-vision"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
"streamSettings": {
|
||||
"network": "tcp",
|
||||
"security": "reality",
|
||||
"realitySettings": {
|
||||
"serverName": "www.microsoft.com",
|
||||
"fingerprint": "chrome",
|
||||
"publicKey": "3jY3vI6MUTEn3X20u7xDjpxrF2wO6zUxiXgP-Aie7yQ",
|
||||
"shortId": "a1b2c3d4",
|
||||
"spiderX": ""
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"tag": "direct",
|
||||
"protocol": "freedom",
|
||||
"settings": {}
|
||||
},
|
||||
{
|
||||
"tag": "block",
|
||||
"protocol": "blackhole",
|
||||
"settings": {}
|
||||
}
|
||||
],
|
||||
"routing": {
|
||||
"domainStrategy": "IPIfNonMatch",
|
||||
"rules": [
|
||||
{
|
||||
"type": "field",
|
||||
"outboundTag": "proxy",
|
||||
"domain": [
|
||||
"telegram.org",
|
||||
"t.me",
|
||||
"core.telegram.org"
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "field",
|
||||
"outboundTag": "proxy",
|
||||
"ip": [
|
||||
"149.154.160.0/20",
|
||||
"91.108.4.0/22",
|
||||
"91.108.8.0/22",
|
||||
"91.108.56.0/22",
|
||||
"95.161.64.0/20"
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "field",
|
||||
"outboundTag": "direct",
|
||||
"network": "tcp,udp"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -1,15 +0,0 @@
|
||||
#!/bin/bash
|
||||
|
||||
echo "Останавливаю контейнер mtproto-proxy..."
|
||||
sudo docker stop mtproto-proxy || true
|
||||
|
||||
echo "Удаляю контейнер mtproto-proxy..."
|
||||
sudo docker rm mtproto-proxy || true
|
||||
|
||||
echo "Удаляю образ nineseconds/mtg:2..."
|
||||
sudo docker rmi nineseconds/mtg:2 || true
|
||||
|
||||
echo "Удаляю конфиг mtg.toml..."
|
||||
[ -f mtg.toml ] && rm mtg.toml || true
|
||||
|
||||
echo "MTProxy удалён."
|
||||
@@ -1,67 +0,0 @@
|
||||
#!/bin/bash
|
||||
set -e
|
||||
|
||||
# ============================================================
|
||||
# MTProxy (Fake TLS) setup script for Telegram
|
||||
# Uses: nineseconds/mtg:2 Docker image
|
||||
# Port: 9443 (proxy), 8889 (stats)
|
||||
# ============================================================
|
||||
|
||||
echo "==> [1/6] Проверка и установка Docker..."
|
||||
if ! command -v docker &>/dev/null; then
|
||||
echo " Docker не найден. Устанавливаем..."
|
||||
curl -fsSL https://get.docker.com | sudo sh
|
||||
sudo systemctl enable --now docker
|
||||
echo " Docker установлен и запущен."
|
||||
else
|
||||
echo " Docker уже установлен: $(docker --version)"
|
||||
fi
|
||||
|
||||
echo ""
|
||||
echo "==> [2/6] Генерация секрета (Fake TLS, домен: www.google.com)..."
|
||||
SECRET=$(sudo docker run --rm nineseconds/mtg:2 generate-secret --hex www.google.com)
|
||||
echo " Секрет сгенерирован: $SECRET"
|
||||
|
||||
echo ""
|
||||
echo "==> [3/6] Создание конфига mtg.toml..."
|
||||
printf 'secret = "%s"\nbind-to = "0.0.0.0:3128"\nfake_tls_domain_check = false\n' "$SECRET" > mtg.toml
|
||||
echo " Файл mtg.toml создан:"
|
||||
cat mtg.toml
|
||||
|
||||
echo ""
|
||||
echo "==> [4/6] Остановка и удаление старого контейнера (если есть)..."
|
||||
sudo docker stop mtproto-proxy 2>/dev/null || true
|
||||
sudo docker rm mtproto-proxy 2>/dev/null || true
|
||||
echo " Готово (или контейнера не было — это нормально)."
|
||||
|
||||
echo ""
|
||||
echo "==> [5/6] Запуск нового контейнера mtproto-proxy..."
|
||||
sudo docker run -d \
|
||||
--name=mtproto-proxy \
|
||||
--restart=always \
|
||||
-p 9443:3128 \
|
||||
-p 8889:3129 \
|
||||
-v "$(pwd)/mtg.toml:/config.toml:ro" \
|
||||
nineseconds/mtg:2
|
||||
echo " Контейнер запущен."
|
||||
|
||||
echo ""
|
||||
echo "==> [6/6] Формирование ссылки для подключения..."
|
||||
SERVER_IP=$(curl -fsSL https://ifconfig.me 2>/dev/null || hostname -I | awk '{print $1}')
|
||||
SECRET_B64=$(echo -n "$SECRET" | xxd -r -p | base64 | tr '+/' '-_' | tr -d '=')
|
||||
TG_LINK="tg://proxy?server=${SERVER_IP}&port=9443&secret=${SECRET_B64}"
|
||||
|
||||
echo ""
|
||||
echo "============================================================"
|
||||
echo " MTProxy успешно развёрнут!"
|
||||
echo "------------------------------------------------------------"
|
||||
echo " Сервер : $SERVER_IP"
|
||||
echo " Порт : 9443"
|
||||
echo " Секрет : $SECRET"
|
||||
echo ""
|
||||
echo " Ссылка для Telegram:"
|
||||
echo " $TG_LINK"
|
||||
echo ""
|
||||
echo " Также можно открыть в браузере (заменит tg:// на https://):"
|
||||
echo " https://t.me/proxy?server=${SERVER_IP}&port=9443&secret=${SECRET_B64}"
|
||||
echo "============================================================"
|
||||
@@ -1,133 +0,0 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
Настройка VLESS Reality inbound на ruvpn (185.130.212.192) через 3x-ui API
|
||||
"""
|
||||
import requests
|
||||
import json
|
||||
import urllib3
|
||||
|
||||
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
|
||||
|
||||
BASE_URL = "https://185.130.212.192:37615"
|
||||
WEB_BASE_PATH = "/Tlvziqv5coI64Ymq5U/"
|
||||
USERNAME = "admin"
|
||||
PASSWORD = "XrayAdmin2026!"
|
||||
|
||||
# Генерация UUID и ключей Reality
|
||||
import uuid
|
||||
import subprocess
|
||||
|
||||
UUID = str(uuid.uuid4())
|
||||
print(f"UUID: {UUID}")
|
||||
|
||||
# Генерация пары ключей Reality через xray
|
||||
result = subprocess.run(
|
||||
["docker", "run", "--rm", "teddysun/xray", "xray", "x25519"],
|
||||
capture_output=True,
|
||||
text=True,
|
||||
timeout=30
|
||||
)
|
||||
|
||||
if result.returncode == 0:
|
||||
lines = result.stdout.strip().split('\n')
|
||||
PRIVATE_KEY = lines[0].split(': ')[1] if ': ' in lines[0] else lines[0]
|
||||
PUBLIC_KEY = lines[1].split(': ')[1] if len(lines) > 1 and ': ' in lines[1] else ""
|
||||
print(f"Private Key: {PRIVATE_KEY}")
|
||||
print(f"Public Key: {PUBLIC_KEY}")
|
||||
else:
|
||||
# Fallback: используем статичные тестовые ключи (в продакшене сгенерировать!)
|
||||
PRIVATE_KEY = "test-private-key-replace-me"
|
||||
PUBLIC_KEY = "test-public-key-replace-me"
|
||||
print("WARNING: Could not generate keys, using placeholders")
|
||||
|
||||
SHORT_ID = uuid.uuid4().hex[:16]
|
||||
print(f"Short ID: {SHORT_ID}")
|
||||
|
||||
# Сессия для API
|
||||
session = requests.Session()
|
||||
session.verify = False
|
||||
|
||||
# Логин
|
||||
login_url = f"{BASE_URL}{WEB_BASE_PATH}login"
|
||||
login_data = {
|
||||
"username": USERNAME,
|
||||
"password": PASSWORD
|
||||
}
|
||||
|
||||
print(f"\n=== Логин в 3x-ui ===")
|
||||
response = session.post(login_url, json=login_data)
|
||||
print(f"Login status: {response.status_code}")
|
||||
print(f"Login response: {response.text[:200]}")
|
||||
|
||||
if response.status_code != 200 or "success" not in response.text.lower():
|
||||
print("ERROR: Login failed!")
|
||||
exit(1)
|
||||
|
||||
# Добавление VLESS Reality inbound
|
||||
print(f"\n=== Добавление VLESS Reality inbound ===")
|
||||
|
||||
inbound_config = {
|
||||
"id": 0, # 0 = новый inbound
|
||||
"up": 0,
|
||||
"down": 0,
|
||||
"total": 0,
|
||||
"remark": "VLESS-Reality-Slava",
|
||||
"enable": True,
|
||||
"expiryTime": 0,
|
||||
"listen": "0.0.0.0",
|
||||
"port": 53903,
|
||||
"protocol": "vless",
|
||||
"settings": json.dumps({
|
||||
"clients": [
|
||||
{
|
||||
"id": UUID,
|
||||
"flow": "xtls-rprx-vision",
|
||||
"email": "slava@android",
|
||||
"limitIp": 0,
|
||||
"totalGB": 0,
|
||||
"expiryTime": 0,
|
||||
"enable": True,
|
||||
"tgId": "",
|
||||
"subId": ""
|
||||
}
|
||||
],
|
||||
"decryption": "none",
|
||||
"fallbacks": []
|
||||
}),
|
||||
"streamSettings": json.dumps({
|
||||
"network": "tcp",
|
||||
"security": "reality",
|
||||
"externalProxy": [],
|
||||
"realitySettings": {
|
||||
"show": False,
|
||||
"xver": 0,
|
||||
"dest": "yahoo.com:443",
|
||||
"serverNames": ["yahoo.com"],
|
||||
"privateKey": PRIVATE_KEY,
|
||||
"minClientVersion": "",
|
||||
"maxClientVersion": "",
|
||||
"maxTimeDiff": 0,
|
||||
"shortIds": [SHORT_ID]
|
||||
},
|
||||
"sockopt": {
|
||||
"acceptProxyProtocol": False,
|
||||
"tcpFastOpen": True
|
||||
}
|
||||
}),
|
||||
"tag": f"VLESS_Reality_{UUID[:8]}"
|
||||
}
|
||||
|
||||
add_url = f"{BASE_URL}{WEB_BASE_PATH}panel/api/inbounds/add"
|
||||
response = session.post(add_url, json=inbound_config)
|
||||
print(f"Add inbound status: {response.status_code}")
|
||||
print(f"Response: {response.text[:500]}")
|
||||
|
||||
if response.status_code == 200:
|
||||
print("\n✅ VLESS Reality inbound успешно добавлен!")
|
||||
print(f"\n📱 Конфиг для Android (v2raytun/happ):")
|
||||
print(f"""
|
||||
vless://{UUID}@185.130.212.192:53903?encryption=none&flow=xtls-rprx-vision&security=reality&fp=chrome&sni=yahoo.com&pbk={PUBLIC_KEY}&sid={SHORT_ID}&type=tcp#VLESS-Reality-Slava
|
||||
""")
|
||||
else:
|
||||
print(f"\n❌ Ошибка добавления inbound")
|
||||
print(f"Response: {response.text}")
|
||||
@@ -1,56 +0,0 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
Восстановление SSH доступа к ruvpn через 3x-ui API
|
||||
Логинимся и пробуем выполнить команду через API (если доступно)
|
||||
или добавляем правило firewall через systemd
|
||||
"""
|
||||
import requests
|
||||
import json
|
||||
import urllib3
|
||||
|
||||
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
|
||||
|
||||
BASE_URL = "https://185.130.212.192:37615"
|
||||
WEB_BASE_PATH = "/Tlvziqv5coI64Ymq5U/"
|
||||
USERNAME = "admin"
|
||||
PASSWORD = "XrayAdmin2026!"
|
||||
|
||||
session = requests.Session()
|
||||
session.verify = False
|
||||
|
||||
# Логин
|
||||
login_url = f"{BASE_URL}{WEB_BASE_PATH}login"
|
||||
login_data = {"username": USERNAME, "password": PASSWORD}
|
||||
|
||||
print(f"=== Логин в 3x-ui ===")
|
||||
response = session.post(login_url, json=login_data)
|
||||
print(f"Status: {response.status_code}")
|
||||
|
||||
if response.status_code == 200:
|
||||
try:
|
||||
data = response.json()
|
||||
print(f"Response: {json.dumps(data, indent=2)[:500]}")
|
||||
if data.get("success"):
|
||||
print("✅ Логин успешен!")
|
||||
else:
|
||||
print("❌ Логин не удался")
|
||||
except:
|
||||
print(f"Response text: {response.text[:300]}")
|
||||
else:
|
||||
print(f"❌ HTTP {response.status_code}")
|
||||
|
||||
# Проверяем доступные API endpoints
|
||||
print(f"\n=== Проверка API endpoints ===")
|
||||
endpoints = [
|
||||
"panel/api/inbounds/list",
|
||||
"panel/api/settings",
|
||||
"server/status",
|
||||
]
|
||||
|
||||
for endpoint in endpoints:
|
||||
url = f"{BASE_URL}{WEB_BASE_PATH}{endpoint}"
|
||||
try:
|
||||
resp = session.get(url, timeout=5)
|
||||
print(f"{endpoint}: {resp.status_code} - {resp.text[:100]}")
|
||||
except Exception as e:
|
||||
print(f"{endpoint}: ERROR - {e}")
|
||||
Reference in New Issue
Block a user