Skip to content

Бэкенд

Эта страница описывает, как подготовить бэкенд-приложение к деплою в нашей инфраструктуре. Инструкции не привязаны к конкретному языку или фреймворку — подойдёт любой стек, способный работать в Docker-контейнере.

Требования к бэкенду

Чтобы бэкенд-приложение работало в инфраструктуре, оно должно соответствовать нескольким требованиям:

ТребованиеОписание
HTTP-серверПриложение слушает HTTP на настраиваемом порту (через переменную окружения PORT)
Health-эндпоинтGET /health возвращает 200 OK — используется Nomad для проверок здоровья
Конфигурация через envВсе настройки (БД, ключи API, уровень логирования) читаются из переменных окружения
Graceful shutdownПриложение корректно завершается при получении SIGTERM

Health-эндпоинт

Каждый бэкенд обязан предоставлять эндпоинт для проверки здоровья. Nomad периодически обращается к нему и перезапускает контейнер, если проверка не проходит.

Минимальная реализация — GET /health, возвращающий 200 OK:

json
{ "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 сборку для минимизации размера итогового образа. Ниже приведены примеры для разных стеков:

dockerfile
# ---- Установка зависимостей ----
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"]
dockerfile
# ---- Сборка зависимостей ----
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"]
dockerfile
# ---- Сборка ----
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, всегда указывайте платформу при локальной сборке:

bash
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

Следующие шаги

Документация по инфраструктуре