Docker·Linux·Orange PI·SBC · BIGGRATZ

Orange Pi 6 Plus как домашний сервер: Docker, Jellyfin, qBittorrent, File Browser, Portainer и собственная панель BigGratz Home

Как превратить Orange Pi 6 Plus в домашний сервер: установка Debian, настройка Docker, Jellyfin, qBittorrent, Portainer и собственной панели мониторинга BigGratz Home.

11 октября 2026 19 мин чтения BigGratz

Orange Pi 6 Plus можно использовать не только как одноплатный компьютер для экспериментов с Linux. При наличии достаточного объёма памяти, внешнего накопителя и подходящей операционной системы он способен стать полноценным домашним сервером: хранить фильмы и музыку, загружать файлы, предоставлять доступ к данным через браузер и управлять несколькими сервисами в контейнерах Docker.

В этом проекте я решил собрать собственную домашнюю инфраструктуру на Orange Pi 6 Plus с 16 ГБ оперативной памяти. Вместо установки большого готового комплекса я выбрал отдельные сервисы, каждый из которых отвечает за конкретную задачу. Для удобного доступа к ним создал собственную стартовую страницу в стиле BigGratz, добавил отображение состояния сервера и установил графическую панель управления Docker — Portainer.

В результате получилась система, которой можно пользоваться через локальную сеть, не подключаясь каждый раз по SSH и не запоминая адрес каждого сервиса.

Что получилось в итоге

Главная страница домашнего сервера доступна по адресу http://192.168.1.99/. С неё можно перейти к медиатеке, управлению файлами, загрузкам и контейнерам Docker.

КомпонентНазначениеАдрес
BigGratz HomeГлавная страница и состояние сервераhttp://192.168.1.99/
JellyfinМедиатека фильмов, сериалов и музыкиhttp://192.168.1.99:8096
File BrowserУправление файлами через браузерhttp://192.168.1.99:8081
qBittorrentЗагрузки через BitTorrenthttp://192.168.1.99:8080
Portainer CEУправление Docker-контейнерамиhttps://192.168.1.99:9443

Все адреса приведены для нашей текущей конфигурации. Для доступа к ним устройства должны находиться в сети, из которой доступен сервер.

1. Аппаратная платформа и выбор операционной системы

Основой проекта стала плата Orange Pi 6 Plus с 16 ГБ оперативной памяти. В качестве системного накопителя используется NVMe SSD Patriot P310 объёмом 240 ГБ, а для медиатеки подключён дополнительный USB-накопитель DEXP C500A на 256 ГБ.

Конфигурация сервера:

  • одноплатный компьютер Orange Pi 6 Plus;
  • процессорная платформа CIX CD8180;
  • 16 ГБ оперативной памяти;
  • NVMe SSD Patriot P310 на 240 ГБ для операционной системы и системных данных;
  • внешний USB SSD DEXP C500A на 256 ГБ для медиафайлов и загрузок;
  • проводное Ethernet-подключение к домашнему роутеру Keenetic Giga;
  • локальный IP-адрес 192.168.1.99.

Первоначально я экспериментировал с Armbian, но при использовании внешних USB-устройств столкнулся с проблемами обнаружения накопителей. Поэтому для дальнейшей сборки выбрал официальный образ Orange Pi.

Использовался образ:

Orangepi6plus_1.0.2_debian_bookworm_desktop_gnome_linux6.6.89.img.xz

Это официальный образ на базе Debian 12 Bookworm с графическим окружением GNOME и ядром Linux 6.6.89-cix. Он не является Armbian: в этом проекте используется именно система, предоставленная производителем платы.

Для домашнего сервера графическое окружение не обязательно, но на первом этапе я решил не усложнять конфигурацию переходом на минимальный серверный образ. При этом все основные сервисы запускаются в Docker и управляются отдельно от рабочего стола.

2. Подготовка Debian и настройка репозиториев

После загрузки системы необходимо убедиться, что она корректно определяет оборудование, сеть и накопители.

Для проверки основных параметров использовались стандартные команды Linux:

uname -a
cat /etc/os-release
lscpu
free -h
lsblk

Они позволяют определить версию ядра, выпуск Debian, архитектуру процессора, объём оперативной памяти и список блочных устройств.

На этом этапе важно не путать системный диск с дополнительным накопителем. В нашем случае операционная система находится на NVMe, а USB SSD предназначен для пользовательских данных. Это разделение упрощает обслуживание: медиатеку можно хранить отдельно от системных файлов и конфигураций контейнеров.

Настройка APT

В исходной конфигурации Debian использовались зеркала Huawei Cloud. При обновлении пакетов и установке Docker возникали неудобства со скоростью загрузки, поэтому системные репозитории были переключены на официальные серверы Debian.

Текущий файл /etc/apt/sources.list содержит:

deb http://deb.debian.org/debian bookworm main contrib non-free non-free-firmware
deb http://deb.debian.org/debian bookworm-updates main contrib non-free non-free-firmware
deb http://deb.debian.org/debian bookworm-backports main contrib non-free non-free-firmware

Перед изменением был сохранён резервный файл /etc/apt/sources.list.bak.

После изменения источников обновляется индекс пакетов:

sudo apt update
sudo apt upgrade

Конкретные доступные обновления зависят от состояния репозиториев на момент установки. После обновления следует проверить, что система продолжает загружаться и сетевое подключение работает.

Для Docker CE использовался отдельный репозиторий Aliyun:

deb [arch=arm64] https://mirrors.aliyun.com/docker-ce/linux/debian bookworm stable

Это важно учитывать при повторении инструкции: скорость зеркал может меняться, а сама настройка репозиториев — часть нашей конкретной конфигурации, а не обязательное требование для всех Orange Pi.

3. Подключение внешнего SSD

Следующим шагом стала подготовка накопителя для медиатеки. Использовался DEXP C500A объёмом 256 ГБ, подключённый через USB.

После успешного обнаружения устройство представлялось в Linux как /dev/sda, а раздел с файловой системой ext4 — как /dev/sda1.

Метка раздела — MediaStorage, UUID:

ac2b6105-1e1d-4bd3-8056-4de8545c6c75

Для постоянного монтирования был создан каталог:

sudo mkdir -p /mnt/media

В /etc/fstab добавлена запись:

UUID=ac2b6105-1e1d-4bd3-8056-4de8545c6c75 /mnt/media ext4 defaults,noatime 0 2

Перед изменением файл /etc/fstab был сохранён в /etc/fstab.bak.

Использование UUID вместо имени /dev/sda1 предпочтительно для постоянного монтирования: имена блочных устройств могут меняться в зависимости от порядка обнаружения оборудования.

После изменения конфигурации необходимо проверить монтирование:

sudo mount -a
findmnt /mnt/media
df -h /mnt/media

Затем сервер был перезагружен, чтобы убедиться, что диск подключается автоматически:

sudo reboot

После повторного входа в систему нужно проверить:

findmnt /mnt/media
ls -la /mnt/media

В нашем случае накопитель успешно монтировался после перезагрузки.

Структура каталога медиатеки

На диске созданы отдельные каталоги для разных типов данных:

/mnt/media/
├── downloads/
├── movies/
├── music/
├── other/
└── tv/

Каталог downloads используется qBittorrent. В movies хранятся фильмы, в tv — сериалы, в music — музыка, а other оставлен для остальных файлов.

Такое разделение помогает избежать ситуации, когда загрузки, готовая медиатека и произвольные файлы оказываются в одной директории. Оно также позволяет выдавать контейнерам доступ только к тем данным, которые им действительно нужны.

4. Docker как основа домашней инфраструктуры

Вместо установки каждого приложения непосредственно в Debian я использовал Docker. Сервисы работают в отдельных контейнерах, а их конфигурации хранятся в отдельных каталогах.

Это упрощает обновление и обслуживание: у каждого приложения свой Compose-файл, параметры запуска и постоянные данные. Если один контейнер требуется пересоздать, остальные сервисы можно не трогать.

В проекте используется Docker Compose. Проверить версии установленных компонентов можно командами:

sudo docker --version
sudo docker compose version
sudo systemctl status docker --no-pager

На момент настройки использовались Docker 29.8.2 и Docker Compose v5.6.0.

Основной каталог для конфигураций:

/opt/docker/
├── biggratz-home/
├── filebrowser/
├── jellyfin/
├── portainer/
└── qbittorrent/

