Help:Backup: Difference between revisions

From Svacer Wiki
(add a note about pg_probackup)
(add link to installation manual for db, new user and permissions commands)
 
(4 intermediate revisions by the same user not shown)
Line 4: Line 4:


=== Если PostgreSQL запущен в виде сервиса ===
=== Если PostgreSQL запущен в виде сервиса ===
Если PostgreSQL запущен в виде сервиса, то для создания резервной копии БД перейдите в пользователя postgres и запустите создание дампа:
Если PostgreSQL запущен в виде сервиса, то для создания резервной копии БД перейдите в пользователя postgres и запустите создание дампа
    sudo su -l postgres
sudo su -l postgres
    pg_dump --clean -T tmp_diff* svacer_db > svacer.sql
pg_dump svacer_db > svacer.sql


где svacer_db — имя БД.
где svacer_db — имя БД.
Line 15: Line 15:
Для восстановления БД из дампа перейдите в пользователя postgres и запустите восстановление
Для восстановления БД из дампа перейдите в пользователя postgres и запустите восстановление


    sudo su -l postgres  
sudo su -l postgres  
    psql -f svacer.sql svacer_db  
psql -f svacer.sql svacer_db
 
Если база не пустая, для очистки перед восстановлением дампа надо удалить ее и создать заново
 
psql -c 'drop database svacer_db;'
psql -c 'create database svacer_db;'
 
