Інструкція · VPS
Як задеплоїти Node.js-сайт або бота на DigitalOcean
Від реєстрації до робочого сайту на https за годину: створюємо сервер, захищаємо його, запускаємо застосунок, підключаємо домен і SSL. Усі команди можна копіювати.
Деякі посилання на цій сторінці партнерські: якщо ви купите послугу за ними, ми отримаємо комісію. Для вас ціна не змінюється, а рекомендуємо ми лише те, з чим працюємо самі. Детальніше
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.