Commit 22d3fa85 authored by Vitaly Lipatov's avatar Vitaly Lipatov

memory: update MEMORY, references, skills and CLAUDE.md

parent 8037b7c0
...@@ -57,4 +57,18 @@ umount /srv && mount -o fsc /srv # remount не работает! ...@@ -57,4 +57,18 @@ umount /srv && mount -o fsc /srv # remount не работает!
## Changelog ## Changelog
(пока нет записей) ### 2026-07-18 — медленные метаданные `/srv` на builder64
- `/srv` экспортируется с `aspetos` из ZFS `ssd1/srv` (mirror: Crucial MX500 + Samsung 870 QVO), не из NVMe `pool0`.
- Локальный `git status --porcelain --untracked-files=no` в `/srv/lav/Projects/git-eter/etersoft-admin-essential` на aspetos: **25 ms** (`refresh index` 12.7 ms). Через NFS на builder64: **15–21 s**, из них `refresh index` 19.6 s.
- Во время запуска на builder64 `GETATTR` получал ответ сервера примерно за 0.22 ms, но ждал в клиентской NFS RPC-очереди около 64 ms на запрос; `ACCESS`/`LOOKUP` ждали 89–93 ms. Это клиентская перегрузка очереди RPC/слотов, а не задержка ZFS, SATA или сети.
- `zpool status -v ssd1`: без ошибок; SMART обоих SSD passed, uncorrectable/pending/reallocated = 0; в момент измерений диск не был загружен.
- Синхронная проверка 2026-07-18: на aspetos CPU idle 67–74%, iowait 0–1%, `ssd1` ~80–84 IOPS и <1.1 MB/s; nfsd не насыщен. Серверная сторона не является узким местом.
- Возможная причина высокого клиентского backlog: на сервере включены NFSv4 delegations (`fs.leases-enable=1`), а `TEST_STATEID` растёт аномально быстро (18 885 за 10 s на aspetos; на builder64 в отдельном интервале — 96 668 за 10 s). Есть известная старая Linux NFSv4 проблема с делегациями и избытком `TEST_STATEID`; для текущих ядер 6.12.68/6.12.74 совпадение симптомов ещё не доказывает ту же bug. Не отключать delegations без согласованного окна: потребуется перезапуск NFS и контрольный замер.
### Подтверждённый workaround — 2026-07-18
- В согласованное окно на `aspetos` временно выполнены `fs.leases-enable=0` и `serv nfs-server restart`; перезапуск прошёл успешно.
- После этого на builder64 `TEST_STATEID` = **0 за 10 s**. Контроль от владельца дерева `lav`: `git status --porcelain --untracked-files=no`**33.8 ms**, `refresh index`**27.8 ms** (до изменения 15–21 s / 19.6 s соответственно).
- Следовательно, первопричина тормозов `/srv` — NFSv4 delegations (`TEST_STATEID` storm), не ZFS, SATA или nfsd. Состояние **временно**: `fs.leases-enable=0` не сохранён в sysctl-конфигурации и исчезнет после перезагрузки. Закреплять только по отдельному решению.
- Контроль `/home` на builder64 после отключения delegations: `/home` = `homeserver:/home`, NFSv4.2 от aspetos; обход первых 1 000 файлов от `lav`**128 ms**, `TEST_STATEID` = **0 за 10 s**. Отдельная настройка `/home` не требуется: `fs.leases-enable` действует на все NFSv4-экспорты server-а.
...@@ -5,6 +5,7 @@ ...@@ -5,6 +5,7 @@
## Активные планы ## Активные планы
- [mail-etersoft-ru.md](mail-etersoft-ru.md) — Перенос почты: этапы 1-3 сделаны, reject работает. Осталось: этап 4 (autoconfig/roundcube), миграция mailboxes.db - [mail-etersoft-ru.md](mail-etersoft-ru.md) — Перенос почты: этапы 1-3 сделаны, reject работает. Осталось: этап 4 (autoconfig/roundcube), миграция mailboxes.db
- [rt-update.md](rt-update.md) — Обновление RT: p9/i686→p11/x86_64, recreate контейнер, тест-контур rt.pr.etersoft.ru. Бага 12480 (REOPENED). RT в ALT только 4.4.5 (апстрим 6.0.x). Связано: Kaiten #66499560
## Завершённые планы ## Завершённые планы
......
...@@ -14,20 +14,42 @@ Execute eterban task: $ARGUMENTS ...@@ -14,20 +14,42 @@ Execute eterban task: $ARGUMENTS
## Commands ## Commands
```bash ```bash
sudo eterban search IP # check if IP is banned sudo eterban search IP # check if IP is banned (grep ipset)
sudo eterban list # list all banned IPs sudo eterban check IP # check exact match (ipset test)
sudo eterban list # list all banned IPs (ipset list)
sudo eterban count # count banned sudo eterban count # count banned
sudo eterban ban IP # ban IP sudo eterban ban IP # ban IP
sudo eterban unban IP # unban IP sudo eterban unban IP # unban IP
sudo eterban info IP # show ban history/offenses
sudo eterban reset IP # reset offense counter
sudo eterban pending # list pending auto-unbans
sudo eterban permanent # list permanent bans
sudo eterban clear # unban ALL IPs (ipset flush)
``` ```
## Architecture (how it works)
**Storage**: ipset (`eterban_1` for IPv4, `eterban_1_ipv6` for IPv6)
**Control flow**:
1. `eterban ban IP``/usr/share/eterban/ban.py` → publishes to Redis channel `ban`
2. `eterban unban IP``/usr/share/eterban/unban.py` → publishes to Redis channel `unban`
3. `eterban_switcher.py` (main daemon in `eterban.service`) listens Redis pubsub and executes `ipset -A/-D`
4. Auto-unban: background thread in switcher checks `AutoBanManager` schedule, publishes to `unban` when ban period expires
**Why unban may fail**: if `eterban.service` is not running or not subscribed to Redis, `unban.py` silently succeeds (publish returns 0 subscribers) but ipset is NOT modified. Always verify with `eterban search` after unban.
**iptables rules** (created by switcher on startup):
- WAN interfaces: DNAT src from `eterban_1` to ban_server (91.232.225.67)
- WAN interfaces: REJECT FORWARD from `eterban_1` except ports 80,81,443
- Internal interface: DNAT dst from `eterban_1` ports 80,443 to ban_server:82
## Ban pages ## Ban pages
- External (banned IP → our sites): http://91.232.225.67/ (port 80/81) - External (banned IP → our sites): http://91.232.225.67/ (port 80/81)
- Internal (our users → banned IP): port 82, `eterban-internal.service` (int2.py, ThreadingHTTPServer) - Internal (our users → banned IP): port 82, `eterban-internal.service` (int2.py, ThreadingHTTPServer)
## NAT rules on priv (iptables) ## Config
- `eterban_1 src` → DNAT all traffic to 91.232.225.67 (ban page) - `/etc/eterban/settings.ini` — redis_server, ban_server, i_interfaces, internal_interface, whitelist_file
- `eterban_1 dst` → DNAT ports 80,443 to 91.232.225.67:82 (internal page) - `/etc/eterban/whitelist.txt` — whitelisted IPs/CIDRs (loaded on startup)
- `/usr/share/eterban/autoban_manager.py` — AutoBan logic (offense counting, escalating ban durations)
## Testing procedure ## Testing procedure
**NEVER ban our own servers (hetzner, etc.)!** **NEVER ban our own servers (hetzner, etc.)!**
......
...@@ -70,12 +70,27 @@ ansible-playbook -i /root/.ansible/hosts ansible/playbooks/NAME.yml ...@@ -70,12 +70,27 @@ ansible-playbook -i /root/.ansible/hosts ansible/playbooks/NAME.yml
| `/igw-api` | igw Route Management API (HTTP :80, самодок): списки bypass/direct/geo, проверка блокировки домена через шлюзы, экспорт маршрутов | | `/igw-api` | igw Route Management API (HTTP :80, самодок): списки bypass/direct/geo, проверка блокировки домена через шлюзы, экспорт маршрутов |
| `/sip` | Телефония: FreeSWITCH, телефоны, sipnet, dialplan | | `/sip` | Телефония: FreeSWITCH, телефоны, sipnet, dialplan |
### Документирование
Все важные сведения по инфраструктуре записывай в `.claude/docs/` — файлы в репозитории, доступные всем. Заметки в session memory — только для текущей работы, не для долгосрочных справок.
### Память проекта (`.claude/memory/`)
**Основная база знаний проекта.** Перед ответом на вопросы про инфраструктуру — ищи сначала туда (`grep`/`read` по `.claude/memory/`). Новые заметки, уроки и справочники пиши туда же. Структура:
- `MEMORY.md` — мастер-индекс (SSH-доступы, сервисы, правила, планы)
- `reference_*.md` — справочники по инфраструктуре
- `feedback_*.md` — правила и ограничения от пользователя
- `lesson_*.md` — извлечённые уроки (грабли)
- `project_*.md` — статусы проектов
- `objects/` — changelog по хостам
- `plans/` — планы
### Справочные документы (.claude/docs/) ### Справочные документы (.claude/docs/)
- `dhash.ru.md` — IPFS нода и gateway (CT 366) - `dhash.ru.md` — IPFS нода и gateway (CT 366)
- `nfs.md` — NFS серверы aspetos/spacer, manage-gids, FS-Cache - `nfs.md` — NFS серверы aspetos/spacer, manage-gids, FS-Cache
- `epm.md` — epm/serv команды для ALT Linux - `epm.md` — epm/serv команды для ALT Linux
- `host03.md` — хостинг host03.eterhost.ru (nginx + Apache CT 390), процедура добавления HTTPS - `host03.md` — хостинг host03.eterhost.ru (nginx + Apache CT 390), процедура добавления HTTPS
- `vaultwarden-lavtomate-bridge.md` — связка password_request ↔ Vaultwarden (брокер паролей): инструкция по реализации - `vaultwarden-lavtomate-bridge.md` — связка password_request ↔ Vaultwarden (брокер паролей): инструкция по реализации
- `sales.md` — серверы sales (production/oldsales/test), SSH (порт 32), sshfs монтирования, .task файлы
- `bugzilla.md` — bugs.etersoft.ru: инстанс Bugzilla 5.2.0 (nginx→httpd2/mod_perl→MySQL .191), REST auth (token/cookie/api_key), подключение, эксплуатация
- Ты помощник системного администратора и выполняешь задачи по моему указанию. Ведёшь себя осмотрительно и спрашиваешь при выполнении команд. - Ты помощник системного администратора и выполняешь задачи по моему указанию. Ведёшь себя осмотрительно и спрашиваешь при выполнении команд.
- Подключение к удалённым серверам либо без пользователя и потом sudo su -, либо сразу root@ - Подключение к удалённым серверам либо без пользователя и потом sudo su -, либо сразу root@
......
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