Для каждого сервиса создан отдельный каталог. Такой подход удобнее, чем хранить все Compose-файлы и конфигурации в одном месте.

Важно понимать, что Docker-контейнер сам по себе не гарантирует сохранность данных. Конфигурации, библиотеки и важные файлы должны находиться в постоянных каталогах или томах, а для действительно важных данных необходима отдельная резервная копия.

5. qBittorrent — загрузки через браузер

Первым из рассматриваемых сервисов выступает qBittorrent. Он позволяет управлять загрузками через веб-интерфейс, не оставляя торрент-клиент открытым на основном компьютере.

Для контейнера используется образ LinuxServer.io:

lscr.io/linuxserver/qbittorrent:5.2.4

Compose-файл /opt/docker/qbittorrent/compose.yml:

services:
  qbittorrent:
    image: lscr.io/linuxserver/qbittorrent:5.2.4
    container_name: qbittorrent

    environment:
      - PUID=1000
      - PGID=1000
      - TZ=Europe/Moscow
      - WEBUI_PORT=8080
      - TORRENTING_PORT=6881

    volumes:
      - /opt/docker/qbittorrent:/config
      - /mnt/media/downloads:/downloads

    ports:
      - "8080:8080"
      - "6881:6881"
      - "6881:6881/udp"

    restart: unless-stopped

Параметры PUID и PGID задают идентификаторы пользователя и группы, от имени которых контейнер LinuxServer.io работает с файлами. В нашей конфигурации это UID и GID 1000.

Каталог /config сохраняет настройки приложения, а /downloads соответствует /mnt/media/downloads на хосте.

Запуск:

cd /opt/docker/qbittorrent
sudo docker compose up -d

Проверка:

sudo docker ps --filter name=qbittorrent

Веб-интерфейс доступен по адресу:

http://192.168.1.99:8080/

В настройках загрузок используются каталоги:

/downloads/complete
/downloads/incomplete

Это помогает разделить завершённые и незавершённые загрузки. После проверки и сортировки готовые фильмы можно перемещать в /mnt/media/movies, чтобы медиатека Jellyfin не зависела от внутренней структуры каталога загрузок.

Проблема с авторизацией при открытии из BigGratz Home

При прямом открытии qBittorrent в обычной вкладке браузера интерфейс работал, но при переходе из нашей стартовой страницы в новой вкладке появлялась ошибка Unauthorized.

Проверка показала, что проблема была связана не с доступностью контейнера, а с проверкой CSRF и заголовка Referer. При открытии в новой вкладке qBittorrent получал запрос с отличающимся источником перехода.

В рамках этой локальной конфигурации была отключена только CSRF-защита в настройках Web UI qBittorrent. После перезапуска контейнера ссылка стала работать.

Это решение следует рассматривать как компромисс для доверенной локальной сети, а не универсальную рекомендацию. Отключение CSRF снижает защиту веб-интерфейса от определённого класса атак. Не следует бездумно переносить такую настройку на сервис, доступный из интернета. Если появится необходимость публиковать интерфейс за пределами домашней сети, следует пересмотреть схему доступа и защиты.

6. Jellyfin — собственная медиатека

Jellyfin отвечает за каталогизацию и воспроизведение фильмов, сериалов и музыки. В отличие от файлового менеджера, он показывает содержимое в виде медиатеки, с библиотеками и удобным интерфейсом просмотра.

Для Jellyfin используется официальный образ:

jellyfin/jellyfin:latest

Compose-файл:

services:
  jellyfin:
    image: jellyfin/jellyfin:latest
    container_name: jellyfin

    ports:
      - "8096:8096"

    volumes:
      - /opt/docker/jellyfin/config:/config
      - /opt/docker/jellyfin/cache:/cache
      - /mnt/media:/media:ro

    devices:
      - /dev/video0:/dev/video0

    restart: unless-stopped

Здесь используются три важных принципа.

Во-первых, конфигурация и кэш Jellyfin хранятся отдельно от медиафайлов. Во-вторых, медиатека подключена с параметром :ro, то есть только для чтения. Это снижает риск случайного изменения или удаления файлов со стороны Jellyfin. В-третьих, устройству /dev/video0 предоставлен доступ в контейнер для дальнейших экспериментов с аппаратным видеоускорением.

