feat: one-line quick-install with PAT prompt

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
Андрей Бобырев
2026-05-14 23:46:43 +03:00
parent a031e9c579
commit c07028514e
6 changed files with 152 additions and 39 deletions

1
PRO_IMAGE_TAG Normal file
View File

@@ -0,0 +1 @@
v1.0.0

View File

@@ -4,16 +4,26 @@
## Требования
- VPS с Docker и Docker Compose v2 (`docker compose`)
- Подписка и значения `GHCR_*` из материалов для подписчиков
- VPS с **Docker** и **Docker Compose v2** (`docker compose`), **curl**, при первой установке — **git**
- Активная подписка и **ключ** (GitHub PAT с `read:packages`), см. закрытый пост Boosty
## Быстрый старт
## Одна ссылка — установка (спросит только ключ)
Скопируйте и выполните на VPS **от root** (или через `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). Ввод скрыт.
## Ручной способ (git + .env)
```bash
git clone https://github.com/andrey271192/amnezia-web-pro-deploy.git
cd amnezia-web-pro-deploy
cp .env.example .env
# заполните GHCR_IMAGE, IMAGE_TAG, GHCR_USERNAME, GHCR_TOKEN (из закрытого поста Boosty)
# заполните GHCR_* из закрытого поста Boosty
sudo bash scripts/install.sh
```

View File

@@ -1,60 +1,53 @@
# Шаблон закрытого поста Boosty (только для подписчиков)
Скопируйте в Boosty и замените плейсхолдеры.
Скопируйте в Boosty и подставьте **один** секрет — ключ ниже.
---
## Amnezia Admin — Pro (Docker)
Спасибо за поддержку. Исходный код Pro не распространяется — доступ только к готовому образу в GitHub Container Registry.
Спасибо за поддержку. Исходный код Pro не распространяется — доступ только к приватному образу на GitHub Container Registry.
### 1) Открытая инструкция и файлы
### Установка одной командой
Репозиторий установки (публичный):
https://github.com/andrey271192/amnezia-web-pro-deploy
На VPS (Ubuntu/Debian, установлен Docker):
На VPS установите Docker и Compose v2, затем выполните **от root**:
```bash
sudo apt-get update && sudo apt-get install -y git
git clone https://github.com/andrey271192/amnezia-web-pro-deploy.git
cd amnezia-web-pro-deploy
cp .env.example .env
nano .env
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
```
### 2) Заполните `.env` значениями ниже
Скрипт спросит **ключ доступа** (скрытый ввод). Вставьте ключ из блока ниже и нажмите Enter.
| Переменная | Значение для подписчиков |
|------------|--------------------------|
| `GHCR_IMAGE` | `ghcr.io/andrey271192/amnezia-admin-pro` |
| `IMAGE_TAG` | `v1.0.0` *(или актуальный тег из объявления)* |
| `GHCR_USERNAME` | **`REPLACE_ME_USERNAME`** |
| `GHCR_TOKEN` | **`REPLACE_ME_TOKEN`** |
### Ваш ключ (Personal Access Token для GHCR)
⚠️ Не выкладывайте `.env` и токен в открытый доступ. Не коммитьте их в git.
```
REPLACE_ME_PASTE_TOKEN_HERE
```
### 3) Установка одной командой
- Логин GitHub для registry уже зашит в установщик (`andrey271192`).
- Актуальный тег образа скрипт подтягивает сам из репозитория установки (`PRO_IMAGE_TAG`).
⚠️ Не публикуйте ключ в открытых чатах и скриншотах. Не отправляйте его третьим лицам.
### После установки
Панель: `http://ВАШ_IP:8080` (порт при необходимости задаётся переменной `HOST_PORT` до запуска quick-install или правкой `/opt/amnezia-web-pro-deploy/.env`).
Файлы установки: `/opt/amnezia-web-pro-deploy`
### Обновление
```bash
sudo bash scripts/install.sh
sudo bash /opt/amnezia-web-pro-deploy/scripts/update.sh
```
Панель: `http://ВАШ_IP:8080` (порт меняется через `HOST_PORT` в `.env`).
Тег образа подтягивается из публичного файла `PRO_IMAGE_TAG` при следующем запуске quick-install; для **update.sh** при новом релизе при необходимости обновите строку `IMAGE_TAG` в `/opt/amnezia-web-pro-deploy/.env` (или заново выполните `quick-install.sh` — он перезапишет `.env` и запросит ключ снова).
### 4) Обновление до новой версии
### Если подписка закончилась
В посте при новом релизе будет указан новый `IMAGE_TAG`. В `.env` замените `IMAGE_TAG`, затем:
```bash
cd amnezia-web-pro-deploy
sudo bash scripts/update.sh
```
### 5) Если подписка закончилась
Доступ к закрытым материалам Boosty пропадает; pull-токен может быть отозван при ротации — новые установки и обновления станут недоступны без активной подписки.
Доступ к закрытому посту пропадает; выданный ключ можно отозвать на стороне GitHub — новые установки и pull образа станут невозможны без нового ключа.
---
**Поддержка:** напишите автору в личные сообщения на Boosty (вопросы по установке и обновлению).
**Поддержка:** напишите автору в личные сообщения на Boosty.

86
quick-install.sh Executable file
View File

@@ -0,0 +1,86 @@
#!/usr/bin/env bash
# Одна команда: curl … | sudo bash — спросит только ключ (PAT для ghcr.io).
set -euo pipefail
DEPLOY_REPO="${DEPLOY_REPO:-https://github.com/andrey271192/amnezia-web-pro-deploy.git}"
RAW_BASE="${RAW_BASE:-https://raw.githubusercontent.com/andrey271192/amnezia-web-pro-deploy/main}"
INSTALL_ROOT="${INSTALL_ROOT:-/opt/amnezia-web-pro-deploy}"
DEFAULT_GHCR_IMAGE="${DEFAULT_GHCR_IMAGE:-ghcr.io/andrey271192/amnezia-admin-pro}"
DEFAULT_GHCR_USERNAME="${DEFAULT_GHCR_USERNAME:-andrey271192}"
need_root() {
if [[ "${EUID:-$(id -u)}" -ne 0 ]]; then
echo "Запустите: curl -fsSL ${RAW_BASE}/quick-install.sh | sudo bash"
exit 1
fi
}
need_cmd() {
command -v "$1" >/dev/null 2>&1 || {
echo "Нужна утилита: $1 (например: apt-get install -y $1)"
exit 1
}
}
trim() {
local v="$1"
v="${v//$'\r'/}"
v="${v#"${v%%[![:space:]]*}"}"
v="${v%"${v##*[![:space:]]}"}"
printf '%s' "$v"
}
need_root
need_cmd curl
need_cmd docker
if ! docker info >/dev/null 2>&1; then
echo "Docker daemon недоступен. Запустите Docker и повторите."
exit 1
fi
echo "→ Получаю актуальный тег образа..."
IMAGE_TAG="$(trim "$(curl -fsSL "${RAW_BASE}/PRO_IMAGE_TAG")")"
if [[ -z "${IMAGE_TAG}" ]]; then
echo "Не удалось прочитать PRO_IMAGE_TAG с GitHub."
exit 1
fi
if [[ ! -d "${INSTALL_ROOT}/.git" ]]; then
need_cmd git
mkdir -p "$(dirname "${INSTALL_ROOT}")"
rm -rf "${INSTALL_ROOT}"
echo "→ Клонирую ${DEPLOY_REPO}${INSTALL_ROOT}"
git clone --depth 1 --branch main "${DEPLOY_REPO}" "${INSTALL_ROOT}"
else
echo "→ Обновляю ${INSTALL_ROOT}"
git -C "${INSTALL_ROOT}" fetch --depth 1 origin main
git -C "${INSTALL_ROOT}" reset --hard "origin/main"
fi
echo ""
echo "Введите ключ доступа к образу (GitHub PAT с правом read:packages)."
echo "Ввод скрыт — символы не отображаются."
read -rs GHCR_KEY
echo ""
GHCR_KEY="$(trim "${GHCR_KEY}")"
if [[ -z "${GHCR_KEY}" ]]; then
echo "Ключ пустой — выход."
exit 1
fi
umask 077
cat >"${INSTALL_ROOT}/.env" <<EOF
GHCR_IMAGE=${DEFAULT_GHCR_IMAGE}
IMAGE_TAG=${IMAGE_TAG}
GHCR_USERNAME=${DEFAULT_GHCR_USERNAME}
GHCR_TOKEN=${GHCR_KEY}
HOST_PORT=${HOST_PORT:-8080}
CONTAINER_NAME=${CONTAINER_NAME:-amnezia-admin-pro}
AWG_CONTAINER=${AWG_CONTAINER:-amnezia-awg2}
EOF
echo "→ Запуск установки из ${INSTALL_ROOT}"
exec bash "${INSTALL_ROOT}/scripts/install.sh"

View File

@@ -52,6 +52,19 @@ set -a
source "${ENV_FILE}"
set +a
# Убираем CR и пробелы по краям (часто после копирования из Boosty/Windows)
trim_crlf() {
local v="$1"
v="${v//$'\r'/}"
v="${v#"${v%%[![:space:]]*}"}"
v="${v%"${v##*[![:space:]]}"}"
printf '%s' "$v"
}
GHCR_IMAGE="$(trim_crlf "${GHCR_IMAGE:-}")"
IMAGE_TAG="$(trim_crlf "${IMAGE_TAG:-}")"
GHCR_USERNAME="$(trim_crlf "${GHCR_USERNAME:-}")"
GHCR_TOKEN="$(trim_crlf "${GHCR_TOKEN:-}")"
: "${GHCR_IMAGE:?Укажите GHCR_IMAGE в .env}"
: "${IMAGE_TAG:?Укажите IMAGE_TAG в .env}"
: "${GHCR_USERNAME:?Укажите GHCR_USERNAME в .env}"

View File

@@ -23,6 +23,16 @@ set -a
source "${ENV_FILE}"
set +a
trim_crlf() {
local v="$1"
v="${v//$'\r'/}"
v="${v#"${v%%[![:space:]]*}"}"
v="${v%"${v##*[![:space:]]}"}"
printf '%s' "$v"
}
GHCR_USERNAME="$(trim_crlf "${GHCR_USERNAME:-}")"
GHCR_TOKEN="$(trim_crlf "${GHCR_TOKEN:-}")"
printf '%s\n' "${GHCR_TOKEN}" | docker login ghcr.io -u "${GHCR_USERNAME}" --password-stdin
"${COMPOSE[@]}" -f "${COMPOSE_FILE}" --env-file "${ENV_FILE}" pull
"${COMPOSE[@]}" -f "${COMPOSE_FILE}" --env-file "${ENV_FILE}" up -d