Commit 0a289478 authored by Vitaly Lipatov's avatar Vitaly Lipatov

Track Claude Code memory in .claude/memory/

Move memory files from ~/.claude/projects/... into the repo so other machines/users get them on clone. Credentials stay out of git in .claude/secrets/ (ignored by the existing .claude/* rule). Co-Authored-By: 's avatarClaude Opus 4.6 (1M context) <noreply@anthropic.com>
parent 006049c1
# Memory
## Где что хранится
- **Skills** (`.claude/skills/`): dns, pve, mail, eterban, vpn, network, sip — знания и процедуры
- **Docs** (`.claude/docs/`): dhash.ru, nfs, epm — справочная информация
- **CLAUDE.md**: таблица skills, общие правила
- **Memory** (здесь): feedback, планы, задачи, личные настройки
## SSH доступы
| Хост | Команда |
|---|---|
| hetzner.egw.eterhost.ru (135.181.95.108) | `ssh -p32 root@hetzner.egw.eterhost.ru` |
| igw.etersoft.ru (91.232.225.13) | `ssh root@igw.etersoft.ru` |
| egw.etersoft.ru (91.232.225.14) | `ssh root@egw.etersoft.ru` |
| priv = 91.232.225.1 (маршрутизатор) | `ssh -p32 priv.etersoft.ru` (lav, потом sudo) |
| mail.etersoft.ru | `ssh -p32 root@mail.etersoft.ru` |
| ns1.etersoft.ru | `ssh -p32 root@ns1.etersoft.ru` |
| evpn.eterfund.ru | `ssh -p32 root@evpn.eterfund.ru` |
| vpn.eterfund.ru | `ssh -p32 root@vpn.eterfund.ru` |
| vpn.office | `ssh vpn.office` (lav, не root) |
| kuma.office.etersoft.ru | `ssh root@kuma.office.etersoft.ru` |
| border (PVE-хост) | `ssh root@border` |
| beget.ogw.eterhost.ru (217.12.37.55) | `ssh root@beget.ogw.eterhost.ru` |
| telemt.eterfund.ru (91.232.225.3) | `ssh root@91.232.225.3` |
## Сервисы (не в skills)
- **Uptime Kuma** — https://kuma.office.etersoft.ru/ (admin, пароль: `.claude/secrets/credentials.md`)
- **Grafana** — https://telegraf.office.etersoft.ru/ (admin, пароль: там же), InfluxDB БД `gateways`
- **hetzner podman**: ns4 (SSH 22122), clamavmirror (SSH 22123), kuma (SSH 22124)
- NAT-логирование (conntrack): hetzner, vpn-серверы, server — `/var/log/conntrack/nat.log`
## Правила работы
- [feedback_no_unauthorized_actions.md](feedback_no_unauthorized_actions.md) — НЕ самовольничать на серверах
- [feedback_no_manual_override.md](feedback_no_manual_override.md) — НЕ вмешиваться в автоматику
- [feedback_alt_bugzilla_defaults.md](feedback_alt_bugzilla_defaults.md) — ALT Bugzilla: priority=P5, rep_platform=x86_64
- [feedback_dnsroot_danger.md](feedback_dnsroot_danger.md) — НИКОГДА не менять dnsRoot в AD crossRef
- [feedback_changelog_notes.md](feedback_changelog_notes.md) — вести заметки по объектам после изменений
- [feedback_verify_before_stating.md](feedback_verify_before_stating.md) — ВСЕГДА проверять информацию, не выдумывать
- [feedback_epmi_pkgconfig.md](feedback_epmi_pkgconfig.md)`epmi "pkgconfig(name)"` для build deps
- [feedback_upgrade_sisyphus.md](feedback_upgrade_sisyphus.md) — обновление LXC ALT p11 → Sisyphus
- Сброс пароля AD: `логин + uidNumber`
- DC: `ssh -p32 dc.etersoft.ru` (lav, потом sudo), samba-tool через sudo
## Планы
- [plans/PLANS.md](plans/PLANS.md) — индекс
- [plans/mail-etersoft-ru.md](plans/mail-etersoft-ru.md) — перенос почты: этапы 1-3 сделаны
## Задачи
- [project_decommission_sprintbox.md](project_decommission_sprintbox.md) — удалить контейнеры sprintbox
- [project_roundcube_fix.md](project_roundcube_fix.md) — fix_reply_button после обновления
- [project_vpn_telegraf_monitoring.md](project_vpn_telegraf_monitoring.md) — OpenVPN per-user статистика через telegraf+exec, ждём Etersoft#19028
## Десктоп lav
- [lav_desktop_hyprland.md](lav_desktop_hyprland.md) — Deferred + Ximper + Hyprland
## Уроки
- heredoc через SSH: `ssh host "cat > file" << 'EOF'` (кавычки вокруг маркера!)
- НЕ `iptables-restore` на работающей системе — сносит правила podman/docker
- При клонировании LXC в PVE — СНАЧАЛА поменять IP, ПОТОМ запускать
- `control ИМЯФАЙЛА РЕЖИМ` вместо chmod для suid/sgid на ALT
- epm: `-y` для неинтерактивной установки, `epm ei` для обновления
- WebFetch идёт через серверы Anthropic — для внутренних хостов использовать `curl`
- Обновление ALT: `epm release-upgrade --force`
- journald в LXC: `Storage=persistent` + `SystemMaxUse=16M`
- LXC на border: `systemd-tmpfiles-setup` status=73 → `systemd-tmpfiles --create`
- host03 — Etersoft hosting. `ssh -p32 root@host03`, sites81 = CTID 381
- Cyrus autocreate: разделитель `|`, НЕ пробел!
---
name: ALT Bugzilla defaults
description: Default field values for creating bugs in ALT Bugzilla (bugzilla.altlinux.org)
type: feedback
---
ALT Bugzilla не принимает стандартные дефолты. Правильные значения:
- **priority**: P5 (не Normal, не normal). Допустимые: P1, P2, P3, P4, P5
- **rep_platform**: x86_64 (не All)
- **version для Sisyphus**: `unstable` (единственная доступная)
- **op_sys**: Linux (работает)
**Why:** API возвращает ошибки вида "There is no Priority named 'Normal'" — значения привязаны к конкретным продуктам.
**How to apply:** При создании бага в ALT Bugzilla всегда указывать эти значения явно. Версии привязаны к продуктам — для Sisyphus только `unstable`. Перед созданием бага в новом продукте стоит запросить допустимые версии через API.
---
name: Вести заметки по настраиваемым объектам
description: После каждого изменения на сервере/сервисе записывать что менялось в отдельный файл заметок
type: feedback
---
Вести каталог заметок (changelog) по каждому настраиваемому объекту (серверу, сервису).
**Why:** Между сессиями теряется контекст — что и где менялось. Без записей невозможно понять, ломал ли я что-то ранее.
**How to apply:** После каждого изменения конфигурации на сервере/сервисе — записывать в файл `memory/objects/<имя-объекта>.md`:
- Дата изменения
- Что менялось (файлы, правила, конфиги)
- Зачем (контекст задачи)
- Какие файлы затронуты (полные пути)
Файлы: `memory/<имя-объекта>.md` — по одному на сервер/сервис.
---
name: dnsRoot in AD crossRef is critical
description: Never modify dnsRoot attribute in AD crossRef partition objects - it breaks KDC principal lookup
type: feedback
---
НИКОГДА не менять dnsRoot в crossRef-объектах AD (CN=Partitions,CN=Configuration). KDC использует dnsRoot для маппинга realm → domain partition. Изменение dnsRoot ломает Kerberos для всего домена (ошибка "Client not found in Kerberos database").
**Why:** 2026-04-07 изменил dnsRoot с "etersoft.ru" на "dc.etersoft.ru" чтобы починить LDAP referral'ы — сломал Kerberos для всего домена ETERSOFT.RU. Откат dnsRoot обратно починил.
**How to apply:** Для проблемы LDAP referral'ов на etersoft.ru (резолвится во внешний IP) использовать клиентский фикс LDAP_OPT_REFERRALS OFF, а не серверные изменения AD.
---
name: epmi_pkgconfig
description: Use epmi "pkgconfig(name)" directly to install build deps, don't guess package names
type: feedback
---
Для установки BuildRequires с pkgconfig() и vapi() использовать напрямую:
```
epmi "pkgconfig(gtk4)" "vapi(granite)" ...
```
**Why:** apt/epm умеет резолвить provides, не нужно угадывать имена пакетов.
**How to apply:** копировать зависимости из spec как есть в epmi.
---
name: etckeeper и .bak файлы
description: Перед правкой в /etc проверить etckeeper; не создавать .bak файлы если он есть. Etckeeper должен быть на всех серверах.
type: feedback
originSessionId: 66597659-4ec3-497e-82d6-2559cabe10c6
---
При любом редактировании файлов в `/etc` на любом сервере (в т.ч. внутри LXC/CT):
1. **Сначала проверить наличие etckeeper:**
```sh
which etckeeper && [ -d /etc/.git ]
```
2. **Если etckeeper установлен** — НЕ создавать `.bak` файлы (`sed -i.bak`, `cp file file.bak` и т.п.). История изменений уже отслеживается в git, а лишние `.bak` засоряют каталог и попадают в коммиты etckeeper.
3. **Если etckeeper НЕ установлен** — сообщить пользователю и предложить установить (`epm install etckeeper && etckeeper init && etckeeper commit "initial"`). Etckeeper должен быть на ВСЕХ серверах.
**Why:** Пользователь хочет, чтобы вся история /etc хранилась единообразно через etckeeper, а не разбросанными .bak файлами разной свежести. Это правило универсальное для всей инфраструктуры Etersoft.
**How to apply:** Перед любым `sed -i`, `Edit`, `Write` в /etc на удалённой машине — проверь etckeeper. На bare-metal хостах — на самом хосте; в LXC/CT — внутри контейнера (у каждого свой /etc и свой etckeeper).
---
name: no_manual_override_of_automation
description: НЕ обходить автоматику вручную — если не работает, чинить саму автоматику
type: feedback
---
Не вмешиваться вручную в работающие системы и автоматику. Не удалять lock-файлы, не убивать процессы, не перезапускать сервисы вручную когда есть штатный механизм.
**Why:** Меня может не быть рядом. Автоматика должна работать правильно сама по себе. Ручное вмешательство (rm lock, kill, ручной запуск) — это обход проблемы, а не решение. Если автоматика не сработала, значит она сломана и её нужно починить.
**How to apply:**
- Внести изменения → подождать → проверить результат
- Если автоматика не сработала — разбираться почему и чинить саму автоматику
- НЕ обходить: не rm lock, не kill -9, не ручной запуск автоматически управляемых скриптов
- Цель — чтобы всё работало без ручного вмешательства, всегда
---
name: no_unauthorized_actions
description: СТРОГО не самовольничать — всегда спрашивать перед действиями на серверах, особенно перед удалением/заменой файлов
type: feedback
---
**СТРОГО запрещено самовольничать:**
- НЕ скачивать, НЕ заменять бинарники/файлы на серверах без явного разрешения
- НЕ удалять файлы без спроса
- Перед любым изменяющим действием на удалённом сервере — сначала показать план и спросить
- Особенно касается: обновления ПО, замены конфигов, удаления файлов
- Сначала собрать информацию, показать пользователю, дождаться подтверждения
- Если задание не получается (сервер недоступен, ошибка) — СООБЩИТЬ о проблеме и СПРОСИТЬ, как действовать. НЕ придумывать альтернативное решение самостоятельно
- Пример: matrix.etersoft.ru недоступен → нельзя ставить matrix.to на web.matrix без спроса
---
name: Запрос паролей только через lavtomate
description: Пароли от пользователя получать ТОЛЬКО через mcp__lavtomate__password_request, не через tty/pinentry/ssh-password.
type: feedback
---
Любой пароль, который нужен от пользователя (master-password Bitwarden, sudo, SSH-пароль, root-пароли серверов, токены и т.п.) запрашивать **исключительно** через инструмент `mcp__lavtomate__password_request`.
НЕ запрашивать через:
- `pinentry` / `pinentry-curses` / `pinentry-qt`
- интерактивный `read -s` в bash
- GUI-диалоги (zenity, kdialog)
- приглашения sudo/ssh на tty
- прямые вопросы в чате ("пришли мне пароль")
**Why:** lavtomate — контролируемый канал для секретов, у которого есть аудит и возможность отменить/ограничить. Всё остальное либо утекает в терминал/логи, либо не работает в автоматизированных сессиях Claude Code.
**How to apply:**
- Перед любой командой, требующей пароль: вызвать `mcp__lavtomate__password_request` с описанием что за пароль и зачем.
- Для `rbw` — использовать неинтерактивный способ ввода master password (через переменную окружения `RBW_PASSWORD` или передать в pinentry stub), пароль предварительно получив через lavtomate.
- Для sudo — `sudo -S` + stdin (пароль из lavtomate).
---
name: ALT upgrade to Sisyphus lessons
description: Как правильно обновлять LXC-контейнер ALT p11 до Sisyphus
type: feedback
---
## Обновление ALT p11 → Sisyphus в LXC
### Правильная последовательность (проверено):
```bash
# 0. Создать tmpdir (отсутствует в LXC!)
mkdir -p /tmp/.private/root
# 1. Обновить epm до актуальной версии
epm ei
# 2. Переключить репозитории на Sisyphus
epm repo switch Sisyphus
# 3. Поставить release-пакет Sisyphus ВРУЧНУЮ через apt
# (epm не может — конфликт altlinux-release-p11 с --no-remove)
apt-get update
apt-get install -y alt-os-release branding-alt-sisyphus-release
# 4. Обновить epm до Sisyphus-версии (содержит workarounds)
epm ei
# 5. Полное обновление
TERM=linux epm --auto --force release-upgrade Sisyphus 2>&1 | tee /root/upgrade-sisyphus.log
```
### Проблемы и причины:
1. `/tmp/.private/root` не существует в LXC — epm падает с "TMPDIR does not exist"
2. epm `--no-remove` не даёт удалить `altlinux-release-p11` при установке `branding-alt-sisyphus-release` — нужен прямой `apt-get install`
3. `branding-alt-sisyphus-release` зависит от `alt-os-release` — ставить оба одновременно
4. TERM=dumb в SSH/pct exec — epm отказывается. Нужен `TERM=linux`
5. `--auto` — правильный флаг для неинтерактивного режима (не `yes |`)
6. Shell может быть fish — heredoc не работает, использовать `bash -c`
7. При ошибке epm удаляет release-файл и откатывает репо — контейнер ломается
**Why:** Потратили ~10 попыток на обновление, пока не нашли правильную последовательность
**How to apply:** Всегда следовать этой последовательности. Ключевое — шаги 0 (tmpdir) и 3 (apt-get вместо epm для release-пакета)
---
name: verify_before_stating
description: ВСЕГДА проверять информацию перед утверждением, не выдумывать
type: feedback
---
Когда нет информации — не выдумывать, а проверять. Даже если есть информация — проверить альтернативно. Обязательно!
**Why:** Я уверенно заявил о встроенном SRS в Postfix, хотя его никогда не существовало. Из-за этого зря удалили postsrsd и потеряли время.
**How to apply:** Перед любым утверждением о возможностях ПО — проверить в исходниках, документации или на практике. Не полагаться на "знание" без верификации. Лучше сказать "не уверен, проверю" чем выдать выдумку за факт.
---
name: lav desktop - Hyprland on Deferred
description: Machine lav (192.168.0.55) setup - Deferred + Ximper + Hyprland, greetd, dual BenQ monitors
type: project
---
Машина lav (192.168.0.55) — десктоп, обновлён 2026-04-09.
**Система:**
- ALT Deferred (снимок Sisyphus) + репозитории Ximper Linux
- `epm repo add ximper` — подключает Ximper-репо через пакет ximper-repos
- `apt-conf-deferred` — правильно настраивает sources.list (Deferred + Ximper Additives/Substrates)
- SSH: `ssh lav@lav` (не `ssh lav` — там другой пользователь)
- root SSH: ключ добавлен в /root/.ssh/authorized_keys
**DE/WM:**
- Hyprland + greetd (regreet графический greeter)
- Конфиг greetd: `/etc/greetd/config.toml` → regreet-hyprland.toml
- lightdm отключён, greetd включён
- Мониторы: DP-1, DP-2 (оба BenQ 2560x1440). DP-2 слева, DP-1 справа
- Раскладка: us,ru, переключение CapsLock (grp:caps_toggle)
- Конфиги Ximper скопированы из /etc/skel/.config/ (hypr, kitty, waybar, swaync, wofi, wlogout, swappy)
**Засыпание отключено:**
- systemd: замаскированы sleep/suspend/hibernate/hybrid-sleep targets
- hypridle: убран listener с `systemctl suspend`
**Проблемы при обновлении:**
- `epm fix` / `apt-get -f install` падают если cwd — NFS-хомдир (rpm: Unable to open current directory). Решение: `cd /tmp`
- Deferred-снимок может быть старее p11 (Qt5 5.15.17 vs 5.15.18). Для даунгрейда: Pin `release l=Sisyphus` с Priority 1001
- `epm downgrade` не работает с `-y` (нужен `--force-yes`). Лучше вручную: preferences + `apt-get -y --force-yes dist-upgrade`
- `runlevel5.target` удалён при обновлении → `systemctl set-default graphical.target`
- lightdm некорректно настраивает wayland-сессию (input-устройства не привязываются к Hyprland)
**Why:** переход на Wayland для тестирования Ximper/Hyprland
**How to apply:** при работе с lav учитывать что это Deferred+Ximper, greetd, Hyprland
# Планы
Список задач, которые запланированы, но ещё не начаты.
## Активные планы
- [mail-etersoft-ru.md](mail-etersoft-ru.md) — Перенос почты: этапы 1-3 сделаны, reject работает. Осталось: этап 4 (autoconfig/roundcube), миграция mailboxes.db
## Завершённые планы
(пусто)
# Перенос почты: полный переход на виртуальные домены
**Статус:** этапы 1-3 применены на проде ✅, reject работает ✅
**Дата:** 2026-04-14
**Главная цель:** все домены Etersoft — виртуальные, Postfix отшивает несуществующие адреса на RCPT TO
## Проблема
- `etersoft.ru`, `etersoft.com/org/net/spb.ru` — в mydestination (локальные домены)
- Postfix принимает письма на любой адрес без проверки → bounce-спам (backscatter)
- Mailbox'ы хранятся в домене `office.etersoft.ru`, а не `etersoft.ru`
- Логин только `user@office.etersoft.ru`
## Текущая конфигурация
- Сервер: mail.etersoft.ru (91.232.225.46), Cyrus IMAP 3.4.6, Postfix
- MySQL: mysql.auth.dmz.etersoft.ru (10.20.30.191), БД `mail`, user=mail, pass=VaQLNsXnyp3KVK4e (--skip-ssl)
- Домены в mydestination: etersoft.ru, etersoft.com/org/net/spb.ru, mail.etersoft.ru, im.etersoft.ru + хостнеймы серверов
- Виртуальные домены (MySQL таблица `domain`): office.etersoft.ru, rusk.ru + ~50 других
- SASL: auxprop SQL, `SELECT password FROM accountuser WHERE username = '%u@%r' AND domain_name = '%r' AND imap = 1`
- defaultdomain: `Hoffice.etersoft.ru` (см. уроки)
- Roundcube: `username_domain = office.etersoft.ru` (на 10.20.30.66, `/etc/roundcube/config.inc.php`)
## План миграции
### Этап 1: SASL — принимать оба логина (нерабочее время)
**Проверено на стенде ✅**
Изменить SQL-запрос в `/etc/sasl2/{Cyrus,smtpd,saslpasswd}.conf`:
```sql
SELECT password FROM accountuser
WHERE ((username = '%u@%r' AND domain_name = '%r')
OR (username = CONCAT('%u', '@office.etersoft.ru')
AND domain_name = 'office.etersoft.ru' AND '%r' = 'etersoft.ru'))
AND imap = 1
LIMIT 1
```
- `user@etersoft.ru` → находит `user@office.etersoft.ru`
- `user@office.etersoft.ru` → работает как раньше ✅
- другие домены (rusk.ru) → не затронуты ✅
**ВАЖНО:** перед применением сверить конфиг побайтово с тестовым. На проде ранее сломалось — причина была в одновременном изменении defaultdomain, не в SQL.
### Этап 2: Postfix — regexp rewriting + убрать из mydestination
Убрать из `/etc/postfix/mydestination`:
- `etersoft.ru`, `etersoft.com`, `etersoft.org`, `etersoft.net`, `etersoft.spb.ru`
Оставить: `mail.etersoft.ru`, `im.etersoft.ru`, хостнеймы серверов
Создать `/etc/postfix/virtual-etersoft-regexp`:
```
/^(.+)@etersoft\.ru$/ ${1}@office.etersoft.ru
/^(.+)@etersoft\.com$/ ${1}@office.etersoft.ru
/^(.+)@etersoft\.org$/ ${1}@office.etersoft.ru
/^(.+)@etersoft\.net$/ ${1}@office.etersoft.ru
/^(.+)@etersoft\.spb\.ru$/ ${1}@office.etersoft.ru
```
Изменить `main.cf`:
```
virtual_alias_maps = regexp:/etc/postfix/virtual-etersoft-regexp, proxy:mysql:/etc/postfix/mysql-virtual.cf
```
Результат: `user@etersoft.ru` → rewrite в `user@office.etersoft.ru` → проверка через MySQL → 550 если нет.
### Этап 3: Миграция mailbox'ов (симлинк)
**Проверено на стенде ✅**
На файловой системе:
```bash
# Переименовать каталог
mv /var/spool/imap/domain/o/office.etersoft.ru /var/spool/imap/domain/e/etersoft.ru/
# Симлинк для совместимости
ln -s /var/spool/imap/domain/e/etersoft.ru /var/spool/imap/domain/o/office.etersoft.ru
```
В mailboxes.db: переименовать записи `office.etersoft.ru!user.*``etersoft.ru!user.*` через `cyradm renamemailbox` или `ctl_mboxlist`.
В MySQL: обновить `virtual` и `accountuser``office.etersoft.ru``etersoft.ru`.
После миграции regexp rewriting разворачивается:
```
/^(.+)@office\.etersoft\.ru$/ ${1}@etersoft.ru
```
### Этап 4: Autoconfig + Roundcube
- Autoconfig XML: логин `%EMAILLOCALPART%@etersoft.ru`
- Roundcube: `username_domain = etersoft.ru`
- Пользователи могут логиниться и старым и новым способом
### Откат (каждого этапа)
- Этап 1: вернуть оригинальный sql_select, перезапустить cyrus
- Этап 2: вернуть домены в mydestination, убрать regexp, `postfix reload`
- Этап 3: обратный mv + симлинк, восстановить mailboxes.db из бэкапа
## Извлечённые уроки
- **defaultdomain: Hoffice.etersoft.ru****намеренный хак**, НЕ менять! Когда defaultdomain совпадает с доменом логина, Cyrus отбрасывает домен и передаёт в SASL только username без @domain → аутентификация ломается. `Hoffice` не совпадает ни с чем → полный userid сохраняется.
- **Симлинк каталогов доменов** — работает на практике (проверено на стенде), хотя документация не рекомендует. Доставка через LMTP и чтение через IMAP — оба работают через симлинк. Но mailboxes.db нужно обновлять отдельно.
- **SASL SQL с OR/CONCAT** — работает корректно на стенде. Проблема на проде была из-за одновременного изменения defaultdomain.
- **loginrealms** — не помогает с алиасами доменов.
- **В Cyrus нет встроенного механизма алиасов доменов**.
## Тестовый стенд
- CT 943 на border, hostname `test-mail`, IP `10.20.30.246`
- Доступ: `ssh root@10.20.30.246`
- Cyrus IMAP 3.4.6 + Postfix + SASL SQL, конфиги с продакшена
- Локальный MySQL (mariadb, bind 127.0.0.1:3306), БД `mail` — копия таблиц accountuser/virtual/domain
- Тестовый пользователь: `testuser@office.etersoft.ru` / `testpass123`
- Проверено: SASL OR-запрос ✅, симлинк доменов ✅, доставка через LMTP ✅
## Заметки
- MySQL прод: `mysql --skip-ssl -h mysql.auth.dmz.etersoft.ru -u mail -p'VaQLNsXnyp3KVK4e' mail`
- MySQL стенд: `mariadb -u mail -p'VaQLNsXnyp3KVK4e' mail` (на 10.20.30.246)
- Cyrus conf: `/etc/imapd.conf`
- SASL confs: `/etc/sasl2/{Cyrus,smtpd,saslpasswd}.conf`
- Postfix virtual: `proxy:mysql:/etc/postfix/mysql-virtual.cf`
- Autoconfig XML: `/var/www/autoconfig/` на mail.etersoft.ru
- Roundcube config: `/etc/roundcube/config.inc.php` на 10.20.30.66
- ~140 пользователей в office.etersoft.ru, ~54 домена, ~340 алиасов
---
name: Вывод sprintbox из эксплуатации
description: Удалить контейнеры sprintbox на border, освободить IP, убрать DNS-записи
type: project
---
Отказ от sprintbox — удалить всё связанное.
**Why:** VDS sprintbox больше не используется.
**How to apply:**
1. Удалить контейнеры на border:
- CT 670 (cloak.ovpn.sprintbox.egw.etersoft.ru)
- CT 676 (ovpn.sprintbox.egw.etersoft.ru)
- Возможно другие — проверить `pct list | grep sprintbox`
2. Освободить IP-адреса (PTR в обратной зоне на ns1)
3. Убрать DNS-записи (A/AAAA) на ns1 в зоне egw.etersoft.ru
4. Убрать из route-health.sh / route-update.sh если упоминается
5. Убрать из CLAUDE.md (SSH доступы, упоминания sprintbox)
Дата постановки: 2026-04-11.
---
name: roundcube_fix_reply_button
description: После обновления roundcube нужно запускать fix_reply_button.sh
type: project
---
После обновления roundcube на mail.etersoft.ru нужно запускать:
```
/usr/share/roundcube/fix_reply_button.sh
```
**Why:** Без этого скрипта кнопка Reply не работает корректно после обновления.
**How to apply:** При любом обновлении roundcube (epm update, release-upgrade) — запустить скрипт.
---
name: VPN OpenVPN мониторинг через telegraf
description: Per-user OpenVPN статистика на evpn/vpn.eterfund/vpn.office в InfluxDB gateways
type: project
---
Настроен сбор статистики OpenVPN с серверов evpn.eterfund.ru, vpn.eterfund.ru, vpn.office в InfluxDB http://10.20.30.130:8086 (БД `gateways`).
**Why:** ALT-сборка telegraf 1.33.0-alt1 не включает плагин `inputs.openvpn` (заведён баг Etersoft#19028 на сборщиков). Временное решение — парсер-скрипт через `inputs.exec`.
**How to apply:**
- Скрипт-парсер: `/usr/local/bin/openvpn-telegraf.sh <status_file> <server_name>` — агрегирует по common_name, выдаёт InfluxDB line protocol
- Конфиг: `/etc/telegraf/telegraf.conf`, exec команды через `/bin/sudo -n` (telegraf в группе wheel — sudo wheelonly)
- Sudoers: `/etc/sudoers.d/telegraf-openvpn``telegraf ALL=(root) NOPASSWD: /usr/local/bin/openvpn-telegraf.sh`
- Status-файлы:
- evpn: `/var/log/openvpn/openvpn-status.log` → server=evpn
- vpn.eterfund: `/var/log/openvpn/openvpn-status.log` (server=vpn.eterfund) + `/var/log/openvpn/openvpn-azbyka-status.log` (server=azbyka)
- vpn.office: `/var/log/openvpn-status.log` → server=vpn.office
**Метрики:**
- `openvpn_server` (tags: server, gateway, host) — fields: `connected_clients`
- `openvpn_client` (tags: server, common_name, gateway, host) — fields: `bytes_received`, `bytes_sent`, `connections`
После сборки нативного плагина (Etersoft#19028) — заменить `inputs.exec` на `inputs.openvpn`, удалить sudoers и парсер.
...@@ -2,10 +2,12 @@ web/config ...@@ -2,10 +2,12 @@ web/config
vz/azbyka/base.task vz/azbyka/base.task
dns/whois-cache/* dns/whois-cache/*
router/.state/ router/.state/
# Claude Code: only track skills and docs # Claude Code: only track skills, docs, memory
.claude/* .claude/*
!.claude/skills/ !.claude/skills/
!.claude/skills/** !.claude/skills/**
!.claude/docs/ !.claude/docs/
!.claude/docs/** !.claude/docs/**
!.claude/memory/
!.claude/memory/**
.playwright-mcp/ .playwright-mcp/
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment