Самостоятельная замена Google: развертывание Nextcloud, Vaultwarden и Immich

«Многие говорят о ‘цифровом суверенитете’, но редко показывают, как собрать из конкретных инструментов удобную экосистему, которая заменит Google на ваших условиях и будет работать на вашем железе.»

Выбор инфраструктуры: Docker или виртуальные машины?

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

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

Более продвинутые оркестраторы вроде Kubernetes избыточны для задачи запуска 3–5 сервисов на одной машине. Они добавляют ненужную сложность в управление, требующую постоянного внимания. Docker Compose остаётся разумным компромиссом между простотой настройки и достаточной для задачи функциональностью.

Разработка структуры Docker Compose файла

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

Базовая сеть и обратный прокси

Создание выделенной Docker-сети (например, `proxy-net`) позволяет изолировать трафик между контейнерами и внешним миром. На эту сеть должен быть подключён контейнер обратного прокси-сервера, например, Nginx Proxy Manager или Traefik. Его задача — принимать входящие HTTP/HTTPS-запросы на 80 и 443 портах хоста и перенаправлять их на соответствующие внутренние сервисы на основе имени домена.

networks:
  proxy-net:
    external: true

Использование внешней сети позволяет управлять ей отдельно от файла `docker-compose.yml`, что упрощает подключение других стеков контейнеров.

Общие тома для данных и конфигураций

Для хранения данных приложений и их конфигурационных файлов следует определить тома в секции `volumes`. Хранение данных на смонтированных хостовых директориях (`./data`) предпочтительнее использования анонимных томов Docker, так как это упрощает резервное копирование и миграцию.

volumes:
  nextcloud_data:
  vaultwarden_data:
  immich_library:
  immich_postgres:
  proxy_data:

Логично сгруппировать эти определения в начале файла, чтобы впоследствии ссылаться на них из сервисов.

Настройка Nextcloud как центра файлов и календаря

Nextcloud, это ядро самохостинговой экосистемы, заменяющее Google Drive, Календарь и Контакты. Его развёртывание требует подключения к базе данных и корректной настройки обратного прокси.

В конфигурации контейнера Nextcloud важно указать явную версию образа (например, `nextcloud:stable-apache`), чтобы избежать неожиданных обновлений, ломающих обратную совместимость. Контейнер должен быть подключён к общей сети `proxy-net` и внутренней сети для взаимодействия с базой данных.

services:
  nextcloud-db:
    image: postgres:15-alpine
    volumes:
      - nextcloud_postgres_data:/var/lib/postgresql/data
    environment:
      - POSTGRES_DB=nextcloud
      - POSTGRES_USER=nextcloud
      - POSTGRES_PASSWORD=${NEXTCLOUD_DB_PASSWORD}

  nextcloud:
    image: nextcloud:stable-apache
    depends_on:
      - nextcloud-db
    volumes:
      - nextcloud_data:/var/www/html
    environment:
      - POSTGRES_HOST=nextcloud-db
      - POSTGRES_DB=nextcloud
      - POSTGRES_USER=nextcloud
      - POSTGRES_PASSWORD=${NEXTCLOUD_DB_PASSWORD}
    networks:
      - proxy-net
      - nextcloud-internal

Переменные окружения, такие как пароли от БД, следует выносить в отдельный `.env`-файл, который не попадает в системы контроля версий. После первого запуска через веб-интерфейс нужно будет создать администратора и выполнить базовую настройку, включая настройку Cron для фоновых задач.

Интеграция Vaultwarden для безопасного хранения паролей

Vaultwarden, это альтернативный, ресурсоэффективный сервер для менеджера паролей Bitwarden, полностью совместимый с его официальными клиентами. В отличие от официального образа, написанного на .NET, Vaultwarden реализован на Rust и потребляет значительно меньше оперативной памяти.

Основная сложность настройки Vaultwarden заключается в организации безопасного HTTPS-доступа, так как клиенты Bitwarden жёстко требуют шифрованного соединения. Для этого можно использовать обратный прокси с автоматическим получением сертификатов Let’s Encrypt.

services:
  vaultwarden:
    image: vaultwarden/server:latest
    volumes:
      - vaultwarden_data:/data
    environment:
      - WEBSOCKET_ENABLED=true
      - ADMIN_TOKEN=${VAULTWARDEN_ADMIN_TOKEN}
    networks:
      - proxy-net

Ключевая переменная `ADMIN_TOKEN` позволяет получить доступ к панели администратора сервера. Её необходимо сгенерировать и хранить в секрете. После настройки обратного прокси для домена (например, `vault.example.com`) вы сможете зарегистрировать учётную запись и подключить к серверу расширения для браузеров и мобильные приложения Bitwarden.

Развёртывание Immich для управления фото- и видеотекой

Immich позиционируется как альтернатива Google Фото с акцентом на приватность. Сервис предлагает автоматическую загрузку с мобильных устройств, распознавание лиц, генерацию превью и карт на основе геометок.

