Compare commits
4 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
29790aaf4d | ||
|
|
884df15f42 | ||
|
|
eb2b2768cd | ||
|
|
147ef3a42d |
10
CHANGELOG.md
10
CHANGELOG.md
@@ -19,6 +19,16 @@ phobos-update beta # или: phobos-update dev
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
## 1.4.6 — роутеры снова получают смену адреса
|
||||||
|
- Исправлено: роутер получал 403 при pull конфига, если клиент создан через API/бота (`/api/client/ensure`) — смена адреса/сервера до него не доходила. Теперь принимается и общий ключ из пакета, и личный токен клиента. Роутеры переустанавливать не нужно — достаточно обновить панель.
|
||||||
|
|
||||||
|
## 1.4.5 — подсеть при установке, beta/dev по токену
|
||||||
|
|
||||||
|
- **feat:** beta и dev теперь берутся из приватного репозитория на Gitea (GitHub заблокирован): `phobos-update beta|dev` с токеном подписчика — в панели «Настройки → Версия и обновления → токен подписчика» или `GH_TOKEN=… phobos-update beta`. Без токена updater сообщает, что канал закрыт, и ничего не трогает.
|
||||||
|
- **fix:** при переустановке на сервер с готовым `wg0.conf` подсеть берётся из него.
|
||||||
|
|
||||||
|
- **feat:** подсеть VPN-клиентов задаётся при установке: `install.sh` и `secondary-setup.sh` спрашивают её в терминале (Enter = `10.25.0.0/16`) или берут `SERVER_WG_IPV4_NETWORK=10.25.1.0/24`. Неверная или публичная сеть — установка останавливается с ошибкой.
|
||||||
|
|
||||||
## 1.4.4 — канал «Облако» (через KeenDNS своего Keenetic)
|
## 1.4.4 — канал «Облако» (через KeenDNS своего Keenetic)
|
||||||
- **Канал «Облако»** в Android PCA Phobos VPN 1.4.4 и iPhone (TestFlight 1.0 (6)): телефон → облако KeenDNS → ваш Keenetic → сервер. Помогает, когда сам сервер заблокирован, а сайты Keenetic открываются; белый IP роутеру не нужен.
|
- **Канал «Облако»** в Android PCA Phobos VPN 1.4.4 и iPhone (TestFlight 1.0 (6)): телефон → облако KeenDNS → ваш Keenetic → сервер. Помогает, когда сам сервер заблокирован, а сайты Keenetic открываются; белый IP роутеру не нужен.
|
||||||
- **wsgw** — шлюз WebSocket → UDP для Keenetic (Entware: aarch64, mipsel, mips) и Linux. Инструкция с картинками — [docs/cloud.md](docs/cloud.md).
|
- **wsgw** — шлюз WebSocket → UDP для Keenetic (Entware: aarch64, mipsel, mips) и Linux. Инструкция с картинками — [docs/cloud.md](docs/cloud.md).
|
||||||
|
|||||||
@@ -99,6 +99,7 @@ bash <(curl -fsSL https://git.bobyrev.com/PCA/PCA_Phobos/raw/branch/main/install
|
|||||||
|-------------------|-----------------|----------|
|
|-------------------|-----------------|----------|
|
||||||
| `PANEL_PASS` | `OcAdmin2026!` | Пароль панели (логин `admin`) |
|
| `PANEL_PASS` | `OcAdmin2026!` | Пароль панели (логин `admin`) |
|
||||||
| `PANEL_PORT` | случайный | Порт веб-панели |
|
| `PANEL_PORT` | случайный | Порт веб-панели |
|
||||||
|
| `SERVER_WG_IPV4_NETWORK` | `10.25.0.0/16` | Подсеть VPN-клиентов (например `10.25.1.0/24`). Без переменной установщик спросит в терминале. Сервер получает первый адрес (`10.25.1.1`). Задаётся только при установке |
|
||||||
| `API_KEY` | случайный | Общий ключ (агенты + pull-токен роутеров) |
|
| `API_KEY` | случайный | Общий ключ (агенты + pull-токен роутеров) |
|
||||||
| `OBF_PORTS` | `2083,5443,993` | Порты обфускатора |
|
| `OBF_PORTS` | `2083,5443,993` | Порты обфускатора |
|
||||||
| `TG_TOKEN`/`TG_CHAT` | пусто | Telegram-уведомления |
|
| `TG_TOKEN`/`TG_CHAT` | пусто | Telegram-уведомления |
|
||||||
|
|||||||
5
app.py
5
app.py
@@ -3449,8 +3449,9 @@ def router_config(client_id):
|
|||||||
st = load_settings()
|
st = load_settings()
|
||||||
token = request.args.get("token", "")
|
token = request.args.get("token", "")
|
||||||
acc = st.get("router_access", {}).get(client_id, {})
|
acc = st.get("router_access", {}).get(client_id, {})
|
||||||
expected = acc.get("pull_token", "") or st.get("server_api_key", "")
|
# packages ship server_api_key as pull_token (phobos-client.sh), so accept both
|
||||||
if not expected or token != expected:
|
expected = {t for t in (acc.get("pull_token", ""), st.get("server_api_key", "")) if t}
|
||||||
|
if not token or token not in expected:
|
||||||
return ("forbidden", 403)
|
return ("forbidden", 403)
|
||||||
conf = generate_failover_conf_for_client(client_id)
|
conf = generate_failover_conf_for_client(client_id)
|
||||||
return (conf, 200, {"Content-Type": "text/plain; charset=utf-8"})
|
return (conf, 200, {"Content-Type": "text/plain; charset=utf-8"})
|
||||||
|
|||||||
27
install.sh
27
install.sh
@@ -29,7 +29,34 @@ PANEL_SCHEME="${PANEL_SCHEME:-http}"
|
|||||||
TG_TOKEN="${TG_TOKEN:-}"
|
TG_TOKEN="${TG_TOKEN:-}"
|
||||||
TG_CHAT="${TG_CHAT:-}"
|
TG_CHAT="${TG_CHAT:-}"
|
||||||
OBF_PORTS="${OBF_PORTS:-2083,5443,993}"
|
OBF_PORTS="${OBF_PORTS:-2083,5443,993}"
|
||||||
|
# Уже есть wg0.conf (переустановка) — подсеть берём из него, иначе server.env разойдётся с интерфейсом
|
||||||
|
if [ -z "${SERVER_WG_IPV4_NETWORK:-}" ] && [ -f /etc/wireguard/wg0.conf ]; then
|
||||||
|
SERVER_WG_IPV4_NETWORK="$(python3 - <<'PY' 2>/dev/null
|
||||||
|
import ipaddress, re
|
||||||
|
for ln in open("/etc/wireguard/wg0.conf"):
|
||||||
|
m = re.match(r"\s*Address\s*=\s*([^,\s]+)", ln)
|
||||||
|
if m:
|
||||||
|
print(ipaddress.ip_interface(m.group(1)).network); break
|
||||||
|
PY
|
||||||
|
)" || SERVER_WG_IPV4_NETWORK=""
|
||||||
|
fi
|
||||||
|
# Подсеть клиентов: env SERVER_WG_IPV4_NETWORK или вопрос в терминале (Enter = 10.25.0.0/16)
|
||||||
|
if [ -z "${SERVER_WG_IPV4_NETWORK:-}" ] && [ -r /dev/tty ] && [ -t 1 ]; then
|
||||||
|
printf 'Подсеть VPN-клиентов [10.25.0.0/16]: ' > /dev/tty
|
||||||
|
read -r -t 60 SERVER_WG_IPV4_NETWORK < /dev/tty || true
|
||||||
|
fi
|
||||||
SERVER_WG_IPV4_NETWORK="${SERVER_WG_IPV4_NETWORK:-10.25.0.0/16}"
|
SERVER_WG_IPV4_NETWORK="${SERVER_WG_IPV4_NETWORK:-10.25.0.0/16}"
|
||||||
|
SERVER_WG_IPV4_NETWORK="$(python3 - "$SERVER_WG_IPV4_NETWORK" <<'PY'
|
||||||
|
import ipaddress, sys
|
||||||
|
try:
|
||||||
|
net = ipaddress.ip_network(sys.argv[1].strip(), strict=False)
|
||||||
|
except ValueError:
|
||||||
|
sys.exit("ERROR: bad subnet " + sys.argv[1])
|
||||||
|
if net.version != 4 or not net.is_private or net.prefixlen > 29:
|
||||||
|
sys.exit("ERROR: subnet must be private IPv4, /8../29 (e.g. 10.25.1.0/24)")
|
||||||
|
print(net)
|
||||||
|
PY
|
||||||
|
)" || exit 1
|
||||||
# Источник: Gitea git.bobyrev.com (основной), GitHub — запасной.
|
# Источник: Gitea git.bobyrev.com (основной), GitHub — запасной.
|
||||||
# Каналы stable/beta/dev — ветки main/beta/dev одного публичного репозитория.
|
# Каналы stable/beta/dev — ветки main/beta/dev одного публичного репозитория.
|
||||||
PCA_GIT="${PCA_GIT:-https://git.bobyrev.com/PCA/PCA_Phobos}"
|
PCA_GIT="${PCA_GIT:-https://git.bobyrev.com/PCA/PCA_Phobos}"
|
||||||
|
|||||||
@@ -18,7 +18,23 @@ MAIN_API_KEY="${MAIN_API_KEY:?Set MAIN_API_KEY=your_api_key}"
|
|||||||
MAIN_PROTO="${MAIN_PROTO:-http}"
|
MAIN_PROTO="${MAIN_PROTO:-http}"
|
||||||
MAIN_PORT="${MAIN_PORT:-8443}"
|
MAIN_PORT="${MAIN_PORT:-8443}"
|
||||||
OBF_PORTS="${OBF_PORTS:-2083,5443,993}"
|
OBF_PORTS="${OBF_PORTS:-2083,5443,993}"
|
||||||
|
# Подсеть клиентов: env SERVER_WG_IPV4_NETWORK или вопрос в терминале (Enter = 10.25.0.0/16)
|
||||||
|
if [ -z "${SERVER_WG_IPV4_NETWORK:-}" ] && [ -r /dev/tty ] && [ -t 1 ]; then
|
||||||
|
printf 'Подсеть VPN-клиентов [10.25.0.0/16]: ' > /dev/tty
|
||||||
|
read -r -t 60 SERVER_WG_IPV4_NETWORK < /dev/tty || true
|
||||||
|
fi
|
||||||
SERVER_WG_IPV4_NETWORK="${SERVER_WG_IPV4_NETWORK:-10.25.0.0/16}"
|
SERVER_WG_IPV4_NETWORK="${SERVER_WG_IPV4_NETWORK:-10.25.0.0/16}"
|
||||||
|
SERVER_WG_IPV4_NETWORK="$(python3 - "$SERVER_WG_IPV4_NETWORK" <<'PY'
|
||||||
|
import ipaddress, sys
|
||||||
|
try:
|
||||||
|
net = ipaddress.ip_network(sys.argv[1].strip(), strict=False)
|
||||||
|
except ValueError:
|
||||||
|
sys.exit("ERROR: bad subnet " + sys.argv[1])
|
||||||
|
if net.version != 4 or not net.is_private or net.prefixlen > 29:
|
||||||
|
sys.exit("ERROR: subnet must be private IPv4, /8../29 (e.g. 10.25.1.0/24)")
|
||||||
|
print(net)
|
||||||
|
PY
|
||||||
|
)" || exit 1
|
||||||
PHOBOS_DIR="/opt/Phobos"
|
PHOBOS_DIR="/opt/Phobos"
|
||||||
WG_SERVER_IPV4="$(python3 - "$SERVER_WG_IPV4_NETWORK" <<'PY'
|
WG_SERVER_IPV4="$(python3 - "$SERVER_WG_IPV4_NETWORK" <<'PY'
|
||||||
import ipaddress, sys
|
import ipaddress, sys
|
||||||
|
|||||||
17
update.sh
17
update.sh
@@ -42,9 +42,17 @@ restart_panel_service() {
|
|||||||
# since 1.4.0 all channels are branches of one public repo (no subscriber token)
|
# since 1.4.0 all channels are branches of one public repo (no subscriber token)
|
||||||
is_private() { return 1; }
|
is_private() { return 1; }
|
||||||
|
|
||||||
|
PCA_GIT_DEV="${PCA_GIT_DEV:-https://git.bobyrev.com/PCA/PCA_Phobos-dev}"
|
||||||
|
|
||||||
fetch_repo_file() { # $1=ref $2=repo_path $3=output ; Gitea first, GitHub fallback
|
fetch_repo_file() { # $1=ref $2=repo_path $3=output ; Gitea first, GitHub fallback
|
||||||
local ref="$1" rp="$2" out="$3" kind=branch
|
local ref="$1" rp="$2" out="$3" kind=branch
|
||||||
case "$ref" in v[0-9]*) kind=tag;; esac
|
case "$ref" in v[0-9]*) kind=tag;; esac
|
||||||
|
# beta/dev live in the private Gitea repo PCA_Phobos-dev: read-only Gitea token in $PANEL_DIR/.gh_token or GH_TOKEN
|
||||||
|
case "$ref" in beta|dev)
|
||||||
|
if [ -n "$GH_TOKEN" ]; then
|
||||||
|
curl -fsSL -m25 -H "Authorization: token $GH_TOKEN" "$PCA_GIT_DEV/raw/branch/$ref/$rp?cb=$(date +%s)" -o "$out" 2>/dev/null && return 0
|
||||||
|
fi;;
|
||||||
|
esac
|
||||||
curl -fsSL -m25 "$PCA_GIT/raw/$kind/$ref/$rp?cb=$(date +%s)" -o "$out" 2>/dev/null && return 0
|
curl -fsSL -m25 "$PCA_GIT/raw/$kind/$ref/$rp?cb=$(date +%s)" -o "$out" 2>/dev/null && return 0
|
||||||
curl -fsSL -m25 "$GH_RAW/$ref/$rp?cb=$(date +%s)" -o "$out"
|
curl -fsSL -m25 "$GH_RAW/$ref/$rp?cb=$(date +%s)" -o "$out"
|
||||||
}
|
}
|
||||||
@@ -241,6 +249,15 @@ case "${1:-}" in
|
|||||||
echo "Токен — по подписке: https://boosty.to/andrey27 . Стабильная (без токена): phobos-update stable"
|
echo "Токен — по подписке: https://boosty.to/andrey27 . Стабильная (без токена): phobos-update stable"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
case "$ref" in beta|dev)
|
||||||
|
if [ -z "$GH_TOKEN" ]; then
|
||||||
|
echo "Каналы beta и dev — по токену подписчика (read-only токен Gitea)."
|
||||||
|
echo "Вставь токен в панели: Настройки → Версия и обновления → «токен подписчика», или:"
|
||||||
|
echo " GH_TOKEN=ваш_токен phobos-update $ref"
|
||||||
|
echo "Стабильная (без токена): phobos-update stable"
|
||||||
|
exit 1
|
||||||
|
fi;;
|
||||||
|
esac
|
||||||
if ! ref_exists "$ref"; then
|
if ! ref_exists "$ref"; then
|
||||||
echo "Версия/ветка '$ref' не найдена (или токен неверный). Обновление отменено (текущая $CUR не тронута)."
|
echo "Версия/ветка '$ref' не найдена (или токен неверный). Обновление отменено (текущая $CUR не тронута)."
|
||||||
echo "Доступные: phobos-update --versions · стабильная: $(latest_version)"
|
echo "Доступные: phobos-update --versions · стабильная: $(latest_version)"
|
||||||
|
|||||||
Reference in New Issue
Block a user