MicroBin на микро-VPS: развёртывание приватного pastebin на сервере с 1 ГБ ОЗУ и 5 ГБ диска

MicroBin на микро-VPS: развёртывание приватного pastebin на сервере с 1 ГБ ОЗУ и 5 ГБ диска

Привет! В этой статье я покажу, как развернуть собственный легковесный pastebin-сервис MicroBin на самом бюджетном VPS. Мы не будем использовать Docker (он съест половину ресурсов), а скачаем статический бинарник и настроим всё вручную.

Целевые характеристики сервера

  • 1 vCPU (3.6 GHz)
  • 1 ГБ DDR4 RAM
  • 5 ГБ NVMe
  • ОС: Debian 12 (Bookworm) minimal

⚠️ Почему именно Debian 12? Ubuntu 22.04/24.04 на старте потребляет 300+ МБ ОЗУ и занимает 3+ ГБ на диске из-за snapd и cloud-init. Debian 12 minimal стартует с ~100 МБ ОЗУ и занимает ~1.2 ГБ. На железе с 5 ГБ диска эта разница критична. FreeBSD/ZFS не подойдут — ZFS требует минимум 4–8 ГБ ОЗУ.

Шаг 0. Подготовка и установка ОС

При установке выберите Debian 12 (Bookworm) minimal / netinst. Не устанавливайте десктопное окружение и стандартные утилиты — только базовая система и SSH-сервер.

После установки подключитесь по SSH под root. Предупреждение /usr/bin/xauth: file /root/.Xauthority does not exist можно игнорировать.

Шаг 1. Обновление и базовые пакеты

apt update && apt upgrade -y
apt install -y sudo wget nano ufw fail2ban nginx certbot python3-certbot-nginx

💡 Обратите внимание: мы не устанавливаем curl, build-essential, git и Rust-тулчейн. Они могут понадобиться позже, но мы удалим их сразу после использования, чтобы сэкономить место.

Шаг 2. Создание пользователя и безопасность

Работать от root небезопасно. Создадим отдельного пользователя:

adduser microbin
usermod -aG sudo microbin

Настройка UFW

⚠️ КРИТИЧНО: Сначала разрешаем SSH, потом включаем фаервол. Иначе потеряете доступ к серверу.

ufw allow OpenSSH
ufw allow 80/tcp
ufw allow 443/tcp
ufw enable

На вопрос Command may disrupt existing ssh connections. Proceed with operation (y|n)? отвечайте y — правило для SSH уже добавлено. Проверьте статус командой ufw status.

Настройка Fail2Ban

На свежем Debian 12 minimal fail2ban не запустится из коробки с ошибкой Have not found any log file for sshd jail, потому что в системе нет файла /var/log/auth.log — логи пишутся только в journald.

Создайте локальный конфиг:

nano /etc/fail2ban/jail.local

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

[DEFAULT]
backend = systemd

[sshd]
enabled = true
port = ssh
filter = sshd
maxretry = 5
bantime = 3600
findtime = 600

Сохраните (Ctrl+O, Enter, Ctrl+X) и запустите:

systemctl restart fail2ban
sleep 2
fail2ban-client status sshd

⏱️ Обязательно добавьте sleep 2 между рестартом и проверкой статуса. На слабом железе сокет создаётся с задержкой, и без паузы вы получите ошибку Failed to access socket path.

Шаг 3. Swap-файл (ОБЯЗАТЕЛЬНО)

Без swap на 1 ГБ ОЗУ сервер упадёт при первой же нагрузке. Создаём файл на 1 ГБ:

fallocate -l 1G /swapfile
chmod 600 /swapfile
mkswap /swapfile
swapon /swapfile
echo '/swapfile none swap sw 0 0' >> /etc/fstab

Проверка: free -h. Строка Swap должна показать 1.0Gi.

Шаг 4. Nginx и SSL-сертификат

Создаём конфиг виртуального хоста (замените bin.icelake.ru на ваш домен):