Каталоги конфигурации и кэша были созданы заранее:

sudo mkdir -p /opt/docker/jellyfin/config
sudo mkdir -p /opt/docker/jellyfin/cache
sudo chown -R 1000:1000 /opt/docker/jellyfin

После запуска:

cd /opt/docker/jellyfin
sudo docker compose up -d

веб-интерфейс доступен по адресу:

http://192.168.1.99:8096

В Jellyfin были созданы библиотеки:

Тип библиотекиКаталог внутри контейнера
Фильмы/media/movies
Сериалы/media/tv
Музыка/media/music

Каталог /media/other не добавлялся в медиатеку.

После сканирования Jellyfin увидел файлы. Проверка воспроизведения показала, что материал, который мы проверяли, воспроизводился в режиме Direct Play. Это означает, что для данного файла не потребовалось перекодирование сервером. Однако это не гарантирует Direct Play для всех форматов, клиентов и субтитров.

На этапе сборки я не стал дополнительно усложнять настройку аппаратного транскодирования: сначала было важнее получить стабильную работающую медиатеку.

7. File Browser — управление файлами через веб-интерфейс

File Browser предоставляет доступ к файлам на внешнем накопителе через браузер. Он полезен для загрузки, просмотра, переименования и сортировки данных без подключения к серверу по SSH.

Для сервиса создан каталог:

/opt/docker/filebrowser/
├── compose.yml
├── database/
└── config/

Compose-файл:

services:
  filebrowser:
    image: filebrowser/filebrowser:latest
    container_name: filebrowser

    ports:
      - "8081:80"

    volumes:
      - /mnt/media:/srv
      - /opt/docker/filebrowser/database:/database
      - /opt/docker/filebrowser/config:/config

    restart: unless-stopped

Каталог /mnt/media внутри контейнера доступен как /srv. База данных и конфигурация приложения сохраняются отдельно.

Запуск:

cd /opt/docker/filebrowser
sudo docker compose up -d

Веб-интерфейс:

http://192.168.1.99:8081

Ошибка прав доступа

При первом запуске File Browser столкнулся с ошибкой:

cp: can't create '/config/settings.json': Permission denied

Контейнер не мог создать конфигурационный файл в смонтированном каталоге. Причиной стали права доступа к каталогу на хосте.

Проблема была решена назначением владельца 1000:1000:

sudo chown -R 1000:1000 /opt/docker/filebrowser

Затем контейнер был пересоздан:

cd /opt/docker/filebrowser
sudo docker compose down
sudo docker compose up -d

После этого File Browser запустился нормально.

Этот пример хорошо показывает один из частых нюансов Docker: подключение каталога через volumes не отменяет обычную модель прав доступа Linux. Контейнер должен иметь возможность читать и записывать данные в смонтированный каталог в соответствии со своим пользователем.

8. Собственная стартовая страница BigGratz Home

Когда основные сервисы заработали, стало понятно, что нужен единый экран для перехода между ними.

Можно было установить готовую панель вроде Homepage, но я решил сделать собственную страницу в стилистике BigGratz. Это позволило контролировать внешний вид, расположение элементов и состав информации, не добавляя ещё одно приложение со своей конфигурацией.

Для страницы используется отдельный контейнер Nginx на порту 80.

Структура проекта:

/opt/docker/biggratz-home/
├── compose.yml
├── html/
│   └── index.html
└── status/
    └── update-status.sh

Compose-файл:

services:
  biggratz-home:
    image: nginx:alpine
    container_name: biggratz-home

    ports:
      - "80:80"

    volumes:
      - /opt/docker/biggratz-home/html:/usr/share/nginx/html:ro

    restart: unless-stopped

HTML-каталог подключён только для чтения. Это означает, что Nginx отдаёт страницу, но не может менять её файлы.

После запуска:

cd /opt/docker/biggratz-home
sudo docker compose up -d

страница доступна по адресу:

http://192.168.1.99/

Дизайн

Внешний вид основан на визуальной системе BigGratz:

  • тёмный фон #071017;
  • голубой акцент #19c8ff;
  • заголовок BIGGRATZ;
  • подпись HOME SERVER;
  • адаптивная сетка карточек;
  • компактные показатели состояния;
  • отдельные карточки приложений.

