Перейти к содержимому

9. Railway и Render

Иллюстрация к уроку

Railway и Render — облачные платформы для бекенда. Проще AWS, дешевле Heroku, идеальны для Node.js API, баз данных и воркеров.

✅ Деплой из GitHub в один клик
✅ Managed PostgreSQL, Redis, MongoDB
✅ Автоматические деплои при push
✅ Reasonable pricing ($5/месяц стартер)
✅ Private networking между сервисами
✅ Удобный CLI
✅ Логи в реальном времени
Окно терминала
# Установка CLI
npm i -g @railway/cli
# Логин
railway login
# Создать проект
railway init
# Деплой текущего проекта
railway up
# Открыть в браузере
railway open
railway.toml
[build]
builder = "nixpacks"
buildCommand = "npm run build"
[deploy]
startCommand = "npm start"
healthcheckPath = "/health"
healthcheckTimeout = 300
restartPolicyType = "ON_FAILURE"
restartPolicyMaxRetries = 10
[[services]]
name = "web"
[[services.variables]]
name = "NODE_ENV"
value = "production"
Окно терминала
# Установить переменные
railway variables set DATABASE_URL="postgresql://..."
railway variables set JWT_SECRET="supersecret"
# Просмотр
railway variables
# DATABASE_URL генерируется автоматически для PostgreSQL сервисов
.github/workflows/railway.yml
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 production
# Procfile
web: node dist/server.js
worker: node dist/worker.js
release: node dist/migrations.js # выполняется перед деплоем

✅ Бесплатный tier (Web Services)
✅ Автодеплой из GitHub
✅ Native Docker поддержка
✅ Static Sites бесплатно
✅ Managed PostgreSQL и Redis
✅ Private Services (не публичные)
✅ Cron Jobs
# 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: starter
# render.yaml с Docker
services:
- type: web
name: myapp
runtime: docker
dockerfilePath: ./Dockerfile
dockerContext: .
plan: starter
envVars:
- key: PORT
value: 10000 # Render слушает на этом порту
# Dockerfile для Render
FROM node:20-alpine
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
COPY . .
RUN npm run build
EXPOSE 10000
ENV PORT=10000
CMD ["node", "dist/server.js"]
КритерийRailwayRenderVercelAWS
Next.jsХорошоХорошоНативноСложно
Node.js APIОтличноОтличноХорошоОтлично
PostgreSQLManagedManagedНетRDS
Бесплатный tier$5/мес стартЕстьЕстьЕсть
СложностьНизкаяНизкаяНизкаяВысокая
МасштабированиеСреднееСреднееХорошееМаксимальное
Vercel — Next.js, фронтенд, JAMstack
Railway — Node.js backend + БД, быстрый старт
Render — fullstack с БД, когда нужен бесплатный tier
AWS/GCP/Azure — когда нужна максимальная контроль и масштаб
Окно терминала
# 1. Создай проект
mkdir myapi && cd myapi
npm init -y
npm 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 script
npm pkg set scripts.start="node server.js"
npm pkg set type="module"
# 4. Инициализируй git
git init && git add . && git commit -m "initial"
# 5. Railway деплой
railway login
railway init
railway up
  • Railway и Render — PaaS для бекенда без боли с инфраструктурой
  • railway.toml / render.yaml — конфигурация как код
  • Managed базы данных — PostgreSQL и Redis без администрирования
  • fromDatabase / fromService в render.yaml — автосвязывание сервисов
  • Procfile — определяет типы процессов (web, worker, release)
  • Railway — лучший DX, Render — лучший бесплатный tier

Сравнение PaaS-платформ для деплоя: