Развертывание Full-Stack приложений на бесплатной инфраструктуре

Мы разработали систему управления обучением (LMS) для G3HUB. Стек: React 18, Node.js 20 и PostgreSQL 15.

У нас не было VPS. У нас не было бюджета на облачные сервисы. У нас был только аккаунт на shared-хостинге с cPanel и дедлайн.

Большинство туториалов предполагают наличие выделенного сервера. Нам пришлось искать способ заставить различные сервисы взаимодействовать друг с другом за $0 в месяц.

Архитектура

• Frontend: React + Vite (размещен на cPanel) • Backend: Node.js + Express (размещен на Render Free Tier) • Database: PostgreSQL (размещен на Supabase Free Tier)

Трудности и решения

1. Shared-хостинг блокирует базы данных Мы пытались запустить Node.js API на cPanel. Это не удалось, так как хостинг блокировал исходящие соединения с PostgreSQL на порту 5432. Решение: Перенести API на Render. Render разрешает такие соединения.

2. Ошибки развертывания монорепозитория Render не мог распознать зависимости нашего pnpm workspace, такие как @workspace/db. Решение: Мы использовали esbuild, чтобы собрать всё в один файл размером 6,4 МБ. Затем мы использовали минимальный package.json только с внешними зависимостями. Это сделало API автономным.

3. Проблема CORS и проксирования Модуль Apache mod_proxy на shared-хостинге был ограничен. Мы не могли легко перенаправлять API-вызовы с фронтенда на Render. Решение: Мы использовали PHP cURL прокси. Фронтенд вызывает локальный PHP-скрипт. PHP-скрипт перенаправляет запрос на Render. Это позволяет обойти проблемы CORS и ограничения брандмауэра.

4. Ошибки SSL-сертификатов Пул соединений (connection pooler) Supabase вызывал ошибки SSL в Node.js. Решение: Мы установили переменную окружения NODE_TLS_REJECT_UNAUTHORIZED=0.

Разбивка затрат

• cPanel: $0 (уже есть) • Render: $0 (Free Tier) • Supabase: $0 (Free Tier) • Итого: $0/месяц

Советы для инженеров

  • Проверяйте исходящую связность на ранних этапах. Убедитесь, что ваш сервер действительно может связаться с базой данных, прежде чем писать код.
  • Используйте esbuild для монорепозиториев. Один собранный файл развернуть гораздо проще, чем сложную структуру папок.
  • Используйте UptimeRobot. Бесплатный уровень Render «засыпает» через 15 минут. Простой пинг поможет поддерживать его в рабочем состоянии.
  • Избегайте специальных символов в паролях к базе данных. Использование @ или ! в строке подключения вызывает бесконечную головную боль с URL-кодированием.

Если позволяют средства, купите VPS за $5. Это снимет все эти ограничения. Но если у вас $0, креативная маршрутизация сделает возможным запуск приложений в продакшн.

Source: https://dev.to/oyohedmond/deploying-a-full-stack-lms-on-shared-hosting-render-free-the-hard-way-4ke0

Optional learning community: https://t.me/GyaanSetuAi