На странице указаны модель платы, версия системы, архитектура, объём оперативной памяти и локальный IP-адрес. Ниже расположены ссылки на Jellyfin, File Browser, qBittorrent и Portainer, а также карточки для сервисов, которые пока не установлены.

Карточки AdGuard Home и Uptime Kuma были оставлены как возможные будущие пункты, но сами сервисы не устанавливались. Впоследствии их можно удалить или заменить, если изменится состав инфраструктуры.

9. Живой статус сервера без тяжёлой системы мониторинга

Одна из наиболее полезных частей BigGratz Home — блок с текущими показателями сервера.

Вместо установки Prometheus, Grafana и отдельного стека экспорта метрик я выбрал простой скрипт, который читает системные данные Linux и формирует JSON-файл. JavaScript на стартовой странице получает этот файл и обновляет значения.

Такой подход не заменяет полноценный мониторинг, но подходит для компактной домашней панели.

Какие показатели отображаются

Загрузка процессора. Скрипт читает счётчики /proc/stat и рассчитывает процент использования CPU. Дополнительно выводятся средние значения нагрузки за 1, 5 и 15 минут из /proc/loadavg.

Оперативная память. Используются данные /proc/meminfo. На странице показываются использованная и общая память, а также процент использования.

Температура системы. Значение считывается из доступных файлов /sys/class/thermal/thermal_zone*. На этой плате найденные зоны отображались как acpitz, поэтому показатель подписан именно как «System temperature», а не «CPU temperature». Без достоверной привязки датчика к конкретному компоненту такое обозначение корректнее.

Место на накопителе. Команда df показывает размер, занятое и доступное место на /mnt/media.

Docker. Скрипт считает общее количество контейнеров и количество запущенных контейнеров.

Время работы. Длительность работы системы рассчитывается на основе /proc/uptime.

Время обновления. В JSON записывается временная отметка последнего обновления.

Скрипт обновления

Файл скрипта находится по пути:

/opt/docker/biggratz-home/status/update-status.sh

Он собирает перечисленные показатели и записывает результат в:

/opt/docker/biggratz-home/html/status.json

Файл JSON используется как простой интерфейс между системным скриптом и веб-страницей. Nginx отдаёт его вместе с остальными статическими файлами.

При обновлении данных скрипт записывает результат во временный файл, а затем заменяет предыдущий JSON. Такой способ помогает избежать ситуации, когда браузер читает файл в момент, когда он ещё не полностью записан.

Автоматическое обновление через systemd

Чтобы скрипт не приходилось запускать вручную, были созданы два systemd-юнита:

/etc/systemd/system/biggratz-status.service
/etc/systemd/system/biggratz-status.timer

Service выполняет сбор показателей, а Timer запускает его периодически. Интервал в нашей конфигурации — 30 секунд.

После создания юнитов выполняются команды:

sudo systemctl daemon-reload
sudo systemctl enable --now biggratz-status.timer

Проверить состояние таймера можно так:

systemctl status biggratz-status.timer --no-pager
systemctl list-timers biggratz-status.timer --no-pager

Посмотреть последний результат:

cat /opt/docker/biggratz-home/html/status.json

В процессе настройки в JSON появлялись данные такого типа:

{
  "status": "online",
  "cpu": {
    "usage": 1,
    "load1": 1.27,
    "load5": 1.25,
    "load15": 1.24
  },
  "memory": {
    "used_gb": 5.9,
    "total_gb": 15.2,
    "percent": 39
  },
  "temperature": {
    "value": 45,
    "unit": "C",
    "label": "System temperature"
  },
  "storage": {
    "mount": "/mnt/media",
    "size": "234G",
    "used": "114G",
    "available": "108G",
    "percent": 52
  },
  "uptime": "1h 12m",
  "uptime_seconds": 4343,
  "docker": {
    "running": 4,
    "total": 4
  },
  "updated": "2026-10-09T00:11:03+03:00"
}

Это пример снимка данных во время настройки, а не постоянные показатели сервера. Загрузка CPU, температура, память, объём занятого места и число контейнеров меняются со временем.

Настройка времени

Во время работы над статусной панелью выяснилось, что системное время было настроено на часовой пояс Asia/Shanghai. Для домашнего сервера в нашей конфигурации выбран часовой пояс Москвы.

