Files
knowledge-base/projects/niikn/changelog.md
Claude Code 066855ce28 mail.niikn.com: DNS настроен, сценарий задокументирован для dttb.ru
- README НИИКН: обновлён Mailcow (пароль, DNS, порты, ящик)
- changelog: добавлена запись о настройке mail.niikn.com
- credentials: добавлены Spaceweb, Mailcow НИИКН, NPM НИИКН
- decisions: сценарий настройки почтового сервера (шаблон для dttb.ru)
- snippets: скрипт spaceweb-dns-api.py для управления DNS

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-03 22:34:52 +00:00

431 lines
24 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# NIIKN — Журнал изменений
---
## 2026-02-24 — Подготовка VM108 (new.niikn.com) к продакшену
### Исправление Nextcloud AIO
- Контейнер `nextcloud-aio-nextcloud` был **unhealthy** — PHP-FPM не стартовал из-за зависшего процесса FTS-индексации
- Создан флаг `/mnt/ncdata/fts-index.done`, убит блокирующий процесс PID 255
- Контейнер поднялся, сайт `https://new.niikn.com` стал доступен
### Сетевая конфигурация VM108
- Назначен статический IP `192.168.1.200` (было DHCP 192.168.1.147)
- Файл: `/etc/netplan/99-static.yaml`
- На MikroTik (192.168.1.1): добавлена статическая DHCP-аренда, проброс Talk-порта 3479 (TCP/UDP), отключён UPnP
### UFW Firewall
- Установлен и настроен UFW
- Скрипт: `/home/cloud/setup-firewall.sh`
- Правила: SSH (22), Talk TURN (3479), Nextcloud Apache только от NPM (11000), LAN-доступ к admin-портам, Proxmox (192.168.1.201), Tailscale (wt0)
### Исправления конфигурации Nextcloud
- `trusted_proxies`: добавлен IP NPM (192.168.1.22)
- `forwarded_for_headers`: настроен для корректного определения IP клиентов
- `maintenance_window_start`: исправлено с `100` на `1` (1:00 UTC)
### NPM (Nginx Proxy Manager)
- Обновлён вручную пользователем: upstream изменён с 192.168.1.147 на 192.168.1.200
---
## 2026-02-24 — SMB LXC (192.168.1.79, LXC 110)
### Исправление прав файлов
- 104,645 файлов принадлежали root → исправлено: `chown -R admin:admin /srv/samba/share`
- Включена SSH-аутентификация по паролю
- Доступ: `admin / 1qaz!QAZ`
---
## 2026-02-24 — Groupfolders (VM100 → SMB)
### Состояние данных (проверено 2026-02-24)
| Папка | VM100 | SMB | Статус |
|-------|-------|-----|--------|
| Общий ресурс | 1.5 TB, 219,396 файлов | 1.5 TB, 227,960 файлов | ✅ SMB актуальнее |
| ГИКЭ_ВОКН_Москва | 1.2 TB, 238,903 файлов | 1.2 TB, 238,903 файлов | ✅ идентично |
- Данные на SMB уже были актуальны — дополнительное копирование не потребовалось
- SMB содержит более полную копию «Общий ресурс» (227,960 файлов vs 219,396 на VM100 — разница: удалённые пользователями файлы)
---
## 2026-02-2425 — Миграция пользователей VM100 → VM108
### Метод
1. Скопированы хэши паролей из БД VM100 (PostgreSQL) → VM108 одним запросом
2. Файлы перенесены через `rsync -a --rsync-path="sudo rsync"` по SSH
3. После переноса — `occ files:scan` для каждого пользователя
### Перенесённые пользователи (файлы)
| Пользователь | Объём | Время | Статус |
|---|---|---|---|
| op.shishova@yandex.ru (Оксана Шишова) | 734 GB | ~3.5ч | ✅ |
| 15101995ol@gmail.com | 45 MB | <1 мин | ✅ |
| office-msk-exp@mail.ru | 171 MB | <1 мин | ✅ |
| 4sa56621@gmail.com | 2.5 GB | 21 сек | ✅ |
| 19761113@mail.ru (Lentovcky) | 21 GB | 6 мин | ✅ |
| maksimmaul@gmail.com | 5.3 GB | 1.5 мин | ✅ |
| Starodubtseva.t.97@mail.ru | 17 GB | 4 мин | ✅ |
| ulyanova140@gmail.com | 59 GB | 14 мин | ✅ |
| ali6507@yandex.ru | 16 GB | 6 мин | ✅ |
| olga_gorkova_arch@mail.ru | 1.6 GB | 15 сек | ✅ |
| Dyomina Elizaveta | 429 MB | <1 мин | ✅ |
| Zlotya Vladlena | 209 MB | <1 мин | ✅ |
| + ~80 пользователей | ~35-38 MB | <1 мин | ✅ |
### Пропущены (системные / не нужны)
- `admin`, `test`, `test2`, `Guest001`
### Итог миграции
- Старт: 2026-02-24 21:27
- Завершение: 2026-02-25 23:42
- Файлов перенесено: **всего ~120+ GB крупных данных + мелкие**
- Пароли: скопированы для всех ~90 пользователей
- files:scan: выполнен для 24 пользователей с новыми данными
- Ошибок: 0
### Инструменты миграции (хранятся на VM108)
- `/tmp/migrate-users.sh` — основной скрипт миграции
- `/tmp/prox_key` — SSH-ключ для доступа к VM100
- `/tmp/migrate-users.log` — полный лог последнего запуска
---
## 2026-02-25 — Groupfolders как Local External Storage (VM108)
### Архитектурное решение
Выбран **Вариант 2**: SMB смонтирован локально на VM108 и подключён как **Local** External Storage в Nextcloud AIO.
Преимущества перед прямым SMB/CIFS из Nextcloud:
- Скорость: доступ через локальную файловую систему, без overhead SMB-протокола внутри контейнера
- Groupfolders вынесены за периметр AIO Backup — не нагружают резервное копирование 2.7 TB лишними данными
- Хранилище SMB (LXC 110) живёт отдельно и независимо от AIO
### Настройка монтирования SMB на VM108
**Файл учётных данных** `/etc/samba/smb-niikn.creds` (chmod 600):
```
username=admin
password=1qaz!QAZ
```
**Запись в `/etc/fstab`:**
```
//192.168.1.79/share /mnt/ncsmb cifs credentials=/etc/samba/smb-niikn.creds,uid=33,gid=33,file_mode=0770,dir_mode=0770,vers=3.0,_netdev,nofail 0 0
```
- `uid=33,gid=33` — www-data (владелец файлов внутри контейнера Nextcloud)
- `_netdev,nofail` — монтируется только после сети, не блокирует загрузку при отсутствии SMB
**Монтирование:**
```bash
sudo apt install cifs-utils
sudo mount -a
```
### Видимость внутри контейнера Nextcloud AIO
`NEXTCLOUD_MOUNT=/mnt` уже был задан в AIO — весь `/mnt` хоста пробрасывается в контейнер.
Однако propagation=`rprivate`: новые подмонтирования, сделанные **после** старта контейнера, не видны автоматически.
**Решение:** `docker restart nextcloud-aio-nextcloud` после монтирования `/mnt/ncsmb`.
### External Storage в Nextcloud (итоговая конфигурация)
| ID | Путь в NC | Тип | Источник на хосте | Группа |
|----|-----------|-----|-------------------|--------|
| 1 | `/Локально` | Local | `/mnt/ncdata` | admin |
| 4 | `/Общий ресурс` | Local | `/mnt/ncsmb/__groupfolders/Общий ресурс` | НИИКН |
| 5 | `/ГИКЭ_ВОКН_Москва` | Local | `/mnt/ncsmb/__groupfolders/ГИКЭ_ВОКН_Москва` | НИИКН |
Команды создания:
```bash
docker exec -u www-data nextcloud-aio-nextcloud php occ files_external:create \
'Общий ресурс' local null::null \
--config=datadir='/mnt/ncsmb/__groupfolders/Общий ресурс'
docker exec -u www-data nextcloud-aio-nextcloud php occ files_external:create \
'ГИКЭ_ВОКН_Москва' local null::null \
--config=datadir='/mnt/ncsmb/__groupfolders/ГИКЭ_ВОКН_Москва'
# Назначить группу НИИКН
docker exec -u www-data nextcloud-aio-nextcloud php occ files_external:applicable --add-group=НИИКН 4
docker exec -u www-data nextcloud-aio-nextcloud php occ files_external:applicable --add-group=НИИКН 5
```
Старый External Storage типа SMB/CIFS (ID=2, `/SMB`) удалён.
---
## 2026-02-25 — Установка Mailcow (VM106, 192.168.1.128)
### Конфигурация VM
| Параметр | Значение |
|----------|----------|
| Proxmox ID | VM106 |
| OS | Ubuntu 24.04.4 LTS Server (cloud image) |
| IP | 192.168.1.128 (статический) |
| CPU | 4 vCPU |
| RAM | 8 GB |
| Диск | 60 GB |
| SSH пользователь | cloud / 1qaz!QAZ |
| Mailcow hostname | mail.niikn.com |
| Timezone | Europe/Moscow |
### Подготовка VM
- Исходная VM106 была с Ubuntu Desktop — переустановлена через Proxmox
- Использован Ubuntu 24.04 Server cloud image (`noble-server-cloudimg-amd64.img`)
- Диск расширен до 60 GB, cloud-init настроен через Proxmox (user=cloud, NOPASSWD sudo, SSH key)
- Статический IP назначен через `/etc/netplan/99-static.yaml`
### Docker (официальный репозиторий)
```bash
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | install -m 0755 /etc/apt/keyrings/docker.asc
echo "deb [arch=amd64 signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu noble stable" > /etc/apt/sources.list.d/docker.list
apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin git curl
```
### Mailcow установка
```bash
git clone https://github.com/mailcow/mailcow-dockerized /opt/mailcow-dockerized
cd /opt/mailcow-dockerized
# Сгенерирован конфиг (MAILCOW_HOSTNAME=mail.niikn.com, TZ=Europe/Moscow)
docker compose pull
docker compose up -d
```
### UFW правила
Открытые порты: 22 (SSH), 25 (SMTP), 80 (HTTP), 443 (HTTPS), 465 (SMTPS), 587 (Submission), 993 (IMAPS), 995 (POP3S), 4190 (Sieve)
### Доступ к веб-интерфейсу
- URL: `https://mail.niikn.com` (внешний) или `http://192.168.1.128` (локальный)
- Логин: `admin` / `moohoo` (сброшен вручную, сменить после входа)
### Важно: формат пароля admin в Mailcow
Mailcow хранит пароли admin в формате **SSHA256** (Dovecot), а не bcrypt.
При ручном сбросе пароля через БД использовать только `doveadm pw`:
```bash
cd /opt/mailcow-dockerized
# Сброс пароля admin через официальный скрипт (интерактивный):
bash helper-scripts/mailcow-reset-admin.sh
# Или вручную через doveadm + MySQL:
HASH=$(docker exec mailcowdockerized-dovecot-mailcow-1 doveadm pw -s SSHA256 -p "НовыйПароль" | tr -d '\r')
docker exec mailcowdockerized-mysql-mailcow-1 mysql -u mailcow -p<DBPASS> mailcow \
-e "UPDATE admin SET password='${HASH}' WHERE username='admin';"
```
DBPASS находится в `/opt/mailcow-dockerized/mailcow.conf` (DBPASS=8VcUSgpKEOoxNojIZBRJx0FzMxzm)
### Статус контейнеров
Все 18 контейнеров запущены: nginx, postfix, dovecot, rspamd, clamd, mysql, redis, unbound, sogo, php-fpm, acme, watchdog и др.
### Что нужно сделать для завершения настройки
1. **DNS записи** для niikn.com (у регистратора):
- `A mail.niikn.com → <белый IP>`
- `MX niikn.com → mail.niikn.com (приоритет 10)`
- `TXT niikn.com → v=spf1 mx ~all`
- `TXT _dmarc.niikn.com → v=DMARC1; p=none; rua=mailto:admin@niikn.com`
- DKIM — получить после входа в Mailcow → Конфигурация → ARC/DKIM
2. **PTR запись (rDNS)** — запросить у провайдера: `<белый IP> → mail.niikn.com`
3. **MikroTik** — проброс портов 25, 80, 443, 465, 587, 993, 995, 4190 → 192.168.1.128
4. **Статическая DHCP-аренда** на MikroTik для MAC `BC:24:11:7E:B7:14` → 192.168.1.128
5. **Let's Encrypt** — автоматически получит SSL после настройки DNS
6. **Сменить пароль admin** в веб-интерфейсе
---
## 2026-02-25 — Проверка установки Nextcloud AIO (VM108)
### Метод установки
- Nextcloud AIO запущен через `docker run` с `--label com.docker.compose.project=nextcloud-aio`**официальный метод**
- Docker Compose файлов на системе нет
- Mastercontainer (`nextcloud-aio-mastercontainer`) сам управляет остальными контейнерами через Docker socket (`:ro`)
- Создан: `2026-02-21T10:09:26` — работает стабильно
### Portainer
- Работает на VM108 как отдельный контейнер (`portainer/portainer-ce:latest`)
- Видит контейнеры AIO как «стек nextcloud-aio» (по label), но **не создавал и не управляет** ими
- Имеет полный доступ к Docker socket — использовать только для мониторинга
### Состояние контейнеров (проверено 2026-02-25)
Все 13 контейнеров AIO — **healthy**, uptime 40+ часов:
`apache`, `nextcloud`, `database`, `redis`, `fulltextsearch`, `onlyoffice`, `imaginary`, `talk`, `talk-recording`, `whiteboard`, `notify-push`, `docker-socket-proxy`, `mastercontainer`
### Важно
- Управление Nextcloud AIO — только через `https://new.niikn.com:8080` или `docker exec -u www-data nextcloud-aio-nextcloud php occ`
- Никогда не перезапускать и не изменять контейнеры AIO через Portainer
---
## 2026-03-03 — Переименование бота НИИКН + SSH доступ
### Переименование бота (LXC 133, 10.0.0.237)
- Telegram: имя изменено с "Максимка" на **"НИИКН помощник"** (@maximka_assistant_bot)
- Описание бота обновлено: "ИИ-помощник НИИКН"
- IDENTITY.md: имя → "НИИКН помощник", эмодзи → 🏛️
- SOUL.md полностью переписан:
- Новое имя и инструкция представляться как "НИИКН помощник"
- Добавлено **ВАЖНОЕ ПРАВИЛО**: перед любыми изменениями в инфраструктуре обязательно спрашивать подтверждение у администратора
- Добавлена информация об инфраструктуре НИИКН (Proxmox, NC AIO, VPS, VM)
- Сохранена ролевая модель доступа (admin vs сотрудники)
- Сервис clawdbot перезапущен
### SSH доступ бота к инфраструктуре НИИКН
- Сгенерирован ключ `ssh-ed25519 ...PzO3 niikn-helper@clawdbot-1` на LXC 133
- **Proxmox НИИКН (192.168.1.201)**: ключ добавлен, SSH работает ✅
- **NC AIO VM (192.168.1.200)**: ключ записан в /root/.ssh/authorized_keys через монтирование LV диска на Proxmox. Заработает после перезагрузки VM (кэш ФС)
- **VPS 89.111.140.86**: не используется в проекте НИИКН — пропущен
### Примечание
VM 192.168.1.200 также добавлен cloud-init диск (ide0: local-lvm:vm-108-cloudinit) с SSH ключом — можно удалить если не нужен.
---
## 2026-03-03 — NC Talk: попытка HPB на VPS, откат
### Проблема
Звонки через NC Talk не работали по сотовой сети (только по Wi-Fi/LAN).
### Что было сделано на VPS 89.111.131.105
1. Настроен HPB (signaling + Janus + coturn + NATS)
2. TURNS на порту 443 с Let's Encrypt сертификатом (turn.niikn.com)
3. Reverse proxy через NPM для signaling WebSocket
4. Отключен HTTP/2 на NPM для niikn.com (баг NC Talk #2211)
5. Оптимизации: expanded relay ports, full_trickle, maxstreambitrate=512Kbit/s
### Результат
- Десктоп: звонки работают <1 сек
- Мобильные (сотовая): НЕ работает — баг iOS/Android Talk (ICE timeout, IPv6 ULA)
### Откат
- Все VPS сервисы остановлены и отключены
- signaling_servers в NC Talk очищен
- NPM signaling proxy удалён
- HTTP/2 на NPM оставлен отключенным (улучшает Talk)
### Текущее состояние Talk
- Встроенный AIO сигнальный сервер работает: https://niikn.com/standalone-signaling/ (v2.1.0~docker)
- signaling_servers в NC Talk ПУСТ — нужно перезапустить AIO контейнеры Talk
- При перезапуске AIO автоматически пропишет signaling_servers с правильным shared secret
---
## 2026-03-03 — Восстановление NC AIO и подготовка миграции Groupfolders
### NC AIO — восстановление контейнеров
- Все контейнеры были остановлены при диагностике Talk HPB
- Запущены через AIO API (POST /api/docker/start с CSRF-токеном)
- Все 13 контейнеров healthy, NC доступен по https://niikn.com
### NC Talk — signaling восстановлен автоматически
- AIO при старте прописал signaling_servers:
- `https://new.niikn.com/standalone-signaling/`
- `https://niikn.com/standalone-signaling/`
- secret: `eba8b0547b0285a475157911300720f99886fe1202a3ca98`
### AIO auto-login из NC → исправлена ссылка
- Проблема: кнопка "Open AIO Interface" в NC admin вела на `localhost:8080` (нерабочая)
- Причина: mastercontainer ставит AIO_URL из Host заголовка при API-вызове /api/docker/start
- Исправление: патч `Admin.php` в контейнере nextcloud-aio-nextcloud — захардкожен `192.168.1.200:8080`
- Файл: `/var/www/html/apps/nextcloud-aio/lib/Settings/Admin.php`
- AIO_TOKEN: `4046205930d1fe250a29c6a50919083fcd61a9fe5feefec9`
- AIO пароль: `exemplary spender jolly rascal tipper crestless goes greasily`
- **Примечание:** патч сбросится при обновлении AIO контейнеров
### Бот НИИКН — переименование и SSH
- Telegram бот переименован: "Максимка" → "НИИКН помощник" (@maximka_assistant_bot)
- Обновлены IDENTITY.md и SOUL.md на LXC 133
- Добавлено правило: бот спрашивает подтверждение перед изменениями инфраструктуры
- SSH ключ `niikn-helper@clawdbot-1` добавлен на:
- Proxmox НИИКН (192.168.1.201) ✅
- NC AIO VM (192.168.1.200) ✅
- Старый NC VM 100 (192.168.1.245) ✅
### Корзина admin — очистка 2.2 TB
- Обнаружено: admin/files_trashbin содержал 2.2 TB удалённых 23.02 данных:
- `__groupfolders` (2.2 TB) — старая копия групповых папок
- `bitrix` (32 GB) — бэкап Битрикс
- Очищено через `occ trashbin:cleanup admin`
- Свободное место ncdata: 626 GB → **3.3 TB**
### Диск ncdata (VM 108) — расширение
- Пользователь увеличил виртуальный диск sdb до 4.4 TB
- `growpart /dev/sdb 1` + `resize2fs /dev/sdb1`
- Результат: 4.4 TB, свободно 3.3 TB
### Миграция Groupfolders — запущено копирование
- Источник: VM 100 (192.168.1.245), `/mnt/nc-data/__groupfolders/`
- Приёмник: VM 108 (192.168.1.200), `/mnt/ncdata/__groupfolders/`
- SSH ключ VM 108 → VM 100 настроен
- Запущен `rsync -avP --partial` через nohup (не прервётся при разрыве SSH)
- Скорость: ~195 MB/s, ожидаемое время: ~4 часа
- Лог: `/root/rsync-groupfolders.log` на VM 108
- Данные: 2.8 TB (1.5 TB Общий ресурс + 1.2 TB ГИКЭ_ВОКН_Москва + versions/trash)
- План миграции с правами: `projects/niikn/groupfolders-migration.md`
### Права Groupfolders — выгружены из старого NC
- Полный дамп таблиц: oc_group_folders, oc_group_folders_groups, oc_group_folders_manage, oc_group_folders_acl
- ACL привязаны к fileid → маппинг путей задокументирован
- Все группы (НИИКН, admin, Редактирование, Фотофиюксация ВОКН Москва, ДКН, test) уже существуют на новом NC
---
## 2026-03-03 — Настройка почтового сервера mail.niikn.com
### Выполненные шаги
1. **MikroTik — проброс портов (192.168.1.1)**
- SSH: AI / OL260380eg
- Проброшены порты 25, 465, 587, 993, 995, 4190 → 192.168.1.128 (Mailcow)
- Порты 80/443 не тронуты — идут на NPM
2. **NPM — proxy host #17 (192.168.1.22)**
- Создан: `mail.niikn.com``https://192.168.1.128:443`
- SSL: Let's Encrypt (cert ID 50), ssl_forced=true
- Mailcow сам обслуживает HTTPS — NPM проксирует на https backend
3. **DNS записи — Spaceweb API (vps.sweb.ru)**
- Логин: it5870yand / 1qaz!QAZ
- API: POST https://api.sweb.ru/domains/dns (JSON-RPC, URL-encoded body)
- Добавлены: MX (mail.niikn.com, pri 10), SPF, DMARC, DKIM
- Все записи распространились и видны через Google/Cloudflare DNS
4. **Mailcow — домен и ящики (192.168.1.128)**
- Домен niikn.com — был уже добавлен
- DKIM — был уже сгенерирован (selector=dkim, 2048-bit)
- Ящик noreply@niikn.com — был уже создан, пароль установлен: NiIkN-NoReply-2026!
- SMTP (587/STARTTLS) проверен — работает, тестовое письмо отправлено
5. **Пароль admin Mailcow**
- Изменён через API: POST /api/v1/edit/admin (X-API-Key: niikn-mailcow-api-2026)
- Новый пароль: 1qaz!QAZ
### Не выполнено
- **Nextcloud SMTP** — нет SSH к VM 108, NC API не поддерживает mail_smtp* настройки
- Настроить вручную: Администрирование → Email → SMTP 192.168.1.128:587, noreply@niikn.com
- **PTR (rDNS)** — текущий: Aquatern.access.comstar.ru → нужен mail.niikn.com
- Обратиться к провайдеру Комстар/МТС
### Spaceweb DNS API — сценарий для повторного использования (dttb.ru)
Подробный скрипт: `snippets/spaceweb-dns-api.py`
---
## Что ещё нужно сделать
- [x] ~~Перезапустить AIO контейнеры Talk → восстановить signaling_servers~~
- [x] ~~Настроить Groupfolders как полноценное приложение~~ (в процессе — rsync идёт)
- [ ] **После rsync:** создать Groupfolders, назначить права, scan (см. groupfolders-migration.md)
- [ ] **После rsync:** удалить External Storage ID 4 и 5 (SMB пока не удалять)
- [ ] Настроить AIO Backup на VM108
- [ ] Настроить SMTP для уведомлений Nextcloud (mail.niikn.com готов, нужно вписать в NC вручную)
- [ ] PTR запись: 85.235.181.190 → mail.niikn.com (провайдер Комстар/МТС)
- [ ] Проверить работу пользователей на new.niikn.com
- [ ] Решить судьбу Linkwarden и FileBrowser (переносить или нет)
- [ ] Зафиксировать статический IP для VM100 (сейчас DHCP 192.168.1.245)
- [ ] Проверить SSH бота к NC AIO после перезагрузки VM
- [ ] Удалить cloud-init диск ide0 с VM 108 (если не нужен)
- [ ] Установить и настроить Matrix на Proxmox НИИКН (VM 107 уже есть)
- [ ] Настроить Element для Nextcloud (riotchat app) для внешних звонков