nano /etc/nginx/sites-available/bin.icelake.ru
server {
    listen 80;
    listen [::]:80;
    server_name bin.icelake.ru;

    location / {
        proxy_pass http://127.0.0.1:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

Активируем сайт:

ln -s /etc/nginx/sites-available/bin.icelake.ru /etc/nginx/sites-enabled/
rm -f /etc/nginx/sites-enabled/default
nginx -t
systemctl enable --now nginx

Получение SSL

⚠️ До выполнения этой команды убедитесь, что DNS A-запись для вашего домена уже указывает на IP сервера.

certbot --nginx -d bin.icelake.ru

Укажите email, согласитесь с условиями и автоматическим редиректом HTTP→HTTPS. Проверка: ls /etc/letsencrypt/live/bin.icelake.ru/ (должны быть файлы fullchain.pem и privkey.pem).

Шаг 5. Установка MicroBin

❌ Почему НЕЛЬЗЯ собирать из исходников на 5 ГБ диске

Компиляция Rust-проекта на 1 vCPU создаёт временные артефакты размером 1–2 ГБ в директории target/. Вместе с системой (~2.8 ГБ) и swap-файлом (1 ГБ) места физически не хватает. Вы получите ошибку No space left on device (os error 28), и даже cargo clean может не помочь, так как кеш Cargo хранится в /root/.cargo.

✅ Правильный способ: скачать prebuilt-бинарник

Узнаём актуальную ссылку на последний релиз:

wget -qO- https://api.github.com/repos/szabodanika/microbin/releases/latest | grep "browser_download_url.*x86_64.*linux" | cut -d '"' -f 4

Скачиваем и устанавливаем (замените URL на полученный выше):

mkdir -p /opt/microbin/data
cd /opt/microbin
wget <URL_ИЗ_ПРЕДЫДУЩЕЙ_КОМАНДЫ> -O microbin.tar.gz
tar xzf microbin.tar.gz
chmod +x microbin
rm -f microbin.tar.gz

💡 Musl-сборка (x86_64-unknown-linux-musl) предпочтительнее glibc-версии: она статически линкована, весит ~15 МБ и потребляет всего 1.1 МБ ОЗУ при работе.

Если ссылка вернула 404, используйте проверенный v2.0.4:
wget https://github.com/szabodanika/microbin/releases/download/v2.0.4/microbin-v2.0.4-x86_64-unknown-linux-gnu.tar.gz -O microbin.tar.gz

Шаг 6. Настройка systemd-юнита

Создаём сервис:

nano /etc/systemd/system/microbin.service
[Unit]
Description=MicroBin Pastebin Service
After=network.target

[Service]
Type=simple
User=microbin
Group=microbin
WorkingDirectory=/opt/microbin
ExecStart=/opt/microbin/microbin --port 8080 --data-dir /opt/microbin/data --public-path https://bin.icelake.ru
Restart=on-failure
RestartSec=5
Environment=MICROBIN_NO_ETERNAL_PASTES=true
Environment=MICROBIN_MAX_PASTE_SIZE=1048576

[Install]
WantedBy=multi-user.target

🔒 Защита диска: MICROBIN_NO_ETERNAL_PASTES=true запрещает вечные пасты, MICROBIN_MAX_PASTE_SIZE=1048576 ограничивает размер 1 МБ. Без этих настроек ваш диск на 5 ГБ заполнится за несколько дней активного использования.

Настраиваем права и запускаем:

chown -R microbin:microbin /opt/microbin
systemctl daemon-reload
systemctl enable --now microbin
systemctl status microbin

Ожидаемый статус: active (running), потребление памяти ~1.1M.

Шаг 7. Финальная проверка

df -h /
free -h
systemctl is-active nginx fail2ban microbin

Откройте https://ваш-домен в браузере. Вы должны увидеть интерфейс MicroBin.

Чек-лист: что пошло не так и как избежать

ПроблемаПричинаРешение
No space left on device при сборке RustАртефакты компиляции + система > 5 ГБИспользуйте prebuilt-бинарник, не собирайте из исходников
fail2ban: Failed to access socket pathПроверка статуса сразу после рестартаДобавьте sleep 2 перед fail2ban-client status
Have not found any log file for sshd jailDebian 12 minimal не создаёт /var/log/auth.logУкажите backend = systemd в jail.local
Потеря SSH после ufw enableНе добавлено правило OpenSSH до включенияВсегда сначала ufw allow OpenSSH, потом ufw enable
Certbot не подтверждает доменDNS A-запись ещё не распространиласьПроверьте dig +short ваш-домен перед получением сертификата
Диск забился через неделюНет ограничений на размер/TTL пастИспользуйте MICROBIN_NO_ETERNAL_PASTES и MICROBIN_MAX_PASTE_SIZE

Мониторинг и обслуживание

Периодически проверяйте состояние:

df -h / && du -sh /opt/microbin/data

Если данные занимают >500 МБ, добавьте в юнит переменную MICROBIN_DEFAULT_EXPIRY=3600 (TTL по умолчанию 1 час) и перезапустите сервис.

Для обновления MicroBin просто скачайте новый бинарник, замените файл /opt/microbin/microbin и выполните systemctl restart microbin.


MicroBin потребляет 1.1 МБ ОЗУ и 15 МБ на диске. Это один из самых эффективных self-hosted сервисов, который реально запустить на микро-VPS. Никакого Docker, никаких тяжелых рантаймов — только статический бинарник и nginx.