Amnezia
April 18

Как переставить Amnezia и сохранить старые конфигурации

Или "семь бед, один ответ".

Было много аналогичных вопросов, решил оформить в виде отдельного сообщения.

Часто может произойти следующее:

  • один из протоколов Amnezia перестаёт работать;
  • Amnezia начинает работать только на домашнем/мобильном Интернете;
  • подключение есть, а Интернета - нет (этим часто страдает протокол Xray);
  • протокол AmneziaWG очень долго подключается.

И т.д.

Что делать в таких случаях? А ответ у меня будет всего один: "Надо полностью переустановить операционную систему на VPS".

Заодно, посмотрите, какая ОС у вас стояла. Если это была Ubuntu 22.04, имеет смысл уже обновиться до Ubuntu 24.04.

Теперь объясню, почему рекомендую это сделать. Вы просто сэкономите кучу времени. Считайте сами:

1. Переустановка ОС

На это у вас уйдёт минут 5.

2. Обновление всего ПО на новой ОС

Да, после установки ОС, надо сразу обновить всё по с помощью этих 4 команд:

sudo apt update && sudo apt upgrade -y && sudo apt autoremove -y && sudo apt autoclean

Ещё 5 минут.

3. Установка нужных протоколов в приложении Amnezia

Ещё минут 5.

Итого: минут 15. У меня уже неоднократно были проблемы, которые описал в начале сообщения. И поступал именно так. Почему так происходит, не понятно.

Теперь будет сложно. Если вы хотите сохранить старые конфиги, чтобы они работали после перестановки ОС, придётся немного напрячься.

Как сохранить старые конфиги с сервера для Amnezia

Для начала надо создать в каталоге "/root" файл "amnezia-backup.sh" вот с таким содержимым:

#!/usr/bin/env bash
set -Eeuo pipefail

BACKUP_ROOT="/root/amnezia-backup"
DATE_TAG="$(date +%F_%H-%M-%S)"
WORKDIR="${BACKUP_ROOT}/${DATE_TAG}"
ARCHIVE="${BACKUP_ROOT}/amnezia-backup-${DATE_TAG}.tar.gz"

mkdir -p "$WORKDIR"

log() {
  echo "[*] $*"
}

warn() {
  echo "[!] $*" >&2
}

save_container_path() {
  local container="$1"
  local src_path="$2"
  local dst_name="$3"

  if docker ps -a --format '{{.Names}}' | grep -Fxq "$container"; then
    log "Найден контейнер: $container"
    mkdir -p "$WORKDIR/containers/$container"

    if docker cp "${container}:${src_path}" "$WORKDIR/containers/$container/$dst_name" 2>/dev/null; then
      log "Скопировано: ${container}:${src_path}"
    else
      warn "Не удалось скопировать ${container}:${src_path}"
    fi

    docker inspect "$container" > "$WORKDIR/containers/$container/inspect.json" || true
    docker logs --tail 200 "$container" > "$WORKDIR/containers/$container/logs.txt" 2>/dev/null || true
  else
    warn "Контейнер не найден: $container"
  fi
}

log "Создаю каталог бэкапа: $WORKDIR"

log "Сохраняю список контейнеров и образов"
docker ps -a > "$WORKDIR/docker-ps-a.txt" || true
docker images > "$WORKDIR/docker-images.txt" || true

log "Сохраняю docker compose / system info"
docker version > "$WORKDIR/docker-version.txt" 2>/dev/null || true
docker info > "$WORKDIR/docker-info.txt" 2>/dev/null || true
uname -a > "$WORKDIR/uname.txt" || true

log "Пытаюсь сохранить данные контейнеров Amnezia"

# AmneziaWG / AWG
save_container_path "amnezia-awg" "/opt/amnezia/awg" "awg"

# WireGuard (если использовался отдельный контейнер)
save_container_path "amnezia-wireguard" "/opt/amnezia/wireguard" "wireguard"

# OpenVPN
save_container_path "amnezia-openvpn-cloak" "/opt/amnezia/openvpn" "openvpn"

# Xray
save_container_path "amnezia-xray" "/opt/amnezia/xray" "xray"

# Cloak (если есть отдельно)
save_container_path "amnezia-cloak" "/opt/amnezia/cloak" "cloak"

log "Пытаюсь сохранить хостовый каталог /opt/amnezia"
if [ -d /opt/amnezia ]; then
  mkdir -p "$WORKDIR/host"
  cp -a /opt/amnezia "$WORKDIR/host/" 2>/dev/null || warn "Не удалось скопировать /opt/amnezia"
else
  warn "Каталог /opt/amnezia на хосте не найден"
fi

