"Что
<br />
Семь конкретных docker-контейнеров с реальными docker-compose конфигами и объяснением зачем каждый нужен. Не теория — практика. Каждый из них закрывает платный облачный сервис который раньше тянул деньги ежемесячно.<br />
<h2>Почему вообще self-hosted</h2>
<p>Я не идеолог. Мне не принципиально где <a href="https://it-apteka.com/docker-volumes-kak-hranit-dannye-kontejnerov-i-ne-poterjat-ih-posle-prune/" title="Docker volumes: как хранить данные контейнеров и не потерять их после prune" target="_blank" rel="noopener" data-wpil-monitor-id="2947">хранятся мои данные</a> из философских соображений. Но когда я посчитал сколько плачу в месяц за Google One, 1Password, разные мониторинговые сервисы и инструменты автоматизации — цифра вышла неожиданной.</p>
<p>Плюс есть вещи которые облако просто не умеет. Автоматизация которая знает про твой умный дом и локальные сервисы одновременно. Мониторинг внутренних сервисов без VPN наружу. Документы которые не нужно загружать в чью-то облачную OCR-систему.</p>
<p>Семь контейнеров ниже — это не «лучшие по версии Reddit». Это то что реально работает у меня. С реальными конфигами, с граблями на которые я наступил, и с честной оценкой потребления ресурсов.</p>
<p>Всё крутится на N100-неттопе с <a class="wpil_keyword_link" href="https://it-apteka.com/category/virtualise/" target="_blank" rel="noopener" title="Виртуализация" data-wpil-keyword-link="linked" data-wpil-monitor-id="2957">Proxmox</a> и Docker внутри LXC. Суммарное потребление RAM семи контейнеров — около 3-3.5 GB. Остаётся место для других задач.</p>
<h2>Архитектура: как всё это связано</h2>
<pre class="mermaid">
%%{init: {
'theme': 'base',
'themeVariables': {
'primaryColor': '#ffffff',
'primaryTextColor': '#1e293b',
'primaryBorderColor': '#94a3b8',
'lineColor': '#64748b',
'fontSize': '15px',
'fontFamily': 'ui-sans-serif, system-ui, sans-serif'
},
'flowchart': {'curve': 'linear', 'nodeSpacing': 40, 'rankSpacing': 50}
}}%%
flowchart TD
NP["Nginx Proxy Manager - reverse proxy + SSL"] --> IM["Immich :2283 - фото"]
NP --> VW["Vaultwarden :8080 - пароли"]
NP --> UK["Uptime Kuma :3001 - мониторинг"]
NP --> PL["Paperless-ngx :8000 - документы"]
NP --> AB["Actual Budget :5006 - финансы"]
NP --> N8["n8n :5678 - автоматизация"]
NP --> HA["Home Assistant :8123 - умный дом"]
N8 --> IM
N8 --> UK
N8 --> HA
style NP fill:#f8fafc,stroke:#3b82f6,stroke-width:2px,color:#1e40af
style IM fill:#f0fdf4,stroke:#22c55e,stroke-width:1px,color:#15803d
style VW fill:#f0fdf4,stroke:#22c55e,stroke-width:1px,color:#15803d
style UK fill:#f0fdf4,stroke:#22c55e,stroke-width:1px,color:#15803d
style PL fill:#fefce8,stroke:#f97316,stroke-width:1px,color:#9a3412
style AB fill:#fefce8,stroke:#f97316,stroke-width:1px,color:#9a3412
style N8 fill:#fef2f2,stroke:#ef4444,stroke-width:1px,color:#991b1b
style HA fill:#fef2f2,stroke:#ef4444,stroke-width:1px,color:#991b1b
</pre>
<p>Все контейнеры сидят за <a href="https://it-apteka.com/nginx_proxy_manager/" title="Nginx Proxy Manager: настройка reverse proxy для Proxmox, Nextcloud, Vaultwarden и ещё семи сервисов" target="_blank" rel="noopener" data-wpil-monitor-id="2943">Nginx Proxy Manager</a> — он раздаёт SSL-сертификаты через Let’s Encrypt и проксирует трафик по доменным именам. Снаружи виден только один порт 443. Изнутри сети контейнеры общаются напрямую. <a class="wpil_keyword_link" href="https://it-apteka.com/tag/n8n/" target="_blank" rel="noopener" title="n8n" data-wpil-keyword-link="linked" data-wpil-monitor-id="2961">n8n</a> умеет дёргать Immich и Home Assistant через их API — это открывает хорошие возможности для автоматизации.</p>
<h2>Требования к железу</h2>
<table>
<thead>
<tr>
<th>Контейнер</th>
<th>RAM (факт)</th>
<th>CPU в покое</th>
<th>Диск</th>
<th>Особенности</th>
</tr>
</thead>
<tbody>
<tr>
<td>Immich (все сервисы)</td>
<td>600-900 MB</td>
<td>1-5%</td>
<td>Под фото — сколько есть</td>
<td>ML-worker нужен CPU при индексации</td>
</tr>
<tr>
<td>Vaultwarden</td>
<td>20-30 MB</td>
<td>0.1%</td>
<td>~50 MB</td>
<td>Самый лёгкий в списке</td>
</tr>
<tr>
<td>Uptime Kuma</td>
<td>150-250 MB</td>
<td>0.5-1%</td>
<td>~100 MB</td>
<td>—</td>
</tr>
<tr>
<td>Paperless-ngx</td>
<td>400-600 MB</td>
<td>1-3%</td>
<td>Под документы</td>
<td>OCR нагружает CPU при обработке</td>
</tr>
<tr>
<td>Actual Budget</td>
<td>100-150 MB</td>
<td>0.1%</td>
<td>~50 MB</td>
<td>—</td>
</tr>
<tr>
<td>n8n</td>
<td>200-400 MB</td>
<td>1-3% при workflow</td>
<td>~200 MB</td>
<td>Растёт с количеством workflows</td>
</tr>
<tr>
<td>Home Assistant</td>
<td>400-700 MB</td>
<td>1-3%</td>
<td>~500 MB</td>
<td>ВМ лучше чем контейнер</td>
</tr>
<tr>
<td>Итого</td>
<td>~2-3 GB</td>
<td>5-15%</td>
<td>Зависит от данных</td>
<td>N100 с 16 GB справляется</td>
</tr>
</tbody>
</table>
<h2>1. Immich — замена Google Photos</h2>
<p>Начну с самого эмоционально заряженного. Google Photos долгое время был безальтернативен — бесплатный, умный, с удобными приложениями. Потом Google сделал хранилище платным. Потом выяснилось что Google использует твои фото для обучения моделей. Потом ещё раз подумал о том сколько платил.</p>
<p>Immich — это не «похожий на Google Photos». Это Google Photos по ощущениям, только на твоём железе. Автобэкап с телефона, распознавание лиц, умный поиск «покажи фото с кошкой у моря», временная шкала, альбомы, общий доступ.</p>
"Что
<br />
Immich активно развивается. Обновления выходят часто. Всегда читай changelog перед обновлением и делай бэкап базы данных перед каждым апгрейдом. Фотографии — это не то с чем хочется экспериментировать.<br />
<p>В октябре 2025 года вышел стабильный Immich 2.0 — первый официально стабильный релиз. До этого проект формально был в бета-стадии. Актуальная версия на момент публикации — 2.7.x. Проверь <a href="https://github.com/immich-app/immich/releases" rel="nofollow noopener" target="_blank">актуальный релиз на GitHub</a> перед установкой.</p>
<h3>Установка Immich через docker compose</h3>
<p>Immich — стек из нескольких контейнеров: сервер, машинное обучение, PostgreSQL, Redis. Используй официальный compose-файл, не копируй из блогов — он меняется между релизами.</p>
<pre><code class="language-bash">
# Создай директорию
mkdir -p /opt/immich && cd /opt/immich
# Скачай официальный compose файл актуального релиза
wget -O docker-compose.yml https://github.com/immich-app/immich/releases/latest/download/docker-compose.yml
# Скачай пример .env
wget -O .env https://github.com/immich-app/immich/releases/latest/download/example.env
</code></pre>
<p>Отредактируй .env — главное задать UPLOAD_LOCATION:</p>
<pre><code class="language-text">
# .env для Immich
# Путь где будут храниться фото - выбери диск с достаточным местом
UPLOAD_LOCATION=/mnt/photos
# Путь для БД
DB_DATA_LOCATION=/opt/immich/pgdata
# Версия - лучше фиксировать конкретную, не latest
# IMMICH_VERSION=v2.7.5
# Пароль для PostgreSQL - сгенерируй нормальный
DB_PASSWORD=меняй_это_на_нормальный_пароль
# Прочее не трогай если не знаешь зачем
DB_USERNAME=postgres
DB_DATABASE_NAME=immich
</code></pre>
<pre><code class="language-bash">
# Запусти стек
docker compose up -d
# Проверь что все контейнеры поднялись
docker compose ps
# Логи если что-то не так
docker compose logs -f immich-server
</code></pre>
<p>Веб-интерфейс будет доступен на порту 2283. Приложения для iOS и Android — в App Store и Google Play, ищи «Immich».</p>
<h3>Настройка автобэкапа с телефона</h3>
<p>В приложении: Settings — <a class="wpil_keyword_link" href="https://it-apteka.com/category/rezervnoe-kopirovanie/" target="_blank" rel="noopener" title="Резервное копирование" data-wpil-keyword-link="linked" data-wpil-monitor-id="2958">Backup</a> — Auto Backup. Выбери папки которые хочешь синхронизировать. Можно настроить: только по Wi-Fi, только когда заряжается, исключить скриншоты. После первого запуска приложение закачает всю историю — на большой библиотеке это занимает время.</p>
<h3>Hardware acceleration для ML</h3>
<p>Если у тебя Intel N100 — Quick Sync можно использовать для ускорения машинного обучения в Immich. Это ускоряет первичную индексацию фотографий. В compose файле раскомментируй секцию с device для iGPU.</p>
<pre><code class="language-text">
# В секции immich-machine-learning добавь:
devices:
- /dev/dri/renderD128:/dev/dri/renderD128
</code></pre>
<p>Что заменяет: Google Photos (~30 EUR/год за 100 GB), iCloud Photos (~36 EUR/год). При большом фотоархиве экономия существенная.</p>
<h2>2. Vaultwarden — менеджер паролей</h2>
<p>Vaultwarden — это неофициальная реализация сервера Bitwarden на Rust. Весит 30 MB RAM против нескольких сотен MB у официального Bitwarden сервера. Разблокирует платные фичи Bitwarden: TOTP, Sends, организации.</p>
<p>Почему не просто локальный менеджер паролей типа KeePass? Потому что синхронизация между устройствами. Телефон, рабочий ноутбук, домашний ПК — все используют одну базу. Расширения Bitwarden для браузеров работают с Vaultwarden без изменений — просто укажи свой <a href="https://it-apteka.com/vpn-na-mikrotik-polnyj-gajd-2026-wireguard-l2tp-ipsec-ikev2-nastrojka-servera-i-klienta/" title="VPN на MikroTik: полный гайд 2026 — WireGuard, L2TP/IPsec, IKEv2, настройка сервера и клиента" target="_blank" rel="noopener" data-wpil-monitor-id="2950">сервер в настройках</a>.</p>
<h3>docker-compose для Vaultwarden</h3>
<pre><code class="language-text">
# /opt/vaultwarden/docker-compose.yml
services:
vaultwarden:
image: vaultwarden/server:latest
container_name: vaultwarden
restart: unless-stopped
volumes:
- /opt/vaultwarden/data:/data
environment:
# Отключи регистрацию после создания своего аккаунта
SIGNUPS_ALLOWED: "false"
# Токен для /admin панели - сгенерируй командой ниже
ADMIN_TOKEN: "замени_на_реальный_токен"
# Включи WebSocket для живых уведомлений
WEBSOCKET_ENABLED: "true"
# Домен для правильной работы 2FA и WebAuthn
DOMAIN: "https://vault.твой-домен.ru"
ports:
- "8080:80"
- "3012:3012"
</code></pre>
<pre><code class="language-bash">
# Сгенерируй ADMIN_TOKEN
openssl rand -base64 48
# Запусти
docker compose up -d
# Проверь логи
docker logs vaultwarden --tail=20
</code></pre>
"Критически
<br />
После создания своего аккаунта немедленно выставь SIGNUPS_ALLOWED в false. Иначе кто угодно кто найдёт твой Vaultwarden сможет зарегистрироваться и использовать его. Пароли — это не то место для экспериментов с настройками.<br />
<h3>Подключение клиентов Bitwarden</h3>
<p>В браузерном расширении Bitwarden: Settings — Server URL. Укажи адрес своего Vaultwarden. Всё остальное работает как в обычном Bitwarden — создаёшь аккаунт, включаешь 2FA, импортируешь существующие пароли из 1Password или LastPass через CSV-экспорт.</p>
<p>Что заменяет: 1Password (~36 EUR/год), LastPass Premium (~36 EUR/год), Bitwarden Premium (~10 EUR/год). Для семьи экономия ещё больше.</p>
<h2>3. Uptime Kuma — мониторинг всего</h2>
<p>Uptime Kuma выглядит как серьёзный мониторинговый сервис. Красивый интерфейс, статусные страницы, уведомления в <a class="wpil_keyword_link" href="https://t.me/it_apteka_com/34" target="_blank" rel="noopener" title="Telegram" data-wpil-keyword-link="linked" data-wpil-monitor-id="2956">Telegram</a>. Но ставится за три минуты и ест 150 MB RAM.</p>
<p>Что мониторю: все свои контейнеры по HTTP-статусу, домашний роутер по ping, внешние сервисы которые мне важны, SSL-сертификаты (Uptime Kuma предупреждает за 30 дней до истечения). Уведомления летят в Telegram — телефон пикает когда что-то упало.</p>
<h3>docker-compose для Uptime Kuma</h3>
<pre><code class="language-text">
# /opt/uptime-kuma/docker-compose.yml
services:
uptime-kuma:
image: louislam/uptime-kuma:latest
container_name: uptime-kuma
restart: unless-stopped
volumes:
- /opt/uptime-kuma/data:/app/data
ports:
- "3001:3001"
# Нужен доступ к Docker сокету если хочешь мониторить контейнеры напрямую
# volumes:
# - /var/run/docker.sock:/var/run/docker.sock:ro
</code></pre>
<pre><code class="language-bash">
docker compose up -d
</code></pre>
<p>После запуска переходи на порт 3001, создаёшь аккаунт (только один — нет мультипользовательности), добавляешь мониторы.</p>
<h3>Настройка Telegram-уведомлений</h3>
<p>Settings — Notifications — Add Notification — Telegram. Нужен Bot Token (создаёшь через @BotFather) и Chat ID (получаешь через @userinfobot). После <a href="https://it-apteka.com/uptime-kuma-alerting-bez-zamorochek-dlja-admina-kotoryj-cenit-vremja/" title="Установка и настройка Uptime Kuma: self-hosted мониторинг сайтов за 5 минут" target="_blank" rel="noopener" data-wpil-monitor-id="2944">настройки Uptime Kuma</a> отправит тестовое сообщение. Настраивай уведомления сразу — иначе смысл мониторинга теряется.</p>
<h3>Статусная страница для семьи</h3>
<p>Status Pages — Add Status Page. Создаёшь публичную страницу где видно статус твоих сервисов. Полезно если другие члены семьи пользуются домашними сервисами — они могут сами посмотреть что упало, а не спрашивать тебя.</p>
<p>Что заменяет: UptimeRobot Pro (~7 USD/месяц), Better Uptime (~20 USD/месяц).</p>
<h2>4. Paperless-ngx — конец бумажному хаосу</h2>
<p>Есть вещи которые я ненавижу. Одна из них — стопка бумаг на столе где «где-то» лежит нужный документ. Страховки, договоры, квитанции, справки — всё это копится и теряется.</p>
<p>Paperless-ngx сканирует документы, делает OCR (распознаёт текст), индексирует и делает доступным через веб-интерфейс с поиском. Загружаешь PDF с телефона — через минуту он проиндексирован и ты можешь найти его по слову в тексте. Можно настроить автоматические правила: если в документе есть слово «Vodafone» — добавь тег «телефон» и положи в папку «Провайдеры».</p>
<h3>docker-compose для Paperless-ngx</h3>
<p>Paperless-ngx требует PostgreSQL или SQLite, Redis и Tika для обработки сложных форматов. Официальный compose-файл на GitHub — самый простой способ.</p>
<pre><code class="language-bash">
# Скачай официальный compose файл
mkdir -p /opt/paperless && cd /opt/paperless
curl -Lo docker-compose.yml https://raw.githubusercontent.com/paperless-ngx/paperless-ngx/main/docker/compose/docker-compose.postgres-tika.yml
curl -Lo .env https://raw.githubusercontent.com/paperless-ngx/paperless-ngx/main/docker/compose/.env.example
</code></pre>
<p>Важные параметры в .env:</p>
<pre><code class="language-text">
# /opt/paperless/.env - ключевые настройки
PAPERLESS_SECRET_KEY=сгенерируй_openssl_rand_-hex_32
PAPERLESS_TIME_ZONE=Europe/Moscow
PAPERLESS_OCR_LANGUAGE=rus+eng
USERMAP_UID=1000
USERMAP_GID=1000
# Для хранения документов
PAPERLESS_MEDIA_ROOT=/usr/src/paperless/media
</code></pre>
<pre><code class="language-bash">
# Запусти
docker compose up -d
# Создай суперпользователя
docker compose exec webserver python3 manage.py createsuperuser
# Проверь логи
docker compose logs -f webserver
</code></pre>
<h3>Workflow с телефона</h3>
<p>На телефоне: приложение «Сканер документов» (iOS) или Microsoft Lens (Android), сохраняешь как PDF, загружаешь в Paperless через мобильный браузер или через папку consume. Paperless обработает документ в фоне — обычно занимает 30-60 секунд на страницу.</p>
<p>Для автоматического импорта: настрой папку consume на сетевом диске или через приложение Paperless для iOS/Android. Положил файл — он автоматически обработан.</p>
<p>Что заменяет: Adobe Acrobat (~18 EUR/месяц), Genius Scan Pro (~15 EUR/год), хранение документов в Dropbox с ручной организацией.</p>
<h2>5. Actual Budget — финансы без подписок</h2>
<p>Это самый неожиданный пункт списка. Не потому что неожиданно полезный, а потому что я долго не понимал зачем мне self-hosted менеджер бюджета. Ведь есть таблицы Excel.</p>
<p>Actual Budget — это приложение для бюджетирования по методу envelope budgeting. Суть: деньги которые ты заработал распределяются по «конвертам» (категориям) заранее. Ты не отслеживаешь что потратил — ты планируешь что потратишь. Разница в подходе принципиальная.</p>
<p>Проект был платным SaaS, потом его создатель открыл исходники. Теперь можно поднять локально — и синхронизация между телефоном и компьютером работает через твой сервер.</p>
<h3>docker-compose для Actual Budget</h3>
<pre><code class="language-text">
# /opt/actual/docker-compose.yml
services:
actual:
image: actualbudget/actual-server:latest
container_name: actual-budget
restart: unless-stopped
volumes:
- /opt/actual/data:/data
ports:
- "5006:5006"
environment:
- ACTUAL_HTTPS=false
</code></pre>
<pre><code class="language-bash">
docker compose up -d
# Открывай :5006, создаёшь файл бюджета, настраиваешь категории
</code></pre>
<p>Actual Budget работает локально в браузере — данные синхронизируются через твой сервер, но само приложение рендерится на клиенте. Быстро, без лагов.</p>
<p>Импорт из банков: большинство российских и европейских банков поддерживают экспорт в CSV или OFX. Actual Budget умеет импортировать оба формата. Ручное добавление транзакций тоже работает — Actual автоматически дополняет название по первым буквам.</p>
<p>Что заменяет: YNAB (~100 USD/год), Copilot Money (~70 USD/год), ручное ведение в Google Sheets.</p>
<h2>6. n8n — автоматизация которая умеет всё</h2>
<p>n8n — это workflow автоматизация. Если знаешь Zapier или Make (Integromat) — n8n это то же самое, но self-hosted и без ограничений на количество запусков.</p>
<p>Звучит абстрактно. Вот конкретные вещи которые у меня автоматизированы:</p>
<ul>
<li>Уведомление в Telegram когда Immich обнаруживает новое лицо на фото</li>
<li>Еженедельный отчёт по Uptime Kuma — сколько времени каждый сервис был недоступен</li>
<li>Автоматическое добавление задачи в Gitea Issues когда приходит письмо с определённой темой</li>
<li>Напоминание в Telegram за 3 дня до истечения SSL-сертификатов</li>
<li>Включение света в Home Assistant когда я прихожу домой (по геолокации телефона)</li>
</ul>
<p>У n8n есть важный нюанс: fair-code лицензия. Для личного использования — бесплатно и без ограничений. Для коммерческого использования — нужна лицензия. Для домашнего сервера это не проблема.</p>
<h3>docker-compose для n8n</h3>
<pre><code class="language-text">
# /opt/n8n/docker-compose.yml
services:
n8n:
image: n8nio/n8n:latest
container_name: n8n
restart: unless-stopped
volumes:
- /opt/n8n/data:/home/node/.n8n
ports:
- "5678:5678"
environment:
- N8N_HOST=n8n.твой-домен.ru
- N8N_PORT=5678
- N8N_PROTOCOL=https
- WEBHOOK_URL=https://n8n.твой-домен.ru/
- GENERIC_TIMEZONE=Europe/Moscow
# Базовая auth - измени!
- N8N_BASIC_AUTH_ACTIVE=true
- N8N_BASIC_AUTH_USER=admin
- N8N_BASIC_AUTH_PASSWORD=измени_это
</code></pre>
<pre><code class="language-bash">
docker compose up -d
# Открывай :5678 - попросит создать аккаунт
</code></pre>
<h3>Первый workflow: уведомление в Telegram</h3>
<p>New Workflow — добавь Trigger (например Schedule или Webhook) — добавь ноду Telegram — Send Message. Укажи Bot Token и Chat ID. Сохрани и активируй. Вот и всё — первая автоматизация работает.</p>
<p>Нод в n8n несколько сотен: HTTP Request, PostgreSQL, Gmail, Telegram, Home Assistant, Gitea, и много других. Если нужного нода нет — HTTP Request нода умеет работать с любым REST API.</p>
"Про
<br />
n8n с Node.js под капотом. При старте ест около 200-300 MB. По мере добавления workflows и при активных executions может вырасти до 500-600 MB. На N100 с 16 GB это не проблема, но имей в виду если память у тебя ограничена.<br />
<p>Что заменяет: Zapier (от ~20 USD/месяц), Make/Integromat (от ~9 USD/месяц за ограниченное количество операций).</p>
<h2>7. Home Assistant — умный дом без облака</h2>
<p>Home Assistant — отдельный разговор. Это не просто контейнер который запустил и забыл. Это платформа которая требует времени на настройку, зато потом работает независимо от интернета, без облаков производителей устройств и без подписок.</p>
<p>У меня через Home Assistant управляются: умные розетки, освещение, термостат, датчики температуры и влажности, присутствие по телефонам в локальной сети. Всё локально, без Zigbee-хаба в облаке производителя.</p>
<h3>Home Assistant: ВМ vs контейнер</h3>
<p>Есть три способа запустить Home Assistant. Home Assistant OS (HAOS) — полноценная ВМ с встроенным менеджером дополнений. Home Assistant Container — просто Docker-контейнер без дополнений. Home Assistant Supervised — нечто среднее.</p>
<p>Я рекомендую HAOS в Proxmox ВМ, а не Docker-контейнер. Причина: аддоны (Zigbee2MQTT, ESPHome, Node-RED, Mosquitto) в HAOS устанавливаются в один клик и автоматически интегрируются. В контейнере каждый аддон это отдельный docker-compose сервис который нужно настраивать вручную.</p>
<p>Но если у тебя нет <a href="https://it-apteka.com/ustanovka-n8n-v-lxc-kontejner-proxmox-polnaja-instrukcija-ot-a-do-ja/" title="Установка N8N в LXC контейнер Proxmox: полная инструкция от А до Я" target="_blank" rel="noopener" data-wpil-monitor-id="2948">Proxmox и ты хочешь просто поставить контейнер:</a></p>
<pre><code class="language-text">
# /opt/homeassistant/docker-compose.yml
# Внимание: это Home Assistant Container - без аддонов
services:
homeassistant:
image: ghcr.io/home-assistant/home-assistant:stable
container_name: homeassistant
restart: unless-stopped
# Обязательно для работы с локальной сетью (mDNS, discovery)
network_mode: host
volumes:
- /opt/homeassistant/config:/config
- /etc/localtime:/etc/localtime:ro
# Для USB Zigbee/Z-Wave адаптеров
# devices:
# - /dev/ttyUSB0:/dev/ttyUSB0
privileged: true
</code></pre>
<pre><code class="language-bash">
docker compose up -d
# Home Assistant поднимается около 1-2 минут при первом старте
# Потом открывай :8123
</code></pre>
<p>При первом запуске Home Assistant автоматически обнаружит устройства в локальной сети — Philips Hue, TP-Link Kasa, DLNA-устройства и другие. Это впечатляет: заходишь на :8123 и видишь уже добавленные интеграции которые HA нашёл сам.</p>
<h3>Интеграция с n8n</h3>
<p>Home Assistant имеет REST API и WebSocket API. n8n умеет работать с обоими. Пример: workflow в n8n запускается по расписанию, проверяет наличие всех домашних устройств через HA API, и если никого нет дома больше часа — отправляет в HA команду выключить всё освещение.</p>
<pre><code class="language-text">
# HTTP Request нода в n8n для HA
URL: http://homeassistant:8123/api/states
Headers:
Authorization: Bearer ВАШ_LONG_LIVED_TOKEN
Content-Type: application/json
</code></pre>
<p>Long-lived token создаётся в HA: профиль пользователя — Security — Long-Lived Access Tokens.</p>
<p>Что заменяет: SmartThings (~5 USD/месяц), Apple HomeKit без хаба (требует HomePod/AppleTV), облачные хабы умных устройств.</p>
<h2>Как это всё обновлять</h2>
<p>Семь контейнеров — это семь точек где нужно следить за обновлениями. Для <a href="https://it-apteka.com/obnovlenie-docker-kontejnerov-avtomaticheski-watchtower-vs-diun/" title="Обновление Docker-контейнеров автоматически: Watchtower vs Diun" target="_blank" rel="noopener" data-wpil-monitor-id="2949">автоматического обновления образов есть Watchtower</a>.</p>
<pre><code class="language-text">
# /opt/watchtower/docker-compose.yml
services:
watchtower:
image: containrrr/watchtower
container_name: watchtower
restart: unless-stopped
volumes:
- /var/run/docker.sock:/var/run/docker.sock
environment:
# Проверять раз в сутки (секунды)
- WATCHTOWER_POLL_INTERVAL=86400
# Уведомлять в Telegram
- WATCHTOWER_NOTIFICATIONS=telegram
- WATCHTOWER_NOTIFICATION_TELEGRAM_TOKEN=твой_бот_токен
- WATCHTOWER_NOTIFICATION_TELEGRAM_CHAT_ID=твой_чат_id
# Только уведомлять, не обновлять автоматически
# Раскомментируй если хочешь автообновление:
# - WATCHTOWER_RUN_ONCE=true
</code></pre>
"Про
<br />
Immich не рекомендует автоматическое обновление через Watchtower. Между версиями бывают несовместимые изменения схемы БД. Обновляй Immich вручную: прочитал changelog, сделал бэкап БД, обновил compose файл, поднял стек.<br />
<h2>Бэкапы: что и как</h2>
<p>Семь контейнеров — это семь источников данных которые нужно бэкапить по-разному.</p>
<table>
<thead>
<tr>
<th>Контейнер</th>
<th>Что бэкапить</th>
<th>Метод</th>
<th>Частота</th>
</tr>
</thead>
<tbody>
<tr>
<td>Immich</td>
<td>Папка с фото + дамп PostgreSQL</td>
<td>rsync + pg_dump</td>
<td>Ежедневно</td>
</tr>
<tr>
<td>Vaultwarden</td>
<td>/opt/vaultwarden/data</td>
<td>rsync или tar</td>
<td>Ежедневно</td>
</tr>
<tr>
<td>Uptime Kuma</td>
<td>/opt/uptime-kuma/data</td>
<td>rsync</td>
<td>Еженедельно</td>
</tr>
<tr>
<td>Paperless-ngx</td>
<td>Медиа + дамп PostgreSQL</td>
<td>rsync + pg_dump</td>
<td>Ежедневно</td>
</tr>
<tr>
<td>Actual Budget</td>
<td>/opt/actual/data</td>
<td>rsync</td>
<td>Ежедневно</td>
</tr>
<tr>
<td>n8n</td>
<td>/opt/n8n/data</td>
<td>rsync</td>
<td>Еженедельно</td>
</tr>
<tr>
<td>Home Assistant</td>
<td>/opt/homeassistant/config</td>
<td>rsync + HA built-in backup</td>
<td>Еженедельно</td>
</tr>
</tbody>
</table>
<pre><code class="language-bash">
#!/bin/bash
# /opt/scripts/backup-all.sh
# Простой скрипт бэкапа всех контейнеров
BACKUP_DIR="/mnt/backup/docker"
DATE=$(date +%Y%m%d)
# Создай директорию
mkdir -p "${BACKUP_DIR}/${DATE}"
# Бэкап папок данных
for service in vaultwarden uptime-kuma actual n8n homeassistant; do
rsync -av "/opt/${service}/data/" "${BACKUP_DIR}/${DATE}/${service}/"
done
# Дамп PostgreSQL для Immich
docker exec immich_postgres pg_dump -U postgres immich | gzip > "${BACKUP_DIR}/${DATE}/immich-db.sql.gz"
# Дамп PostgreSQL для Paperless
docker exec paperless-db pg_dump -U paperless paperless | gzip > "${BACKUP_DIR}/${DATE}/paperless-db.sql.gz"
# Удали бэкапы старше 30 дней
find "${BACKUP_DIR}" -maxdepth 1 -type d -mtime +30 -exec rm -rf {} \;
echo "Backup done: ${DATE}"
</code></pre>
<pre><code class="language-bash">
# Добавь в crontab для запуска ежедневно в 03:00
echo "0 3 * * * /opt/scripts/backup-all.sh >> /var/log/docker-backup.log 2>&1" | crontab -
</code></pre>
<h2>Troubleshooting: частые проблемы</h2>
<table>
<thead>
<tr>
<th>Проблема</th>
<th>Контейнер</th>
<th>Причина</th>
<th>Решение</th>
</tr>
</thead>
<tbody>
<tr>
<td>Immich не запускается после обновления</td>
<td>Immich</td>
<td>Несовместимое изменение схемы БД</td>
<td>Откати версию, сделай бэкап, обновляй по официальному changelog</td>
</tr>
<tr>
<td>Vaultwarden не принимает пароль</td>
<td>Vaultwarden</td>
<td>Домен не указан или не совпадает</td>
<td>Проверь DOMAIN в env, должен совпадать с URL клиента</td>
</tr>
<tr>
<td>Uptime Kuma не шлёт уведомления</td>
<td>Uptime Kuma</td>
<td>Bot Token или Chat ID неверный</td>
<td>Проверь через @userinfobot, перепроверь токен в @BotFather</td>
</tr>
<tr>
<td>Paperless не распознаёт кириллицу</td>
<td>Paperless-ngx</td>
<td>Не установлен пакет tesseract для русского</td>
<td>PAPERLESS_OCR_LANGUAGE=rus+eng в .env</td>
</tr>
<tr>
<td>n8n потерял все workflows</td>
<td>n8n</td>
<td>Volume не был примонтирован</td>
<td>Всегда монтируй /home/node/.n8n на хост</td>
</tr>
<tr>
<td>Home Assistant не видит локальные устройства</td>
<td>Home Assistant</td>
<td>Нет network_mode: host</td>
<td>Добавь network_mode: host в compose</td>
</tr>
<tr>
<td>Actual Budget не синхронизируется с телефона</td>
<td>Actual Budget</td>
<td>HTTP вместо HTTPS — браузер блокирует</td>
<td>Поставь за <a href="https://it-apteka.com/mikrotik-nginx-proxy-manager-ustanovka-container-ssl-i-reverse-proxy-shpargalka/" title="MikroTik Nginx Proxy Manager: установка container, SSL и reverse proxy — шпаргалка" target="_blank" rel="noopener" data-wpil-monitor-id="2942">Nginx Proxy Manager с SSL</a></td>
</tr>
</tbody>
</table>
<h3>Команды диагностики</h3>
<pre><code class="language-bash">
# Статус всех контейнеров
docker ps -a --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}"
# Потребление ресурсов
docker stats --no-stream --format "table {{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}}"
# Логи конкретного контейнера
docker logs vaultwarden --tail=50 -f
# Перезапустить один контейнер
docker restart uptime-kuma
# Полностью пересоздать контейнер
cd /opt/n8n && docker compose down && docker compose up -d
# Проверить сетевые соединения между контейнерами
docker network ls
docker network inspect bridge
</code></pre>
<h2>FAQ</h2>
<h3>Нужен ли публичный IP для всего этого?</h3>
<p>Нет. Всё из списка работает полностью в локальной сети без выхода наружу. Телефонные приложения Immich и Vaultwarden умеют работать и по локальному IP. Если хочешь доступ снаружи — подними WireGuard VPN и заходи через него. Это безопаснее чем открывать порты напрямую.</p>
<h3>Как лучше организовать docker-compose файлы?</h3>
<p>Каждый сервис в отдельной папке /opt/servicename/ со своим docker-compose.yml и .env. Не надо складывать всё в один большой compose. Проще обновлять, проще откатывать, проще разбираться что сломалось. Gitea или просто <a class="wpil_keyword_link" href="https://it-apteka.com/tag/git/" target="_blank" rel="noopener" title="Git" data-wpil-keyword-link="linked" data-wpil-monitor-id="2959">git</a> init в /opt/ — и все compose файлы под версионным контролем.</p>
<h3>Как безопасно открыть сервисы наружу?</h3>
<p>Только через reverse proxy с SSL (<a href="https://it-apteka.com/acme-nginx-nastrojka-let-s-encrypt-vruchnuju-i-cherez-nginx-proxy-manager/" title="ACME + Nginx: настройка Let’s Encrypt вручную и через Nginx Proxy Manager" target="_blank" rel="noopener" data-wpil-monitor-id="2945">Nginx Proxy Manager</a>, Caddy, Traefik). Напрямую порты не открывай. Обязательно аутентификация на каждом сервисе — или встроенная, или через <a href="https://it-apteka.com/nginx-proxy-manager-vs-traefik-chto-vybrat-v-2026/" title="Nginx Proxy Manager vs Traefik: что выбрать в 2026" target="_blank" rel="noopener" data-wpil-monitor-id="2946">Nginx Proxy Manager</a> с Basic Auth. Fail2ban на SSH. Для критичных сервисов (Vaultwarden) — дополнительно IP whitelist или VPN.</p>
<h3>Что делать если диск заканчивается под Immich?</h3>
<p>Immich умеет работать с несколькими точками монтирования (Storage Templates). Можно добавить внешний диск, примонтировать как volume и указать как Storage Path в настройках Immich. Старые фото можно переложить вручную — главное не трогать структуру папок которую Immich создал сам.</p>
<h3>Как обновлять контейнеры безопасно?</h3>
<pre><code class="language-bash">
# Общая процедура безопасного обновления
cd /opt/servicename
# 1. Сделай бэкап данных
rsync -av ./data/ /mnt/backup/servicename-before-update/
# 2. Скачай новый образ
docker compose pull
# 3. Посмотри что изменилось (для сервисов с важными данными)
# Читай changelog проекта на GitHub
# 4. Обнови
docker compose up -d
# 5. Проверь логи
docker compose logs -f --tail=50
</code></pre>
<h3>Сколько места нужно под все это?</h3>
<p>Без учёта фото и документов — около 5-10 GB для всех образов и конфигов. Immich с фотоархивом — столько сколько у тебя фотографий (у меня около 80 GB за 10 лет). Paperless с документами — обычно 5-20 GB. Остальные сервисы по 50-200 MB. Минимальный рабочий вариант — 32 GB <a class="wpil_keyword_link" href="https://it-apteka.com/tag/nvme/" target="_blank" rel="noopener" title="nvme" data-wpil-keyword-link="linked" data-wpil-monitor-id="2960">NVMe</a>, комфортный — 256 GB и выше.</p>
<h2>Итог</h2>
<p>Семь контейнеров, три часа на установку, несколько вечеров на <a href="https://it-apteka.com/10-oshibok-pri-nastrojke-domashnego-wi-fi-iz-za-kotoryh-tormozit-internet/" title="10 ошибок при настройке домашнего Wi-Fi, из-за которых тормозит интернет" target="_blank" rel="noopener" data-wpil-monitor-id="2951">настройку — и домашний</a> сервер закрывает задачи которые раньше требовали платных подписок или мирились с отдачей данных третьим сторонам.</p>
<p>Экономия в деньгах: Google One + 1Password + Zapier + UptimeRobot Pro — это где-то 80-150 EUR/год в зависимости от тарифов. Домашний сервер на N100 стоит в эксплуатации около 15-20 EUR/год электричества.</p>
<p>Начинай с Vaultwarden и Uptime Kuma — они простейшие и сразу дают ощутимый результат. Immich и Paperless требуют больше настройки но и отдача выше. n8n и Home Assistant — это кроличья нора в которую можно нырнуть надолго, но это уже приятная часть.</p>
"Если
<br />
Пиши в комментариях. Все семь контейнеров я поднимал сам, грабли собирал лично — большинство проблем знакомы.<br />
Что получишь после этой статьи
Семь конкретных docker-контейнеров с реальными docker-compose конфигами и объяснением зачем каждый нужен. Не теория — практика. Каждый из них закрывает платный облачный сервис который раньше тянул деньги ежемесячно.
Почему вообще self-hosted
Я не идеолог. Мне не принципиально где хранятся мои данные из философских соображений. Но когда я посчитал сколько плачу в месяц за Google One, 1Password, разные мониторинговые сервисы и инструменты автоматизации — цифра вышла неожиданной.
Плюс есть вещи которые облако просто не умеет. Автоматизация которая знает про твой умный дом и локальные сервисы одновременно. Мониторинг внутренних сервисов без VPN наружу. Документы которые не нужно загружать в чью-то облачную OCR-систему.
Семь контейнеров ниже — это не «лучшие по версии Reddit». Это то что реально работает у меня. С реальными конфигами, с граблями на которые я наступил, и с честной оценкой потребления ресурсов.
Всё крутится на N100-неттопе с Proxmox и Docker внутри LXC. Суммарное потребление RAM семи контейнеров — около 3-3.5 GB. Остаётся место для других задач.
Архитектура: как всё это связано
%%{init: {
'theme': 'base',
'themeVariables': {
'primaryColor': '#ffffff',
'primaryTextColor': '#1e293b',
'primaryBorderColor': '#94a3b8',
'lineColor': '#64748b',
'fontSize': '15px',
'fontFamily': 'ui-sans-serif, system-ui, sans-serif'
},
'flowchart': {'curve': 'linear', 'nodeSpacing': 40, 'rankSpacing': 50}
}}%%
flowchart TD
NP["Nginx Proxy Manager - reverse proxy + SSL"] --> IM["Immich :2283 - фото"]
NP --> VW["Vaultwarden :8080 - пароли"]
NP --> UK["Uptime Kuma :3001 - мониторинг"]
NP --> PL["Paperless-ngx :8000 - документы"]
NP --> AB["Actual Budget :5006 - финансы"]
NP --> N8["n8n :5678 - автоматизация"]
NP --> HA["Home Assistant :8123 - умный дом"]
N8 --> IM
N8 --> UK
N8 --> HA
style NP fill:#f8fafc,stroke:#3b82f6,stroke-width:2px,color:#1e40af
style IM fill:#f0fdf4,stroke:#22c55e,stroke-width:1px,color:#15803d
style VW fill:#f0fdf4,stroke:#22c55e,stroke-width:1px,color:#15803d
style UK fill:#f0fdf4,stroke:#22c55e,stroke-width:1px,color:#15803d
style PL fill:#fefce8,stroke:#f97316,stroke-width:1px,color:#9a3412
style AB fill:#fefce8,stroke:#f97316,stroke-width:1px,color:#9a3412
style N8 fill:#fef2f2,stroke:#ef4444,stroke-width:1px,color:#991b1b
style HA fill:#fef2f2,stroke:#ef4444,stroke-width:1px,color:#991b1b
Все контейнеры сидят за Nginx Proxy Manager — он раздаёт SSL-сертификаты через Let’s Encrypt и проксирует трафик по доменным именам. Снаружи виден только один порт 443. Изнутри сети контейнеры общаются напрямую. n8n умеет дёргать Immich и Home Assistant через их API — это открывает хорошие возможности для автоматизации.
Требования к железу
| Контейнер |
RAM (факт) |
CPU в покое |
Диск |
Особенности |
| Immich (все сервисы) |
600-900 MB |
1-5% |
Под фото — сколько есть |
ML-worker нужен CPU при индексации |
| Vaultwarden |
20-30 MB |
0.1% |
~50 MB |
Самый лёгкий в списке |
| Uptime Kuma |
150-250 MB |
0.5-1% |
~100 MB |
— |
| Paperless-ngx |
400-600 MB |
1-3% |
Под документы |
OCR нагружает CPU при обработке |
| Actual Budget |
100-150 MB |
0.1% |
~50 MB |
— |
| n8n |
200-400 MB |
1-3% при workflow |
~200 MB |
Растёт с количеством workflows |
| Home Assistant |
400-700 MB |
1-3% |
~500 MB |
ВМ лучше чем контейнер |
| Итого |
~2-3 GB |
5-15% |
Зависит от данных |
N100 с 16 GB справляется |
1. Immich — замена Google Photos
Начну с самого эмоционально заряженного. Google Photos долгое время был безальтернативен — бесплатный, умный, с удобными приложениями. Потом Google сделал хранилище платным. Потом выяснилось что Google использует твои фото для обучения моделей. Потом ещё раз подумал о том сколько платил.
Immich — это не «похожий на Google Photos». Это Google Photos по ощущениям, только на твоём железе. Автобэкап с телефона, распознавание лиц, умный поиск «покажи фото с кошкой у моря», временная шкала, альбомы, общий доступ.
Что важно знать про Immich
Immich активно развивается. Обновления выходят часто. Всегда читай changelog перед обновлением и делай бэкап базы данных перед каждым апгрейдом. Фотографии — это не то с чем хочется экспериментировать.
В октябре 2025 года вышел стабильный Immich 2.0 — первый официально стабильный релиз. До этого проект формально был в бета-стадии. Актуальная версия на момент публикации — 2.7.x. Проверь актуальный релиз на GitHub перед установкой.
Установка Immich через docker compose
Immich — стек из нескольких контейнеров: сервер, машинное обучение, PostgreSQL, Redis. Используй официальный compose-файл, не копируй из блогов — он меняется между релизами.
# Создай директорию
mkdir -p /opt/immich && cd /opt/immich
# Скачай официальный compose файл актуального релиза
wget -O docker-compose.yml https://github.com/immich-app/immich/releases/latest/download/docker-compose.yml
# Скачай пример .env
wget -O .env https://github.com/immich-app/immich/releases/latest/download/example.env
Отредактируй .env — главное задать UPLOAD_LOCATION:
# .env для Immich
# Путь где будут храниться фото - выбери диск с достаточным местом
UPLOAD_LOCATION=/mnt/photos
# Путь для БД
DB_DATA_LOCATION=/opt/immich/pgdata
# Версия - лучше фиксировать конкретную, не latest
# IMMICH_VERSION=v2.7.5
# Пароль для PostgreSQL - сгенерируй нормальный
DB_PASSWORD=меняй_это_на_нормальный_пароль
# Прочее не трогай если не знаешь зачем
DB_USERNAME=postgres
DB_DATABASE_NAME=immich
# Запусти стек
docker compose up -d
# Проверь что все контейнеры поднялись
docker compose ps
# Логи если что-то не так
docker compose logs -f immich-server
Веб-интерфейс будет доступен на порту 2283. Приложения для iOS и Android — в App Store и Google Play, ищи «Immich».
Настройка автобэкапа с телефона
В приложении: Settings — Backup — Auto Backup. Выбери папки которые хочешь синхронизировать. Можно настроить: только по Wi-Fi, только когда заряжается, исключить скриншоты. После первого запуска приложение закачает всю историю — на большой библиотеке это занимает время.
Hardware acceleration для ML
Если у тебя Intel N100 — Quick Sync можно использовать для ускорения машинного обучения в Immich. Это ускоряет первичную индексацию фотографий. В compose файле раскомментируй секцию с device для iGPU.
# В секции immich-machine-learning добавь:
devices:
- /dev/dri/renderD128:/dev/dri/renderD128
Что заменяет: Google Photos (~30 EUR/год за 100 GB), iCloud Photos (~36 EUR/год). При большом фотоархиве экономия существенная.
2. Vaultwarden — менеджер паролей
Vaultwarden — это неофициальная реализация сервера Bitwarden на Rust. Весит 30 MB RAM против нескольких сотен MB у официального Bitwarden сервера. Разблокирует платные фичи Bitwarden: TOTP, Sends, организации.
Почему не просто локальный менеджер паролей типа KeePass? Потому что синхронизация между устройствами. Телефон, рабочий ноутбук, домашний ПК — все используют одну базу. Расширения Bitwarden для браузеров работают с Vaultwarden без изменений — просто укажи свой сервер в настройках.
docker-compose для Vaultwarden
# /opt/vaultwarden/docker-compose.yml
services:
vaultwarden:
image: vaultwarden/server:latest
container_name: vaultwarden
restart: unless-stopped
volumes:
- /opt/vaultwarden/data:/data
environment:
# Отключи регистрацию после создания своего аккаунта
SIGNUPS_ALLOWED: "false"
# Токен для /admin панели - сгенерируй командой ниже
ADMIN_TOKEN: "замени_на_реальный_токен"
# Включи WebSocket для живых уведомлений
WEBSOCKET_ENABLED: "true"
# Домен для правильной работы 2FA и WebAuthn
DOMAIN: "https://vault.твой-домен.ru"
ports:
- "8080:80"
- "3012:3012"
# Сгенерируй ADMIN_TOKEN
openssl rand -base64 48
# Запусти
docker compose up -d
# Проверь логи
docker logs vaultwarden --tail=20
Критически важно
После создания своего аккаунта немедленно выставь SIGNUPS_ALLOWED в false. Иначе кто угодно кто найдёт твой Vaultwarden сможет зарегистрироваться и использовать его. Пароли — это не то место для экспериментов с настройками.
Подключение клиентов Bitwarden
В браузерном расширении Bitwarden: Settings — Server URL. Укажи адрес своего Vaultwarden. Всё остальное работает как в обычном Bitwarden — создаёшь аккаунт, включаешь 2FA, импортируешь существующие пароли из 1Password или LastPass через CSV-экспорт.
Что заменяет: 1Password (~36 EUR/год), LastPass Premium (~36 EUR/год), Bitwarden Premium (~10 EUR/год). Для семьи экономия ещё больше.
3. Uptime Kuma — мониторинг всего
Uptime Kuma выглядит как серьёзный мониторинговый сервис. Красивый интерфейс, статусные страницы, уведомления в Telegram. Но ставится за три минуты и ест 150 MB RAM.
Что мониторю: все свои контейнеры по HTTP-статусу, домашний роутер по ping, внешние сервисы которые мне важны, SSL-сертификаты (Uptime Kuma предупреждает за 30 дней до истечения). Уведомления летят в Telegram — телефон пикает когда что-то упало.
docker-compose для Uptime Kuma
# /opt/uptime-kuma/docker-compose.yml
services:
uptime-kuma:
image: louislam/uptime-kuma:latest
container_name: uptime-kuma
restart: unless-stopped
volumes:
- /opt/uptime-kuma/data:/app/data
ports:
- "3001:3001"
# Нужен доступ к Docker сокету если хочешь мониторить контейнеры напрямую
# volumes:
# - /var/run/docker.sock:/var/run/docker.sock:ro
docker compose up -d
После запуска переходи на порт 3001, создаёшь аккаунт (только один — нет мультипользовательности), добавляешь мониторы.
Настройка Telegram-уведомлений
Settings — Notifications — Add Notification — Telegram. Нужен Bot Token (создаёшь через @BotFather) и Chat ID (получаешь через @userinfobot). После настройки Uptime Kuma отправит тестовое сообщение. Настраивай уведомления сразу — иначе смысл мониторинга теряется.
Статусная страница для семьи
Status Pages — Add Status Page. Создаёшь публичную страницу где видно статус твоих сервисов. Полезно если другие члены семьи пользуются домашними сервисами — они могут сами посмотреть что упало, а не спрашивать тебя.
Что заменяет: UptimeRobot Pro (~7 USD/месяц), Better Uptime (~20 USD/месяц).
4. Paperless-ngx — конец бумажному хаосу
Есть вещи которые я ненавижу. Одна из них — стопка бумаг на столе где «где-то» лежит нужный документ. Страховки, договоры, квитанции, справки — всё это копится и теряется.
Paperless-ngx сканирует документы, делает OCR (распознаёт текст), индексирует и делает доступным через веб-интерфейс с поиском. Загружаешь PDF с телефона — через минуту он проиндексирован и ты можешь найти его по слову в тексте. Можно настроить автоматические правила: если в документе есть слово «Vodafone» — добавь тег «телефон» и положи в папку «Провайдеры».
docker-compose для Paperless-ngx
Paperless-ngx требует PostgreSQL или SQLite, Redis и Tika для обработки сложных форматов. Официальный compose-файл на GitHub — самый простой способ.
# Скачай официальный compose файл
mkdir -p /opt/paperless && cd /opt/paperless
curl -Lo docker-compose.yml https://raw.githubusercontent.com/paperless-ngx/paperless-ngx/main/docker/compose/docker-compose.postgres-tika.yml
curl -Lo .env https://raw.githubusercontent.com/paperless-ngx/paperless-ngx/main/docker/compose/.env.example
Важные параметры в .env:
# /opt/paperless/.env - ключевые настройки
PAPERLESS_SECRET_KEY=сгенерируй_openssl_rand_-hex_32
PAPERLESS_TIME_ZONE=Europe/Moscow
PAPERLESS_OCR_LANGUAGE=rus+eng
USERMAP_UID=1000
USERMAP_GID=1000
# Для хранения документов
PAPERLESS_MEDIA_ROOT=/usr/src/paperless/media
# Запусти
docker compose up -d
# Создай суперпользователя
docker compose exec webserver python3 manage.py createsuperuser
# Проверь логи
docker compose logs -f webserver
Workflow с телефона
На телефоне: приложение «Сканер документов» (iOS) или Microsoft Lens (Android), сохраняешь как PDF, загружаешь в Paperless через мобильный браузер или через папку consume. Paperless обработает документ в фоне — обычно занимает 30-60 секунд на страницу.
Для автоматического импорта: настрой папку consume на сетевом диске или через приложение Paperless для iOS/Android. Положил файл — он автоматически обработан.
Что заменяет: Adobe Acrobat (~18 EUR/месяц), Genius Scan Pro (~15 EUR/год), хранение документов в Dropbox с ручной организацией.
5. Actual Budget — финансы без подписок
Это самый неожиданный пункт списка. Не потому что неожиданно полезный, а потому что я долго не понимал зачем мне self-hosted менеджер бюджета. Ведь есть таблицы Excel.
Actual Budget — это приложение для бюджетирования по методу envelope budgeting. Суть: деньги которые ты заработал распределяются по «конвертам» (категориям) заранее. Ты не отслеживаешь что потратил — ты планируешь что потратишь. Разница в подходе принципиальная.
Проект был платным SaaS, потом его создатель открыл исходники. Теперь можно поднять локально — и синхронизация между телефоном и компьютером работает через твой сервер.
docker-compose для Actual Budget
# /opt/actual/docker-compose.yml
services:
actual:
image: actualbudget/actual-server:latest
container_name: actual-budget
restart: unless-stopped
volumes:
- /opt/actual/data:/data
ports:
- "5006:5006"
environment:
- ACTUAL_HTTPS=false
docker compose up -d
# Открывай :5006, создаёшь файл бюджета, настраиваешь категории
Actual Budget работает локально в браузере — данные синхронизируются через твой сервер, но само приложение рендерится на клиенте. Быстро, без лагов.
Импорт из банков: большинство российских и европейских банков поддерживают экспорт в CSV или OFX. Actual Budget умеет импортировать оба формата. Ручное добавление транзакций тоже работает — Actual автоматически дополняет название по первым буквам.
Что заменяет: YNAB (~100 USD/год), Copilot Money (~70 USD/год), ручное ведение в Google Sheets.
6. n8n — автоматизация которая умеет всё
n8n — это workflow автоматизация. Если знаешь Zapier или Make (Integromat) — n8n это то же самое, но self-hosted и без ограничений на количество запусков.
Звучит абстрактно. Вот конкретные вещи которые у меня автоматизированы:
- Уведомление в Telegram когда Immich обнаруживает новое лицо на фото
- Еженедельный отчёт по Uptime Kuma — сколько времени каждый сервис был недоступен
- Автоматическое добавление задачи в Gitea Issues когда приходит письмо с определённой темой
- Напоминание в Telegram за 3 дня до истечения SSL-сертификатов
- Включение света в Home Assistant когда я прихожу домой (по геолокации телефона)
У n8n есть важный нюанс: fair-code лицензия. Для личного использования — бесплатно и без ограничений. Для коммерческого использования — нужна лицензия. Для домашнего сервера это не проблема.
docker-compose для n8n
# /opt/n8n/docker-compose.yml
services:
n8n:
image: n8nio/n8n:latest
container_name: n8n
restart: unless-stopped
volumes:
- /opt/n8n/data:/home/node/.n8n
ports:
- "5678:5678"
environment:
- N8N_HOST=n8n.твой-домен.ru
- N8N_PORT=5678
- N8N_PROTOCOL=https
- WEBHOOK_URL=https://n8n.твой-домен.ru/
- GENERIC_TIMEZONE=Europe/Moscow
# Базовая auth - измени!
- N8N_BASIC_AUTH_ACTIVE=true
- N8N_BASIC_AUTH_USER=admin
- N8N_BASIC_AUTH_PASSWORD=измени_это
docker compose up -d
# Открывай :5678 - попросит создать аккаунт
Первый workflow: уведомление в Telegram
New Workflow — добавь Trigger (например Schedule или Webhook) — добавь ноду Telegram — Send Message. Укажи Bot Token и Chat ID. Сохрани и активируй. Вот и всё — первая автоматизация работает.
Нод в n8n несколько сотен: HTTP Request, PostgreSQL, Gmail, Telegram, Home Assistant, Gitea, и много других. Если нужного нода нет — HTTP Request нода умеет работать с любым REST API.
Про потребление памяти n8n
n8n с Node.js под капотом. При старте ест около 200-300 MB. По мере добавления workflows и при активных executions может вырасти до 500-600 MB. На N100 с 16 GB это не проблема, но имей в виду если память у тебя ограничена.
Что заменяет: Zapier (от ~20 USD/месяц), Make/Integromat (от ~9 USD/месяц за ограниченное количество операций).
7. Home Assistant — умный дом без облака
Home Assistant — отдельный разговор. Это не просто контейнер который запустил и забыл. Это платформа которая требует времени на настройку, зато потом работает независимо от интернета, без облаков производителей устройств и без подписок.
У меня через Home Assistant управляются: умные розетки, освещение, термостат, датчики температуры и влажности, присутствие по телефонам в локальной сети. Всё локально, без Zigbee-хаба в облаке производителя.
Home Assistant: ВМ vs контейнер
Есть три способа запустить Home Assistant. Home Assistant OS (HAOS) — полноценная ВМ с встроенным менеджером дополнений. Home Assistant Container — просто Docker-контейнер без дополнений. Home Assistant Supervised — нечто среднее.
Я рекомендую HAOS в Proxmox ВМ, а не Docker-контейнер. Причина: аддоны (Zigbee2MQTT, ESPHome, Node-RED, Mosquitto) в HAOS устанавливаются в один клик и автоматически интегрируются. В контейнере каждый аддон это отдельный docker-compose сервис который нужно настраивать вручную.
Но если у тебя нет Proxmox и ты хочешь просто поставить контейнер:
# /opt/homeassistant/docker-compose.yml
# Внимание: это Home Assistant Container - без аддонов
services:
homeassistant:
image: ghcr.io/home-assistant/home-assistant:stable
container_name: homeassistant
restart: unless-stopped
# Обязательно для работы с локальной сетью (mDNS, discovery)
network_mode: host
volumes:
- /opt/homeassistant/config:/config
- /etc/localtime:/etc/localtime:ro
# Для USB Zigbee/Z-Wave адаптеров
# devices:
# - /dev/ttyUSB0:/dev/ttyUSB0
privileged: true
docker compose up -d
# Home Assistant поднимается около 1-2 минут при первом старте
# Потом открывай :8123
При первом запуске Home Assistant автоматически обнаружит устройства в локальной сети — Philips Hue, TP-Link Kasa, DLNA-устройства и другие. Это впечатляет: заходишь на :8123 и видишь уже добавленные интеграции которые HA нашёл сам.
Интеграция с n8n
Home Assistant имеет REST API и WebSocket API. n8n умеет работать с обоими. Пример: workflow в n8n запускается по расписанию, проверяет наличие всех домашних устройств через HA API, и если никого нет дома больше часа — отправляет в HA команду выключить всё освещение.
# HTTP Request нода в n8n для HA
URL: http://homeassistant:8123/api/states
Headers:
Authorization: Bearer ВАШ_LONG_LIVED_TOKEN
Content-Type: application/json
Long-lived token создаётся в HA: профиль пользователя — Security — Long-Lived Access Tokens.
Что заменяет: SmartThings (~5 USD/месяц), Apple HomeKit без хаба (требует HomePod/AppleTV), облачные хабы умных устройств.
Как это всё обновлять
Семь контейнеров — это семь точек где нужно следить за обновлениями. Для автоматического обновления образов есть Watchtower.
# /opt/watchtower/docker-compose.yml
services:
watchtower:
image: containrrr/watchtower
container_name: watchtower
restart: unless-stopped
volumes:
- /var/run/docker.sock:/var/run/docker.sock
environment:
# Проверять раз в сутки (секунды)
- WATCHTOWER_POLL_INTERVAL=86400
# Уведомлять в Telegram
- WATCHTOWER_NOTIFICATIONS=telegram
- WATCHTOWER_NOTIFICATION_TELEGRAM_TOKEN=твой_бот_токен
- WATCHTOWER_NOTIFICATION_TELEGRAM_CHAT_ID=твой_чат_id
# Только уведомлять, не обновлять автоматически
# Раскомментируй если хочешь автообновление:
# - WATCHTOWER_RUN_ONCE=true
Про автообновление Immich
Immich не рекомендует автоматическое обновление через Watchtower. Между версиями бывают несовместимые изменения схемы БД. Обновляй Immich вручную: прочитал changelog, сделал бэкап БД, обновил compose файл, поднял стек.
Бэкапы: что и как
Семь контейнеров — это семь источников данных которые нужно бэкапить по-разному.
| Контейнер |
Что бэкапить |
Метод |
Частота |
| Immich |
Папка с фото + дамп PostgreSQL |
rsync + pg_dump |
Ежедневно |
| Vaultwarden |
/opt/vaultwarden/data |
rsync или tar |
Ежедневно |
| Uptime Kuma |
/opt/uptime-kuma/data |
rsync |
Еженедельно |
| Paperless-ngx |
Медиа + дамп PostgreSQL |
rsync + pg_dump |
Ежедневно |
| Actual Budget |
/opt/actual/data |
rsync |
Ежедневно |
| n8n |
/opt/n8n/data |
rsync |
Еженедельно |
| Home Assistant |
/opt/homeassistant/config |
rsync + HA built-in backup |
Еженедельно |
#!/bin/bash
# /opt/scripts/backup-all.sh
# Простой скрипт бэкапа всех контейнеров
BACKUP_DIR="/mnt/backup/docker"
DATE=$(date +%Y%m%d)
# Создай директорию
mkdir -p "${BACKUP_DIR}/${DATE}"
# Бэкап папок данных
for service in vaultwarden uptime-kuma actual n8n homeassistant; do
rsync -av "/opt/${service}/data/" "${BACKUP_DIR}/${DATE}/${service}/"
done
# Дамп PostgreSQL для Immich
docker exec immich_postgres pg_dump -U postgres immich | gzip > "${BACKUP_DIR}/${DATE}/immich-db.sql.gz"
# Дамп PostgreSQL для Paperless
docker exec paperless-db pg_dump -U paperless paperless | gzip > "${BACKUP_DIR}/${DATE}/paperless-db.sql.gz"
# Удали бэкапы старше 30 дней
find "${BACKUP_DIR}" -maxdepth 1 -type d -mtime +30 -exec rm -rf {} \;
echo "Backup done: ${DATE}"
# Добавь в crontab для запуска ежедневно в 03:00
echo "0 3 * * * /opt/scripts/backup-all.sh >> /var/log/docker-backup.log 2>&1" | crontab -
Troubleshooting: частые проблемы
| Проблема |
Контейнер |
Причина |
Решение |
| Immich не запускается после обновления |
Immich |
Несовместимое изменение схемы БД |
Откати версию, сделай бэкап, обновляй по официальному changelog |
| Vaultwarden не принимает пароль |
Vaultwarden |
Домен не указан или не совпадает |
Проверь DOMAIN в env, должен совпадать с URL клиента |
| Uptime Kuma не шлёт уведомления |
Uptime Kuma |
Bot Token или Chat ID неверный |
Проверь через @userinfobot, перепроверь токен в @BotFather |
| Paperless не распознаёт кириллицу |
Paperless-ngx |
Не установлен пакет tesseract для русского |
PAPERLESS_OCR_LANGUAGE=rus+eng в .env |
| n8n потерял все workflows |
n8n |
Volume не был примонтирован |
Всегда монтируй /home/node/.n8n на хост |
| Home Assistant не видит локальные устройства |
Home Assistant |
Нет network_mode: host |
Добавь network_mode: host в compose |
| Actual Budget не синхронизируется с телефона |
Actual Budget |
HTTP вместо HTTPS — браузер блокирует |
Поставь за Nginx Proxy Manager с SSL |
Команды диагностики
# Статус всех контейнеров
docker ps -a --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}"
# Потребление ресурсов
docker stats --no-stream --format "table {{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}}"
# Логи конкретного контейнера
docker logs vaultwarden --tail=50 -f
# Перезапустить один контейнер
docker restart uptime-kuma
# Полностью пересоздать контейнер
cd /opt/n8n && docker compose down && docker compose up -d
# Проверить сетевые соединения между контейнерами
docker network ls
docker network inspect bridge
FAQ
Нужен ли публичный IP для всего этого?
Нет. Всё из списка работает полностью в локальной сети без выхода наружу. Телефонные приложения Immich и Vaultwarden умеют работать и по локальному IP. Если хочешь доступ снаружи — подними WireGuard VPN и заходи через него. Это безопаснее чем открывать порты напрямую.
Как лучше организовать docker-compose файлы?
Каждый сервис в отдельной папке /opt/servicename/ со своим docker-compose.yml и .env. Не надо складывать всё в один большой compose. Проще обновлять, проще откатывать, проще разбираться что сломалось. Gitea или просто git init в /opt/ — и все compose файлы под версионным контролем.
Как безопасно открыть сервисы наружу?
Только через reverse proxy с SSL (Nginx Proxy Manager, Caddy, Traefik). Напрямую порты не открывай. Обязательно аутентификация на каждом сервисе — или встроенная, или через Nginx Proxy Manager с Basic Auth. Fail2ban на SSH. Для критичных сервисов (Vaultwarden) — дополнительно IP whitelist или VPN.
Что делать если диск заканчивается под Immich?
Immich умеет работать с несколькими точками монтирования (Storage Templates). Можно добавить внешний диск, примонтировать как volume и указать как Storage Path в настройках Immich. Старые фото можно переложить вручную — главное не трогать структуру папок которую Immich создал сам.
Как обновлять контейнеры безопасно?
# Общая процедура безопасного обновления
cd /opt/servicename
# 1. Сделай бэкап данных
rsync -av ./data/ /mnt/backup/servicename-before-update/
# 2. Скачай новый образ
docker compose pull
# 3. Посмотри что изменилось (для сервисов с важными данными)
# Читай changelog проекта на GitHub
# 4. Обнови
docker compose up -d
# 5. Проверь логи
docker compose logs -f --tail=50
Сколько места нужно под все это?
Без учёта фото и документов — около 5-10 GB для всех образов и конфигов. Immich с фотоархивом — столько сколько у тебя фотографий (у меня около 80 GB за 10 лет). Paperless с документами — обычно 5-20 GB. Остальные сервисы по 50-200 MB. Минимальный рабочий вариант — 32 GB NVMe, комфортный — 256 GB и выше.
Итог
Семь контейнеров, три часа на установку, несколько вечеров на настройку — и домашний сервер закрывает задачи которые раньше требовали платных подписок или мирились с отдачей данных третьим сторонам.
Экономия в деньгах: Google One + 1Password + Zapier + UptimeRobot Pro — это где-то 80-150 EUR/год в зависимости от тарифов. Домашний сервер на N100 стоит в эксплуатации около 15-20 EUR/год электричества.
Начинай с Vaultwarden и Uptime Kuma — они простейшие и сразу дают ощутимый результат. Immich и Paperless требуют больше настройки но и отдача выше. n8n и Home Assistant — это кроличья нора в которую можно нырнуть надолго, но это уже приятная часть.
Если что-то не завелось
Пиши в комментариях. Все семь контейнеров я поднимал сам, грабли собирал лично — большинство проблем знакомы.