Развертывание 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
