# 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-24–25 — Миграция пользователей 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 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 --- ## Что ещё нужно сделать - [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 после настройки DNS) - [ ] Проверить работу пользователей на 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) для внешних звонков