Команды настройки:

sudo timedatectl set-timezone Europe/Moscow
sudo timedatectl set-local-rtc 0

После изменения проверяется состояние времени:

timedatectl status

Это важно не только для удобства отображения. Правильное системное время помогает сопоставлять логи, проверять время обновления метрик и разбираться в проблемах контейнеров.

10. Portainer CE — графическое управление Docker

Когда контейнеров стало несколько, управление только через терминал перестало быть единственным удобным вариантом. Поэтому следующим шагом стал Portainer Community Edition.

Portainer предоставляет веб-интерфейс для просмотра контейнеров, образов, сетей и стеков Docker. Официальная документация описывает установку Portainer Server в отдельном контейнере с подключением Docker socket и постоянного каталога данных. Документация Portainer CE.

Для установки был создан каталог:

sudo mkdir -p /opt/docker/portainer
cd /opt/docker/portainer

Файл /opt/docker/portainer/compose.yml:

services:
  portainer:
    image: portainer/portainer-ce:lts
    container_name: portainer

    ports:
      - "9443:9443"

    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - /opt/docker/portainer/data:/data

    restart: unless-stopped

В этом файле есть два принципиально важных подключения.

/var/run/docker.sock позволяет Portainer взаимодействовать с Docker Engine на самом Orange Pi. Каталог /data используется для постоянного хранения данных Portainer.

Порт 9443 предназначен для веб-интерфейса с HTTPS. Порт 8000 в нашей конфигурации не публикуется: он нужен для функций Edge Compute/Edge Agents, которые мы не планируем использовать.

Запуск Portainer

Из каталога приложения:

cd /opt/docker/portainer
sudo docker compose up -d

Проверка:

sudo docker ps --filter name=portainer

В результате контейнер запустился с пробросом порта 9443.

Интерфейс открывается по адресу:

https://192.168.1.99:9443

При первом посещении браузер может предупредить о самоподписанном сертификате. Для локальной установки это ожидаемо, поскольку Portainer по умолчанию использует собственный сертификат, если не настроен другой. Официальная инструкция установки.

Первоначальная настройка и Setup Token

При первом запуске Portainer предложил создать администратора, но кнопка подтверждения оставалась неактивной, пока не был указан Setup Token.

Это не ошибка установки. В актуальных версиях Portainer токен используется для защиты новой установки от захвата посторонним пользователем. Его необходимо получить из логов контейнера.

Команда:

sudo docker logs portainer 2>&1 | grep "setup_token="

Из найденной строки копируется только значение после setup_token= и вставляется в поле Setup token в веб-интерфейсе. Токен одноразовый и не нужен после завершения первоначальной настройки.

После создания администратора Portainer предложил настроить Edge Compute. Мы пропустили этот шаг, поскольку сервер управляет локальным Docker Engine и не нуждается в подключении удалённых окружений.

Затем на экране Environment Wizard был выбран локальный Docker. Portainer обнаружил окружение local-Standalone с Docker 29.8.2.

На панели окружения после запуска отображались пять контейнеров, пять стеков, пять образов и восемь сетей. Все пять контейнеров были запущены, а два из них отмечены как healthy. Эти значения относятся к состоянию системы в момент проверки.

Важное замечание по безопасности

Portainer получает доступ к Docker socket, поэтому его следует считать привилегированным инструментом администрирования. Доступ к нему не стоит публиковать в интернет без отдельной продуманной схемы защиты.

В этой конфигурации Portainer доступен по локальному адресу домашней сети. Для внешнего доступа потребовались бы дополнительные меры защиты, а не просто проброс порта на роутере.

11. Проверка всей инфраструктуры

После запуска Portainer на главной странице BigGratz Home была проверена ссылка на https://192.168.1.99:9443. Она открывала интерфейс Portainer.

Таким образом, текущая схема выглядит так:

                    BigGratz Home
                    192.168.1.99:80
                           |
       +-------------------+-------------------+
       |                   |                   |
    Jellyfin           File Browser        qBittorrent
      :8096                :8081               :8080
       |
    /mnt/media
       |
  movies / tv / music

       Portainer CE
         :9443
           |
       Docker Engine
           |
    Все контейнеры проекта

