Блог
Что у нас ломалось на боевом контуре, почему это было незаметно и как проверить то же самое у себя. С датами, замерами и ссылками на решения.
Серверы и мониторинг
- Сколько стоит студии узнать о падении сервера от клиентаЧас команды считают все. Извинение и вероятность потерять клиента — почти никто. На условных числах одно падение, о котором вы узнали последним, выходит в 93 000 ₽.10 сентября 20263 мин
- fail2ban молчал полгода: защита, которая читала не тот журналАвтобан сканеров стоял полгода и не забанил никого. Конфиг был верный, сухой прогон проходил. Разбор: почему проверка регулярки ничего не доказывает.10 сентября 20263 мин
- Почта встала, а на сервере не было ни одной причины: порты режет панель хостераПолдня диагностики на чистом сервере. iptables пуст, политика accept, DNS верный. Дропало на гипервизоре, и изнутри машины это не видно никаким способом.10 сентября 20263 мин
- Одна проба врёт в обе стороны: как мы мерили доступность и дважды ошиблисьПервая проверка сказала «заблокировано», вторая — «всё работает». Обе были неверны. 28 проб за две минуты, 29 % отказов и почему доступность — это доля.10 сентября 20263 мин
- Две трети трафика шли через чужую машину, и мы этого не видели88 917 запросов из 133 715 — с одного адреса. Чужая виртуалка в том же дата-центре прозрачно форвардила 443 на наш сервер, а статистика посещаемости врала вдвое.10 сентября 20263 мин
Доступы и безопасность
- Мы развёртываем на серверы клиентов и не храним ни одного SSH-ключаКлючи в папке — самая дорогая вещь в студии и самая незаметная. Разбор pull-модели: агент сам приходит за заданием, подписывает запросы Ed25519, приватная часть не покидает машину.10 сентября 20263 мин
- Почему оператор SaaS не должен уметь читать ваши секретыПраво доступа к чужим данным всегда объясняют поддержкой. Разница между «мы обещаем не смотреть» и «мы не можем посмотреть» — это разница между регламентом и устройством.10 сентября 20262 мин
- Почему студии не нужен пароль от репозитория заказчикаЗаказчик присылает логин и пароль от своего GitHub, студия хранит их до конца проекта и после. Заявка по ссылке решает то же самое: заказчик авторизует доступ сам, у себя.10 сентября 20262 мин
- Что происходит с проектом, когда уходит единственный разработчикКлючи на двадцати машинах, панель хостера, регистратор, реестр образов. Три-четыре дня ротации и почти гарантированно пропущенная машина — потому что полного списка нет ни у кого.10 сентября 20263 мин
- Ссылка на сайт уходила в чат без картинки — из-за одной строки в robots.txtРазметка Open Graph на месте, страница открывается, у других превью есть. Разборщик Telegram не отдаёт приоритет более длинному Allow — и за картинкой не идёт.10 сентября 20262 мин
Копии и выкат
- Копия, из которой ни разу не восстанавливали, не считается копиейУчение на своём проде 04.09.2026: копия 621 МБ, база поднялась за 19 секунд, файлы за 4, контрольные числа сошлись. До учения все эти цифры были бы догадкой.10 сентября 20262 мин
- Четыреста тридцать миграций и семь номеров, занятых дваждыНомер выбирают в момент создания файла, а применяют через день. Две ветки берут один свободный номер, и коллизия всплывает не у автора, а на чужой машине при накате.10 сентября 20262 мин
- Код или миграция первым: порядок, который зависит от направленияПравило одно и оно несимметрично. Сносите колонку — сначала выкат, потом миграция. Добавляете — наоборот. Ошибка порядка даёт несколько минут сломанного экрана на бою.10 сентября 20262 мин
- Редирект вёл на 0.0.0.0:3000, а локально всё работалоАбсолютный адрес строился от того, что процесс думает о себе. За nginx это дало адрес, которого не существует, — и ни одна проверка до выката этого не видела.10 сентября 20262 мин
- Два запроса в окно выката: почему 5xx на robots.txt дороже, чем на страницеЗа сутки 157 успешных ответов и два ответа 502 — оба в одну секунду, в момент перезапуска контейнера. Поисковик читает 5xx на robots.txt как «обход запрещён» и ставит краулинг на паузу.10 сентября 20263 мин
- Первое подключение проходило, повторное — «не удалось сохранить»upsert не берёт частичный уникальный индекс: Postgres отвечает 42P10 на планировании. Ломается только второй раз, и в интерфейсе это выглядит случайным сбоем.10 сентября 20262 мин
Документы и заказчик
- Почему мы закрыли витрины заказчиков от поисковиков и отказались от лёгкого трафикаСотни поддоменов с настоящим содержимым — готовый источник поискового трафика. Мы закрыли их полностью: это документы клиентов, а не наша поисковая поверхность.10 сентября 20262 мин
- Почему документация устаревает быстрее кода — и как мы поймали это числомСверка нашла 14 задач, закрытых в коде и числящихся открытыми. Две из них два дня блокировали продажу юрлицам, хотя работа была сделана. Теперь форму отметок держит машина.10 сентября 20263 мин
- Мы убрали с экрана два абзаца объяснений — и это улучшениеВсё написанное было правдой. Кроме одной фразы, которая разошлась с интерфейсом и врала месяцами, — и никто не заметил, потому что её не читали.10 сентября 20262 мин
Как мы строим
- Счётчик посещаемости отправил бы наружу одноразовые токены, и увидеть это было бы негдеВнешняя аналитика шлёт адрес страницы целиком. У двух публичных адресов в адресе лежит секрет — подтверждение регистрации и сброс пароля. Поэтому список разрешительный.10 сентября 20263 мин
- Зелёный гейт, который ничего не проверил, опаснее красногоЗа один день нашлись три: проверка секретов зеленела на обрезанной истории, проверка зависимостей принимала пустой ответ за «уязвимостей нет», третья не запускала сравнение ни разу.10 сентября 20262 мин
- Мы уходим с Coolify на своё: что взяли, что выкинули и чего это стоилоБазовое решение — не переносить данные, а перенимать работающие стеки как есть. Единицей переезда становится хост, простой сокращается до минут на переключении портов.10 сентября 20262 мин
- 12 из 25 против 23 из 25: как мы выбирали модель для поиска по документамУ одного кандидата отличная цена и локальная юрисдикция, у другого репутация. Собрали 25 реальных запросов с известным ответом — разница оказалась вдвое, а не в пределах погрешности.10 сентября 20262 мин
- Почему «ещё один таск-трекер» — плохая идея, и что мы делаем вместоОбзор шестнадцати продуктов: серверная версия есть у десяти из двенадцати российских, база знаний внутри трекера — норма. Не занята одна ось, и она не про задачи.10 сентября 20262 мин
- Проверка показывала 43 замечания. В коде было 66Базовая линия считала только выданные замечания и не видела подавленные. Двадцать три случая были закрыты комментарием и не попадали в счёт — рост долга шёл мимо цифры.10 сентября 20262 мин
Разборы наших собственных случаев: что сломалось, почему это было незаметно и как проверить у себя.