From 6faf69665027cc7c51a32b90f0bb97afd16f488c 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: Fri, 15 May 2026 01:07:26 +0300 Subject: [PATCH] fix(install): persist community/UI env from prev container; auto LANDING_PORT - Restore ALLOW_COMMUNITY_GITHUB_ACTIVATION and related vars from old amnezia-admin - Pick free LANDING_PORT when host :80 is busy - README: FAQ token field, 8080 vs PRO, landing port Co-authored-by: Cursor --- README.md | 16 ++++++++++++++++ scripts/install.sh | 44 ++++++++++++++++++++++++++++++-------------- 2 files changed, 46 insertions(+), 14 deletions(-) diff --git a/README.md b/README.md index a99679a..c12d252 100644 --- a/README.md +++ b/README.md @@ -82,6 +82,22 @@ curl -fsSL https://raw.githubusercontent.com/andrey271192/amnezia_web/main/scrip --- +## Частые проблемы + +### Пропало поле «токен GitHub» под плашкой FREE + +Форма показывается только если в контейнере **`ALLOW_COMMUNITY_GITHUB_ACTIVATION=1`** (и редакция **community**). Переменную нужно хотя бы один раз задать с **`export`** (см. выше). Начиная с актуального **`install.sh`**, при следующем обновлении панели **`ALLOW_COMMUNITY_*`**, **`COMMUNITY_UPGRADE_*`**, **`AMNEZIA_EDITION`** и ряд других значений **подтягиваются из предыдущего контейнера `amnezia-admin`**, чтобы не терять настройку. + +### `Bind for 0.0.0.0:8080 failed: port is already allocated` у `amnezia-admin-pro` + +На **8080** уже слушает **FREE**‑панель (**`amnezia-admin`**). Перед запуском образа PRO (**`docker compose`**, **`amnezia-web-pro-deploy`**, свой скрипт): **`docker rm -f amnezia-admin`**, затем снова **`up`**. Два контейнера панели на один и тот же порт не поднять. + +### Лендинг: порт 80 занят + +Если на хосте уже что-то слушает **TCP 80**, установщик сообщит об этом и, при дефолтном **`LANDING_PORT=80`**, сам попробует другой свободный порт (обычно начиная с **8081**). Либо явно: **`LANDING_PORT=8083`**, либо **`SKIP_LANDING=1`**. + +--- + ## Лицензия MIT — см. [LICENSE](LICENSE). diff --git a/scripts/install.sh b/scripts/install.sh index 927561c..a54120a 100755 --- a/scripts/install.sh +++ b/scripts/install.sh @@ -122,18 +122,21 @@ PREV_CONTAINER_ENV="" if docker inspect "${CONTAINER_NAME}" >/dev/null 2>&1; then PREV_CONTAINER_ENV="$(docker inspect "${CONTAINER_NAME}" --format '{{range .Config.Env}}{{println .}}{{end}}' 2>/dev/null || true)" fi -for __ui_var in UI_HIDE_SECTIONS UI_HIDE_USERS UI_HIDE_WARP UI_HIDE_CASCADE WARP_SSH_INSTALL_DIR; do - if [[ -z "${!__ui_var:-}" ]] && [[ -n "${PREV_CONTAINER_ENV}" ]]; then +for __reuse_var in UI_HIDE_SECTIONS UI_HIDE_USERS UI_HIDE_WARP UI_HIDE_CASCADE WARP_SSH_INSTALL_DIR \ + ALLOW_COMMUNITY_GITHUB_ACTIVATION COMMUNITY_PRIVATE_INSTALL_SCRIPT_URL COMMUNITY_INSTALL_FETCH_MS PRIVATE_INSTALL_SCRIPT_MAX_BYTES \ + COMMUNITY_UPGRADE_URL COMMUNITY_UPGRADE_PITCH AMNEZIA_EDITION \ + EXPORT_CONFIG_SECRET CLIENT_CONFIG_ENDPOINT CLIENT_EXPORT_DNS1 CLIENT_EXPORT_DNS2; do + if [[ -z "${!__reuse_var:-}" ]] && [[ -n "${PREV_CONTAINER_ENV}" ]]; then PREV_VAL="" while IFS= read -r __line; do - if [[ "${__line}" == "${__ui_var}="* ]]; then + if [[ "${__line}" == "${__reuse_var}="* ]]; then PREV_VAL="${__line#*=}" break fi done <<<"${PREV_CONTAINER_ENV}" if [[ -n "${PREV_VAL}" ]]; then - printf -v "${__ui_var}" '%s' "${PREV_VAL}" - echo "→ ${__ui_var} восстановлен из предыдущего контейнера ${CONTAINER_NAME}." + printf -v "${__reuse_var}" '%s' "${PREV_VAL}" + echo "→ ${__reuse_var} восстановлен из предыдущего контейнера ${CONTAINER_NAME}." fi fi done @@ -175,15 +178,10 @@ for __warp_var in WARP_DIR WARP_CONF_PATH WARP_CLIENTS_LIST AMNEZIA_START_SCRIPT fi done -for __export_var in CLIENT_CONFIG_ENDPOINT CLIENT_EXPORT_DNS1 CLIENT_EXPORT_DNS2 EXPORT_CONFIG_SECRET; do - if [[ -n "${!__export_var:-}" ]]; then - RUN_ENV+=( -e "${__export_var}=${!__export_var}" ) - fi -done - -for __ui_var in UI_HIDE_SECTIONS UI_HIDE_USERS UI_HIDE_WARP UI_HIDE_CASCADE WARP_SSH_INSTALL_DIR; do - if [[ -n "${!__ui_var:-}" ]]; then - RUN_ENV+=( -e "${__ui_var}=${!__ui_var}" ) +for __panel_env_var in UI_HIDE_SECTIONS UI_HIDE_USERS UI_HIDE_WARP UI_HIDE_CASCADE \ + EXPORT_CONFIG_SECRET CLIENT_CONFIG_ENDPOINT CLIENT_EXPORT_DNS1 CLIENT_EXPORT_DNS2; do + if [[ -n "${!__panel_env_var:-}" ]]; then + RUN_ENV+=( -e "${__panel_env_var}=${!__panel_env_var}" ) fi done @@ -208,6 +206,24 @@ for __ce_var in COMMUNITY_UPGRADE_URL COMMUNITY_UPGRADE_PITCH ALLOW_COMMUNITY_GI fi done +host_tcp_port_in_use() { + local port="$1" + command -v ss >/dev/null 2>&1 || return 1 + ss -tln 2>/dev/null | grep -qE ":${port}([^0-9]|$)" +} + +if [[ "${SKIP_LANDING:-}" != "1" ]] && [[ -d "${INSTALL_DIR}/landing" ]]; then + if [[ "${LANDING_PORT:-80}" == "80" ]] && host_tcp_port_in_use 80; then + echo "⚠ На хосте занят TCP-порт 80 — лендинг нельзя привязать к :80 без конфликта." + LP=8081 + while host_tcp_port_in_use "${LP}" && [[ "${LP}" -lt 8100 ]]; do + LP=$((LP + 1)) + done + LANDING_PORT="${LP}" + echo "→ Использую LANDING_PORT=${LANDING_PORT} (или задайте LANDING_PORT=… явно)." + fi +fi + IP="$(hostname -I 2>/dev/null | awk '{print $1}' || true)" docker run -d --name "${CONTAINER_NAME}" --restart unless-stopped \