При этом главная страница не управляет контейнерами напрямую. Она только предоставляет ссылки и показывает системную статистику. Самими контейнерами управляют Docker Compose и Portainer.

12. Почему мы не стали устанавливать дополнительные сервисы

После запуска базовой инфраструктуры можно было продолжить установку новых приложений, но на этом этапе я решил не перегружать сервер.

AdGuard Home и Uptime Kuma были оставлены на будущее. В домашней сети устройства часто работают через VPN, поэтому польза от отдельного DNS-фильтра в текущем сценарии требует дополнительной оценки. Uptime Kuma также не стал необходимым для одного сервера, где уже есть простая панель состояния.

Не устанавливались и тяжёлые системы мониторинга вроде Prometheus с Grafana. Для отображения базовой загрузки CPU, памяти, температуры, накопителя и Docker-контейнеров достаточно существующего скрипта.

В перспективе сервер можно расширить следующими сервисами:

  • Syncthing — синхронизация файлов между компьютерами и мобильными устройствами;
  • Immich — собственная фототека с автоматической загрузкой снимков со смартфона;
  • Paperless-ngx — архив документов с распознаванием текста;
  • Forgejo — собственный Git-сервер для конфигураций и технических проектов;
  • BookStack — внутренняя документация по серверу;
  • Audiobookshelf — библиотека аудиокниг и подкастов.

Но до установки новых приложений стоит продумать резервное копирование. Внешний SSD на 256 ГБ удобен для медиатеки, однако один накопитель не является резервной копией. При отказе диска можно потерять данные, поэтому важные документы и конфигурации следует хранить ещё в одном независимом месте.

13. Что ещё предстоит улучшить

Текущая конфигурация уже решает основные задачи, но есть несколько направлений для дальнейшей работы.

Локальные имена вместо IP-адресов. Я попробовал добавить на Keenetic статическую DNS-запись server → 192.168.1.99. Запись была создана, но CachyOS продолжил использовать DNS-сервер 1.1.1.1 через WireGuard, поэтому имя не разрешалось. Из-за этого настройку решили не усложнять. Сейчас сервисы открываются по IP-адресу и порту.

Единая точка доступа к сервисам. В дальнейшем можно рассмотреть reverse proxy и локальные имена для отдельных приложений. Но для этого потребуется аккуратно учесть работу VPN, DNS и сертификатов.

Резервное копирование. Необходимо отдельно определить, какие данные действительно важны: конфигурации Docker, настройки Jellyfin, библиотека загрузок, документы и личные файлы. Затем выбрать подходящий способ копирования на независимый носитель или другое устройство.

Обновление контейнеров. Для каждого сервиса следует периодически проверять обновления и читать изменения, особенно если используются теги latest или lts. Перед крупными обновлениями полезно иметь резервную копию постоянных данных.

Безопасность веб-интерфейсов. Порты сервисов открыты в локальной сети. Их не следует без необходимости пробрасывать наружу через Keenetic. Особое внимание нужно уделять qBittorrent, File Browser и Portainer, поскольку они предоставляют доступ к данным или управлению системой.

Итоги

В результате на Orange Pi 6 Plus собран домашний сервер на официальной Debian 12 Bookworm с ядром Linux 6.6.89-cix. Для приложений используется Docker Compose, а пользовательские данные вынесены на отдельный USB SSD с постоянным монтированием в /mnt/media.

Jellyfin предоставляет доступ к медиатеке, qBittorrent отвечает за загрузки, File Browser позволяет работать с файлами через браузер, а Portainer обеспечивает графическое управление Docker-контейнерами. Все сервисы объединены собственной стартовой страницей BigGratz Home, которая также показывает текущие показатели состояния системы.

Отдельно реализован простой сбор метрик через системный скрипт и systemd timer с интервалом 30 секунд. Он позволяет видеть загрузку процессора, оперативную память, системную температуру, заполнение накопителя, время работы и состояние контейнеров без развёртывания отдельного стека мониторинга.

Главный результат проекта — не количество установленных приложений, а понятная и управляемая структура. Каждый сервис выполняет свою задачу, конфигурации находятся в отдельных каталогах, а доступ к основным функциям собран в одном месте.

Следующий важный шаг — настроить резервное копирование. После этого можно постепенно расширять инфраструктуру, добавляя только те сервисы, которые действительно нужны.