Архитектура Immich состоит из нескольких микросервисов. Минимальная конфигурация для работы включает в себя основной веб-сервис (`immich-server`), отдельный сервис машинного обучения (`immich-machine-learning`) для анализа медиа, и базу данных PostgreSQL.

services:
  immich-postgres:
    image: postgres:15-alpine
    volumes:
      - immich_postgres:/var/lib/postgresql/data
    environment:
      - POSTGRES_DB=immich
      - POSTGRES_USER=immich
      - POSTGRES_PASSWORD=${IMMICH_DB_PASSWORD}

  immich-server:
    image: immich-server:release
    depends_on:
      - immich-postgres
    volumes:
      - immich_library:/usr/src/app/upload
    environment:
      - DB_HOSTNAME=immich-postgres
      - DB_USERNAME=immich
      - DB_PASSWORD=${IMMICH_DB_PASSWORD}
    networks:
      - proxy-net

  immich-machine-learning:
    image: immich-machine-learning:release
    volumes:
      - immich_library:/usr/src/app/upload
      - immich_cache:/cache
    networks:
      - proxy-net

Сервис машинного обучения может потреблять существенные ресурсы CPU при первичной индексации библиотеки. Важно выделить под том `immich_library` достаточно места, так как в нём будут храниться оригиналы всех загруженных фотографий и видео.

Обеспечение безопасности и управление доступом

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

Настройка брандмауэра и ограничение портов

На уровне операционной системы сервера необходимо настроить фаервол (например, `ufw` или `firewalld`), разрешив входящие подключения только на необходимые порты: 80 и 443 для обратного прокси, и, возможно, SSH на нестандартный порт. Все остальные порты должны быть закрыты.

# Пример для ufw
ufw allow 80/tcp
ufw allow 443/tcp
ufw allow 2222/tcp  # SSH на нестандартный порт
ufw --force enable

Внутри Docker Compose не следует публиковать порты сервисов (директива `ports`) на все интерфейсы хоста (`0.0.0.0`). Достаточно того, что контейнеры подключены к внутренней сети `proxy-net`, а наружу смотрит только прокси.

HTTPS и автоматическое обновление сертификатов

Принудительное использование HTTPS — обязательное условие. Обратный прокси-сервер, такой как Nginx Proxy Manager, позволяет автоматически получать и обновлять SSL-сертификаты Let’s Encrypt для всех ваших доменов. Это не только шифрует трафик, но и решает проблему доверия клиентов (например, Bitwarden) к вашему самоподписанному сертификату.

Регулярные обновления и мониторинг

Контейнерные образы необходимо регулярно обновлять, чтобы получать исправления уязвимостей. Процесс можно автоматизировать с помощью утилит вроде Watchtower или обновлением образов вручную через `docker-compose pull && docker-compose up -d`. Важно следить за логами приложений и использовать мониторинг базовых метрик сервера (загрузка CPU, память, диск).

Резервное копирование и восстановление данных

Физический сервер или VPS могут выйти из строя. Отсутствие продуманной стратегии бэкапов означает потерю всех данных.

Резервное копирование должно быть многоуровневым и включать как сами данные приложений (тома Docker), так и их конфигурации (файлы `docker-compose.yml`, `.env`).

  • Данные приложений: Тома Docker, смонтированные в директории на хосте (например, `./data/nextcloud`), можно архивировать с помощью `tar` или `rsync`. Критично остановить контейнеры перед копированием файлов баз данных (PostgreSQL) для обеспечения консистентности бэкапа.
  • Конфигурации: Весь каталог проекта с файлами Docker Compose и переменными окружения необходимо регулярно копировать на внешнее хранилище.
  • Частота: Для личных данных может быть достаточно ежедневных инкрементальных бэкапов и еженедельных полных.

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

Типичные проблемы и их решение

При первом запуске и в процессе эксплуатации неизбежно возникают ошибки.

Проблема Вероятная причина Решение
Контейнеры не запускаются, ошибка ‘network not found’ Внешняя сеть `proxy-net` не создана. Выполнить docker network create proxy-net перед запуском `docker-compose up`.
Nextcloud пишет ‘Internal Server Error’ после установки Некорректные права на файлы в томе или проблема с базой данных. Проверить логи контейнера Nextcloud и PostgreSQL. Убедиться, что переменные окружения для подключения к БД заданы верно.
Мобильное приложение Bitwarden не подключается к Vaultwarden Отсутствует HTTPS или неверно настроен обратный прокси. Убедиться, что для домена vaultwarden работает HTTPS (зелёный замочек в браузере). В настройках клиента указать URL с `https://`.
Immich не генерирует превью или не распознаёт лица Сервис машинного обучения не запущен или не имеет доступа к библиотеке. Проверить статус контейнера `immich-machine-learning` и его логи. Убедиться, что том `immich_library` смонтирован в него с теми же путями, что и в `immich-server`.
После обновления образа сервис перестал работать Новая версия образа требует изменения переменных окружения или структуры томов. Перед обновлением проверять changelog образа на GitHub. Сначала тестировать обновление на копии бэкапа.

Большинство проблем диагностируется через анализ логов конкретного контейнера командой `docker-compose logs [service_name]`.

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