Інструкція · VPS

Як задеплоїти Node.js-сайт або бота на DigitalOcean

Від реєстрації до робочого сайту на https за годину: створюємо сервер, захищаємо його, запускаємо застосунок, підключаємо домен і SSL. Усі команди можна копіювати.

· 5 хв читання

Деякі посилання на цій сторінці партнерські: якщо ви купите послугу за ними, ми отримаємо комісію. Для вас ціна не змінюється, а рекомендуємо ми лише те, з чим працюємо самі. Детальніше

DigitalOcean це хмарний провайдер, у якого ми найчастіше розгортаємо Telegram-ботів, CRM і сайти на Node.js. За нього говорять стабільність, зрозуміла панель, сервер за хвилину і одна з найкращих баз документації в індустрії. Нижче наш робочий сценарій деплою, який підходить і для Express чи Next.js, і для бота на Telegraf чи grammY.

Інструкція для Ubuntu 24.04 LTS. Знадобиться домен і базове знайомство з терміналом. Якщо не хочеться розбиратися, напишіть нам, і ми все налаштуємо.

Крок 1. Реєстрація і кредит на старт

Зареєструйтесь у DigitalOcean і додайте картку. За реферальним посиланням нові користувачі отримують кредит на перші 60 днів, якого з головою вистачає, щоб усе спокійно протестувати.

Крок 2. SSH-ключ

Вхід за ключем безпечніший за пароль. Якщо ключа ще немає, створіть його на своєму компʼютері:

ssh-keygen -t ed25519 -C "you@example.com"
cat ~/.ssh/id_ed25519.pub

Скопіюйте виведений публічний ключ: він знадобиться під час створення сервера.

Крок 3. Створюємо Droplet

У панелі натисніть Create → Droplets і оберіть:

  • Region: Frankfurt або Amsterdam, найближчі до України.
  • Image: Ubuntu 24.04 (LTS) x64.
  • Size: Basic, Regular, 1 ГБ памʼяті. Цього вистачає для бота або невеликого сайту. Тариф можна підвищити пізніше.
  • Authentication: SSH Key, вставте ключ із кроку 2.
  • Backups: увімкніть, якщо на сервері будуть дані, які шкода втратити (коштує частку від ціни сервера).

За хвилину сервер готовий, і в панелі зʼявиться його IP-адреса.

Крок 4. Перший вхід і окремий користувач

ssh root@IP_СЕРВЕРА
apt update && apt upgrade -y
adduser deploy
usermod -aG sudo deploy
rsync --archive --chown=deploy:deploy ~/.ssh /home/deploy

Далі працюємо від імені deploy, а не root: так помилка в застосунку не дасть доступу до всієї системи.

Крок 5. Фаєрвол

Відкриваємо лише SSH і веб-порти:

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

Альтернатива: Cloud Firewall у панелі DigitalOcean, який працює ще до сервера і налаштовується мишкою.

Крок 6. Встановлюємо Node.js

Ставимо актуальну LTS-версію з офіційного репозиторію NodeSource (на момент написання це 24.x):

ssh deploy@IP_СЕРВЕРА
curl -fsSL https://deb.nodesource.com/setup_24.x | sudo -E bash -
sudo apt install -y nodejs git
node -v

Крок 7. Завантажуємо код

git clone https://github.com/you/your-app.git ~/app
cd ~/app
npm ci --omit=dev

Секрети (токен бота, паролі до бази) тримайте у файлі .env на сервері, а не в репозиторії.

Крок 8. Автозапуск через systemd

systemd вже є в Ubuntu: він запустить застосунок після перезавантаження і перезапустить, якщо той впаде. Створіть файл /etc/systemd/system/app.service:

[Unit]
Description=Node.js app
After=network.target

[Service]
User=deploy
WorkingDirectory=/home/deploy/app
EnvironmentFile=/home/deploy/app/.env
ExecStart=/usr/bin/node server.js
Restart=always
RestartSec=3

[Install]
WantedBy=multi-user.target

Запускаємо і дивимось логи:

sudo systemctl daemon-reload
sudo systemctl enable --now app
journalctl -u app -f

Telegram-боту на long polling цього вже достатньо: він працює. Для сайту чи бота на вебхуках продовжуємо.

Крок 9. nginx перед застосунком

nginx приймає запити з інтернету, віддає їх застосунку на порту 3000, а також займається HTTPS і стисненням.

sudo apt install -y nginx
sudo nano /etc/nginx/sites-available/app
server {
    listen 80;
    server_name example.com www.example.com;

    location / {
        proxy_pass http://127.0.0.1:3000;
        proxy_http_version 1.1;
        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;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }
}
sudo ln -s /etc/nginx/sites-available/app /etc/nginx/sites-enabled/
sudo rm /etc/nginx/sites-enabled/default
sudo nginx -t && sudo systemctl reload nginx

Крок 10. Домен і безкоштовний SSL

У реєстратора домену створіть A-запис для example.com і www з IP-адресою сервера. Коли DNS оновиться (зазвичай від кількох хвилин до години), отримайте сертифікат Let's Encrypt:

sudo apt install -y certbot python3-certbot-nginx
sudo certbot --nginx -d example.com -d www.example.com

Certbot сам пропише HTTPS у конфіг nginx і налаштує автоматичне продовження сертифіката.

Крок 11. Бекапи й оновлення

  • Бекапи Droplet у панелі роблять копію всього сервера щотижня або щодня. Додатково можна робити snapshot перед ризикованими змінами.
  • База даних: окремий щоденний дамп у сховище (наприклад, DigitalOcean Spaces) не завадить навіть за наявності бекапів сервера.
  • Оновлення безпеки в Ubuntu ставляться автоматично через unattended-upgrades. Решту оновлюйте раз на місяць: sudo apt update && sudo apt upgrade.

Скільки це коштує

Найпростіший Droplet із 1 ГБ памʼяті коштує близько 6 $ на місяць, бекапи додають 20-30% до ціни сервера. Оплата йде за фактичний час роботи: видалили сервер, і він більше не тарифікується. Ціни орієнтовні на жовтень 2026 року, актуальні дивіться на сайті DigitalOcean.

Якщо потрібно багато памʼяті під парсери чи кілька проєктів, а стабільність продуктивності не критична, порівняйте з Contabo: там за ті самі гроші більше ресурсів.

Можна використовувати pm2 замість systemd?

Так, pm2 теж популярний варіант із зручним моніторингом. Ми частіше беремо systemd, бо він уже є в системі і не потребує додаткових пакетів.

А якщо застосунок у Docker?

Тоді замість кроків 6-8 встановіть Docker і запускайте застосунок через docker compose up -d із політикою перезапуску. nginx і certbot налаштовуються так само.

Що таке App Platform і чи не простіше він?

App Platform це PaaS від DigitalOcean: підключаєте GitHub, і платформа сама збирає й запускає застосунок. Простіше, але дорожче за Droplet і з меншою гнучкістю. Для одного невеликого сайту це хороший варіант.

Чи вистачить 1 ГБ памʼяті?

Для бота або невеликого сайту на Node.js так. Якщо на тому ж сервері буде база даних або збірка Next.js, беріть 2 ГБ або додайте swap.

Написати