log "Сохраняю список томов Docker"
docker volume ls > "$WORKDIR/docker-volume-ls.txt" 2>/dev/null || true

log "Проверяю mounted volumes у контейнеров"
for c in amnezia-awg amnezia-wireguard amnezia-openvpn-cloak amnezia-xray amnezia-cloak; do
  if docker ps -a --format '{{.Names}}' | grep -Fxq "$c"; then
    docker inspect "$c" | grep -A 20 -B 5 '"Mounts"' > "$WORKDIR/${c}-mounts.txt" || true
  fi
done

log "Упаковываю всё в архив"
mkdir -p "$BACKUP_ROOT"
tar -czf "$ARCHIVE" -C "$BACKUP_ROOT" "$DATE_TAG"

log "Готово"
echo
echo "Архив:"
echo "  $ARCHIVE"
echo
echo "Проверь содержимое:"
echo "  tar -tzf $ARCHIVE | less"
echo
echo "Скопируй архив с сервера на свой компьютер:"
echo "  scp root@IP_СЕРВЕРА:$ARCHIVE ."

Что этот скрипт делает?

  • ищет контейнеры Amnezia ;
  • пытается сохранить данные из amnezia-awg, amnezia-openvpn-cloak, amnezia-xray, amnezia-wireguard, если они есть;
  • дополнительно сохраняет хостовый каталог /opt/amnezia;
  • упаковывает всё в один архив .tar.gz

Вам останется скопировать этот архив в надёжное место.

Как запустить:

chmod +x amnezia-backup.sh
sudo ./amnezia-backup.sh

Как вернуть старые конфиги с сервера для Amnezia

Итак, вы переустановили ОС, теперь надо вернуть всё как было, чтобы новая операционная система работал со старыми конфигурациями.

Для начала обновите на ОС ПО и поставьте в приложении AmneziaVPN нужные протоколы. Потом скопируйте файл со старыми конфигами на сервер в каталог "/root".

Кроме того, вам понадобиться вот файл "amnezia-restore.sh" вот с таким содержимым:

#!/usr/bin/env bash
set -Eeuo pipefail

if [[ $EUID -ne 0 ]]; then
  echo "Запусти от root: sudo ./amnezia-restore.sh /path/to/amnezia-backup-....tar.gz"
  exit 1
fi

