From 11933c92020fdd6cb99fc9b12d281c9360a6ab56 Mon Sep 17 00:00:00 2001 From: MaximilianYan <4+maximilianyan@noreply.localhost> Date: Thu, 20 Aug 2026 06:39:13 +0000 Subject: [PATCH] =?UTF-8?q?=D0=9E=D0=BF=D0=B8=D1=81=D0=B0=D0=BD=D0=B8?= =?UTF-8?q?=D0=B5=20=D0=B2=D1=81=D0=B5=D0=B3=D0=BE=20=D1=81=D1=82=D0=B5?= =?UTF-8?q?=D0=BA=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- стек сервера/стек сервера.md | 65 ++++++++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 стек сервера/стек сервера.md diff --git a/стек сервера/стек сервера.md b/стек сервера/стек сервера.md new file mode 100644 index 0000000..e52611b --- /dev/null +++ b/стек сервера/стек сервера.md @@ -0,0 +1,65 @@ +# Контекст +* **Задача:** Настройка домашнего сервера для театра на мини-ПК +* **ОС:** Ubuntu server +* **Железо:** двухъядерный процессор, ОЗУ 6ГБ, 128 ГБ eMMC, внешний USB-диск на 2 ТБ +* **Стек:** Docker, Filebrowser (облако), Gitea, Caddy (HTTPS reverse proxy), UFW, fail2ban, SSH; + +# Диски +* **eMMC:** ext4; +* **usb-HDD:** `/dev/sda1`, файловая система **EXT4**, примонтирован по UUID, с nofail в `/mnt/drive2T`, отключено резервирование места (`tune2fs -m 0`), настроен сон диска через `hd-idle`. + +## Права доступа (Permissions) +* Выделенная группа `storage`. Основной пользователь (`songbird`) добавлен в эту группу. +* **Каталог хранения `/mnt/drive2T`:** Настроены жесткие права **ACL** (`setfacl`) и установлен **SGID-бит** (`chmod g+s`), чтобы всё внутри диска автоматически наследовало владельца и полные права (`rwx`) группы `storage`. + +## Службы +* **Зависимости Systemd:** Служба `docker.service` модифицирована: контейнеры строго после внешнего диска `/mnt/drive2T` (`RequiresMountsFor` / `After`) +* **Ротация логов:** автоматическая ротация логов контейнеров через `logrotate` (`/etc/logrotate.d/....`), чтобы не забивать emmc. + +# Сеть +* **IP:** белый статический, DuckDNS обновляется вручную, домен `songbird-theatre.duckdns.org` +* **Брандмауэр UFW:** По умолчанию `deny incoming`, `allow outgoing`. Открыты порты: `22/tcp` (SSH) и `443/tcp` (HTTPS) +* **Fail2ban:** + * `sshd`: атаки на SSH (`/etc/fail2ban/jail.d/sshd.conf`) + * `infra-filebrowser` и `infra-gitea`: фильтр `/etc/fail2ban/filter.d/infra-filebrowser.local` для логов Caddy и блокировки попыток подбора паролей к Filebrowser и Gitea + * `recidive`: бан рецидивистов +* filebrowser на `songbird-theatre.duckdns.org`, gitea на `git.songbird-theatre.duckdns.org` + +## Доступ +* **SSH:** Вход по паролю +* **PermitRootLogin:** no +* **AllowUsers:** songbird + +# Docker +Приложения развернуты в связке через Docker Compose в `~/docker/infra/`. + +* **caddy-proxy:** (`cpus: 0.45`, `memory: 250M`) `HTTPS`:`443`, логи в `~/docker/infra/conf/`, user root + * настройки прокси и логирования: `~/docker/infra/conf/Caddyfile`; + * файл настроек: `~/docker/infra/docker-compose.yml`; +* **filebrowser-quantum:** (`cpus: 1.5`, `memory: 4500M`) Работает за прокси Caddy. Внутренний порт `80` за брандмауэром. Лог в `~/docker/infra/data/filebrowser.log`, работает от имени uid=1000 songbird. + * конфиг: `~/docker/infra/data/config.yaml`; +* **gitea:** (`cpus: 1.5`, `memory: 2500M`) Работает за прокси Caddy. Внутренний порт `3000` за брандмауэром. Лог в `~/docker/infra/conf/caddy-git.log`, работает от имени uid=1000 songbird. + * конфиг: `~/docker/infra/gitea/gitea/conf/app.ini`; + +Обновления unattended-upgrades. + +# Gitea + +* **LFS:** + * `MAX_CREATION_FILE_SIZE = 20971520`, `/mnt/drive2T/gitea/lfs:/data/git/lfs` + * `DISABLE_SSH = true` + +* **Организация** `songbird_theatre`, репозитории: + * именуются `[проект]-[тип]`, например `theatre-design`, `lesmiserables-design`, `lesmiserables-music`, система тегов + * в `ReadMe` навигация + +* **Нюансы:** + * `DISABLED_REPO_UNITS = repo.packeges, repo.actions`, `DEFAULT_REPO_UNITS = repo.code, repo.issues, repo.pulls, repo.projects, repo.releases`, `[actions] ENABLED = false [packages] ENABLED = false` + +# Требования к ии + +Не бойся критиковать решения. Используй максимально проверенные профессиональные с точки зрения архитектуры подходы. Поясняй все команды. + +Проверяй все предложения по документации. + +Вход по паролю в ssh необходимость. Резервное копирование делается вручную