From 73b7d104d4b06fbfcc421bcfe680ea5bb7a7e119 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D0=BD=D0=B4=D1=80=D0=B5=D0=B9=20=D0=91=D0=BE=D0=B1?= =?UTF-8?q?=D1=8B=D1=80=D0=B5=D0=B2?= Date: Thu, 14 May 2026 16:03:28 +0300 Subject: [PATCH] fix(install): preserve HOST_PORT on upgrade; NO_CACHE; bust tarball fetch Co-authored-by: Cursor --- README.md | 23 ++++++++++++++++++++--- scripts/install.sh | 25 ++++++++++++++++++++++--- 2 files changed, 42 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 4c98090..3e54dca 100644 --- a/README.md +++ b/README.md @@ -42,6 +42,7 @@ cd /opt/amnezia-admin && chmod +x scripts/install.sh && sudo SKIP_DOWNLOAD=1 bas | `SKIP_LANDING` | `0` | `1` — не ставить публичную страницу с футером поддержки | | `LANDING_PORT` | `80` | Порт nginx-лендинга (если `80` занят — например `8081`) | | `LANDING_CONTAINER` | `amnezia-web-landing` | Имя контейнера лендинга | +| `NO_CACHE` | `0` | `1` — `docker build --no-cache` при проблемах с обновлением образа | После установки: **админ-панель** `http://IP:8080` (или ваш `HOST_PORT`), **страница с поддержкой проекта** `http://IP/` на порту лендинга (по умолчанию **80**). Кнопка на лендинге ведёт на админку с тем же `HOST_PORT`. @@ -51,19 +52,35 @@ cd /opt/amnezia-admin && chmod +x scripts/install.sh && sudo SKIP_DOWNLOAD=1 bas Коммиты на GitHub **сами не попадают** в уже запущенный контейнер: нужно заново **скачать код и пересобрать образ**. -Проще всего — та же команда, что при установке (данные в `DATA_DIR`, пароль сохранится): +Проще всего — та же команда, что при установке (данные в `DATA_DIR`, пароль сохранится). Скрипт **подставит прежний внешний порт** контейнера `amnezia-admin`, если вы не передавали `HOST_PORT` и в коде по умолчанию стоит `8080`: ```bash curl -fsSL https://raw.githubusercontent.com/andrey271192/Amnezia_web/main/scripts/install.sh | sudo bash ``` +Если интерфейс после этого всё ещё старый — принудительно без кэша слоёв Docker: + +```bash +curl -fsSL https://raw.githubusercontent.com/andrey271192/Amnezia_web/main/scripts/install.sh | sudo NO_CACHE=1 bash +``` + Если проект уже лежит в `/opt/amnezia-admin` через git и вы подтянули изменения (`git pull`), пересоберите без повторной загрузки архива: ```bash -cd /opt/amnezia-admin && sudo SKIP_DOWNLOAD=1 HOST_PORT=8080 bash scripts/install.sh +cd /opt/amnezia-admin && chmod +x scripts/install.sh && sudo SKIP_DOWNLOAD=1 bash scripts/install.sh ``` -Подставьте свой `HOST_PORT`, если панель не на `8080`. После обновления сделайте в браузере **жёсткое обновление** страницы (Ctrl+Shift+R / ⌘+Shift+R), если интерфейс всё ещё старый. +Порт при этом возьмётся из уже работающего контейнера так же, как при установке с GitHub. + +Подставьте **`HOST_PORT=ваш_порт`** перед `bash`, если нужно явно зафиксировать порт (в том числе сменить его при обновлении). + +После обновления сделайте в браузере **жёсткое обновление** страницы (Ctrl+Shift+R / ⌘+Shift+R), если интерфейс всё ещё старый. + +Команда на сервере для проверки, что в образ попали новые статические файлы (после установки должно быть **Amnezia Admin WebUI**, не «Kaskad»): + +```bash +sudo docker run --rm amnezia-admin:latest grep -E -o 'Amnezia Admin WebUI|Kaskad' /app/public/index.html | head -1 +``` --- diff --git a/scripts/install.sh b/scripts/install.sh index 8caed67..ffe0fe0 100755 --- a/scripts/install.sh +++ b/scripts/install.sh @@ -43,7 +43,10 @@ trap cleanup EXIT if [[ "${SKIP_DOWNLOAD:-}" != "1" ]]; then echo "→ Клонирование релиза ${GITHUB_REPO} (${BRANCH})..." TMP=$(mktemp -d) - curl -fsSL "https://github.com/${GITHUB_REPO}/archive/refs/heads/${BRANCH}.tar.gz" \ + curl -fsSL \ + -H 'Cache-Control: no-cache' \ + -H 'Pragma: no-cache' \ + "https://github.com/${GITHUB_REPO}/archive/refs/heads/${BRANCH}.tar.gz" \ | tar xz -C "${TMP}" rm -rf "${INSTALL_DIR}" mkdir -p "$(dirname "${INSTALL_DIR}")" @@ -53,6 +56,16 @@ fi mkdir -p "${DATA_DIR}" +# При повторном запуске не менять внешний порт панели, если не указали HOST_PORT явно (по умолчанию 8080). +PREV_HOST_PORT="" +if docker inspect "${CONTAINER_NAME}" >/dev/null 2>&1; then + PREV_HOST_PORT="$(docker port "${CONTAINER_NAME}" 3980/tcp 2>/dev/null | head -1 | awk -F: '{print $NF}')" + if [[ -n "${PREV_HOST_PORT}" && "${HOST_PORT}" == "8080" ]]; then + HOST_PORT="${PREV_HOST_PORT}" + echo "→ Уже запущен ${CONTAINER_NAME}: сохраняю внешний порт ${HOST_PORT} (укажите HOST_PORT=… чтобы сменить)." + fi +fi + BOOT_PW="" PASS_FILE="/root/amnezia-admin.initial-password" if [[ -f "${DATA_DIR}/password.hash" ]]; then @@ -69,8 +82,14 @@ else echo "→ Первый пароль записан в ${PASS_FILE}" fi +DOCKER_BUILD_EXTRA=() +if [[ "${NO_CACHE:-}" == "1" ]]; then + DOCKER_BUILD_EXTRA+=(--no-cache) + echo "→ NO_CACHE=1 — сборка без слоя кэша Docker." +fi + echo "→ Сборка образа amnezia-admin:latest ..." -docker build -t amnezia-admin:latest "${INSTALL_DIR}" +docker build "${DOCKER_BUILD_EXTRA[@]}" -t amnezia-admin:latest "${INSTALL_DIR}" docker rm -f "${CONTAINER_NAME}" 2>/dev/null || true @@ -96,7 +115,7 @@ docker run -d --name "${CONTAINER_NAME}" --restart unless-stopped \ if [[ "${SKIP_LANDING:-}" != "1" ]] && [[ -d "${INSTALL_DIR}/landing" ]]; then printf "window.__AMNEZIA_ADMIN_PORT__='%s';\n" "${HOST_PORT}" >"${INSTALL_DIR}/landing/admin-port.js" echo "→ Сборка образа ${LANDING_IMAGE} (страница на порту ${LANDING_PORT})..." - docker build -t "${LANDING_IMAGE}" "${INSTALL_DIR}/landing" + docker build "${DOCKER_BUILD_EXTRA[@]}" -t "${LANDING_IMAGE}" "${INSTALL_DIR}/landing" docker rm -f "${LANDING_CONTAINER}" 2>/dev/null || true if docker run -d --name "${LANDING_CONTAINER}" --restart unless-stopped \ -p "${LANDING_PORT}:80" \