# Контекст * **Задача:** Настройка домашнего сервера для театра на мини-ПК * **ОС:** 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 на `drive.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 (Лог в `~/docker/infra/conf/caddy-drive.log`). Внутренний порт `80` за брандмауэром. Лог в `~/docker/infra/data/filebrowser.log`, работает от имени uid=1000 songbird. * конфиг: `~/docker/infra/data/config.yaml`; * **gitea:** (`cpus: 1.5`, `memory: 2500M`) Работает за прокси Caddy (Лог в `~/docker/infra/conf/caddy-git.log`). Внутренний порт `3000` за брандмауэром. Работает от имени 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 необходимость. Резервное копирование делается вручную