Если переносите дамп в новый сервер PostgreSQL, создайте пользователя и назначьте ему права на БД, как в [[Help:Installation#Создание_БД_и_запуск_сервера_Svacer|руководстве по установке]].


=== Если PostgreSQL запущен в docker-контейнере ===
=== Если PostgreSQL запущен в docker-контейнере ===
Если PostgreSQL запущен в docker-контейнере, то для создания резервной копии БД выполните следующую команду
Если PostgreSQL запущен в docker-контейнере, то для создания резервной копии БД выполните следующую команду


    docker exec -t svacer_postgres pg_dump --clean -T tmp_diff* -U postgres svacer_db > svacer.sql
docker exec -t svacer-postgres pg_dump -U svace svacer_db > svacer.sql


где:
где:
* svacer_postgres — имя docker-контейнера
* svacer-postgres — имя docker-контейнера
* postgres — имя пользователя, под учётной записью которого создана БД
* svace — имя пользователя, под учётной записью которого создана БД
* svacer_db — имя БД
* svacer_db — имя БД


Для восстановления БД используйте команду
Для восстановления БД используйте команду


    cat svacer.sql | docker exec -i svacer_postgres psql -U postgres svacer_db
cat svacer.sql | docker exec -i svacer-postgres psql -U svace svacer_db
 
Если используете docker-compose со Svacer и PostgreSQL, сначала запустите только контейнер PostgreSQL, восстановите базу из бэкапа, после чего запустите контейнер Svacer
 
docker-compose up -d postgresql
cat svacer.sql | docker exec -i svacer-postgres psql -U svace svacer_db
docker-compose up -d
 
Если база не пустая, для ее очистки перед восстановлением дампа надо остановить контейнер PostgreSQL и удалить docker volume с базой, после чего запустить контейнер
 
docker-compose down
docker volume rm <postgres_volume_name>
docker-compose up -d postgresql


=== Бэкап object store в файле ===
=== Бэкап object store в файле ===
Line 36: Line 55:
Резервную копию object store можно создать, использовав следующую команду (доступна только пользователю с ролью admin)
Резервную копию object store можно создать, использовав следующую команду (доступна только пользователю с ролью admin)


    svacer server backup --user admin --password <password> --file <filename>.kvbak
svacer server backup --user admin --password <password> --file <filename>.kvbak


В результате object store будет сохранен в файл '''<filename>.kvbak'''
В результате object store будет сохранен в файл '''<filename>.kvbak'''
Line 42: Line 61:
Для восстановления из резервной копии требуется при запуске сервера указать этот файл в опции '''--load-from-backup'''.
Для восстановления из резервной копии требуется при запуске сервера указать этот файл в опции '''--load-from-backup'''.


    svacer-server run --pg <postgres_url> --store /home/svacer/new-store --load-from-backup <filename>.kvbak
svacer-server run --pg <postgres_url> --store /home/svacer/new-store --load-from-backup <filename>.kvbak


Восстановление возможно только в пустой object store. То есть в данном примере директория '''/home/svacer/new-store''' должна быть пустой.
Восстановление возможно только в пустой object store. То есть в данном примере директория '''/home/svacer/new-store''' должна быть пустой.
Line 51: Line 70:
Создание бэкапа:
Создание бэкапа:


    svacer server backup --user admin --password <password> --pg
svacer server backup --user admin --password <password> --pg


Бэкап создается в фоновом процессе, пользователь может продолжать работать с сервером. Результат работы команды состоит из ID бэкапа и времени создания. Эти данные печатаются в stdout
Бэкап создается в фоновом процессе, пользователь может продолжать работать с сервером. Результат работы команды состоит из ID бэкапа и времени создания. Эти данные печатаются в stdout


    ID = 23 CREATE_TS = 2022-10-06T06:04:33Z  
ID = 23 CREATE_TS = 2022-10-06T06:04:33Z  


Для печати списка существующих бэкапов используется команда:
Для печати списка существующих бэкапов используется команда:


    svacer server backup --user admin --password <password> --list-pg
svacer server backup --user admin --password <password> --list-pg


Результат печатается в stdout и включает ID и время создания бэкапа
Результат печатается в stdout и включает ID и время создания бэкапа


<pre>
<pre>
    2022-10-06T09:04:36.929+0300    info    Quering server configuration from http://localhost:8080/api/public/server/info
2022-10-06T09:04:36.929+0300    info    Quering server configuration from http://localhost:8080/api/public/server/info
    2022-10-06T09:04:36.930+0300    info    Server configuration grpc = 3002, rest = 8080
2022-10-06T09:04:36.930+0300    info    Server configuration grpc = 3002, rest = 8080
    2022-10-06T09:04:36.939+0300    info    Logged by user admin
2022-10-06T09:04:36.939+0300    info    Logged by user admin
    2022-10-06T09:04:36.941+0300    info    Backups:
2022-10-06T09:04:36.941+0300    info    Backups:
    ID = 23 CREATE_TS = 2022-10-06T06:04:33Z
ID = 23 CREATE_TS = 2022-10-06T06:04:33Z
</pre>
</pre>


Восстановление object store из бэкапа допустимо только при старте сервера. Для этого следует очистить текущий object store (или указать путь на новую директорию) и использовать следующий флаг при старте:
Восстановление object store из бэкапа допустимо только при старте сервера. Для этого следует очистить текущий object store (или указать путь на новую директорию) и использовать следующий флаг при старте:


    svacer-server run --load-from-pg-backup=<id>
svacer-server run --load-from-pg-backup=<id>


где <id> — ID бэкапа или 0, для использования последнего доступного бэкапа.
где <id> — ID бэкапа или 0, для использования последнего доступного бэкапа.
Line 79: Line 98:
Для очистки старых бэкапов используется следующая команда:
Для очистки старых бэкапов используется следующая команда:


    svacer server backup --user admin --password <password> --drop-pg=<lower>:<upper>
svacer server backup --user admin --password <password> --drop-pg=<lower>:<upper>


где <lower> и <upper> — нижняя и верхняя граница ID бэкапов.
где <lower> и <upper> — нижняя и верхняя граница ID бэкапов.
Line 85: Line 104:
При запуске сервера можно указать в переменной окружения SVACER_KV_BACKUP_MAX_AGE время хранения таких бэкапов. Задается в формате [https://pkg.go.dev/time#ParseDuration duration], к примеру 24h, 2h30m, 5m30s. По умолчанию 30 дней (720h). Очистка проводится как часть сборки мусора (т. е. периодичность проверки задается через переменную SVACER_GC_PERIOD).
При запуске сервера можно указать в переменной окружения SVACER_KV_BACKUP_MAX_AGE время хранения таких бэкапов. Задается в формате [https://pkg.go.dev/time#ParseDuration duration], к примеру 24h, 2h30m, 5m30s. По умолчанию 30 дней (720h). Очистка проводится как часть сборки мусора (т. е. периодичность проверки задается через переменную SVACER_GC_PERIOD).


  SVACER_GC_PERIOD=2h SVACER_KV_BACKUP_MAX_AGE=720h svacer-server run
SVACER_GC_PERIOD=2h SVACER_KV_BACKUP_MAX_AGE=720h svacer-server run


=== Бэкап object store вручную ===
=== Бэкап object store вручную ===
Line 97: Line 116:
При восстановлении из резервной копии поместите файлы object store в директорию по умолчанию (см. выше), либо в другую директорию и при запуске сервера Svacer укажите путь к ней одним из способов:
При восстановлении из резервной копии поместите файлы object store в директорию по умолчанию (см. выше), либо в другую директорию и при запуске сервера Svacer укажите путь к ней одним из способов:


* В переменной окружения SVACER_OBJECT_STORE:
* В переменной окружения SVACER_OBJECTS
  export SVACER_OBJECT_STORE=/home/user/data/object_store
export SVACER_OBJECTS=/home/user/data/object_store
  svacer-server run  
svacer-server run  
* В параметре --store:
* В параметре <code>--store</code>
  svacer-server run --store /home/user/data/object_store
svacer-server run --store /home/user/data/object_store
 
При запуске Svacer в docker-контейнере смонтируйте директорию с object store в контейнер как volume и укажите путь к ней в переменной <code>STORE</code> в файле <code>docker-compose.yml</code>


При запуске Svacer в docker-контейнере смонтируйте директорию с object store в контейнер как volume и укажите путь к ней в переменной '''STORE''' в файле '''docker-compose.yml'''
volumes:
  - /home/user/data:/data
environment:
  - STORE=/data/object_store


    volumes:
При использовании named docker volume, для восстановления данных временно примонтируйте его к другому контейнеру, скопируйте object store, размонтируйте, и после запустите с ним контейнер Svacer. Подробнее и с примерами — в документации [https://docs.docker.com/storage/volumes/#back-up-restore-or-migrate-data-volumes docker volumes]
      - /home/user/data:/data
    environment:
      - STORE=/data/object_store

Latest revision as of 18:14, 12 September 2025

Создание и восстановление резервной копии

Для переноса Svacer на другой сервер создайте резервные копии БД PostgreSQL и object store как описано ниже и восстановите их на новом сервере.

Для бэкапов PostgreSQL можно использовать более продвинутые решения, чем входящий в состав PostgreSQL pg_dump, например pg_probackup. В нем поддерживаются инкрементальные бэкапы, валидация бэкапа после создания, и прочие полезные возможности. Описание его настройки и использования смотрите в их документации

Если PostgreSQL запущен в виде сервиса

Если PostgreSQL запущен в виде сервиса, то для создания резервной копии БД перейдите в пользователя postgres и запустите создание дампа

sudo su -l postgres
pg_dump svacer_db > svacer.sql

где svacer_db — имя БД.

В результате дамп БД будет создан в файле svacer.sql

Для восстановления БД из дампа перейдите в пользователя postgres и запустите восстановление

sudo su -l postgres 
psql -f svacer.sql svacer_db

Если база не пустая, для очистки перед восстановлением дампа надо удалить ее и создать заново

psql -c 'drop database svacer_db;'
psql -c 'create database svacer_db;'

Если переносите дамп в новый сервер PostgreSQL, создайте пользователя и назначьте ему права на БД, как в руководстве по установке.

Если PostgreSQL запущен в docker-контейнере

Если PostgreSQL запущен в docker-контейнере, то для создания резервной копии БД выполните следующую команду

docker exec -t svacer-postgres pg_dump -U svace svacer_db > svacer.sql

где:

  • svacer-postgres — имя docker-контейнера
  • svace — имя пользователя, под учётной записью которого создана БД
  • svacer_db — имя БД

Для восстановления БД используйте команду

cat svacer.sql | docker exec -i svacer-postgres psql -U svace svacer_db

Если используете docker-compose со Svacer и PostgreSQL, сначала запустите только контейнер PostgreSQL, восстановите базу из бэкапа, после чего запустите контейнер Svacer

docker-compose up -d postgresql
cat svacer.sql | docker exec -i svacer-postgres psql -U svace svacer_db
docker-compose up -d

Если база не пустая, для ее очистки перед восстановлением дампа надо остановить контейнер PostgreSQL и удалить docker volume с базой, после чего запустить контейнер

docker-compose down
docker volume rm <postgres_volume_name>
docker-compose up -d postgresql

Бэкап object store в файле

Этот способ хорошо подходит, если object store достаточно большой (десятки гигабайт) и не желательно останавливать сервер Svacer. Резервную копию object store можно создать, использовав следующую команду (доступна только пользователю с ролью admin)

svacer server backup --user admin --password <password> --file <filename>.kvbak

В результате object store будет сохранен в файл <filename>.kvbak

Для восстановления из резервной копии требуется при запуске сервера указать этот файл в опции --load-from-backup.

svacer-server run --pg <postgres_url> --store /home/svacer/new-store --load-from-backup <filename>.kvbak

Восстановление возможно только в пустой object store. То есть в данном примере директория /home/svacer/new-store должна быть пустой.

Бэкап object store в сервере PostgreSQL

Резервную копию object store можно сохранить в PostgreSQL, который используется сервером Svacer. Данный механизм использует функциональность large object store из PostgreSQL. Этот способ хорошо подходит, если object store не очень большой, в пределах нескольких гигабайт.

Создание бэкапа:

svacer server backup --user admin --password <password> --pg

Бэкап создается в фоновом процессе, пользователь может продолжать работать с сервером. Результат работы команды состоит из ID бэкапа и времени создания. Эти данные печатаются в stdout

ID = 23 CREATE_TS = 2022-10-06T06:04:33Z 

Для печати списка существующих бэкапов используется команда:

svacer server backup --user admin --password <password> --list-pg

Результат печатается в stdout и включает ID и время создания бэкапа

 2022-10-06T09:04:36.929+0300    info    Quering server configuration from http://localhost:8080/api/public/server/info
 2022-10-06T09:04:36.930+0300    info    Server configuration grpc = 3002, rest = 8080
 2022-10-06T09:04:36.939+0300    info    Logged by user admin
 2022-10-06T09:04:36.941+0300    info    Backups:
 ID = 23 CREATE_TS = 2022-10-06T06:04:33Z

Восстановление object store из бэкапа допустимо только при старте сервера. Для этого следует очистить текущий object store (или указать путь на новую директорию) и использовать следующий флаг при старте:

svacer-server run --load-from-pg-backup=<id>

где <id> — ID бэкапа или 0, для использования последнего доступного бэкапа.

Для очистки старых бэкапов используется следующая команда:

svacer server backup --user admin --password <password> --drop-pg=<lower>:<upper>

где <lower> и <upper> — нижняя и верхняя граница ID бэкапов.

При запуске сервера можно указать в переменной окружения SVACER_KV_BACKUP_MAX_AGE время хранения таких бэкапов. Задается в формате duration, к примеру 24h, 2h30m, 5m30s. По умолчанию 30 дней (720h). Очистка проводится как часть сборки мусора (т. е. периодичность проверки задается через переменную SVACER_GC_PERIOD).

SVACER_GC_PERIOD=2h SVACER_KV_BACKUP_MAX_AGE=720h svacer-server run

Бэкап object store вручную

Создать бэкап object store можно вручную, просто скопировав директорию object store. Перед этим желательно остановить сервер Svacer для обеспечения целостности данных. Такой способ хорошо подходит, если object store достаточно большой (десятки гигабайт) и возможно остановить сервер Svacer. Для инкрементального бэкапа можно использовать rsync.

Если директория, где хранить object store не была явно указана при запуске сервера, по умолчанию он создается в следующей директории:

  • ~/.cache/svacer — в OC Linux
  • %LocalAppData%\svacer — в ОС Windows (например, С:\Users\myusername\AppData\Local\svacer)

При восстановлении из резервной копии поместите файлы object store в директорию по умолчанию (см. выше), либо в другую директорию и при запуске сервера Svacer укажите путь к ней одним из способов:

  • В переменной окружения SVACER_OBJECTS
export SVACER_OBJECTS=/home/user/data/object_store
svacer-server run 
  • В параметре --store
svacer-server run --store /home/user/data/object_store

При запуске Svacer в docker-контейнере смонтируйте директорию с object store в контейнер как volume и укажите путь к ней в переменной STORE в файле docker-compose.yml

volumes:
  - /home/user/data:/data
environment:
  - STORE=/data/object_store

При использовании named docker volume, для восстановления данных временно примонтируйте его к другому контейнеру, скопируйте object store, размонтируйте, и после запустите с ним контейнер Svacer. Подробнее и с примерами — в документации docker volumes