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