Заметки о коде, серверах и всём между

Персональный блог о бэкенде, DevOps и вещах, которые ломаются в пятницу вечером.

Почему ваш Docker-образ весит 1.2 ГБ и что с этим делать

Разбираемся, как multi-stage сборки, правильный выбор базового образа и .dockerignore уменьшают размер контейнера в 10 раз без потери функциональности.

# До: 1.2 GB FROM node:20 # После: 118 MB FROM node:20-alpine AS builder WORKDIR /app COPY package*.json ./ RUN npm ci --omit=dev
Читать далее

Индексы в PostgreSQL: когда B-tree не спасает

GIN, GiST, BRIN — какой индекс выбрать для полнотекстового поиска, геоданных и временных рядов. Реальные бенчмарки на таблице в 40 млн строк.

Читать далее

systemd-таймеры вместо cron: пошаговая миграция

Cron работал 50 лет и будет работать дальше, но systemd-таймеры дают логирование через journalctl, зависимости между задачами и нормальную обработку ошибок из коробки.

# /etc/systemd/system/backup.timer [Unit] Description=Ежедневный бэкап БД [Timer] OnCalendar=*-*-* 03:00:00 Persistent=true [Install] WantedBy=timers.target
Читать далее

Утечки памяти в Node.js: находим и чиним за вечер

Гайд по диагностике: heapdump, clinic.js, Chrome DevTools. Три самых частых паттерна утечек и примеры из продакшена.

Читать далее

Rate limiting в Nginx без сторонних модулей

limit_req_zone + burst + nodelay — три директивы, которые защитят API от брутфорса. Настраиваем лимиты по IP, по эндпоинту и по заголовку Authorization.

limit_req_zone $binary_remote_addr zone=api_limit:10m rate=10r/s; location /api/ { limit_req zone=api_limit burst=20 nodelay; }
Читать далее