Документация
SETUP_HOME.md — ноут Олега (домашний сервер)
Простыми словами. Без программирования. Только практика. ТЗ —
ARCHITECTURE.md. Чек-лист —PRODUCTION.md. Статус —STATE.md.
1. Что мы строим
Два места + один транспорт:
| Где | Что | Для чего |
|---|---|---|
| VPS (Hetzner) | Сайт, оплата, Telegram-бот, превью 600px | Витрина |
| Ноут Олега (дома) | Оригиналы, znymkari-data, PostgreSQL |
Склад + цех |
SFTP (id_ed25519) |
Транспорт превью и метаданных на VPS | Связь ноут → VPS |
Как работает импорт ивента:
- Олег копирует фестиваль с SD-карты в
\\192.168.31.87\zny-festivals\<название>\. - В браузере на ноуте:
http://192.168.31.87:8000/→ Импорт. znymkari-data— копирует оригиналы в STORAGE, sanitize, превью 600px + QR, постеры видео + 10-сек mp4, пишет в БД.push_event— JSON (метаданные) + tar превью → SFTP на VPS.- VPS:
receive_event— мягкий merge через ORM.
Что происходит, когда клиент платит (план):
- Клиент платит на VPS.
- VPS генерит
DownloadToken. - Бот шлёт:
https://files.znymkari.com/d/<token>. - DNS ведёт на домашний IP.
- nginx дома спрашивает VPS «токен валиден?».
- VPS отвечает «да» → nginx дома отдаёт файл напрямую клиенту.
VPS трафик на оригиналы не тратит.
2. Что нужно для старта
2.1. Ноут Олега
- Ноутбук (бывший Revit/3D).
- Встроенный SSD — система, PostgreSQL, venv, превью на время push.
- Внешний HDD WD My Passport 2 ТБ (USB) — единое хранилище и оригиналы.
- Питание — постоянно.
- Сеть — Wi-Fi к роутеру Xiaomi. Ethernet-разъём сломан.
Роль ноута: мини-UPS. Батарея держит 2–4 ч.
2.2. Что понадобится
| Что | Зачем |
|---|---|
| Флешка 8 ГБ+ | Ubuntu Server |
| Другой комп | Записать образ |
| Браузер | Для работы с сайтом ноута |
| Доступ к роутеру | Проброс, DHCP-резерв |
2.3. Что уже есть
- ✅ Белый IP Олега:
193.176.249.24. - ✅ VPS:
128.140.81.213, ключznymkari-my. - ✅ Домен
znymkari.com. - ✅ SSH-ключ
id_ed25519. - ✅ Ubuntu Server 24.04 на ноуте.
- ✅ Wi-Fi Broadcom (
wlp8s0,192.168.31.87). - ✅ HDD 2 ТБ смонтирован в
/mnt/hdd. - ✅ Samba с шарами
zny-festivals/zny-heap.
3. Установка Ubuntu Server 24.04 (справка)
3.1. Записать образ
- Скачать Ubuntu Server 24.04 LTS — https://ubuntu.com/download/server.
- Скачать Rufus — https://rufus.ie.
- Rufus: устройство → флешка; образ →
.iso; схема GPT; «Старт».
3.2. Загрузиться с флешки
- Вставить флешку в ноут.
- Включить. Сразу жми Boot Menu (
F12,F10,F2,Esc). - Выбрать флешку.
3.3. Установка
- Язык: English.
- Keyboard: US / Ukrainian.
- Install Ubuntu Server.
- Network: Wi-Fi → сеть
Xiaomi_170B→ пароль. - Storage: - Use an entire disk на встроенном SSD. - LVM — галку снять. - HDD НЕ трогать.
- Профиль:
- Your name:
Oleg Arh. - Server name:oleg-home. - Username:olegarh. - Password: надёжный, записать! - Install OpenSSH server ✅.
- Snaps — ничего.
- Дождаться, Reboot.
3.4. Первый вход
Логин olegarh, пароль. Проверка:
ping -c 3 8.8.8.8
4. Первые настройки
4.1. Обновить систему
sudo apt update sudo apt upgrade -y sudo reboot
4.2. Wi-Fi IP
ip -4 addr show wlp8s0
Реально Wi-Fi получил 192.168.31.87. Ethernet enp9s0 сломан.
4.3. Автообновления
sudo apt install -y unattended-upgrades sudo dpkg-reconfigure --priority=low unattended-upgrades
На вопрос — Yes.
4.4. Wi-Fi Broadcom
sudo apt install -y broadcom-sta-dkms sudo reboot
После ребута:
ip -4 addr show wlp8s0
Важно: при обновлении ядра модуль wl пересобирается через DKMS.
Проверять после каждого apt upgrade.
4.5. Отключить сон
sudo sed -i 's/^#HandleLidSwitch=./HandleLidSwitch=ignore/' /etc/systemd/logind.conf sudo sed -i 's/^#HandleLidSwitchExternalPower=./HandleLidSwitchExternalPower=ignore/' /etc/systemd/logind.conf sudo sed -i 's/^#HandleLidSwitchDocked=./HandleLidSwitchDocked=ignore/' /etc/systemd/logind.conf sudo systemctl restart systemd-logind sudo systemctl mask sleep.target suspend.target hibernate.target hybrid-sleep.target
Крышку можно закрывать — ноут продолжает работать.
4.6. Пользователь deploy
sudo adduser --gecos "" --disabled-password deploy sudo usermod -aG sudo deploy echo "deploy ALL=(ALL) NOPASSWD: ALL" | sudo tee /etc/sudoers.d/deploy sudo chmod 440 /etc/sudoers.d/deploy sudo mkdir -p /home/deploy/.ssh sudo chmod 700 /home/deploy/.ssh sudo cp ~/.ssh/authorized_keys /home/deploy/.ssh/authorized_keys sudo chmod 600 /home/deploy/.ssh/authorized_keys sudo chown -R deploy:deploy /home/deploy/.ssh
olegarh — uid 1000, deploy — uid 1001.
4.7. MAC-адреса
- Wi-Fi
wlp8s0:10:08:B1:E5:64:D3. - Ethernet
enp9s0:F0:76:1C:5D:9B:62(сломан).
5. Роутер Xiaomi: DHCP и проброс
Роутер: http://192.168.31.1.
5.1. DHCP-резерв
«Налаштування локальної мережі» → «Призначення статичної IP-адреси DHCP».
- Wi-Fi
oleg-home(MAC10:08:B1:E5:64:D3) →192.168.31.87✅. - Ethernet
oleg-home(MACF0:76:1C:5D:9B:62) →.155(не используется).
5.2. Проброс порта
«Додаткові налаштування» → «Переадресація портів».
| Имя | Внешний | Внутренний IP | Внутренний порт | Протокол |
|---|---|---|---|---|
ssh-notebook |
22022 |
192.168.31.87 |
22 |
TCP |
5.3. Проверка извне
С телефона через мобильный интернет:
ssh -i C:\Users\A5375.ssh\id_ed25519 deploy@193.176.249.24 -p 22022
5.4. NAT loopback
Из локальной сети внешний IP 193.176.249.24 не работает.
Внутри — только 192.168.31.87:22. Это нормально для Xiaomi.
6. Внешний SSH
Зачем: разработчик (в Польше) должен зайти снаружи.
Раздел «Port Forwarding» / «Виртуальные серверы» / «Проброс портов».
| Поле | Значение |
|---|---|
| Имя | ssh-notebook |
| Внешний порт | 22022 |
| Внутренний IP | 192.168.31.87 |
| Внутренний порт | 22 |
| Протокол | TCP |
Безопасность:
/etc/ssh/sshd_config:
PasswordAuthentication no PermitRootLogin no
sudo systemctl restart ssh. Не делать, пока ключ не залит.
7. Что делает разработчик по SSH
Олег не делает ничего из этого. Всё — удалённо.
7.1. SSH-ключ
Ключ id_ed25519 уже залит в authorized_keys для olegarh и deploy.
7.2. Стек (готов)
- Python 3.14, pip, venv.
- PostgreSQL 18 (
uk_UA.UTF-8). - nginx 1.28.
- ffmpeg 8.0.1.
- git, build-essential, libpq-dev, rsync, ntfs-3g, smartmontools.
7.3. Монтирование дисков
- SSD — один раздел,
/ext4. - HDD WD My Passport 2 ТБ — NTFS,
/mnt/hdd.
/etc/fstab:
/dev/sdb1 /mnt/hdd ntfs-3g uid=1000,gid=1000,umask=022,windows_names,nofail 0 0
Папки: /mnt/hdd/znymkari-storage # Рабочая копия + превью (единое хранилище) /mnt/hdd/zny-festivals # Источник импорта (оригиналы) /mnt/hdd/zny-heap # Свалка
Симлинки в /home/olegarh:
sudo -u olegarh ln -sfn /mnt/hdd /home/olegarh/HDD sudo -u olegarh ln -sfn /mnt/hdd/znymkari-storage /home/olegarh/STORE
Техдолг: findmnt --verify рекомендует ntfs3. Пока FUSE.
7.4. Samba
Шары в /etc/samba/smb.conf:
| Шара | Путь | Для чего |
|---|---|---|
zny-festivals |
/mnt/hdd/zny-festivals |
Источник импорта |
zny-heap |
/mnt/hdd/zny-heap |
Свалка, вне импорта |
Юзер olegarh, SMB-пароль отдельный (smbpasswd -a olegarh).
Порт 445, только LAN 192.168.31.0/24. Наружу не пробрасывается.
Из Windows:
net use Z: \192.168.31.87\zny-festivals /user:olegarh /persistent:yes net use Y: \192.168.31.87\zny-heap /user:olegarh /persistent:yes
ufw — не включён. Правило для 445 добавлено. Техдолг.
7.5. Postgres
- PostgreSQL 18 (кластер
18/main). - БД
znymkari_local. - Юзер
znymkari_local_user. - Только
localhost, порт5432. - Локаль
uk_UA.UTF-8.
7.6. Django — проект znymkari-data
- Код в
/home/deploy/znymkari-data/. - venv в
/home/deploy/znymkari-data/venv/. settings_local.py— Postgres локальный,DEBUG=False,ALLOWED_HOSTS=['*'].- Миграции, суперюзер.
- systemd
gunicorn-oleg.service— Django на0.0.0.0:8000.
7.7. Проверка
С любого устройства в домашней сети:
http://192.168.31.87:8000/admin/
8. Как пользоваться — для Олега
8.1. Как импортировать ивент
Две папки в Проводнике рабочего компа (подключить один раз):
- Z: → \\192.168.31.87\zny-festivals — сюда кладёшь фестиваль.
- Y: → \\192.168.31.87\zny-heap — свалка. Импорт сюда не смотрит.
Подключить:
net use Z: \192.168.31.87\zny-festivals /user:olegarh /persistent:yes net use Y: \192.168.31.87\zny-heap /user:olegarh /persistent:yes
Импорт:
1. Скопируй фестиваль в Z:\<название>\.
2. Если ивента ещё нет в базе — создай его в админке:
http://192.168.31.87:8000/admin/catalog/event/add/.
Заполни название, город, дату начала. Сохрани.
3. Открой http://192.168.31.87:8000/import/.
4. + Импортировать → выбери ивент → выбери папку-источник → Запустить.
5. Наблюдай прогресс на /import/<id>/.
6. Готово — «Отправить на сайт» (push_event).
7. Ивент появится на https://znymkari.com.
Что под капотом:
- Оригинал в Z:\<название>\ остаётся. Олег сам решает, когда удалять.
- Копирование в /mnt/hdd/znymkari-storage/<slug>/.
- Sanitize имён (транслит, структура сохраняется).
- Превью 600px + QR.
- Постеры видео + 10-сек mp4.
- Записи в БД.
- Push на VPS — превью + метаданные.
8.2. WinSCP
Локальный IP 192.168.31.87:22, порт 22 (не 22022).
Заходит как olegarh, видит HDD/ и STORE/.
8.3. Проблемы
| Проблема | Что проверить |
|---|---|
| Сайт ноута не открывается | Ноут включён? Wi-Fi к роутеру? |
Браузер не видит 192.168.31.87 |
Ноут в той же сети? |
| Импорт падает | Место на HDD? Файлы на месте? |
| Пуш на сайт не идёт | Интернет? Ключ id_ed25519? Кнопка «Проверить связь с VPS» в /settings/. |
| Свет отключился | Ноут работает от батареи 2–4 ч. |
| Совсем плохо | Позвони разработчику. Не перезагружай. |
9. Железо — что купить в будущем
9.1. Сейчас ничего не нужно
9.2. Со временем
| Что | Модель | Цена (грн) |
|---|---|---|
| HDD 16 ТБ | Seagate IronWolf (CMR!) | ~15000 |
| Корпус 3.5" | Orico USB 3.2 | ~2000 |
| HDD бэкап 4 ТБ | WD Red Plus | ~4000 |
Алерты: - ❌ Не SMR (WD Blue). Только CMR. - ✅ USB 3.2 — быстрее USB 2.0 в 5–10 раз.
9.3. UPS не нужен
Ноут сам — UPS.
10. Что критично не забыть
- Пароль
olegarh— записать в блокнот. Иначе переустановка. - Пароль Postgres — записать.
- Автообновления — включены.
- Крышка закрыта — не влияет.
- Проброс —
22022 → 192.168.31.87:22. - Не трогать то, чего не понимаешь.
- Wi-Fi — ноут всегда на
Xiaomi_170B. - NTFS HDD — не менять права
chown/chmod(FUSE игнорирует). - Windows Fast Startup — выключить. Иначе NTFS «грязный».
- Безопасное извлечение диска от Windows — всегда.
- Бэкап — раз в месяц БД + манифест.
11. Чек-лист установки
| # | Шаг | Кто | Статус |
|---|---|---|---|
| 1 | Ubuntu Server 24.04 на флешку | Олег | ✅ |
| 2 | Установка на ноут | Олег | ✅ |
| 3 | apt update && upgrade |
Олег | ✅ |
| 4 | Wi-Fi Broadcom broadcom-sta-dkms |
Разраб. | ✅ |
| 5 | Отключить сон крышки | Разраб. | ✅ |
| 6 | Пользователь deploy |
Разраб. | ✅ |
| 7 | DHCP-резерв Wi-Fi .87 |
Олег | ✅ |
| 8 | Проброс 22022 → 192.168.31.87:22 |
Олег | ✅ |
| 9 | Внешний SSH | Разраб. | ✅ |
| 10 | HDD NTFS /mnt/hdd |
Разраб. | ✅ |
| 11 | Папки STORAGE / FESTIVALS / HEAP | Разраб. | ✅ |
| 12 | Симлинки HDD, STORE |
Разраб. | ✅ |
| 13 | Стек Python 3.14 / PG 18 / nginx / ffmpeg | Разраб. | ✅ |
| 14 | Samba с zny-festivals, zny-heap |
Разраб. | ✅ |
| 15 | WinSCP у Олега | Олег | ✅ |
| 16 | Django znymkari-data + venv |
Разраб. | ⏳ |
| 17 | settings_local.py |
Разраб. | ⏳ |
| 18 | Миграции | Разраб. | ⏳ |
| 19 | sanitize.py, import_service |
Разраб. | ✅ |
| 20 | Мини-админка Олега | Разраб. | ✅ |
| 21 | pack_event / push_event |
Разраб. | ✅ |
| 22 | gunicorn-oleg.service |
Разраб. | ⏳ |
| 23 | Первый реальный импорт | Олег | ⏳ |
| 24 | Push на VPS | Разраб. | ⏳ |
| 25 | Ивент виден на https://znymkari.com |
Олег | ⏳ |
12. Что не делаем сейчас
- ❌ WireGuard VPS ↔ ноут.
- ❌ nginx ноута (
auth_request,files.znymkari.com). - ❌ Certbot для дома.
- ❌ Отдача файлов клиенту напрямую.
- ❌
DownloadToken. - ❌ Оплата, заказы.
- ❌ Обратный канал
pull_protected+ файл чистки.
Всё это — после стабильного импорта и транспорта.
13. Стоимость
| Что | Стоимость |
|---|---|
| Ноут | уже есть |
| Ubuntu Server | 0 |
| VPS Hetzner | €23.89/мес |
| Домен | €13.50/год |
| SSD/HDD/корпуса | по мере надобности |