if [[ $# -lt 1 ]]; then
  echo "Использование:"
  echo "  sudo ./amnezia-restore.sh /root/amnezia-backup/amnezia-backup-YYYY-MM-DD_HH-MM-SS.tar.gz"
  exit 1
fi

ARCHIVE="$1"
RESTORE_ROOT="/root/amnezia-restore"
EXTRACT_DIR="$RESTORE_ROOT/extracted"

log() {
  echo "[*] $*"
}

warn() {
  echo "[!] $*" >&2
}

need_cmd() {
  command -v "$1" >/dev/null 2>&1 || {
    echo "Команда не найдена: $1"
    exit 1
  }
}

container_exists() {
  docker ps -a --format '{{.Names}}' | grep -Fxq "$1"
}

stop_if_exists() {
  local c="$1"
  if container_exists "$c"; then
    log "Останавливаю контейнер $c"
    docker stop "$c" >/dev/null 2>&1 || true
  else
    warn "Контейнер $c не найден"
  fi
}

start_if_exists() {
  local c="$1"
  if container_exists "$c"; then
    log "Запускаю контейнер $c"
    docker start "$c" >/dev/null 2>&1 || true
  fi
}

restore_path_to_container() {
  local container="$1"
  local local_path="$2"
  local remote_parent="$3"

  if [[ ! -e "$local_path" ]]; then
    warn "Локальный путь не найден: $local_path"
    return 0
  fi

  if ! container_exists "$container"; then
    warn "Контейнер не найден: $container"
    return 0
  fi

  log "Готовлю каталог в контейнере $container:$remote_parent"
  docker exec "$container" sh -c "mkdir -p '$remote_parent' && rm -rf '${remote_parent:?}'/*" || true

  log "Копирую $local_path -> $container:$remote_parent"
  docker cp "$local_path" "$container:$remote_parent"
}

need_cmd tar
need_cmd docker

if [[ ! -f "$ARCHIVE" ]]; then
  echo "Архив не найден: $ARCHIVE"
  exit 1
fi

mkdir -p "$EXTRACT_DIR"
rm -rf "$EXTRACT_DIR"/*

log "Распаковываю архив $ARCHIVE"
tar -xzf "$ARCHIVE" -C "$EXTRACT_DIR"

TOP_DIR="$(find "$EXTRACT_DIR" -mindepth 1 -maxdepth 1 -type d | head -n1)"
if [[ -z "${TOP_DIR:-}" ]]; then
  echo "Не удалось определить корневой каталог в архиве"
  exit 1
fi

log "Корневой каталог архива: $TOP_DIR"

# Пути из бэкапа
AWG_PATH="$TOP_DIR/containers/amnezia-awg/awg"
WG_PATH="$TOP_DIR/containers/amnezia-wireguard/wireguard"
OVPN_PATH="$TOP_DIR/containers/amnezia-openvpn-cloak/openvpn"
XRAY_PATH="$TOP_DIR/containers/amnezia-xray/xray"
CLOAK_PATH="$TOP_DIR/containers/amnezia-cloak/cloak"
HOST_OPT_AMNEZIA="$TOP_DIR/host/opt/amnezia"

log "Показываю найденные данные в архиве"
for p in "$AWG_PATH" "$WG_PATH" "$OVPN_PATH" "$XRAY_PATH" "$CLOAK_PATH" "$HOST_OPT_AMNEZIA"; do
  [[ -e "$p" ]] && echo "  найдено: $p"
done

echo
echo "ВАЖНО:"
echo "Перед запуском восстановления контейнеры Amnezia уже должны быть заново созданы."
echo "То есть сначала:"
echo "  1) Установи Docker"
echo "  2) Добавь сервер в Amnezia"
echo "  3) Установи через Amnezia те же протоколы, что были раньше"
echo "  4) Только потом запускай этот скрипт"
echo

read -r -p "Продолжить восстановление? [y/N] " ans
if [[ ! "$ans" =~ ^[Yy]$ ]]; then
  echo "Отменено"
  exit 0
fi

log "Останавливаю контейнеры Amnezia"
for c in amnezia-awg amnezia-wireguard amnezia-openvpn-cloak amnezia-xray amnezia-cloak; do
  stop_if_exists "$c"
done

# Восстановление данных в контейнеры
[[ -d "$AWG_PATH"   ]] && restore_path_to_container "amnezia-awg"           "$AWG_PATH"   "/opt/amnezia"
[[ -d "$WG_PATH"    ]] && restore_path_to_container "amnezia-wireguard"     "$WG_PATH"    "/opt/amnezia"
[[ -d "$OVPN_PATH"  ]] && restore_path_to_container "amnezia-openvpn-cloak" "$OVPN_PATH"  "/opt/amnezia"
[[ -d "$XRAY_PATH"  ]] && restore_path_to_container "amnezia-xray"          "$XRAY_PATH"  "/opt/amnezia"
[[ -d "$CLOAK_PATH" ]] && restore_path_to_container "amnezia-cloak"         "$CLOAK_PATH" "/opt/amnezia"

# Опционально: восстановить /opt/amnezia на хосте
if [[ -d "$HOST_OPT_AMNEZIA" ]]; then
  log "Восстанавливаю хостовый каталог /opt/amnezia"
  mkdir -p /opt
  rm -rf /opt/amnezia
  cp -a "$HOST_OPT_AMNEZIA" /opt/
else
  warn "Хостовый каталог /opt/amnezia в архиве не найден"
fi

log "Запускаю контейнеры обратно"
for c in amnezia-awg amnezia-wireguard amnezia-openvpn-cloak amnezia-xray amnezia-cloak; do
  start_if_exists "$c"
done

echo
echo "Готово."
echo
echo "Что проверить дальше:"
echo "  1) docker ps -a"
echo "  2) docker logs --tail 100 amnezia-awg"
echo "  3) docker logs --tail 100 amnezia-openvpn-cloak"
echo "  4) В Amnezia: Management -> Check the server for previously installed Amnezia services"
echo
echo "Если сервер IP/домен/порты изменились, старые клиентские конфиги могут перестать подключаться."

Как запустить:

chmod +x amnezia-restore.sh
sudo ./amnezia-restore.sh /root/amnezia-backup-2026-04-18_09-10-00.tar.gz

Где "amnezia-backup-2026-04-18_09-10-00.tar.gz" - это имя вашего файла, который вы сохранили ранее.

Итоговая последовательность действий:

  1. ставишь те же протоколы, что были раньше;
  2. останавливаешь контейнеры;
  3. заливаешь обратно сохранённые каталоги;
  4. запускаешь контейнеры;
  5. в приложении AmneziaVPN жмёшь "Check the server for previously installed Amnezia services"/"Проверить сервер на наличие ранее установленных сервисов Amnezia", чтобы приложение заново увидело уже установленные на сервере сервисы.

Amnezia действительно работает через Docker-контейнеры на сервере, а приложение умеет переобнаруживать уже установленные сервисы через этот пункт.

Вроде всё. Удачи!