Як розгорнути FastAPI або Django на VPS
19.04.2026Розгортання Python-проєкту на VPS часто здається складним лише на перший погляд. Насправді, якщо використати Docker як спосіб пакування застосунку, а Nginx як reverse proxy, можна отримати передбачуваний і доволі простий процес запуску. Такий підхід добре працює і для FastAPI, і для Django: змінюються лише деталі старту застосунку та деякі налаштування.
Що потрібно підготувати
Перед початком бажано мати VPS із Linux, доступ через SSH і домен, який уже вказує на IP-адресу сервера. Також знадобляться встановлені Docker і Docker Compose. Якщо проєкт ще локально розробляється, переконайтеся, що він запускається без помилок у вашому середовищі. Це суттєво спростить деплой.
Для прикладу візьмемо стандартну схему:
- Python-застосунок працює в контейнері;
- Gunicorn або Uvicorn обслуговує HTTP-запити всередині Docker;
- Nginx приймає зовнішній трафік на 80/443 портах;
- за потреби база даних теж запускається в окремому контейнері.
Структура проєкту
Зручно тримати окремі файли для Docker, Nginx і змінних середовища. Типова структура може виглядати так:
- app/ — код проєкту;
- Dockerfile — образ застосунку;
- docker-compose.yml — оркестрація контейнерів;
- .env — змінні середовища;
- nginx.conf або окрема конфігурація в папці nginx/.
Для Django часто також додають volume для static і media, а для FastAPI — лише конфігурацію запуску та, якщо потрібно, окремий контейнер для БД.
Dockerfile для FastAPI або Django
Базовий Dockerfile може бути схожим для обох фреймворків. Важливо лише правильно вказати команду запуску. Нижче наведено універсальний приклад, який можна адаптувати під конкретний проєкт.
Спочатку обираємо легкий Python-образ, встановлюємо залежності та копіюємо код. Для продакшну краще не ставити все в один шар без потреби, щоб образ був стабільним і передбачуваним.
Для FastAPI зазвичай запускають Uvicorn або Gunicorn з Uvicorn worker. Для Django — Gunicorn. Це дозволяє не використовувати вбудований development server, який не підходить для бойового середовища.
Приклад логіки запуску
- FastAPI: uvicorn app.main:app –host 0.0.0.0 –port 8000;
- Django: gunicorn project_name.wsgi:application –bind 0.0.0.0:8000.
Якщо ваш додаток використовує змінні середовища, додайте їх у .env і передавайте в контейнер. Так конфігурація не буде захардкожена в коді.
Docker Compose: зручно для сервера
Docker Compose особливо корисний на VPS, бо дозволяє підняти застосунок, базу даних та інші сервіси однією командою. Це спрощує оновлення і перезапуск. У продакшн-сценарії найчастіше достатньо одного файлу docker-compose.yml.
Типова схема виглядає так: сервіс web, сервіс db і, якщо потрібно, кеш або черга задач. Для Django часто використовують PostgreSQL, а для FastAPI — залежно від задачі, але принцип залишається тим самим.
Корисно розділити мережу між контейнерами та не виставляти базу даних назовні. Публічним має бути лише Nginx, який проксуватиме запити на внутрішній порт застосунку.
Nginx як reverse proxy
Nginx приймає запит від користувача, передає його в контейнер з Python-застосунком і повертає відповідь назад. Крім цього, він добре справляється зі статикою, TLS і простими обмеженнями доступу.
У конфігурації Nginx вказують upstream на контейнер або на локальний порт, який проброшений із Docker. Для FastAPI і Django це зазвичай один і той самий принцип: усе, що приходить на домен, проксувати на внутрішній сервер застосунку.
На що звернути увагу
- увімкніть підтримку WebSocket, якщо застосунок її використовує;
- додайте коректні заголовки Host та X-Forwarded-For;
- налаштуйте окрему роздачу static-файлів для Django;
- увімкніть кешування лише там, де це справді потрібно.
Для Django важливо, щоб файли static збиралися командою collectstatic, а Nginx мав доступ до каталогу з цими файлами. Для медіа-файлів можна зробити окремий location-блок.
Відмінності між FastAPI та Django
Хоча схема розгортання схожа, є кілька практичних відмінностей. FastAPI часто простіший у запуску, бо не потребує окремої обробки static-файлів у базовій конфігурації. Django, навпаки, зазвичай вимагає трохи більше підготовки: налаштування ALLOWED_HOSTS, collectstatic, а іноді ще й media storage.
FastAPI добре підходить для API-сервісів, де важлива швидка обробка запитів і асинхронність. Django зручний, коли потрібні адміністративна панель, ORM і велика кількість готових інструментів. Але для VPS-публікації обидва варіанти можуть використовувати однаковий Docker/Nginx-підхід.
Практичний порядок дій
Щоб не заплутатися, зручно йти простим маршрутом:
- підготувати код і переконатися, що локально все працює;
- додати Dockerfile;
- створити docker-compose.yml;
- налаштувати Nginx;
- відкрити потрібні порти на VPS;
- запустити контейнер і перевірити логи;
- після успішного тесту підключити домен і HTTPS.
На етапі перевірки особливо корисно дивитися логи контейнерів і Nginx. Якщо застосунок не відповідає, проблема часто криється у неправильному порту, помилці в import path або в змінних середовища. Коли все працює локально в контейнері, знайти таку помилку значно легше.
Типові помилки під час деплою
Одна з найчастіших помилок — запуск development-сервера замість production-сервера. Інша поширена проблема — неправильна прив’язка до 127.0.0.1 всередині контейнера. У Docker застосунок має слухати 0.0.0.0, інакше Nginx не зможе до нього підключитися.
Ще один важливий момент — права доступу до файлів. Це особливо стосується Django static і media. Якщо Nginx не бачить файли або не має прав на читання, сторінка може відкриватися без стилів або з помилками 403.
Також не варто забувати про секрети. SECRET_KEY, паролі до БД та інші чутливі параметри краще зберігати в .env, а не в репозиторії. Це базова практика для будь-якого VPS-деплою.
Що дає такий підхід
Комбінація Docker і Nginx робить розгортання більш повторюваним. Ви можете перенести той самий проєкт на інший сервер, просто скопіювавши конфігурацію та змінні середовища. Це зменшує кількість ручних дій і ризик помилок.
Для Python-проєктів це особливо зручно, бо ви не прив’язуєте застосунок до конкретної системної конфігурації VPS. Усе, що потрібно для запуску, описано в Dockerfile і Compose-файлі. Nginx у цій схемі виконує роль зручного входу для користувача, а Python-код працює у передбачуваному контейнері.
Висновок
Розгорнути FastAPI або Django на VPS можна без зайвої складності, якщо відразу побудувати зрозумілу схему: контейнер для застосунку, Docker Compose для керування сервісами та Nginx як reverse proxy. Такий підхід підходить і для невеликих pet-проєктів, і для більш серйозних production-сервісів. Головне — продумати запуск, змінні середовища, статичні файли та логи ще до першого деплою.