Initial public deploy bundle (GHCR + Boosty)

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

17
.env.example Normal file
View File

@@ -0,0 +1,17 @@
# Скопируйте в .env и заполните значения из закрытого поста Boosty (только для подписчиков).
# Образ из GHCR (пример; ваш продавец подставит точное значение)
GHCR_IMAGE=ghcr.io/andrey271192/amnezia-admin-pro
IMAGE_TAG=v1.0.0
# Учётные данные только для docker pull (read-only PAT / Fine-grained token)
GHCR_USERNAME=your_github_username_or_bot
GHCR_TOKEN=ghp_xxxxxxxxxxxxxxxxxxxx
# Опционально
HOST_PORT=8080
CONTAINER_NAME=amnezia-admin-pro
AWG_CONTAINER=amnezia-awg2
# Первый пароль панели (рекомендуется задать явно). Иначе смотрите логи контейнера / доку Pro.
# ADMIN_PASSWORD=

2
.gitignore vendored Normal file
View File

@@ -0,0 +1,2 @@
.env
*.log

52
README.md Normal file
View File

@@ -0,0 +1,52 @@
# Amnezia Admin Pro — установка (Docker / GHCR)
Публичный репозиторий **только с инструкциями и compose**. Сам образ приложения — **приватный** на GitHub Container Registry; учётные данные для `docker pull` выдаются **активным подписчикам** (например, в закрытом посте на Boosty).
## Требования
- VPS с Docker и Docker Compose v2 (`docker compose`)
- Подписка и значения `GHCR_*` из материалов для подписчиков
## Быстрый старт
```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)
sudo bash scripts/install.sh
```
## Публикация на GitHub (для автора)
1. Создайте на GitHub новый репозиторий **`amnezia-web-pro-deploy`**, тип **Public** (без автогенерации README, если заливаете уже готовые файлы).
2. В каталоге с этим проектом:
```bash
cd amnezia-web-pro-deploy
git init
git add -A
git commit -m "Initial public deploy bundle"
git branch -M main
git remote add origin https://github.com/andrey271192/amnezia-web-pro-deploy.git
git push -u origin main
```
Если GitHub при создании репозитория уже добавил коммит — сделайте `git pull origin main --allow-unrelated-histories`, затем push.
## Обновление
После объявления нового тега образа обновите `IMAGE_TAG` в `.env` и выполните:
```bash
sudo bash scripts/update.sh
```
## Шаблон поста для Boosty
См. [docs/BOOSTY_SUBSCRIBERS_POST.md](docs/BOOSTY_SUBSCRIBERS_POST.md).
## Безопасность
- Файл `.env` с токеном не должен попадать в issue, чаты и скриншоты.
- При утечке токена автор перевыпускает его в GitHub; подписчикам выдаётся новый токен в обновлённом посте.

25
docker-compose.yml Normal file
View File

@@ -0,0 +1,25 @@
services:
panel:
image: ${GHCR_IMAGE}:${IMAGE_TAG}
container_name: ${CONTAINER_NAME:-amnezia-admin-pro}
restart: unless-stopped
ports:
- "${HOST_PORT:-8080}:3980"
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- amnezia-admin-pro-data:/data
environment:
AWG_CONTAINER: ${AWG_CONTAINER:-amnezia-awg2}
TZ: ${TZ:-}
AWG_PROFILES: ${AWG_PROFILES:-}
TIME_SYNC_SSH_HOST: ${TIME_SYNC_SSH_HOST:-}
TIME_SYNC_DISABLED: ${TIME_SYNC_DISABLED:-}
WARP_DIR: ${WARP_DIR:-}
WARP_CONF_PATH: ${WARP_CONF_PATH:-}
WARP_CLIENTS_LIST: ${WARP_CLIENTS_LIST:-}
AMNEZIA_START_SCRIPT: ${AMNEZIA_START_SCRIPT:-}
ADMIN_PASSWORD: ${ADMIN_PASSWORD:-}
ALLOW_DEFAULT_PASSWORD: ${ALLOW_DEFAULT_PASSWORD:-}
volumes:
amnezia-admin-pro-data:

View File

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

73
scripts/install.sh Executable file
View File

@@ -0,0 +1,73 @@
#!/usr/bin/env bash
# Установка Pro с приватного GHCR (без исходников). Публичный репозиторий — только этот скрипт и compose.
set -euo pipefail
ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
COMPOSE_FILE="${ROOT_DIR}/docker-compose.yml"
ENV_FILE="${ENV_FILE:-${ROOT_DIR}/.env}"
need_root() {
if [[ "${EUID:-$(id -u)}" -ne 0 ]]; then
echo "Запустите от root: sudo bash scripts/install.sh"
exit 1
fi
}
need_docker() {
command -v docker >/dev/null 2>&1 || {
echo "Нужен Docker."
exit 1
}
docker info >/dev/null 2>&1 || {
echo "Docker daemon недоступен."
exit 1
}
}
need_compose() {
if docker compose version >/dev/null 2>&1; then
COMPOSE=(docker compose)
return
fi
if command -v docker-compose >/dev/null 2>&1; then
COMPOSE=(docker-compose)
return
fi
echo "Нужен Docker Compose v2 (docker compose)."
exit 1
}
need_root
need_docker
need_compose
if [[ ! -f "${ENV_FILE}" ]]; then
echo "Создайте файл .env из .env.example и вставьте GHCR_* из закрытого поста Boosty:"
echo " cp .env.example .env && nano .env"
exit 1
fi
set -a
# shellcheck disable=SC1090
source "${ENV_FILE}"
set +a
: "${GHCR_IMAGE:?Укажите GHCR_IMAGE в .env}"
: "${IMAGE_TAG:?Укажите IMAGE_TAG в .env}"
: "${GHCR_USERNAME:?Укажите GHCR_USERNAME в .env}"
: "${GHCR_TOKEN:?Укажите GHCR_TOKEN в .env}"
echo "→ docker login ghcr.io ..."
printf '%s\n' "${GHCR_TOKEN}" | docker login ghcr.io -u "${GHCR_USERNAME}" --password-stdin
echo "→ pull ${GHCR_IMAGE}:${IMAGE_TAG}"
"${COMPOSE[@]}" -f "${COMPOSE_FILE}" --env-file "${ENV_FILE}" pull
echo "→ up -d"
"${COMPOSE[@]}" -f "${COMPOSE_FILE}" --env-file "${ENV_FILE}" up -d
IP="$(hostname -I 2>/dev/null | awk '{print $1}' || true)"
echo ""
echo "=== Готово ==="
echo "Панель: http://${IP:-YOUR_SERVER_IP}:${HOST_PORT:-8080}"
echo "Обновление: sudo bash ${ROOT_DIR}/scripts/update.sh"

30
scripts/update.sh Executable file
View File

@@ -0,0 +1,30 @@
#!/usr/bin/env bash
set -euo pipefail
ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
ENV_FILE="${ENV_FILE:-${ROOT_DIR}/.env}"
COMPOSE_FILE="${ROOT_DIR}/docker-compose.yml"
if [[ "${EUID:-$(id -u)}" -ne 0 ]]; then
echo "Запустите от root."
exit 1
fi
if docker compose version >/dev/null 2>&1; then
COMPOSE=(docker compose)
elif command -v docker-compose >/dev/null 2>&1; then
COMPOSE=(docker-compose)
else
echo "Нужен docker compose."
exit 1
fi
set -a
# shellcheck disable=SC1090
source "${ENV_FILE}"
set +a
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
echo "Обновлено."