Files
amnezia-web-pro-deploy/scripts/install.sh
2026-06-06 01:32:41 +03:00

107 lines
3.5 KiB
Bash
Executable File

#!/usr/bin/env bash
# Legacy GHCR installer. Default public install now goes through quick-install.sh
# -> amnezia_web-PRO_test/install.sh to avoid GHCR 403 for users without package access.
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}"
# shellcheck disable=SC1091
source "${ROOT_DIR}/scripts/lib-compose-v2.sh"
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_root
need_docker
ensure_compose_v2 || exit 1
COMPOSE=(docker compose)
if [[ "${USE_GHCR:-0}" != "1" ]]; then
echo "Этот сценарий использует private GHCR image и может дать 403 Forbidden."
echo "Для обычной установки используйте:"
echo " curl -fsSL https://raw.githubusercontent.com/andrey271192/amnezia-web-pro-deploy/main/quick-install.sh | sudo bash"
echo ""
echo "Если точно нужен старый GHCR-режим, запустите:"
echo " USE_GHCR=1 sudo -E bash scripts/install.sh"
exit 1
fi
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
# Убираем 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:-}")"
ADMIN_PASSWORD="$(trim_crlf "${ADMIN_PASSWORD:-}")"
: "${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
RESET_PANEL_PASSWORD=0
if [[ -n "${ADMIN_PASSWORD}" ]]; then
echo "→ ADMIN_PASSWORD задан — сбрасываю старый пароль панели в volume."
"${COMPOSE[@]}" -f "${COMPOSE_FILE}" --env-file "${ENV_FILE}" run --rm --no-deps --entrypoint sh panel -lc '
set -eu
if [ -f /data/password.hash ]; then
cp -p /data/password.hash "/data/password.hash.bak.$(date -u +%Y%m%dT%H%M%SZ)" 2>/dev/null || true
rm -f /data/password.hash
rm -f /data/session.secret
fi
'
RESET_PANEL_PASSWORD=1
fi
echo "→ up -d"
UP_ARGS=(up -d)
if [[ "${RESET_PANEL_PASSWORD}" == "1" ]]; then
UP_ARGS+=(--force-recreate)
fi
"${COMPOSE[@]}" -f "${COMPOSE_FILE}" --env-file "${ENV_FILE}" "${UP_ARGS[@]}"
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"