8.0 KiB
Синхронизация config.toml между mtg.ivx.su, gt1.ivx.su, gt2.ivx.su и gt3.ivx.su
Целевая схема:
- A (primary, запись):
mtg.ivx.su - B (replica, только чтение):
gt1.ivx.su,gt2.ivx.su,gt3.ivx.su
Изменения вносятся только на A (через API/бот), затем автоматически синхронизируются на все B.
1) Подготовка telemt-data на каждом B-сервере
cd /opt/telemt-plus
docker compose stop telemt
mkdir -p telemt-data/cache
Если ранее использовались отдельные файлы рядом с compose:
mkdir -p backup-telemt-$(date +%F-%H%M%S)
cp -a config.toml proxy-secret cache docker-compose.yml backup-telemt-$(date +%F-%H%M%S)/ 2>/dev/null || true
[ -f config.toml ] && cp -f config.toml telemt-data/config.toml
[ -f proxy-secret ] && cp -f proxy-secret telemt-data/proxy-secret
[ -d cache ] && cp -a cache/. telemt-data/cache/
Права под пользователя контейнера Telemt (uid/gid = 999):
chown -R 999:999 telemt-data
find telemt-data -type d -exec chmod 750 {} \;
find telemt-data -type f -exec chmod 640 {} \;
chmod 660 telemt-data/config.toml 2>/dev/null || true
chmod 770 telemt-data/cache 2>/dev/null || true
2) Compose-настройка (A и B)
Для сервиса telemt должен быть volume директории:
volumes:
- ./telemt-data:/run/telemt
Убрать:
./config.toml:/run/telemt/config.tomltmpfs: /run/telemt
3) Настройка API в config.toml
A (mtg.ivx.su)
[server.api]
enabled = true
read_only = false
B (gt1.ivx.su, gt2.ivx.su, gt3.ivx.su)
[server.api]
enabled = true
read_only = true
4) SSH-доступ A -> B без пароля
Выполняется на mtg.ivx.su:
ssh-keygen -t ed25519 -N "" -f ~/.ssh/telemt_sync
ssh-copy-id -i ~/.ssh/telemt_sync.pub [email protected]
ssh-copy-id -i ~/.ssh/telemt_sync.pub [email protected]
ssh-copy-id -i ~/.ssh/telemt_sync.pub [email protected]
ssh -i ~/.ssh/telemt_sync [email protected] "echo ok"
ssh -i ~/.ssh/telemt_sync [email protected] "echo ok"
ssh -i ~/.ssh/telemt_sync [email protected] "echo ok"
5) Установка lsyncd на A (mtg.ivx.su)
apt update && apt install -y lsyncd rsync
mkdir -p /etc/lsyncd
Создать файл /etc/lsyncd/lsyncd.conf.lua:
settings {
logfile = "/var/log/lsyncd.log",
statusFile = "/var/log/lsyncd.status",
nodaemon = false,
}
-- B1: gt1.ivx.su
sync {
default.rsyncssh,
source = "/opt/telemt-plus/telemt-data/",
host = "[email protected]",
targetdir = "/opt/telemt-plus/telemt-data/",
delay = 1,
exclude = { "cache/" },
rsync = {
archive = true,
compress = true,
_extra = {
"--delete",
"--chown=65532:65532",
"--chmod=Du=rwx,Dg=rx,Do=,Fu=rw,Fg=r,Fo=",
"-e", "ssh -i /root/.ssh/telemt_sync -o StrictHostKeyChecking=accept-new"
}
}
}
-- B2: gt2.ivx.su
sync {
default.rsyncssh,
source = "/opt/telemt-plus/telemt-data/",
host = "[email protected]",
targetdir = "/opt/telemt-plus/telemt-data/",
delay = 1,
exclude = { "cache/" },
rsync = {
archive = true,
compress = true,
_extra = {
"--delete",
"--chown=65532:65532",
"--chmod=Du=rwx,Dg=rx,Do=,Fu=rw,Fg=r,Fo=",
"-e", "ssh -i /root/.ssh/telemt_sync -o StrictHostKeyChecking=accept-new"
}
}
}
-- B3: gt3.ivx.su
sync {
default.rsyncssh,
source = "/opt/telemt-plus/telemt-data/",
host = "[email protected]",
targetdir = "/opt/telemt-plus/telemt-data/",
delay = 1,
exclude = { "cache/" },
rsync = {
archive = true,
compress = true,
_extra = {
"--delete",
"--chown=65532:65532",
"--chmod=Du=rwx,Dg=rx,Do=,Fu=rw,Fg=r,Fo=",
"-e", "ssh -i /root/.ssh/telemt_sync -o StrictHostKeyChecking=accept-new"
}
}
}
6) Первичная синхронизация (один раз)
Важно: на каждом B (gt1.ivx.su, gt2.ivx.su, gt3.ivx.su) должен быть установлен rsync:
# Выполнить на каждом B-сервере:
apt update && apt install -y rsync
На mtg.ivx.su:
# B1: gt1.ivx.su
rsync -az --delete \
--chown=65532:65532 \
--chmod=Du=rwx,Dg=rx,Do=,Fu=rw,Fg=r,Fo= \
-e "ssh -i /root/.ssh/telemt_sync -o StrictHostKeyChecking=accept-new" \
/opt/telemt-plus/telemt-data/ \
[email protected]:/opt/telemt-plus/telemt-data/
# B2: gt2.ivx.su
rsync -az --delete \
--chown=65532:65532 \
--chmod=Du=rwx,Dg=rx,Do=,Fu=rw,Fg=r,Fo= \
-e "ssh -i /root/.ssh/telemt_sync -o StrictHostKeyChecking=accept-new" \
/opt/telemt-plus/telemt-data/ \
[email protected]:/opt/telemt-plus/telemt-data/
# B3: gt3.ivx.su
rsync -az --delete \
--chown=65532:65532 \
--chmod=Du=rwx,Dg=rx,Do=,Fu=rw,Fg=r,Fo= \
-e "ssh -i /root/.ssh/telemt_sync -o StrictHostKeyChecking=accept-new" \
/opt/telemt-plus/telemt-data/ \
[email protected]:/opt/telemt-plus/telemt-data/
7) Запуск lsyncd
На A:
systemctl enable lsyncd
systemctl restart lsyncd
systemctl status lsyncd --no-pager
Если ошибка пути конфигурации:
systemctl cat lsyncd
8) Проверка работы
На каждом B (gt1.ivx.su, gt2.ivx.su, gt3.ivx.su):
cd /opt/telemt-plus
docker compose up -d --force-recreate telemt
docker logs --tail=100 telemt
На B проверить режим read-only:
curl -s http://127.0.0.1:9091/v1/health
В ответе ожидается read_only: true.
8.1) Перенастройка существующих B (slave) на новый uid/gid и повторный запуск синхронизации
Если B-серверы уже были настроены со старым --chown=999:999, выполните эти шаги, чтобы синхронизация снова применялась корректно.
- На A (
mtg.ivx.su) обновить конфигlsyncdи перезапустить демон (выполнять наmtg.ivx.suот root; желательно сначала остановитьtelemtна всех B по шагу 2, затем вставить блок целиком):
sed -i.bak 's/--chown=999:999/--chown=65532:65532/g' /etc/lsyncd/lsyncd.conf.lua
systemctl restart lsyncd
systemctl status lsyncd --no-pager
- На каждом B (
gt1.ivx.su,gt2.ivx.su,gt3.ivx.su) остановитьtelemtи выставить права под новыйuid/gid:
cd /opt/telemt-plus
docker compose stop telemt
chown -R 65532:65532 telemt-data
find telemt-data -type d -exec chmod 750 {} \;
find telemt-data -type f -exec chmod 640 {} \;
chmod 660 telemt-data/config.toml 2>/dev/null || true
chmod 770 telemt-data/cache 2>/dev/null || true
-
На A выполнить повторную полную синхронизацию на все B (команды из шага 6 с
--chown=65532:65532). -
На A перезапустить
lsyncd:
systemctl restart lsyncd
systemctl status lsyncd --no-pager
- На каждом B поднять контейнер и проверить, что узел в режиме read-only:
cd /opt/telemt-plus
docker compose up -d --force-recreate telemt
curl -s http://127.0.0.1:9091/v1/health
Ожидаемо:
- контейнер
telemtстартует без ошибок прав доступа; - в health-ответе
read_only: true; - после изменения
config.tomlна A файл автоматически обновляется на всех B.
9) Правило эксплуатации
- Мутации (
POST/PATCH/DELETE) делать только на A (mtg.ivx.su). - Бота направлять на API A.
- B (
gt1.ivx.su,gt2.ivx.su,gt3.ivx.su) держать как реплики только для чтения.