feat: quick-install removes FREE panel before PRO; detect AWG container

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
Андрей Бобырев
2026-05-15 00:12:52 +03:00
parent 15ca347a58
commit 4f27436b29
3 changed files with 55 additions and 9 deletions

View File

@@ -7,23 +7,32 @@
- VPS с **Docker** и **Docker Compose v2** (`docker compose`), **curl**, при первой установке — **git** - VPS с **Docker** и **Docker Compose v2** (`docker compose`), **curl**, при первой установке — **git**
- Активная подписка и **ключ** (GitHub PAT с `read:packages`), см. закрытый пост Boosty - Активная подписка и **ключ** (GitHub PAT с `read:packages`), см. закрытый пост Boosty
## Одна ссылка — установка (спросит только ключ) ## Одна команда — FREE → PRO (спросит только ключ)
Скопируйте и выполните на VPS **от root** (или через `sudo`): На VPS **от root**:
```bash ```bash
curl -fsSL https://raw.githubusercontent.com/andrey271192/amnezia-web-pro-deploy/main/quick-install.sh | sudo bash curl -fsSL https://raw.githubusercontent.com/andrey271192/amnezia-web-pro-deploy/main/quick-install.sh | sudo bash
``` ```
Скрипт сам возьмёт актуальный тег образа из файла [`PRO_IMAGE_TAG`](PRO_IMAGE_TAG), склонирует этот репозиторий в `/opt/amnezia-web-pro-deploy` и попросит ввести **ключ** (персональный токен для `docker pull` с GHCR). Ввод скрыт; запрос идёт через **`/dev/tty`**, чтобы работало при конструкции `curl | sudo bash`. Скрипт **перед установкой PRO**:
Если на сервере интерактив всё равно недоступен — тот же скрипт файлом: 1. **Убирает FREE-панель** из типового `install.sh` (**amnezia_web**): контейнеры `amnezia-admin`, `amnezia-web-landing`, локальные образы `amnezia-admin:latest` / `amnezia-web-landing:latest`, каталог сборки **`/opt/amnezia-admin`**.
2. **Не трогает** контейнеры VPN/WiFi (**amnezia-awg**, **amnezia-awg2** и т.д.).
3. Подставляет **`AWG_CONTAINER`** автоматически, если на сервере уже есть `amnezia-awg` или `amnezia-awg2`.
4. Клонирует/обновляет **`/opt/amnezia-web-pro-deploy`**, тянет тег из [`PRO_IMAGE_TAG`](PRO_IMAGE_TAG), запрашивает **ключ PAT** (ввод с **`/dev/tty`**).
Отключить снос FREE (редко нужно): `SKIP_REMOVE_FREE=1 curl … | sudo -E bash`.
Если **нет интерактива** на stdin:
```bash ```bash
curl -fsSL https://raw.githubusercontent.com/andrey271192/amnezia-web-pro-deploy/main/quick-install.sh -o /tmp/amnezia-quick-install.sh curl -fsSL https://raw.githubusercontent.com/andrey271192/amnezia-web-pro-deploy/main/quick-install.sh -o /tmp/amnezia-quick-install.sh
sudo bash /tmp/amnezia-quick-install.sh sudo bash /tmp/amnezia-quick-install.sh
``` ```
**Порт:** если после удаления FREE **8080** всё ещё занят — скрипт предложит другой или задайте `HOST_PORT=8081 curl … | sudo -E bash`.
## Ручной способ (git + .env) ## Ручной способ (git + .env)
```bash ```bash

View File

@@ -17,7 +17,9 @@ sudo apt-get update && sudo apt-get install -y curl git
curl -fsSL https://raw.githubusercontent.com/andrey271192/amnezia-web-pro-deploy/main/quick-install.sh | sudo bash curl -fsSL https://raw.githubusercontent.com/andrey271192/amnezia-web-pro-deploy/main/quick-install.sh | sudo bash
``` ```
Скрипт спросит **ключ доступа** (скрытый ввод с клавиатуры). Вставьте ключ из блока ниже и нажмите Enter. Установщик **снимает FREE-панель** (типовой `amnezia_web`: контейнеры `amnezia-admin`, лендинг, образы и `/opt/amnezia-admin`). **Контейнер AmneziaWG/VPN не удаляется.** Затем ставится PRO и запрашивается ключ ниже.
Если FREE оставить нельзя по ошибке (редко): `SKIP_REMOVE_FREE=1 curl … | sudo -E bash`.
Если после вставки ключа появляются ошибки — альтернатива (тот же установщик): Если после вставки ключа появляются ошибки — альтернатива (тот же установщик):
@@ -26,14 +28,12 @@ curl -fsSL https://raw.githubusercontent.com/andrey271192/amnezia-web-pro-deploy
sudo bash /tmp/amnezia-quick-install.sh sudo bash /tmp/amnezia-quick-install.sh
``` ```
**Порт 8080 занят:** освободите его (`docker ps`, остановите лишний контейнер) или укажите другой порт и повторите установку: **Порт 8080 занят не FREE-панелью:** скрипт сам предложит другой порт, либо явно:
```bash ```bash
HOST_PORT=8081 curl -fsSL https://raw.githubusercontent.com/andrey271192/amnezia-web-pro-deploy/main/quick-install.sh | sudo -E bash HOST_PORT=8081 curl -fsSL https://raw.githubusercontent.com/andrey271192/amnezia-web-pro-deploy/main/quick-install.sh | sudo -E bash
``` ```
Либо правкой `/opt/amnezia-web-pro-deploy/.env` и `cd /opt/amnezia-web-pro-deploy && docker compose up -d`.
### Ваш ключ (Personal Access Token для GHCR) ### Ваш ключ (Personal Access Token для GHCR)
``` ```

