Compare commits
5 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
4c1c82afec | ||
|
|
0f98c074c8 | ||
|
|
286142bd7a | ||
|
|
cf4b5f79b5 | ||
|
|
5f97c6c6d7 |
70
CHANGELOG.md
Normal file
70
CHANGELOG.md
Normal file
@@ -0,0 +1,70 @@
|
|||||||
|
# Changelog — PCA Phobos
|
||||||
|
|
||||||
|
Каналы: **stable** (публичный, без токена) · **beta** / **dev** (приватный repo, токен подписчика).
|
||||||
|
Обновление: `phobos-update stable` · `GH_TOKEN=… phobos-update beta|dev` · из панели → «Версия и обновления».
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Как обновиться после фиксов
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# stable (открытый)
|
||||||
|
phobos-update stable
|
||||||
|
|
||||||
|
# beta/dev (токен уже сохранён в /opt/phobos-panel/.gh_token)
|
||||||
|
phobos-update beta # или: phobos-update dev
|
||||||
|
```
|
||||||
|
Затем **пересоздать клиентов** в панели (старые конфиги могли содержать неверный порт обфускатора).
|
||||||
|
Обновляются: панель, скрипты онбординга, агент, updater. Ключи WireGuard, `server.env`, клиенты — НЕ трогаются.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## stable
|
||||||
|
|
||||||
|
### v1.2.7
|
||||||
|
- **fix:** импорт `phobos://` в PhobosWG. Конфиги дополняются `= none` для недостающих полей (`PresharedKey` и др.) перед base64 — иначе приложение писало «невозможно импортировать туннель».
|
||||||
|
|
||||||
|
### v1.2.6
|
||||||
|
- **fix:** бинарники wg-obfuscator для роутеров. Keenetic = aarch64, а Ground-Zerro раздаёт только x86_64. Теперь install.sh и сборка пакета клиента авто-качают aarch64/mipsel/armv7 из ClusterM/wg-obfuscator releases.
|
||||||
|
|
||||||
|
### v1.2.5
|
||||||
|
- **feat:** поле токена подписчика + кнопки каналов (stable/beta/dev) прямо в карточке «Версия и обновления». Подписчик вставляет токен в панель и переключается на beta/dev без консоли.
|
||||||
|
|
||||||
|
### v1.2.4
|
||||||
|
- **feat:** установка по умолчанию стабильная; beta/dev — опционально (`CHANNEL=`).
|
||||||
|
|
||||||
|
### v1.2.3
|
||||||
|
- **fix:** дебаунс DOWN-алертов (3 цикла + повтор) — убирает ложный флап серверов.
|
||||||
|
- **fix:** `phobos-update` отменяет обновление на несуществующую версию (текущая не трогается).
|
||||||
|
- **feat:** `--check` / `--versions`, кнопка «Проверить обновления».
|
||||||
|
|
||||||
|
### v1.2.2
|
||||||
|
- контакт во всех местах → группа `@PCAdministration`.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Критичные фиксы (общие, во всех каналах)
|
||||||
|
|
||||||
|
| Версия | Проблема | Решение |
|
||||||
|
|--------|----------|---------|
|
||||||
|
| 1.2.7 / 1.3.x | PhobosWG: «невозможно импортировать туннель» | `phobos://` дополняется `= none` для всех обязательных полей (`PresharedKey`) по спеке формата |
|
||||||
|
| 1.2.6 / 1.3.x | Роутер aarch64: «бинарник не найден в архиве» | авто-загрузка aarch64/mipsel/armv7 из ClusterM releases |
|
||||||
|
| (внутр.) | Клиент не подключается, «НЕТ СОЕДИНЕНИЯ», handshake не встаёт | клиентский обфускатор целился в порт 51821 (никто не слушал); теперь берёт первый из `OBFUSCATOR_PORTS` (2083) |
|
||||||
|
| (внутр.) | агент secondary не обновлялся через `phobos-update` | `server/api.py` добавлен в managed_files |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## beta (приватный)
|
||||||
|
|
||||||
|
### v1.3.0-beta
|
||||||
|
- скачивание `.conf` для телефона (Android `phobos://` + QR, iOS обычный WireGuard + QR);
|
||||||
|
- кнопка скачивания приложения **PhobosWG (APK)** — авто-загрузка из GitHub Release приватного repo;
|
||||||
|
- все критичные фиксы выше.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## dev (приватный, активная разработка)
|
||||||
|
|
||||||
|
### v1.3.1-dev
|
||||||
|
- **баланс по трафику:** агенты отдают пропускную способность канала (rx/tx NIC), `server_load = 0.45·cpu + 0.30·mem + 0.25·bw`; карточки серверов показывают ↕ Mbps;
|
||||||
|
- все фиксы и фичи из beta.
|
||||||
22
README.md
22
README.md
@@ -113,7 +113,7 @@ bash <(curl -fsSL https://raw.githubusercontent.com/andrey271192/PCA_Phobos/main
|
|||||||
> Для каждого устройства создавай **отдельного клиента** (свой ключ и IP). Один конфиг на двух устройствах = конфликт ключей.
|
> Для каждого устройства создавай **отдельного клиента** (свой ключ и IP). Один конфиг на двух устройствах = конфликт ключей.
|
||||||
|
|
||||||
**Приложения:**
|
**Приложения:**
|
||||||
- **Android (PhobosWG):** автор пока не публикует APK официально. Положи `.apk` на сервер в `/opt/Phobos/www/app/PhobosWG.apk` — панель сама покажет кнопку «Скачать приложение PhobosWG» на странице Android-клиента (раздаётся по `http://<сервер>/app/PhobosWG.apk`).
|
- **Android (PhobosWG):** на странице Android-клиента в панели есть кнопка **«Скачать приложение PhobosWG (APK)»** — приложение скачивается автоматически (доступно в каналах beta/dev). Установи APK, затем импортируй `phobos://`-ссылку или QR.
|
||||||
- **iPhone (iOS):** официальный [WireGuard из App Store](https://apps.apple.com/app/wireguard/id1441195209) — кнопка есть на странице iOS-клиента.
|
- **iPhone (iOS):** официальный [WireGuard из App Store](https://apps.apple.com/app/wireguard/id1441195209) — кнопка есть на странице iOS-клиента.
|
||||||
|
|
||||||
---
|
---
|
||||||
@@ -138,6 +138,22 @@ phobos-update --list # список бэкапов
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
## Полное удаление сервера
|
||||||
|
|
||||||
|
Одной командой (спросит подтверждение):
|
||||||
|
|
||||||
|
```bash
|
||||||
|
bash <(curl -fsSL https://raw.githubusercontent.com/andrey271192/PCA_Phobos/main/uninstall.sh)
|
||||||
|
```
|
||||||
|
|
||||||
|
Без подтверждения: `PURGE=1 bash <(curl -fsSL https://raw.githubusercontent.com/andrey271192/PCA_Phobos/main/uninstall.sh)`
|
||||||
|
|
||||||
|
Удаляет: веб-панель, обфускатор-сервисы, WireGuard `wg0`, агент, nginx-сайт, watchdog-cron, iptables-правила, бинарники (`wg-obfuscator`, `phobos-update`) и каталоги `/opt/Phobos`, `/opt/phobos-panel`. Общие пакеты (wireguard, nginx, cron) НЕ трогает.
|
||||||
|
|
||||||
|
**Удаление с роутера** (на самом роутере): `/opt/etc/Phobos/phobos-uninstall.sh`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
## Возможные проблемы и решения
|
## Возможные проблемы и решения
|
||||||
|
|
||||||
| Симптом | Причина | Решение |
|
| Симптом | Причина | Решение |
|
||||||
@@ -152,6 +168,10 @@ phobos-update --list # список бэкапов
|
|||||||
| **Смена сервера применяется не сразу** | роутер тянет конфиг по cron | Применяется за ~12–15 сек, не мгновенно |
|
| **Смена сервера применяется не сразу** | роутер тянет конфиг по cron | Применяется за ~12–15 сек, не мгновенно |
|
||||||
| **Забыл порт панели** | случайный порт | `cat /opt/phobos-panel/.port` |
|
| **Забыл порт панели** | случайный порт | `cat /opt/phobos-panel/.port` |
|
||||||
| **Забыл API key** | | `grep server_api_key /opt/phobos-panel/settings.json` |
|
| **Забыл API key** | | `grep server_api_key /opt/phobos-panel/settings.json` |
|
||||||
|
| **PhobosWG: «невозможно импортировать туннель»** | старая панель генерила неполный `phobos://` (без `PresharedKey`) | Обнови панель, заново скопируй `phobos://`-ссылку или пересканируй QR. Исправлено в v1.2.7 |
|
||||||
|
| **Роутер aarch64: «бинарник не найден в архиве»** | Ground-Zerro раздаёт только x86_64 | Обнови (`phobos-update`) — aarch64/mipsel/armv7 авто-качаются из ClusterM, затем пересоздай клиента. Исправлено в v1.2.6 |
|
||||||
|
| **Клиент не подключается, «НЕТ СОЕДИНЕНИЯ»** | клиентский обфускатор целился в неверный порт (51821) | Обнови панель → **пересоздай клиента** → переустанови на роутере. Порт берётся из `OBFUSCATOR_PORTS` |
|
||||||
|
| **Удалить сервер полностью** | | `bash <(curl -fsSL https://raw.githubusercontent.com/andrey271192/PCA_Phobos/main/uninstall.sh)` |
|
||||||
|
|
||||||
Логи: `journalctl -u phobos-panel -n 50` · сторож: `/opt/Phobos/server/watchdog.log` · роутер: `/opt/etc/Phobos/health.log`.
|
Логи: `journalctl -u phobos-panel -n 50` · сторож: `/opt/Phobos/server/watchdog.log` · роутер: `/opt/etc/Phobos/health.log`.
|
||||||
|
|
||||||
|
|||||||
9
app.py
9
app.py
@@ -764,8 +764,13 @@ def _pad_conf_with_none(conf):
|
|||||||
def qr_datauri(data):
|
def qr_datauri(data):
|
||||||
try:
|
try:
|
||||||
import qrcode, io, base64
|
import qrcode, io, base64
|
||||||
|
qr = qrcode.QRCode(error_correction=qrcode.constants.ERROR_CORRECT_L,
|
||||||
|
box_size=4, border=3)
|
||||||
|
qr.add_data(data)
|
||||||
|
qr.make(fit=True)
|
||||||
|
img = qr.make_image(fill_color="black", back_color="white")
|
||||||
buf = io.BytesIO()
|
buf = io.BytesIO()
|
||||||
qrcode.make(data).save(buf, format="PNG")
|
img.save(buf, format="PNG")
|
||||||
return "data:image/png;base64," + base64.b64encode(buf.getvalue()).decode()
|
return "data:image/png;base64," + base64.b64encode(buf.getvalue()).decode()
|
||||||
except Exception:
|
except Exception:
|
||||||
return ""
|
return ""
|
||||||
@@ -1689,7 +1694,7 @@ def client_phone(cid, mode):
|
|||||||
{nav('clients')}
|
{nav('clients')}
|
||||||
<div class="card" style="text-align:center">
|
<div class="card" style="text-align:center">
|
||||||
<h2>{cid} — {title}</h2>
|
<h2>{cid} — {title}</h2>
|
||||||
<img src="{qr}" alt="QR" style="width:300px;height:300px;background:#fff;padding:10px;border-radius:10px"><br>
|
<img src="{qr}" alt="QR" style="max-width:340px;width:100%;background:#fff;padding:10px;border-radius:10px;image-rendering:pixelated"><br>
|
||||||
<p style="margin-top:10px">{tr("Отсканируй QR в приложении или импортируй конфиг:", "Scan the QR in the app or import the config:")}</p>
|
<p style="margin-top:10px">{tr("Отсканируй QR в приложении или импортируй конфиг:", "Scan the QR in the app or import the config:")}</p>
|
||||||
{extra}
|
{extra}
|
||||||
<textarea readonly onclick="this.select()" style="width:100%;height:250px;font-family:monospace;font-size:.78em">{conf}</textarea>
|
<textarea readonly onclick="this.select()" style="width:100%;height:250px;font-family:monospace;font-size:.78em">{conf}</textarea>
|
||||||
|
|||||||
70
uninstall.sh
Executable file
70
uninstall.sh
Executable file
@@ -0,0 +1,70 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
# ============================================================
|
||||||
|
# PCA Phobos — полное удаление сервера (primary / panel node)
|
||||||
|
#
|
||||||
|
# bash <(curl -fsSL https://raw.githubusercontent.com/andrey271192/PCA_Phobos/main/uninstall.sh)
|
||||||
|
#
|
||||||
|
# Останавливает и удаляет: панель, обфускатор-сервисы, WireGuard wg0,
|
||||||
|
# nginx-сайт, watchdog-cron, бинарники, iptables-правила, каталоги Phobos.
|
||||||
|
# По умолчанию спрашивает подтверждение. PURGE=1 — без вопросов.
|
||||||
|
# ============================================================
|
||||||
|
set -u
|
||||||
|
PHOBOS_DIR="/opt/Phobos"
|
||||||
|
PANEL_DIR="/opt/phobos-panel"
|
||||||
|
|
||||||
|
[ "$(id -u)" -eq 0 ] || { echo "Запусти от root"; exit 1; }
|
||||||
|
|
||||||
|
echo "=================================================="
|
||||||
|
echo " PCA Phobos — УДАЛЕНИЕ сервера"
|
||||||
|
echo " Будут удалены: панель, obfuscator, wg0, nginx-сайт,"
|
||||||
|
echo " watchdog, бинарники, $PHOBOS_DIR, $PANEL_DIR"
|
||||||
|
echo "=================================================="
|
||||||
|
if [ "${PURGE:-0}" != "1" ]; then
|
||||||
|
printf "Точно удалить ВСЁ? [yes/NO]: "
|
||||||
|
read ans
|
||||||
|
[ "$ans" = "yes" ] || { echo "Отменено."; exit 0; }
|
||||||
|
fi
|
||||||
|
|
||||||
|
IFACE=$(ip route get 8.8.8.8 2>/dev/null | awk '{for(i=1;i<NF;i++) if($i=="dev") print $(i+1)}' | head -1)
|
||||||
|
IFACE="${IFACE:-eth0}"
|
||||||
|
|
||||||
|
echo "[1/8] stop + disable services..."
|
||||||
|
# obfuscator services (any port)
|
||||||
|
for svc in $(systemctl list-units --all --plain --no-legend 'wg-obfuscator-*' 2>/dev/null | awk '{print $1}'); do
|
||||||
|
systemctl stop "$svc" 2>/dev/null; systemctl disable "$svc" 2>/dev/null
|
||||||
|
done
|
||||||
|
for svc in phobos-panel phobos-api wg-quick@wg0; do
|
||||||
|
systemctl stop "$svc" 2>/dev/null; systemctl disable "$svc" 2>/dev/null
|
||||||
|
done
|
||||||
|
|
||||||
|
echo "[2/8] remove systemd units..."
|
||||||
|
rm -f /etc/systemd/system/wg-obfuscator-*.service 2>/dev/null
|
||||||
|
rm -f /etc/systemd/system/phobos-panel.service /etc/systemd/system/phobos-api.service 2>/dev/null
|
||||||
|
systemctl daemon-reload 2>/dev/null
|
||||||
|
|
||||||
|
echo "[3/8] remove WireGuard wg0..."
|
||||||
|
rm -f /etc/wireguard/wg0.conf 2>/dev/null
|
||||||
|
|
||||||
|
echo "[4/8] remove iptables rules..."
|
||||||
|
iptables -t nat -D POSTROUTING -o "$IFACE" -j MASQUERADE 2>/dev/null || true
|
||||||
|
iptables -D FORWARD -i wg0 -j ACCEPT 2>/dev/null || true
|
||||||
|
iptables -D FORWARD -o wg0 -m state --state RELATED,ESTABLISHED -j ACCEPT 2>/dev/null || true
|
||||||
|
iptables -D INPUT -p udp --dport 51820 ! -s 127.0.0.1 -j DROP 2>/dev/null || true
|
||||||
|
|
||||||
|
echo "[5/8] remove nginx site..."
|
||||||
|
rm -f /etc/nginx/sites-enabled/phobos /etc/nginx/sites-available/phobos 2>/dev/null
|
||||||
|
nginx -t >/dev/null 2>&1 && systemctl reload nginx 2>/dev/null || true
|
||||||
|
|
||||||
|
echo "[6/8] remove watchdog cron..."
|
||||||
|
( crontab -l 2>/dev/null | grep -v 'phobos-router-watchdog' | grep -v '/opt/Phobos' || true ) | crontab - 2>/dev/null || true
|
||||||
|
|
||||||
|
echo "[7/8] remove binaries / symlinks..."
|
||||||
|
rm -f /usr/local/bin/wg-obfuscator /usr/local/bin/phobos-update 2>/dev/null
|
||||||
|
|
||||||
|
echo "[8/8] remove directories..."
|
||||||
|
rm -rf "$PHOBOS_DIR" "$PANEL_DIR" 2>/dev/null
|
||||||
|
|
||||||
|
echo "=================================================="
|
||||||
|
echo " Phobos удалён."
|
||||||
|
echo " (WireGuard/nginx/cron-пакеты НЕ удалены — общие; убрать вручную при желании)"
|
||||||
|
echo "=================================================="
|
||||||
Reference in New Issue
Block a user