“Корпорации заинтересованы не в приватности, а в контроле. Когда у вас есть свой сервер, правила меняются. Вы получаете облачные функции без слежки, и это доступнее, чем кажется.”
Термин self-hosted — хостинг своими руками — означает, что программное обеспечение разворачивается и обслуживается на вашем собственном оборудовании или арендованном сервере, а не на инфраструктуре крупного провайдера вроде Google. Это не только про полный контроль над данными, но и про архитектурную независимость: ваши приложения работают по вашим правилам, в вашей сети, с вашими настройками резервного копирования и безопасности.
Выбор self-hosted решений, это стратегический отказ от модели, где вы являетесь продуктом. Вместо того чтобы обменивать свои данные на «бесплатные» сервисы, вы инвестируете в инфраструктуру, которая служит только вам. Это переводит отношения с технологиями из потребительской плоскости в плоскость владения и управления.
В российском IT-контексте этот подход получает дополнительное измерение. Регуляторные требования, такие как 152-ФЗ о персональных данных, обязывают компании обеспечивать локализацию и безопасность обработки данных. Self-hosted инфраструктура, развернутая внутри юрисдикции, изначально соответствует многим из этих требований, поскольку данные физически находятся под вашим контролем. Это снижает риски, связанные с использованием иностранных облаков, которые могут попадать под санкционные ограничения или иметь неясный правовой статус в вопросах доступа к информации.
Для ФСТЭК self-hosted подход может упростить процедуру аттестации информационных систем, так как исключается фактор стороннего, особенно зарубежного, провайдера. Вы сами определяете конфигурацию системы безопасности, проводите аудит и несете ответственность.
Альтернативы Google-сервисам в мире self-hosted
Экосистема Google построена вокруг ключевых сервисов: облачное хранилище (Google Диск), менеджер паролей (встроенный в Chrome и Android), фотохостинг (Google Фото). Для каждого из них существуют зрелые self-hosted аналоги, которые не просто копируют функционал, а часто предлагают большую гибкость.
Nextcloud, это не просто замена Google Диску. Это платформа для совместной работы, включающая файловый хостинг, календари, контакты, видеоконференции, документы для совместного редактирования и множество плагинов. Его ядро — веб-интерфейс для управления файлами, который синхронизируется с десктопными и мобильными клиентами. Nextcloud позволяет создавать общие папки для команд, настраивать детальные права доступа и автоматически версионировать файлы.
Vaultwarden, это неофициальная, но широко распространенная реализация менеджера паролей Bitwarden. Оригинальный Bitwarden имеет проприетарный сервер, в то время как Vaultwarden переписан на Rust и распространяется как открытое ПО. Он полностью совместим с официальными клиентами Bitwarden для браузеров, мобильных устройств и десктопа. Вы храните свои логины, пароли, заметки и платежные данные в зашифрованном виде на своем сервере.
Immich, это современная альтернатива Google Фото, созданная с фокусом на скорость и качество работы с большими библиотеками фотографий. Он поддерживает автоматическую загрузку с мобильных устройств, распознавание лиц, создание альбомов по геотегам, машинное обучение для тегирования объектов и дубликаты функций вроде «Воспоминания о сегодняшнем дне».
Эти три приложения формируют базовый стек для личного или рабочего использования, покрывая ключевые потребности в хранении, безопасности и медиа.
Архитектура: один сервер, несколько контейнеров
Развернуть три независимых приложения вручную, настраивая каждое в отдельности, — трудоемко и чревато конфликтами зависимостей. Современный подход — контейнеризация. Docker позволяет упаковать каждое приложение со всеми его библиотеками и настройками в изолированную среду — контейнер. Для оркестрации нескольких контейнеров, которые должны работать вместе, общаться между собой и быть описанными единой конфигурацией, используется Docker Compose.
Архитектура такого развертывания выглядит следующим образом: В этой схеме:
- Каждое приложение работает в своем контейнере, избегая конфликтов версий PHP, Python или других компонентов.
- Данные приложений (файлы Nextcloud, база паролей Vaultwarden, фотографии Immich) хранятся не внутри контейнеров, а на смонтированных томах (volumes) или директориях хоста. Это позволяет легко делать резервные копии, обновлять контейнеры без потери данных и мигрировать на другой сервер.
- Docker Compose описывает всю эту систему в одном файле
docker-compose.yml, определяя, какие образы использовать, какие порты открывать, как монтировать тома и как контейнеры зависят друг от друга.
Этот подход масштабируется. Позже вы сможете добавить в тот же файл Compose другие сервисы: почтовый сервер, RSS-агрегатор, систему мониторинга.
Предварительные требования и подготовка сервера
Для развертывания вам потребуется:
- Сервер с публичным IP-адресом. Это может быть физический сервер, VPS у российского хостинг-провайдера или даже мощный мини-ПК дома с пробросом портов.
- Операционная система. Ubuntu Server 22.04 LTS или аналогичный дистрибутив Debian/Rocky Linux — стандартный выбор из-за стабильности и широкой поддержки.
- Минимальные аппаратные ресурсы зависят от нагрузки. Для старта и небольшой семьи или команды из нескольких человек подойдет конфигурация:
- 2-4 ядра процессора.
- 4-8 ГБ оперативной памяти.
- 50-100 ГБ дискового пространства для системы и данных. SSD настоятельно рекомендуется для скорости работы баз данных и индексации фотографий Immich.
- Доменное имя или, как минимум, статический IP. Для полноценной работы, особенно с мобильными клиентами Bitwarden/Vaultwarden, нужен валидный SSL-сертификат. Проще всего получить его с помощью Let’s Encrypt, для чего требуется доменное имя, указывающее на ваш сервер.
Базовая настройка сервера
После получения доступа к серверу выполните первоначальные шаги по обеспечению безопасности и установке необходимого ПО:
- Обновление системы:
sudo apt update && sudo apt upgrade -y - Установка Docker и Docker Compose:
Docker Compose теперь часто входит в пакет `docker-compose-plugin`. Установка выполняется командами:
sudo apt install -y docker.io docker-compose-pluginПосле установки добавьте вашего пользователя в группу docker, чтобы не использовать sudo для каждой команды:
sudo usermod -aG docker $USERНеобходимо выйти из системы и зайти снова, чтобы изменения вступили в силу.
- Настройка брандмауэра (опционально, но рекомендуется):
Если вы используете `ufw`, разрешите SSH и порты для будущих сервисов:
sudo ufw allow OpenSSH sudo ufw enableПорты для самих сервисов (например, 80, 443 для веба) лучше открыть позже, после их настройки.
Создание структуры проекта и docker-compose.yml
Логично организовать проект в отдельной директории, где будут храниться конфигурация Docker Compose и данные приложений.
mkdir ~/selfhosted-stack
cd ~/selfhosted-stack
Создайте файл docker-compose.yml. Его структура будет описывать три сервиса. Приведем ключевые моменты конфигурации для каждого.
1. Nextcloud
Образ Nextcloud включает в себя веб-сервер и PHP. Для работы ему требуется база данных. Мы будем использовать MariaDB как отдельный контейнер в рамках того же файла Compose. Важно смонтировать том для хранения файлов пользователей вне контейнера.
2. Vaultwarden
Vaultwarden легковесен. Ему требуется только один том для хранения SQLite базы данных (или файлов, если вы выберете режим хранения на диске). Обратите внимание на переменную окружения SIGNUPS_ALLOWED: на рабочем сервере её следует установить в false после создания основного аккаунта, чтобы предотвратить несанкционированную регистрацию.
3. Immich
Конфигурация Immich немного сложнее, так как приложение состоит из нескольких микросервисов (server, machine-learning, microservices). Для простоты можно использовать образ, который включает всё необходимое. Immich требует томов для хранения фотографий и своей базы данных (PostgreSQL).
Ниже представлен объединенный файл docker-compose.yml, который служит отправной точкой. Это рабочий пример, но перед запуском в продакшене его необходимо адаптировать под свои нужды: заменить пароли, указать свои доменные имена, настроить пути для хранения данных.
version: '3.8'
services:
# База данных для Nextcloud
nextcloud-db:
image: mariadb:10.11
container_name: nextcloud-db
restart: unless-stopped
environment:
MYSQL_ROOT_PASSWORD: ваш_сложный_root_пароль
MYSQL_PASSWORD: пароль_для_пользователя_nextcloud
MYSQL_DATABASE: nextcloud
MYSQL_USER: nextcloud
volumes:
- nextcloud_db_data:/var/lib/mysql
# Сам Nextcloud
nextcloud:
image: nextcloud:latest
container_name: nextcloud-app
restart: unless-stopped
ports:
- "8080:80" # Веб-интерфейс будет доступен на порту 8080 сервера
depends_on:
- nextcloud-db
environment:
MYSQL_HOST: nextcloud-db
MYSQL_DATABASE: nextcloud
MYSQL_USER: nextcloud
MYSQL_PASSWORD: пароль_для_пользователя_nextcloud
NEXTCLOUD_TRUSTED_DOMAINS: ваш-домен-или-ip
volumes:
- nextcloud_data:/var/www/html
- nextcloud_config:/var/www/html/config
- ./apps:/var/www/html/custom_apps # Для пользовательских приложений
- ./data:/var/www/html/data # Пользовательские файлы
# Vaultwarden
vaultwarden:
image: vaultwarden/server:latest
container_name: vaultwarden
restart: unless-stopped
ports:
- "8081:80" # Веб-интерфейс на порту 8081
environment:
SIGNUPS_ALLOWED: 'true' # Поменять на 'false' после создания аккаунта!
ADMIN_TOKEN: ваш_секретный_админ_токен # Для доступа к панели администрирования
volumes:
- vaultwarden_data:/data
# Immich
immich:
image: altran1502/immich-server:release
container_name: immich-server
restart: unless-stopped
ports:
- "8082:3000" # Веб-интерфейс на порту 8082
environment:
DB_HOSTNAME: immich-postgres
DB_USERNAME: immich
DB_PASSWORD: пароль_для_immich
DB_DATABASE_NAME: immich
REDIS_HOSTNAME: immich-redis
volumes:
- immich_upload:/usr/src/app/upload
- ./photos:/photos # Директория с фотографиями на хосте
depends_on:
- immich-postgres
- immich-redis
# База данных PostgreSQL для Immich
immich-postgres:
image: postgres:14
container_name: immich-postgres
restart: unless-stopped
environment:
POSTGRES_USER: immich
POSTGRES_PASSWORD: пароль_для_immich
POSTGRES_DB: immich
volumes:
- immich_pg_data:/var/lib/postgresql/data
# Redis для Immich (кеширование)
immich-redis:
image: redis:7-alpine
container_name: immich-redis
restart: unless-stopped
volumes:
nextcloud_db_data:
nextcloud_data:
nextcloud_config:
vaultwarden_data:
immich_upload:
immich_pg_data:
Запуск и первоначальная настройка
Сохраните файл docker-compose.yml. Для запуска всех описанных сервисов выполните команду в директории с файлом:
docker compose up -d
Ключ -d запускает контейнеры в фоновом режиме (detached). Docker загрузит необходимые образы с Docker Hub и создаст контейнеры. Процесс может занять несколько минут.
После запуска проверьте статус контейнеров:
docker compose ps
Все сервисы должны иметь статус «Up». Теперь можно перейти к первоначальной настройке каждого через веб-интерфейс.
Nextcloud: откройте в браузере `http://ваш-ip-сервера:8080`. Вам будет предложено создать администраторскую учетную запись и указать данные для подключения к базе данных. В соответствующие поля введите:
- Имя пользователя БД:
nextcloud - Пароль БД: тот, что указан в
MYSQL_PASSWORD - База данных:
nextcloud - Хост БД:
nextcloud-db(это имя сервиса из docker-compose.yml, Docker Compose автоматически разрешает его в сетевой адрес)
Vaultwarden: откройте `http://ваш-ip-сервера:8081`. Вы увидите страницу входа. Так как мы разрешили регистрацию (`SIGNUPS_ALLOWED: ‘true’`), создайте первую учетную запись — она автоматически станет основной. После этого немедленно отредактируйте файл `docker-compose.yml`, изменив `SIGNUPS_ALLOWED` на `’false’`, и перезапустите сервис:
docker compose up -d vaultwarden
Immich: откройте `http://ваш-ip-сервера:8082`. Пройдите процесс регистрации первого пользователя. Затем в настройках можно указать путь к папке с фотографиями на хосте (в нашем примере это `./photos` внутри директории проекта). Immich начнет сканирование и индексацию.
Настройка обратного прокси и HTTPS (Nginx + Let’s Encrypt)
Работать с сервисами по разным портам (8080, 8081, 8082) неудобно. Стандартная практика — использование обратного прокси-сервера, такого как Nginx или Caddy. Он будет принимать все входящие HTTP/HTTPS запросы на стандартных портах 80 и 443 и «проксировать» их на соответствующий внутренний контейнер по порту.
Главная задача — получение SSL-сертификатов от Let’s Encrypt для включения HTTPS. Это обязательно для Vaultwarden, так как браузерные расширения и мобильные приложения Bitwarden требуют безопасного соединения. Для Nextcloud и Immich HTTPS также критически важен для безопасности.
Мы добавим в наш стек два новых контейнера: nginx-proxy как обратный прокси и letsencrypt-companion для автоматического получения и обновления сертификатов.
Пример обновленного фрагмента docker-compose.yml для Nginx:
nginx-proxy:
image: nginxproxy/nginx-proxy:latest
container_name: nginx-proxy
restart: unless-stopped
ports:
- "80:80"
- "443:443"
volumes:
- ./nginx/html:/usr/share/nginx/html
- ./nginx/vhost.d:/etc/nginx/vhost.d
- ./nginx/certs:/etc/nginx/certs:ro
- /var/run/docker.sock:/tmp/docker.sock:ro
depends_on:
- nextcloud
- vaultwarden
- immich
letsencrypt-companion:
image: nginxproxy/acme-companion:latest
container_name: nginx-proxy-letsencrypt
restart: unless-stopped
volumes:
- ./nginx/certs:/etc/nginx/certs:rw
- ./nginx/vhost.d:/etc/nginx/vhost.d
- ./nginx/html:/usr/share/nginx/html
- /var/run/docker.sock:/var/run/docker.sock:ro
depends_on:
- nginx-proxy
Для каждого из основных сервисов (nextcloud, vaultwarden, immich) в их конфигурацию в секции environment нужно добавить переменные:
VIRTUAL_HOST: ваше доменное имя (например,cloud.ваш-домен.ru,pass.ваш-домен.ru,photos.ваш-домен.ru).LETSENCRYPT_HOST: то же доменное имя.LETSENCRYPT_EMAIL: ваш email для уведомлений от Let’s Encrypt.
После добавления этих переменных и перезапуска стека (docker compose up -d) прокси автоматически настроится, и Let’s Encrypt получит сертификаты. Ваши сервисы станут доступны по https://cloud.ваш-домен.ru, https://pass.ваш-домен.ru и т.д.
Резервное копирование и обновления
Резервное копирование
Важные данные в self-hosted среде — это:
- Файлы пользователей (том
nextcloud_data, директория./photosдля Immich). - Базы данных (тома
nextcloud_db_data,vaultwarden_data,immich_pg_data). - Конфигурационные файлы.
Резервное копирование сводится к копированию соответствующих томов или директорий с хоста. Для баз данных рекомендуется использовать дампы. Например, для MariaDB можно добавить задание в cron:
docker exec nextcloud-db mysqldump -u nextcloud -p"пароль" nextcloud > /путь/к/бекапам/nextcloud-$(date +%Y%m%d).sql
Тома Docker обычно находятся в /var/lib/docker/volumes/, но полагаться на эту внутреннюю структуру не рекомендуется. Лучше смонтировать их в известные директории на хосте, как показано в примере с ./data для Nextcloud.
Обновления
Обновление контейнеров до новых версий — одна из сильных сторон Docker. Процесс обычно безопасен, если данные вынесены в тома.
- Остановите конкретный сервис:
docker compose stop vaultwarden. - Удалите его контейнер (данные в томах останутся):
docker compose rm vaultwarden. - Запустите сервис снова:
docker compose up -d vaultwarden. Docker Compose подтянет образ с последней версией тега `latest` (или того тега, что указан в файле) и создаст новый контейнер с теми же томами.
Для массового обновления всех сервисов можно использовать:
docker compose pull
docker compose up -d
Перед обновлением Nextcloud стоит ознакомиться с официальными заметками о выпуске, так как могут требоваться дополнительные шаги по обновлению базы данных.
Интеграция и использование
После настройки вы получаете три независимых, но совместно работающих сервиса.
Nextcloud станет вашим центральным файловым хабу. Установите десктопный клиент синхронизации или мобильное приложение для автоматической загрузки фото и документов. Используйте плагины для совместной работы над документами (Collabora Online или OnlyOffice).
Vaultwarden интегрируется через официальные расширения для браузеров (Chrome, Firefox, Edge) и мобильные приложения Bitwarden. В настройках клиента укажите URL вашего сервера (`https://pass.ваш-домен.ru`). Импортируйте пароли из менеджера браузера или других менеджеров.
Immich предлагает мобильное приложение для Android и iOS, которое может автоматически загружать новые фотографии и видео в вашу библиотеку при подключении к Wi-Fi. Веб-интерфейс позволяет просматривать, искать по тегам и лицам, создавать альбомы и делиться ими.
Эти три сервиса покрывают базовые потребности в облачных сервисах, предоставляя контроль, приватность и отсутствие скрытых платежей или ограничений на объем данных.