Как переставить Amnezia и сохранить старые конфигурации
Или "семь бед, один ответ".
Было много аналогичных вопросов, решил оформить в виде отдельного сообщения.
Часто может произойти следующее:
- один из протоколов Amnezia перестаёт работать;
- Amnezia начинает работать только на домашнем/мобильном Интернете;
- подключение есть, а Интернета - нет (этим часто страдает протокол Xray);
- протокол AmneziaWG очень долго подключается.
Что делать в таких случаях? А ответ у меня будет всего один: "Надо полностью переустановить операционную систему на VPS".
Заодно, посмотрите, какая ОС у вас стояла. Если это была Ubuntu 22.04, имеет смысл уже обновиться до Ubuntu 24.04.
Теперь объясню, почему рекомендую это сделать. Вы просто сэкономите кучу времени. Считайте сами:
1. Переустановка ОС
2. Обновление всего ПО на новой ОС
Да, после установки ОС, надо сразу обновить всё по с помощью этих 4 команд:
sudo apt update && sudo apt upgrade -y && sudo apt autoremove -y && sudo apt autoclean
3. Установка нужных протоколов в приложении Amnezia
Итого: минут 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" - это имя вашего файла, который вы сохранили ранее.
Итоговая последовательность действий:
- ставишь те же протоколы, что были раньше;
- останавливаешь контейнеры;
- заливаешь обратно сохранённые каталоги;
- запускаешь контейнеры;
- в приложении AmneziaVPN жмёшь "Check the server for previously installed Amnezia services"/"Проверить сервер на наличие ранее установленных сервисов Amnezia", чтобы приложение заново увидело уже установленные на сервере сервисы.
Amnezia действительно работает через Docker-контейнеры на сервере, а приложение умеет переобнаруживать уже установленные сервисы через этот пункт.