9. Railway и Render

Railway и Render — облачные платформы для бекенда. Проще AWS, дешевле Heroku, идеальны для Node.js API, баз данных и воркеров.
Railway
Заголовок раздела «Railway»Преимущества Railway
Заголовок раздела «Преимущества Railway»✅ Деплой из GitHub в один клик✅ Managed PostgreSQL, Redis, MongoDB✅ Автоматические деплои при push✅ Reasonable pricing ($5/месяц стартер)✅ Private networking между сервисами✅ Удобный CLI✅ Логи в реальном времениБыстрый старт с Railway
Заголовок раздела «Быстрый старт с Railway»# Установка CLInpm i -g @railway/cli
# Логинrailway login
# Создать проектrailway init
# Деплой текущего проектаrailway up
# Открыть в браузереrailway openrailway.toml — конфигурация
Заголовок раздела «railway.toml — конфигурация»[build]builder = "nixpacks"buildCommand = "npm run build"
[deploy]startCommand = "npm start"healthcheckPath = "/health"healthcheckTimeout = 300restartPolicyType = "ON_FAILURE"restartPolicyMaxRetries = 10
[[services]]name = "web"
[[services.variables]]name = "NODE_ENV"value = "production"Переменные окружения в Railway
Заголовок раздела «Переменные окружения в Railway»# Установить переменныеrailway variables set DATABASE_URL="postgresql://..."railway variables set JWT_SECRET="supersecret"
# Просмотрrailway variables
# DATABASE_URL генерируется автоматически для PostgreSQL сервисовGitHub Actions + Railway
Заголовок раздела «GitHub Actions + Railway»name: Deploy to Railway
on: push: branches: [main]
jobs: deploy: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4
- name: Install Railway run: npm i -g @railway/cli
- name: Deploy env: RAILWAY_TOKEN: ${{ secrets.RAILWAY_TOKEN }} run: railway up --service web --environment productionProcfile (для Railway и Render)
Заголовок раздела «Procfile (для Railway и Render)»# Procfileweb: node dist/server.jsworker: node dist/worker.jsrelease: node dist/migrations.js # выполняется перед деплоемПреимущества Render
Заголовок раздела «Преимущества Render»✅ Бесплатный tier (Web Services)✅ Автодеплой из GitHub✅ Native Docker поддержка✅ Static Sites бесплатно✅ Managed PostgreSQL и Redis✅ Private Services (не публичные)✅ Cron Jobsrender.yaml — Infrastructure as Code
Заголовок раздела «render.yaml — Infrastructure as Code»# render.yaml — описывает все сервисыservices: # Web API - type: web name: myapp-api runtime: node plan: starter # free / starter / standard buildCommand: npm ci && npm run build startCommand: npm start healthCheckPath: /health envVars: - key: NODE_ENV value: production - key: DATABASE_URL fromDatabase: name: myapp-db property: connectionString - key: REDIS_URL fromService: type: redis name: myapp-redis property: connectionString - key: JWT_SECRET generateValue: true # Render генерирует случайное значение
# Background Worker - type: worker name: myapp-worker runtime: node buildCommand: npm ci && npm run build startCommand: npm run worker envVars: - key: DATABASE_URL fromDatabase: name: myapp-db property: connectionString
# Cron Job - type: cron name: daily-cleanup runtime: node buildCommand: npm ci && npm run build startCommand: npm run cleanup schedule: "0 2 * * *" # каждый день в 2:00
# Static Site - type: web name: myapp-frontend runtime: static buildCommand: npm run build staticPublishPath: ./dist routes: - type: rewrite source: /* destination: /index.html
databases: - name: myapp-db plan: starter databaseName: myapp user: myapp
- name: myapp-redis plan: starterRender + Docker
Заголовок раздела «Render + Docker»# render.yaml с Dockerservices: - type: web name: myapp runtime: docker dockerfilePath: ./Dockerfile dockerContext: . plan: starter envVars: - key: PORT value: 10000 # Render слушает на этом порту# Dockerfile для RenderFROM node:20-alpine
WORKDIR /appCOPY package*.json ./RUN npm ci --only=productionCOPY . .RUN npm run build
EXPOSE 10000ENV PORT=10000
CMD ["node", "dist/server.js"]Сравнение платформ
Заголовок раздела «Сравнение платформ»| Критерий | Railway | Render | Vercel | AWS |
|---|---|---|---|---|
| Next.js | Хорошо | Хорошо | Нативно | Сложно |
| Node.js API | Отлично | Отлично | Хорошо | Отлично |
| PostgreSQL | Managed | Managed | Нет | RDS |
| Бесплатный tier | $5/мес старт | Есть | Есть | Есть |
| Сложность | Низкая | Низкая | Низкая | Высокая |
| Масштабирование | Среднее | Среднее | Хорошее | Максимальное |
Когда что использовать
Заголовок раздела «Когда что использовать»Vercel — Next.js, фронтенд, JAMstackRailway — Node.js backend + БД, быстрый стартRender — fullstack с БД, когда нужен бесплатный tierAWS/GCP/Azure — когда нужна максимальная контроль и масштабБыстрый деплой Express.js на Railway
Заголовок раздела «Быстрый деплой Express.js на Railway»# 1. Создай проектmkdir myapi && cd myapinpm init -ynpm install express
# 2. Напиши серверcat > server.js << 'EOF'import express from 'express';const app = express();const PORT = process.env.PORT || 3000;
app.get('/health', (req, res) => res.json({ status: 'ok' }));app.get('/', (req, res) => res.json({ message: 'Hello Railway!' }));
app.listen(PORT, () => console.log(`Server on port ${PORT}`));EOF
# 3. package.json start scriptnpm pkg set scripts.start="node server.js"npm pkg set type="module"
# 4. Инициализируй gitgit init && git add . && git commit -m "initial"
# 5. Railway деплойrailway loginrailway initrailway upКлючевые моменты
Заголовок раздела «Ключевые моменты»- Railway и Render — PaaS для бекенда без боли с инфраструктурой
railway.toml/render.yaml— конфигурация как код- Managed базы данных — PostgreSQL и Redis без администрирования
fromDatabase/fromServiceв render.yaml — автосвязывание сервисов- Procfile — определяет типы процессов (web, worker, release)
- Railway — лучший DX, Render — лучший бесплатный tier
Интерактивный пример
Заголовок раздела «Интерактивный пример»Сравнение PaaS-платформ для деплоя: