Znymkari · Лабораторія
←

Документация

Архитектура Статус Контекст История Продакшн Ноут Олега VPS COM Oleg COM Pavel Коммиты VPS Коммиты Цеха

SETUP_HOME.md — ноут Олега (домашний сервер)

Простыми словами. Без программирования. Только практика. ТЗ — ARCHITECTURE.md. Чек-лист — PRODUCTION.md. Статус — STATE.md.


1. Что мы строим

Два места + один транспорт:

Где Что Для чего
VPS (Hetzner) Сайт, оплата, Telegram-бот, превью 600px Витрина
Ноут Олега (дома) Оригиналы, znymkari-data, PostgreSQL Склад + цех
SFTP (id_ed25519) Транспорт превью и метаданных на VPS Связь ноут → VPS

Как работает импорт ивента:

  1. Олег копирует фестиваль с SD-карты в \\192.168.31.87\zny-festivals\<название>\.
  2. В браузере на ноуте: http://192.168.31.87:8000/ → Импорт.
  3. znymkari-data — копирует оригиналы в STORAGE, sanitize, превью 600px + QR, постеры видео + 10-сек mp4, пишет в БД.
  4. push_event — JSON (метаданные) + tar превью → SFTP на VPS.
  5. VPS: receive_event — мягкий merge через ORM.

Что происходит, когда клиент платит (план):

  1. Клиент платит на VPS.
  2. VPS генерит DownloadToken.
  3. Бот шлёт: https://files.znymkari.com/d/<token>.
  4. DNS ведёт на домашний IP.
  5. nginx дома спрашивает VPS «токен валиден?».
  6. VPS отвечает «да» → nginx дома отдаёт файл напрямую клиенту.

VPS трафик на оригиналы не тратит.


2. Что нужно для старта

2.1. Ноут Олега

Роль ноута: мини-UPS. Батарея держит 2–4 ч.

2.2. Что понадобится

Что Зачем
Флешка 8 ГБ+ Ubuntu Server
Другой комп Записать образ
Браузер Для работы с сайтом ноута
Доступ к роутеру Проброс, DHCP-резерв

2.3. Что уже есть


3. Установка Ubuntu Server 24.04 (справка)

3.1. Записать образ

  1. Скачать Ubuntu Server 24.04 LTS — https://ubuntu.com/download/server.
  2. Скачать Rufus — https://rufus.ie.
  3. Rufus: устройство → флешка; образ → .iso; схема GPT; «Старт».

3.2. Загрузиться с флешки

  1. Вставить флешку в ноут.
  2. Включить. Сразу жми Boot Menu (F12, F10, F2, Esc).
  3. Выбрать флешку.

3.3. Установка

  1. Язык: English.
  2. Keyboard: US / Ukrainian.
  3. Install Ubuntu Server.
  4. Network: Wi-Fi → сеть Xiaomi_170B → пароль.
  5. Storage: - Use an entire disk на встроенном SSD. - LVM — галку снять. - HDD НЕ трогать.
  6. Профиль: - Your name: Oleg Arh. - Server name: oleg-home. - Username: olegarh. - Password: надёжный, записать!
  7. Install OpenSSH server ✅.
  8. Snaps — ничего.
  9. Дождаться, 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-адреса


5. Роутер Xiaomi: DHCP и проброс

Роутер: http://192.168.31.1.

5.1. DHCP-резерв

«Налаштування локальної мережі» → «Призначення статичної IP-адреси DHCP».

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. Стек (готов)

7.3. Монтирование дисков

/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

7.6. Django — проект znymkari-data

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. Что критично не забыть

  1. Пароль olegarh — записать в блокнот. Иначе переустановка.
  2. Пароль Postgres — записать.
  3. Автообновления — включены.
  4. Крышка закрыта — не влияет.
  5. Проброс — 22022 → 192.168.31.87:22.
  6. Не трогать то, чего не понимаешь.
  7. Wi-Fi — ноут всегда на Xiaomi_170B.
  8. NTFS HDD — не менять права chown/chmod (FUSE игнорирует).
  9. Windows Fast Startup — выключить. Иначе NTFS «грязный».
  10. Безопасное извлечение диска от Windows — всегда.
  11. Бэкап — раз в месяц БД + манифест.

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. Что не делаем сейчас

Всё это — после стабильного импорта и транспорта.


13. Стоимость

Что Стоимость
Ноут уже есть
Ubuntu Server 0
VPS Hetzner €23.89/мес
Домен €13.50/год
SSD/HDD/корпуса по мере надобности