Self-hosting стек для небольшого VPS: что влезает в 2 GB и 4 GB RAM
Реалистичный стартовый self-hosted стек на небольшом VPS: Docker Compose, Caddy, Vaultwarden, Uptime Kuma и Forgejo, бюджет RAM на каждый сервис, бэкапы и основы безопасности.
Коротко: на VPS с 2 GB спокойно работает self-hosted ядро из Caddy (HTTPS reverse proxy), Vaultwarden (пароли), Uptime Kuma (мониторинг) и Forgejo (git) под Docker Compose — примерно 0,6–1 GB RAM. Если добавить Nextcloud, нужно 4 GB; с более лёгкими инструментами вроде Syncthing или File Browser хватит и 2 GB.
В этом руководстве — рабочий Compose-файл, бюджет RAM на каждый сервис и две вещи, которые большинство self-hosted установок откладывают, пока не станет поздно: бэкапы вне сервера и закрытая сетевая поверхность. Команды рассчитаны на Debian 12/13 или Ubuntu 24.04 с Docker Engine и плагином Compose из официального репозитория Docker.
Бюджет RAM на каждый сервис
Цифры — типичная резидентная память от простоя до лёгкой нагрузки для одного–пяти пользователей с SQLite там, где он поддерживается. Пики при обновлениях, клонировании больших git-репозиториев или генерации превью в Nextcloud бывают выше, поэтому оставьте не меньше 20% запаса и добавьте swap-файл на 1–2 GB.
| Сервис | Роль | Типичная RAM | Примечания |
|---|---|---|---|
| ОС + sshd + journald | Базовая система | 150–250 MB | Минимальный Debian или Ubuntu |
| Docker Engine + containerd | Среда выполнения контейнеров | 80–120 MB | Фиксированная цена использования контейнеров |
| Caddy | Reverse proxy, автоматический HTTPS | 20–50 MB | Один бинарник, без базы данных |
| Vaultwarden | Сервер паролей, совместимый с Bitwarden | 20–60 MB | Написан на Rust, SQLite |
| Uptime Kuma | Мониторинг доступности и сертификатов | 100–200 MB | Node.js; растёт с числом мониторов |
| Forgejo | Git-хостинг, задачи, CI-хуки | 150–300 MB | Go, SQLite достаточно для небольших команд |
| Nextcloud + MariaDB + Redis | Файлы, календарь, контакты | 600 MB–1.2 GB | Основной расход — воркеры PHP-FPM |
| Syncthing | Синхронизация файлов, без веб-пакета | 50–150 MB | Более лёгкая альтернатива Nextcloud |
| File Browser | Веб-файловый менеджер | 20–40 MB | Загрузка и раздача файлов по HTTPS |
| Radicale | CalDAV и CardDAV | 30–50 MB | Календарь и контакты без Nextcloud |
Выбор размера VPS
Базовый стек (Caddy, Vaultwarden, Uptime Kuma, Forgejo) вместе с системой занимает около 0,6–1 GB, что помещается на сервер 2 vCPU / 2 GB с запасом для Syncthing и Radicale. Nextcloud с MariaDB и Redis поднимает итог примерно до 1,5–2,2 GB, поэтому 4 GB — реалистичный минимум, если хотите полный пакет плюс всё остальное. Важен и диск: репозитории Forgejo и синхронизируемые файлы растут, тогда как самим сервисам нужно всего несколько GB.
В NoctisNode тариф Pulse (2 vCPU, 2 GB RAM, 40 GB NVMe, $10 за 28 дней) вмещает базовый стек, а Umbra (4 vCPU, 4 GB, 60 GB NVMe, $15 за 28 дней) — базовый стек плюс Nextcloud. Оба — KVM с полным root и выделенным IPv4, оплачиваются в Monero или другой крипте. Ничто в этом руководстве не зависит от провайдера.
Файл Docker Compose
Веб-порты публикует только Caddy; приложения доступны исключительно через внутреннюю сеть Compose. Forgejo дополнительно публикует порт 2222 для git по SSH, так что OpenSSH хоста остаётся на своём порту. Задайте `FORGEJO_TAG` в файле `.env` равным текущей мажорной версии Forgejo и замените примерные домены своими DNS-записями.
# /srv/stack/compose.yaml
services:
caddy:
image: caddy:2
restart: unless-stopped
ports:
- "80:80"
- "443:443"
- "443:443/udp"
volumes:
- ./Caddyfile:/etc/caddy/Caddyfile:ro
- ./caddy/data:/data
- ./caddy/config:/config
vaultwarden:
image: vaultwarden/server:latest
restart: unless-stopped
environment:
DOMAIN: "https://vault.example.com"
SIGNUPS_ALLOWED: "true" # set to "false" after creating your account
volumes:
- ./vaultwarden:/data
uptime-kuma:
image: louislam/uptime-kuma:2
restart: unless-stopped
volumes:
- ./uptime-kuma:/app/data
forgejo:
image: codeberg.org/forgejo/forgejo:${FORGEJO_TAG}
restart: unless-stopped
environment:
USER_UID: "1000"
USER_GID: "1000"
FORGEJO__service__DISABLE_REGISTRATION: "true"
volumes:
- ./forgejo:/data
ports:
- "2222:22"
# /srv/stack/Caddyfile
# vault.example.com {
# reverse_proxy vaultwarden:80
# }
# status.example.com {
# reverse_proxy uptime-kuma:3001
# }
# git.example.com {
# reverse_proxy forgejo:3000
# }Запуск
- 01.Направьте A- (и AAAA-) записи для `vault`, `status` и `git` на IP сервера, чтобы Caddy смог получить сертификаты при первом запуске.
- 02.Создайте `/srv/stack`, положите туда `compose.yaml`, `Caddyfile` и `.env` и выполните `docker compose up -d`.
- 03.Откройте URL Forgejo и завершите установщик; первый созданный через него аккаунт становится администратором, так как публичная регистрация отключена.
- 04.Создайте свой аккаунт в Vaultwarden, затем установите `SIGNUPS_ALLOWED` в `"false"` и снова выполните `docker compose up -d`. Оставьте админ-панель отключённой, если не задали `ADMIN_TOKEN`, захэшированный Argon2.
- 05.Создайте администратора Uptime Kuma сразу после запуска, потому что до этого страница настройки открыта для всех.
- 06.Добавьте мониторы для каждого сервиса и для срока действия сертификатов, в идеале со второй точки, ведь монитор на том же сервере не сообщит о собственном падении.
Note · Caddy обрабатывает HTTPS автоматически. Про заголовки, ограничение запросов и более сложную маршрутизацию см. руководство по Caddy как reverse proxy.
Бэкапы, которые действительно восстанавливаются
Всё, что стоит сохранить, лежит в `/srv/stack`: базы SQLite, репозитории Forgejo, сертификаты Caddy и ваши конфиги. Не рассчитывайте на снапшоты провайдера; держите собственную зашифрованную копию вне сервера через restic, как описано в руководстве по бэкапам restic.
Файлы SQLite, скопированные во время записи сервисом, могут оказаться несогласованными. Самый простой безопасный подход на небольшом сервере — остановить стек на ту минуту, что идёт бэкап. Если добавите Nextcloud с MariaDB, делайте дамп базы через `mariadb-dump` перед запуском restic. Хотя бы раз проверьте восстановление во временный каталог: бэкап, который вы ни разу не восстанавливали, — это догадка.
#!/bin/sh
# /usr/local/sbin/stack-backup (run nightly from cron or a systemd timer)
# needs RESTIC_REPOSITORY and RESTIC_PASSWORD_FILE in the environment
cd /srv/stack || exit 1
docker compose stop
rc=0
restic backup /srv/stack --tag stack || rc=$?
docker compose start
[ "$rc" -eq 0 ] || exit "$rc"
restic forget --keep-daily 7 --keep-weekly 4 --keep-monthly 6 --pruneОсновы безопасности
- ▹SSH: только ключи, без входа root по паролю, при желании нестандартный порт; см. [руководство по защите SSH](/guides/ssh-hardening).
- ▹Оговорка про файрвол: порты, опубликованные Docker, обходят правила `ufw`, потому что Docker пишет собственные цепочки iptables/nftables. Публикуйте только то, что должно быть публичным (80, 443, 2222), и никогда не публикуйте порты баз данных и админок.
- ▹Обновления: включите `unattended-upgrades` для хоста и запускайте `docker compose pull && docker compose up -d` по расписанию, которого вы действительно придерживаетесь.
- ▹Регистрация: держите публичную регистрацию выключенной в Vaultwarden и Forgejo; приглашайте пользователей.
- ▹Шифрование диска: разместите `/srv` на [зашифрованном root](/guides/luks-encrypted-root), чтобы скопированный образ диска ничего не раскрыл; на удалённом сервере используйте [удалённую разблокировку LUKS по SSH](/guides/luks-remote-unlock-ssh) и предпочитайте формат LUKS2, описанный в статье [LUKS2 против LUKS1](/guides/luks2-vs-luks1).
- ▹Секреты: `.env` и каталог данных Vaultwarden должны быть доступны только root (`chmod 600`/`700`).
FAQ
QСколько RAM нужно для self-hosting?
AБазовый self-hosted стек из Caddy, Vaultwarden, Uptime Kuma и Forgejo занимает около 0,6–1 GB вместе с ОС и Docker, так что VPS с 2 GB достаточно. С Nextcloud, MariaDB и Redis практический минимум — 4 GB.
QМожно ли запустить Nextcloud на VPS с 2 GB?
AЗапустится, но вместе с другими сервисами запаса почти не останется, и при генерации превью или всплесках синхронизации он будет тормозить. На 2 GB Syncthing плюс File Browser и Radicale покрывают файлы, календарь и контакты за малую долю памяти.
QБезопасно ли самому хостить Vaultwarden?
AVaultwarden хранит только данные хранилища со сквозным шифрованием, поэтому взлом сервера не раскрывает пароли в открытом виде напрямую. Держите регистрацию выключенной, админ-панель отключённой или защищённой хэшированным токеном, регулярно обновляйтесь и бэкапьте каталог данных.
QКакой reverse proxy лучше для self-hosted Docker-стека?
AДля небольших установок проще всего Caddy: он автоматически получает и продлевает HTTPS-сертификаты по нескольким строкам конфига. Nginx и Traefik тоже подойдут, но требуют больше настройки.
QЗащищает ли ufw Docker-контейнеры?
AПо умолчанию нет. Порты, опубликованные через опцию `ports:` в Docker, обходят ufw, потому что Docker вставляет собственные правила файрвола, — публикуйте только те порты, которые должны быть публичными.