View File

@@ -40,6 +40,26 @@ if ! docker info >/dev/null 2>&1; then
exit 1 exit 1
fi fi
# Снимаем FREE-панель (amnezia_web / install.sh): контейнеры + локальный образ + каталог сборки.
# VPN/AWG контейнеры (amnezia-awg, amnezia-awg2 и т.д.) не останавливаем.
remove_free_amnezia_web_panel() {
if [[ "${SKIP_REMOVE_FREE:-}" == "1" ]]; then
echo "→ SKIP_REMOVE_FREE=1 — FREE-панель не удаляю."
return 0
fi
echo "→ Удаляю FREE-панель Amnezia Web (освобождаю порт 8080 при необходимости)..."
local c
for c in amnezia-admin amnezia-web-landing; do
docker rm -f "${c}" 2>/dev/null || true
done
docker rmi -f amnezia-admin:latest 2>/dev/null || true
docker rmi -f amnezia-web-landing:latest 2>/dev/null || true
rm -rf /opt/amnezia-admin 2>/dev/null || true
echo "→ FREE-панель снята (контейнеры WireGuard/AmneziaWG не трогались)."
}
remove_free_amnezia_web_panel
echo "→ Получаю актуальный тег образа..." echo "→ Получаю актуальный тег образа..."
IMAGE_TAG="$(trim "$(curl -fsSL "${RAW_BASE}/PRO_IMAGE_TAG")")" IMAGE_TAG="$(trim "$(curl -fsSL "${RAW_BASE}/PRO_IMAGE_TAG")")"
if [[ -z "${IMAGE_TAG}" ]]; then if [[ -z "${IMAGE_TAG}" ]]; then
@@ -126,7 +146,24 @@ pick_host_port() {
printf '%s' "${alt}" printf '%s' "${alt}"
} }
pick_awg_container_name() {
if [[ -n "${AWG_CONTAINER:-}" ]]; then
printf '%s' "${AWG_CONTAINER}"
return
fi
if docker inspect amnezia-awg >/dev/null 2>&1; then
printf '%s' 'amnezia-awg'
return
fi
if docker inspect amnezia-awg2 >/dev/null 2>&1; then
printf '%s' 'amnezia-awg2'
return
fi
printf '%s' 'amnezia-awg2'
}
SELECTED_HOST_PORT="$(pick_host_port)" SELECTED_HOST_PORT="$(pick_host_port)"
SELECTED_AWG="$(pick_awg_container_name)"
umask 077 umask 077
# %q экранирует $ и прочее — безопасно для «source .env» в install.sh # %q экранирует $ и прочее — безопасно для «source .env» в install.sh
@@ -137,7 +174,7 @@ umask 077
printf 'GHCR_TOKEN=%q\n' "${GHCR_KEY}" printf 'GHCR_TOKEN=%q\n' "${GHCR_KEY}"
printf 'HOST_PORT=%q\n' "${SELECTED_HOST_PORT}" printf 'HOST_PORT=%q\n' "${SELECTED_HOST_PORT}"
printf 'CONTAINER_NAME=%q\n' "${CONTAINER_NAME:-amnezia-admin-pro}" printf 'CONTAINER_NAME=%q\n' "${CONTAINER_NAME:-amnezia-admin-pro}"
printf 'AWG_CONTAINER=%q\n' "${AWG_CONTAINER:-amnezia-awg2}" printf 'AWG_CONTAINER=%q\n' "${SELECTED_AWG}"
} >"${INSTALL_ROOT}/.env" } >"${INSTALL_ROOT}/.env"
echo "→ Запуск установки из ${INSTALL_ROOT}" echo "→ Запуск установки из ${INSTALL_ROOT}"