Бэкенд
Эта страница описывает, как подготовить бэкенд-приложение к деплою в нашей инфраструктуре. Инструкции не привязаны к конкретному языку или фреймворку — подойдёт любой стек, способный работать в Docker-контейнере.
Требования к бэкенду
Чтобы бэкенд-приложение работало в инфраструктуре, оно должно соответствовать нескольким требованиям:
| Требование | Описание |
|---|---|
| HTTP-сервер | Приложение слушает HTTP на настраиваемом порту (через переменную окружения PORT) |
| Health-эндпоинт | GET /health возвращает 200 OK — используется Nomad для проверок здоровья |
| Конфигурация через env | Все настройки (БД, ключи API, уровень логирования) читаются из переменных окружения |
| Graceful shutdown | Приложение корректно завершается при получении SIGTERM |
Health-эндпоинт
Каждый бэкенд обязан предоставлять эндпоинт для проверки здоровья. Nomad периодически обращается к нему и перезапускает контейнер, если проверка не проходит.
Минимальная реализация — GET /health, возвращающий 200 OK:
{ "status": "ok" }TIP
Делайте health-эндпоинт лёгким и без побочных эффектов. Если нужна проверка подключения к базе данных, создайте отдельный эндпоинт /health/ready.
Переменные окружения
Конфигурация бэкенда приходит из переменных окружения, которые Nomad инжектит из Consul KV через блок template. Типичные переменные:
| Переменная | Описание | Пример |
|---|---|---|
PORT | Порт HTTP-сервера | 3000 |
DATABASE_URL | Строка подключения к БД | postgresql://user:pass@host:5432/db |
LOG_LEVEL | Уровень логирования | info |
NODE_ENV / APP_ENV | Окружение приложения | production |
Dockerfile
Используйте multi-stage сборку для минимизации размера итогового образа. Ниже приведены примеры для разных стеков:
# ---- Установка зависимостей ----
FROM node:22-alpine AS deps
WORKDIR /app
COPY package.json package-lock.json ./
RUN npm ci --omit=dev
# ---- Продакшен ----
FROM node:22-alpine
RUN apk add --no-cache tini
WORKDIR /app
COPY --from=deps /app/node_modules ./node_modules
COPY . .
ENV NODE_ENV=production
EXPOSE 3000
ENTRYPOINT ["/sbin/tini", "--"]
CMD ["node", "src/app.js"]# ---- Сборка зависимостей ----
FROM python:3.12-slim AS builder
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir --prefix=/install -r requirements.txt
COPY . .
# ---- Продакшен ----
FROM python:3.12-slim
WORKDIR /app
COPY --from=builder /install /usr/local
COPY --from=builder /app .
EXPOSE 8000
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]# ---- Сборка ----
FROM golang:1.22-alpine AS builder
WORKDIR /app
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o /bin/server .
# ---- Продакшен ----
FROM alpine:3.19
COPY --from=builder /bin/server /bin/server
EXPOSE 8080
ENTRYPOINT ["/bin/server"]WARNING
Все образы собираются с --platform linux/amd64. Если вы разрабатываете на Apple Silicon, всегда указывайте платформу при локальной сборке:
docker build --platform linux/amd64 -t my-backend:test .Структура проекта
Рекомендуемая структура репозитория для бэкенда:
my-service-backend/
├── src/ # Исходный код приложения
├── migrations/ # Миграции БД (если используются)
├── test/ # Тесты
├── Dockerfile
├── .gitlab-ci.yml
└── deploy/
├── my-service.nomad.hcl
├── dev.vars.hcl
├── stage.vars.hcl
└── prod.vars.hclСледующие шаги
- Настройте CI/CD-пайплайн для автоматической сборки и деплоя.
- Создайте файлы деплоя — Nomad job и vars-файлы.
- Пройдите чек-лист запуска перед выводом в продакшен.