Что происходит, когда ты открываешь сайт
Зачем это тебе. Без этой картинки все следующие девять глав будут набором несвязанных слов. Здесь действующие лица появляются разом — дальше каждое разбирается отдельно.
Простыми словами
Ты знаешь название места: «кофейня на Пушкинской». Курьер по такому адресу не поедет — ему нужны улица, дом, координаты. Поэтому сначала кто-то переводит название в координаты, и только потом заказ едет по адресу.
С сайтом ровно так же. Ты вводишь имя, кто-то переводит имя в числовой адрес, запрос уезжает туда, оттуда приезжает файл, браузер его показывает.
И главное, что стоит принять сразу: сайт — это набор файлов, которые кто-то отдаёт по запросу. Не программа, не живой организм. Файлы.
А теперь по-настоящему
Между твоим Enter и появлением страницы происходит шесть вещей.
- Браузер спрашивает адрес. Он идёт в DNS — систему, которая переводит имена в числа — и спрашивает: какой IP-адрес у этого имени? Получает что-то вроде
84.201.148.12. - Браузер стучится по этому адресу. Устанавливается соединение — то, что называют TCP. Считай, дозвонился.
- Договариваются о шифровании. Это TLS-рукопожатие: сервер показывает сертификат, браузер проверяет, что он настоящий и не просрочен. Замок в адресной строке — про это и только про это.
- Браузер отправляет HTTP-запрос. Дословно: «дай мне файл по пути
/». - Приходит ответ. Код
200и текст файлаindex.html. Или404, если такого файла нет, или500, если на той стороне что-то сломалось. - Браузер читает HTML и видит ссылки на другие файлы — стили, скрипты, картинки. И за каждым идёт отдельным запросом. Одна страница — это обычно десятки запросов, а не один.
Слово статика, которое дальше будет встречаться постоянно, означает ровно это: файлы лежат готовыми и отдаются как есть. Никто ничего не вычисляет в момент запроса.
Тут стоит остановиться и заметить неочевидное: в этой цепочке нет ничего, что выполняло бы твой код. Есть хранилище файлов и браузер. Всё. Программа, которая думает на той стороне, появляется только тогда, когда ты её специально заводишь — и это отдельная история, глава 2.
Что спросить у Клода
Разбери по шагам, что происходит, когда я открываюмойсайт.ру: куда уходит DNS-запрос, кто отвечает, откуда берётся сертификат, какие файлы догружаются. Отвечай на моём примере, не в общем виде.
Страница открывается, но выглядит как голый текст без оформления. Объясни, что это значит с точки зрения запросов браузера, и скажи, где смотреть.
Объясни разницу между «сайт не открывается» и «домен не резолвится». Как мне отличить одно от другого, не зная терминов?
Красные флаги
- В адресной строке «Не защищено». Сертификат не выписан, просрочен или выписан не на то имя. К содержимому сайта отношения не имеет — ищи в главе 4.
- Сайт открывается по числовому адресу, но не по имени. Файлы на месте, сломан перевод имени в адрес. Проблема в DNS, а не на сервере.
- Страница белая, а в консоли браузера красные
404на.cssи.js. HTML доехал, остальные файлы лежат не там, где на них ссылаются. - «У меня открывается, у коллеги нет». Почти никогда не мистика — обычно разные кэши DNS. Глава 4.
→ Дальше: 2. Что такое сервер
Что такое сервер
Зачем это тебе. Словом «сервер» называют три очень разные вещи. От того, какая из них у тебя, зависит цена, сложность и список того, что вообще может сломаться. Разговор с агентом без этой развилки превращается в испорченный телефон.
Простыми словами
Сервер — это чужой компьютер, который всегда включён.
Отличий от твоего ноутбука ровно три: он не засыпает, у него постоянный адрес в интернете, и он рассчитан отвечать многим одновременно.
Твой ноутбук тоже может быть сервером — ровно до момента, когда ты закроешь крышку.
А теперь по-настоящему
Три ступени. Это осевая конструкция всего учебника — дальше почти каждая тема будет привязана к одной из них.
| Ступень | Что это | Когда работает | Порядок цены |
|---|---|---|---|
| 1. Объектное хранилище | Не сервер вовсе. Папка с файлами, доступная из интернета | Всегда, но ничего не вычисляет | Копейки. Часто десятки рублей в месяц |
| 2. Функция | Программа, которая поднимается на секунды под запрос и гаснет | Только в момент запроса | На малых объёмах обычно бесплатно |
| 3. Свой сервер | Машина, которую ты арендуешь целиком и настраиваешь сам | Круглосуточно, даже когда никто не заходит | От $4–6 в месяц и выше |
Термины, которые ты услышишь: бакет — та самая папка на первой ступени. Serverless — про вторую (название врёт: сервер там есть, просто он не твой и живёт секунды). VPS или дроплет — третья ступень, арендованная машина. Аптайм — доля времени, когда всё это доступно.
Главное правило: подниматься на следующую ступень надо только когда предыдущая перестала справляться. Не раньше. Большинство проектов навсегда остаются на первой, и это не бедность, а нормальный инженерный выбор — там нечему ломаться, нечего обновлять и некого взламывать.
Как понять, что пора выше? Первая ступень заканчивается там, где нужно что-то запомнить между визитами пользователей. Вторая — там, где надо что-то делать без запроса: по расписанию, в фоне, самому.
Что спросить у Клода
Вот что делает мой проект: [опиши в трёх предложениях]. Скажи, какая ступень ему нужна — хранилище файлов, функции или свой сервер, — и объясни, что именно в моём описании тебя к этому привело. Посчитай примерную стоимость в месяц для всех трёх вариантов при нагрузке около [сколько] посещений в день. Где я упрусь в бесплатный лимит первым? Что конкретно придётся переделать в моём проекте, если переезжать со статики на функции? Список работ, а не общие слова.Красные флаги
- Арендовал сервер под сайт-визитку. Платишь за круглосуточную машину, которая раздаёт три файла, и вдобавок обязан её обновлять и защищать.
- Первый заход после паузы грузится десять секунд, потом всё быстро. Это холодный старт функции. Не поломка, а свойство второй ступени.
- Проект должен что-то делать по расписанию, а живёт на первой ступени. Не заработает никогда, сколько ни чини. Нужна другая ступень.
- «Мне нужен сервер» без ответа на вопрос «что он будет делать, когда никто не заходит». Если ответа нет — сервер не нужен.
→ Дальше: 3. Виды хостинга
Виды хостинга
Зачем это тебе. Выбор хостинга делается один раз в начале и дальше определяет всё: как ты выкладываешь изменения, сколько платишь, что можешь себе позволить и насколько больно будет съезжать. Переиграть потом можно, но дорого.
Простыми словами
Аналогия с жильём работает почти буквально.
- Полка в камере хранения — объектное хранилище. Положил вещи, забрал вещи. Жить нельзя, но дёшево и ломаться нечему.
- Студия с обслуживанием — платформа вроде Netlify, Vercel или Firebase. Заехал и живёшь, уборка и коммуналка включены. Но стены двигать нельзя, и правила не твои.
- Пустая квартира — свой сервер. Есть стены и розетки. Всё остальное ставишь сам, чинишь сам, охраняешь сам.
А теперь по-настоящему
Объектное хранилище. Кладёшь файлы, включаешь режим раздачи сайта, привязываешь домен. Не умеет ничего, кроме отдачи файлов, — и в этом его сила: нечему падать. Дёшево до неприличия. Минус: любая динамика требует чего-то ещё.
Платформа-конструктор. Netlify, Vercel, Firebase Hosting, Cloudflare Pages. Подключаешь репозиторий — платформа сама собирает и раскладывает при каждом изменении, сама выписывает сертификат, сама раздаёт файлы через CDN (сеть серверов по миру, чтобы пользователю отвечал ближайший). Даёт превью-ссылку на каждую ветку. За пять минут и бесплатно.
Обратная сторона — вендор-лок. Их функции, их хранилище, их формат конфигурации работают только у них. Пока проект — статика, переезд занимает вечер. Как только ты начал пользоваться их функциями и хранилищем, переезд означает переписывание.
Свой сервер (VPS). Полный контроль и полная ответственность. Единственный вариант, если нужна круглосуточная работа, чужое системное ПО или что-то тяжёлое. Цена — обновления безопасности, настройка, мониторинг. Это работа, которая не кончается.
Шаред-хостинг — тот, что с панелью управления и рекламой «сайт за 99 рублей». Для наших задач мёртв: там неудобно выкладываться из репозитория, старые версии всего и никакого нормального доступа. Упоминаю, чтобы ты его узнал и прошёл мимо.
Ещё два слова из этого мира. Билд — сборка исходников в готовые файлы (у чистой статики его просто нет). Холодный старт — задержка первого запроса, пока функция просыпается.
Что спросить у Клода
Сравни [хостинг А] и [хостинг Б] для моего проекта: [описание]. Меня интересуют цена в месяц, лимиты бесплатного тарифа и в какой лимит я упрусь первым. Если через полгода я захочу съехать с этой платформы на свой сервер — что конкретно придётся переписать? Дай список файлов и мест. Проверь, чем можно оплатить [сервис] из [страна] в 2026 году, и предложи два запасных варианта на случай, если оплата не пройдёт.Красные флаги
- Проекту нужно что-то запоминать, а хостинг умеет только отдавать файлы. Дальше будет много боли и костылей. Проще признать это в начале.
- Всё держится на бесплатном тарифе одного вендора. Пока это осознанный выбор — нормально. Пока это случайность — бомба с часовым механизмом.
- Выбрал свой сервер «на вырост». Вырост может не наступить, а обновления безопасности начинаются уже завтра.
- Не проверил оплату до того, как всё написал. Самый обидный способ потерять неделю.
→ Дальше: 4. Домен и DNS
Домен и DNS
Зачем это тебе. Это место, где чаще всего «всё сломалось, хотя я ничего не трогал». И единственное место во всём стеке, где изменения применяются не сразу, — а ты об этом не знаешь и правишь по кругу одно и то же.
Простыми словами
Домен — арендованное имя, а не собственность. Платишь раз в год. Перестал платить — потерял, и его может занять кто угодно.
DNS — телефонная книга интернета: переводит имя в числовой адрес. Ключевая деталь, из которой растут все проблемы: копий этой книги миллионы по всему миру, и обновляются они не одновременно.
Ты правишь оригинал. Копии подтягиваются когда захотят. «Захотят» — это от минут до суток.
А теперь по-настоящему
Записи. В настройках домена ты заводишь записи разных типов:
| Тип | Что делает |
|---|---|
A | Имя → числовой адрес. Самая прямая |
AAAA | То же, но для адресов нового формата (IPv6) |
CNAME | Имя → другое имя. «Спроси вон у того». Так подключают хостинги: их адрес может меняться, а имя нет |
TXT | Просто текст. Используют для подтверждений: «да, этот домен мой» |
MX | Куда доставлять почту для этого домена |
TTL — время жизни записи в чужих кэшах, в секундах. Поставил 3600 — значит, мир может держать старое значение ещё час после твоей правки. Это не поломка, это дизайн. Практический вывод: перед плановой сменой записей TTL снижают заранее, а не в момент правки.
Регистратор и DNS-провайдер — разные роли, и это источник половины путаницы. Регистратор — там, где домен куплен. DNS-провайдер — там, где реально живут записи. Часто это одна компания, но не обязательно: у домена есть NS-записи, которые говорят, чьи серверы за него отвечают. Если NS указывают на Cloudflare, а ты правишь записи в панели регистратора — ты правишь мёртвую копию. Ничего не применится, и ошибок тебе никто не покажет.
Откуда берётся замок. Сертификат выдаёт центр сертификации, и почти всегда автоматически по протоколу ACME. Чтобы убедиться, что домен твой, он просит завести TXT-запись с именем _acme-challenge и определённым значением. Видит её — выписывает сертификат на три месяца, потом молча продлевает. Пока запись на месте, ты об этом не думаешь. Снёс её при уборке — через несколько месяцев сайт внезапно «сломается».
Проксирование. У Cloudflare каждая запись бывает в двух режимах. DNS-only (серое облако) — просто отдаёт адрес. Проксируемая (оранжевое) — трафик идёт через Cloudflare, он кэширует, прячет настоящий адрес и подменяет сертификат своим. Второй режим полезен, но ломает сценарии, где хостинг сам выпускает сертификат и хочет видеть настоящего посетителя. Если инструкция хостинга говорит «DNS-only» — это не перестраховка.
Что спросить у Клода
Я хочу привязать домен [имя], купленный у [регистратор], к хостингу [какой]. Скажи, какие записи и с какими значениями завести, и где именно их заводить — в панели регистратора или где-то ещё. Я поправил DNS-запись [сколько] назад, ничего не изменилось. Объясни, как проверить, какое значение сейчас реально отдаётся, и сколько мне ещё ждать. Дай команду для Windows. У меня в настройках домена вот такие записи: [список]. Объясни по каждой, за что она отвечает и что сломается, если её удалить.Красные флаги
- Правишь записи час, ничего не меняется. В девяти случаях из десяти это TTL, а не ошибка. Не правь по кругу — проверь, что реально отдаётся, и подожди.
- Сайт открывается у тебя, но не у коллеги. У вас разные кэши. Подожди и проверь ещё раз, прежде чем что-то чинить.
- Сертификат перестал продлеваться. Первым делом смотри, на месте ли служебная
TXT-запись, и не включил ли кто проксирование. - Домен куплен у одного провайдера, а NS-записи указывают на другого. Ты правишь не там. Самая обидная потеря вечера, потому что интерфейс послушно сохраняет твои правки.
- Домен оформлен на почту, к которой у тебя нет доступа. Проверь это до того, как строить на нём бизнес.
→ Дальше: 5. Почему важна страна сервера
Почему важна страна сервера
Зачем это тебе. У нас это не абстрактная география, а два очень конкретных вопроса: откроется ли твой сайт у твоих же клиентов и сможешь ли ты вообще за него заплатить.
Простыми словами
Сервер — это железка в конкретном здании в конкретной стране. На неё действуют законы этой страны и правила её платёжной системы. Не твои представления о том, как должно быть, — а законы того места, где стоит железка.
А теперь по-настоящему
В эту тему обычно валят четыре разных вопроса и пытаются решить их одним ответом. Они решаются по отдельности, и важность у них очень разная.
- Скорость. Расстояние даёт задержку. Звучит важно, на практике для статики это десятки миллисекунд, и человек их не замечает. А если хостинг раздаёт через CDN — файл вообще приедет с ближайшего к пользователю узла. Обычно это наименее важный из четырёх факторов, хотя обсуждают его чаще всего.
- Доступность. Блокировки работают в обе стороны. Зарубежный хостинг может оказаться недоступен части твоих пользователей. Зарубежный сервис может не пустить тебя — по адресу, по карте, по номеру телефона при регистрации. Проверяется только опытом, обещаниям на сайте сервиса верить нельзя.
- Оплата. Самый частый реальный блокер. Российской картой не оплатить многие зарубежные сервисы; зарубежной картой неудобно платить за российские. Бесплатный тариф однажды кончается, и вот тогда выясняется, что заплатить нечем. Проверять надо до того, как проект написан, а не после.
- Законы о данных. Если собираешь персональные данные российских пользователей — имена, почты, телефоны, — есть требования к тому, где эти данные хранятся. Я не юрист и не буду им притворяться: важно знать, что вопрос существует, и задать его до запуска, а не после первой жалобы.
И честно: для сайта-визитки без форм и без личных данных всё это почти не имеет значения. Бери что удобнее. Значение появляется ровно в трёх случаях: у тебя есть пользователи, есть платежи или есть чужие персональные данные.
Что спросить у Клода
Я в [страна], аудитория проекта в [страна]. Дай список хостингов, которые я реально смогу оплатить и которые точно откроются у моей аудитории. Отсортируй по тому, насколько уверенно выполняются оба условия. Мой проект собирает у пользователей [что именно: почты, телефоны, имена]. Объясни простыми словами, какие требования к хранению данных при этом возникают и о чём мне стоит спросить юриста. Как проверить, открывается ли мой сайт из [страна/регион], не имея там знакомых? Дай способы и скажи, насколько каждому можно верить.Красные флаги
- Сервис выбран, проект написан, а оплатить нечем. Самый обидный сценарий: работа сделана, а запуска нет. Проверяй оплату первым делом, до написания кода.
- Сайт открывается у тебя и не открывается у половины клиентов. И ты об этом не знаешь, потому что они просто не пришли и ничего не написали.
- Собираешь почты и телефоны, не задумываясь, где они физически лежат. Пока пользователей десять — никого не волнует. Проблема приходит вместе с успехом.
- Выбор сделан по скорости. Почти всегда это оптимизация наименее важного фактора из четырёх.
→ Дальше: 6. Терминал
Терминал
Зачем это тебе. Твой агент живёт в терминале. Пока терминал для тебя чёрный ящик, все его ошибки выглядят одинаково — как «что-то сломалось», и ты не можешь отличить свою опечатку от настоящей проблемы.
Простыми словами
Окно, куда пишут команды текстом, а в ответ приходит текст.
Он появился раньше мышки и никуда не делся: у текстовой команды есть свойства, которых у кнопки нет. Её можно записать. Повторить дословно. Передать другому человеку в сообщении. Положить в файл и запускать по расписанию. И — что важно именно сейчас — её может сгенерировать программа.
Кнопку сгенерировать нельзя. По кнопке нельзя понять, получилось ли.
А теперь по-настоящему
Окно и оболочка — разные вещи. Окно (Терминал, PowerShell, iTerm) рисует буквы. Оболочка (shell) внутри него разбирает то, что ты написал, и запускает программы. Отсюда путаница «в одном окне работает, в другом нет» — окна разные, но ломается обычно из-за разных оболочек, у которых свои правила.
Текущая директория. Оболочка всегда «стоит» в какой-то папке, и все относительные пути считаются от неё. Половина ошибок «файл не найден» — это не отсутствие файла, а нахождение не там.
PATH — список папок, в которых оболочка ищет программы. Когда ты пишешь python, она перебирает эти папки и берёт первое совпадение. Отсюда «команда не найдена» у установленной программы: установлена, но не в том месте, где её ищут. И отсюда же «запускается не та версия»: нашлась другая раньше.
Два потока вывода. Обычный результат идёт в stdout, ошибки — в stderr. Это два разных канала, хоть и выглядят в окне одинаково. Поэтому бывает «команда ничего не вывела» — на самом деле вывела, просто в другой канал, а ты его перенаправил или не туда посмотрел.
Код возврата. После каждой команды остаётся число: 0 — успех, любое другое — нет. Это скучно и это самое важное в главе.
Почему агенту удобен терминал. Именно из-за кода возврата. У команды есть однозначный машинно-проверяемый результат: выполнил, посмотрел число, понял, получилось ли, решил, что делать дальше. Кнопку в чужом интерфейсе агент нажать не может и понять её результат тоже. Терминал — это не эстетика, это единственная поверхность, где агент может действовать и проверять себя.
И сразу снимем главный страх: Claude Code, который ты видишь в окне приложения, под капотом — тот же самый терминал. Это визуальная обёртка для тех, кому чёрный экран некомфортен. Ничего другого там не происходит.
Что спросить у Клода
Разбери эту команду по частям и объясни, что делает каждый кусок, до того как я её выполню: [команда]. Скажи отдельно, что она изменит на диске и можно ли это откатить. Я выполнил команду, она ничего не вывела. Объясни, куда мог деться вывод и как посмотреть ошибку. Я на Windows, оболочка — [какая]. Команда не находит файл, хотя файл точно есть. Помоги понять, в какой папке я сейчас нахожусь и относительно чего считается путь.Красные флаги
- Копируешь команды из интернета, не понимая, что они делают. Большинство безобидны, но цена одной неудачной — потерянные файлы без возможности отката.
- «Команда ничего не вывела». Почти всегда вывела — в другой канал. Смотри туда, прежде чем считать, что ничего не произошло.
- Агент третий раз подряд ошибается с путями. Он не понимает, где находится. Скажи ему явно, вместо того чтобы ждать, пока угадает, — каждая попытка стоит лимитов.
- Одна и та же команда работает в одном окне и падает в другом. Это разные оболочки. Глава 10.
→ Дальше: 7. Git: коммит, ветка, .git
Git: коммит, ветка, .git
Зачем это тебе. Без Git любая правка агента необратима. С Git ты можешь дать ему сломать что угодно и вернуть всё за пять секунд. Это ровно то, что превращает работу с агентом из страшной в спокойную — и позволяет разрешать ему больше.
Простыми словами
Сохранёнки в игре. Прошёл сложный кусок — сохранился. Дальше пошло не так — загрузился и попробовал иначе.
Отличий от игровых сохранёнок три: они именованные, их видно списком, и можно посмотреть, что именно поменялось между любыми двумя.
А теперь по-настоящему
Репозиторий — папка проекта, за которой Git следит. Стал ей после команды git init. Вся история при этом лежит внутри самой папки, в скрытом каталоге .git. Стёр его — стёр всю историю, файлы останутся, прошлое исчезнет.
Коммит — сохранёнка. Снимок состояния всех файлов плюс сообщение, зачем ты его сделал. Каждый знает своего предшественника, поэтому получается цепочка — история.
Staging и зачем этот лишний шаг. Сначала git add, потом git commit. Кажется бюрократией, но смысл есть: ты правил пять файлов, а в эту сохранёнку хочешь положить только три. git add — это «вот эти беру», git commit — «запечатал». Для агентной работы это ещё и момент, когда ты смотришь, что вообще собираешься сохранить.
Ветка — параллельная линия сохранёнок. Отпочковался, поэкспериментировал, не понравилось — выкинул ветку, основная линия не тронута. HEAD — указатель «ты сейчас вот здесь».
.gitignore — список того, за чем Git следить не должен: временные файлы, тяжёлое, и — критически важно — секреты. Подробнее в главе 8.
Git и GitHub — разные вещи. Git целиком работает на твоей машине и в интернете не нуждается. GitHub — сервис, куда можно отправить копию. Можно годами пользоваться Git без всякого GitHub.
Worktree — одним абзацем, чтобы ты узнал слово. Обычно у тебя одна папка и в ней одна ветка за раз. Worktree позволяет разложить две ветки одного репозитория в две разные папки и работать с ними одновременно. Полезно, когда агент экспериментирует, а ты параллельно смотришь рабочую версию. Не нужно на старте — просто знай, что такое есть.
И главное, что стоит услышать в начале: правильного способа делать коммиты не существует. Как правильно называть? Как часто? Что класть в один? Нет такого. Есть только удобный тебе. Единственное объективное правило — коммит должно быть возможно откатить, не задев несвязанное.
Что спросить у Клода
Покажи, что изменилось с последнего коммита, и объясни каждое изменение простыми словами — что это и зачем. Я хочу понять, что именно я собираюсь сохранить. Я испортил файл [какой] и не коммитил перед этим. Скажи честно: что можно вернуть, а что уже потеряно навсегда. Не предлагай ничего выполнять, пока не объяснишь. Объясни разницу междуgit reset --hard и git revert: что делает каждая, что необратимо, и какая безопаснее в моей ситуации — [опиши ситуацию].
Красные флаги
- В проекте нет папки
.git. Значит нет и истории. Откатываться некуда, и любая правка агента окончательна. - Последний коммит был неделю назад, а правок с тех пор сотни. Откат вернёт тебя на неделю назад целиком. Это почти то же самое, что не иметь истории.
- В истории двадцать коммитов «update» подряд. Технически история есть, практически найти в ней ничего нельзя.
- Агент коммитит сам после каждого действия. Забери у него это право и запиши правило в инструкции проекта.
- Ты боишься разрешать агенту править файлы. Верный признак, что коммитов давно не было: страх пропорционален объёму несохранённого.
→ Дальше: 8. GitHub
GitHub
Зачем это тебе. Git спасает от твоих собственных ошибок. GitHub спасает от сгоревшего ноутбука, украденной сумки и случайно отформатированного диска. И заодно оказывается кнопкой «выложить в интернет».
Простыми словами
Облачная копия проекта вместе со всей историей.
Не «папка в облаке»: облако хранит последнюю версию файла и затирает предыдущую. GitHub хранит все версии, кто и когда их менял и что писал в пояснении. Это разница между «есть копия» и «есть память».
А теперь по-настоящему
Он решает три разные задачи, и полезно понимать, какая из них твоя.
- Бэкап. Самая недооценённая. Ноутбук — единственная копия твоей работы ровно до первого
git push. - История и совместная работа. Видно, что менялось; можно обсуждать изменения; можно пустить второго человека.
- Источник для деплоя. Хостинги умеют следить за репозиторием и выкладывать сайт при каждом изменении. Об этом глава 9.
Remote — «дальняя» копия репозитория, обычно по имени origin. git push — отправить свои коммиты туда, git pull — забрать оттуда. Приватный репозиторий видишь только ты и кого пустишь; публичный — весь интернет, включая поисковики и роботов, которые целенаправленно ищут в чужом коде ключи.
GitHub Actions — машина, которая делает что-то при каждом пуше: собирает, проверяет, выкладывает. Описывается файлом в репозитории. Ей можно дать секреты — они хранятся отдельно от кода, и человек, открывший репозиторий, их не увидит.
README.md — первый файл, который открывает и человек, и агент. Три абзаца о том, что это за проект и как его запустить, экономят потом часы.
Что нельзя коммитить никогда. Это здесь, а не в отдельной главе про токены, потому что первый push ты делаешь именно сейчас.
- Пароли, API-ключи, токены доступа в любом виде — включая «я потом уберу».
- Файлы
.envи любые файлы с настройками, где лежат секреты. - Приватные ключи, файлы сертификатов, файлы доступа к облакам.
- Персональные данные: списки клиентов, почты, телефоны, выгрузки из CRM.
Удалить секрет следующим коммитом недостаточно. Он остаётся в истории, и его видно — история для того и существует, чтобы хранить прошлое. Единственный правильный первый шаг, если ключ уехал: немедленно отозвать и перевыпустить его. Чистка истории — потом и необязательно.
И приватность репозитория тут не спасает: приватный сегодня легко становится публичным завтра — при передаче проекта, при смене владельца, по случайному клику.
Что спросить у Клода
Проверь мой проект на то, что не должно попадать в репозиторий: ключи, токены,.env, чужие персональные данные. Проверь и текущие файлы, и историю. Если что-то нашлось — скажи, что делать в первую очередь.
Составь .gitignore для проекта на [что за стек] и объясни каждую строку: что она исключает и почему это не должно попадать в git.
Объясни, что именно произойдёт, если я сейчас сделаю git push: какие файлы уедут, что запустится после этого, и увидит ли кто-то изменения на сайте.
Красные флаги
- В репозитории лежит
.envили файл с ключами. Считай ключи скомпрометированными и перевыпускай — прямо сейчас, а не после того как разберёшься. .gitignoreпустой или отсутствует. Значит в git уедет всё подряд, включая то, о чём ты не подумал.- Репозиторий публичный, а внутри чужие персональные данные. Это уже не техническая проблема.
- После
pushсайт не обновился. Смотри логи автоматики, а не пушь повторно. Второй пуш ничего не чинит. - Ты единственный, у кого есть доступ, и доступ на почте, которой ты не пользуешься. Проверь, пока не понадобилось срочно.
→ Дальше: 9. Что такое деплой
Что такое деплой
Зачем это тебе. Это единственный момент, когда написанное становится доступным другим людям.
Простыми словами
Переезд из твоей папки на чужой всегда включённый компьютер. Всё, что было только у тебя, становится видно всем.
Отсюда вся драма: пока файл лежал у тебя, вокруг него был твой компьютер со всеми твоими настройками. На новом месте настройки чужие, и половина того, на что файл молча опирался, там просто отсутствует.
А теперь по-настоящему
Три механизма по возрастанию сложности — по одному на каждую ступень из главы 2.
1. Синхронизация файлов. Берём содержимое папки и копируем в хранилище. Никакой сборки, никакого запуска. Самый прозрачный вариант: что положил, то и отдаётся.
Здесь живёт флаг, о который бьются все. Синхронизация обычно умеет режим «удалять то, чего нет у источника». Он нужен — иначе на сервере годами копится мусор. Но он означает: удалил файл локально — он исчезнет и на сайте. Это не баг, это буквально смысл слова «синхронизация».
2. Автодеплой платформы. Платформа следит за репозиторием: увидела пуш — забрала код, собрала, разложила. Даёт логи сборки (читай их, когда «не работает») и превью-ссылки на ветки. Ты не управляешь процессом, ты его настраиваешь один раз.
3. Скрипт на своём сервере. Подключиться, забрать свежий код, поставить зависимости, перезапустить процесс. Максимум контроля и максимум мест, где может отвалиться.
Слова, которые встретятся: билд — сборка исходников в готовые файлы (у чистой статики его нет). Артефакт — то, что получилось после сборки. Пайплайн — вся цепочка от пуша до живого сайта. Окружение — набор настроек: обычно есть «боевое» и хотя бы твоё локальное.
Почему «локально работает, а там нет». Четыре причины покрывают почти все случаи:
- Файл есть у тебя, но не уехал — он в
.gitignore. - Переменные окружения заданы у тебя и не заданы там.
- Разные версии — языка, библиотек, системы.
- Пути. У тебя
Изображения/Фото.PNGоткроется какфото.png, на сервере — нет: там регистр важен.
Что спросить у Клода
Объясни по шагам, что произойдёт при выкладке этого проекта: что запустится, какие файлы поедут, какие останутся, и сколько это займёт. Покажи, где смотреть логи. Я запушил, прошло [сколько], на сайте старая версия. Дай порядок проверки от самого вероятного к самому редкому — я пройду по списку и скажу, где остановился. Как откатиться на предыдущую рабочую версию, если новая сломалась? Опиши способ заранее, чтобы я не искал его в момент аварии.Красные флаги
- Выкладка прошла успешно, изменений не видно. Первым делом кэш — браузера или сети раздачи. Открой в приватном окне, прежде чем чинить несломанное.
- Локально работает, на боевом нет. Иди по четырём причинам выше по порядку. Почти всегда это первая или вторая.
- У тебя нет способа откатиться. Узнавать об этом в момент аварии — худший вариант. Проверь заранее.
- Правишь файлы прямо на боевом сервере. Работает ровно до следующей выкладки, которая молча всё затрёт.
- Деплой занимает больше пяти минут ручных действий. Значит его будут делать реже, чем нужно, и бояться.
→ Дальше: 10. Windows: почему агенту тут больно
Windows: почему агенту тут больно
Зачем это тебе. Если ты на Windows — а на потоке это почти все, — часть ошибок агента не твоя вина и не его глупость. Это столкновение двух операционных систем. Лечится один раз, навсегда, за десять минут.
Простыми словами
Агент учился в основном на примерах из мира Linux и по привычке говорит на его языке.
Формулировка, которая всё объясняет: у себя в голове он живёт в Linux и с твоим компьютером тоже разговаривает как с Linux. А с ним надо разговаривать как с Windows.
Он не тупит. Он в другой стране и не знает об этом, пока ты не скажешь.
А теперь по-настоящему
Пять мест, где это вылезает. Симптомы разные, причина одна.
- Пути. В Linux — прямые слэши от корня:
/home/user/project. В Windows — буква диска и обратные слэши:C:\Users\ilya\project. Обратный слэш во многих языках означает «следующий символ особенный», поэтому путь молча превращается в мусор:C:\Users\ilyaстановитсяC:Usersilya. Обрубленный путь в тексте ошибки — это почти всегда съеденные слэши. - Имена команд. В Linux интерпретатор Python зовут
python3. В Windows — простоpython, аpython3ведёт на заглушку из магазина приложений, которая молча не работает. То же сpipпротивpython -m pip. Агент по привычке пишет первое, получает невнятную ошибку и тратит несколько попыток подряд, чтобы догадаться. - Кавычки и экранирование. У оболочек разные правила: где-то одинарные кавычки означают одно, где-то другое. Одна и та же команда работает в одном окне и падает в другом с невразумительным сообщением про синтаксис.
- Кодировки. Windows исторически читает и пишет файлы не в UTF-8. Отсюда
UnicodeDecodeErrorс упоминаниемcharmapи кракозябры вместо русского текста. - Переводы строк. Windows завершает строку двумя невидимыми символами, Linux одним. Шелл-скрипт, отредактированный на Windows, на сервере падает с
bad interpreter: /bin/bash^M. Символ^Mв конце сообщения — визитная карточка.
Лечение, а не жалоба. Всё это чинится одним действием: напиши в главный файл инструкций агента, что проект живёт на Windows — какая оболочка, как называется интерпретатор, что с кодировкой, как писать пути. Одна такая запись экономит десятки итераций, и каждая из них стоит тебе лимитов и времени.
Какую оболочку выбрать. Из коробки у тебя, скорее всего, cmd — там нет ни вкладок, ни нормальной истории. Стоит перейти на PowerShell: он уже установлен и заметно удобнее.
Git Bash — вторая дорога: он даёт привычные Linux-команды, и многие инструкции из интернета в нём просто работают. Цена — он переписывает пути на свой лад, и часть настроек агента может потерять ориентиры.
Честный вывод, без «правильного ответа»: обе дороги кривые. Как и почти всё в этой индустрии — выбор не между хорошим и плохим, а между плохим и не самым плохим. Важно не угадать «правильную», а выбрать одну осознанно и записать выбор в инструкции, чтобы агент не гадал.
Что спросить у Клода
Собери для моего файла инструкций блок про окружение: у меня Windows [версия], терминал — [какой]. Проверь сам, как называется интерпретатор, включён ли режим UTF-8, и впиши в блок реальные значения, а не предположения. Эта команда работает в одном терминале и падает в другом: [команда]. Объясни, в чём разница между оболочками в этом конкретном месте, и дай версию, которая работает в обеих. Проверь проект на проблемы с переводами строк перед выкладкой на Linux-сервер: найди файлы, которые сломаются, и скажи, как это чинится один раз для всего репозитория.Красные флаги
- Агент несколько попыток подряд правит одну и ту же команду. Он не знает про твоё окружение и подбирает вслепую. Останови и скажи прямо — это дешевле, чем ждать.
UnicodeDecodeErrorс упоминаниемcharmap. Кодировка, пункт 4.bad interpreterи^Mв конце сообщения на сервере. Переводы строк, пункт 5.- Пути в ошибках выглядят склеенными:
C:UsersimyaвместоC:\Users\ilya. Съеденные обратные слэши, пункт 1. - «Команда не найдена» у программы, которую ты точно установил. Либо она не в списке поиска, либо ты зовёшь её линуксовым именем.
- В файле инструкций проекта не написано, что ты на Windows. Тогда всё вышеперечисленное будет повторяться каждый новый диалог.
→ Дальше: Практика 1. GitHub руками
GitHub руками: от git init до первого push
Зачем это тебе. Один раз пройти это руками стоит больше, чем десять раз посмотреть, как это делает агент. Дальше можешь спокойно поручать — ты будешь понимать, что происходит, и заметишь, если пойдёт не так.
Шаги
-
Проверь, что Git вообще есть.
git --version
Ответ вида
git version 2.x.x— всё в порядке. «Команда не найдена» — поставь Git и перезапусти терминал: без перезапуска он не появится. - Представься. Один раз на всю жизнь. git config --global user.name "Твоё Имя" git config --global user.email "ты@почта.ру" Это уйдёт в каждый твой коммит. Почта попадёт в публичную историю, если репозиторий станет публичным, — используй ту, которую не жалко.
-
Зайди в папку проекта и сделай её репозиторием.
cd "C:/путь/к/проекту"
git init
Появилась скрытая папка
.git. С этого момента история пишется. -
Создай
.gitignore— до первого коммита, не после. Файл с таким именем в корне проекта, внутри — что не отслеживать. Минимум: .env .env.* node_modules/ *.log .DS_Store Почему до, а не после: попавшее в историю остаётся в ней навсегда. Добавить правило потом — значит перестать отслеживать дальше, но не стереть прошлое. - Посмотри, что Git видит. git status Список файлов, за которыми он пока не следит. Прочитай его. Это единственный момент, когда легко заметить лишнее.
-
Отбери файлы для первой сохранёнки.
git add .
Точка означает «всё из текущей папки, кроме игнорируемого».
Перед
git add .посмотриgit statusи убедись, что в списке нет ключей, паролей,.envи чужих персональных данных. Это займёт пять секунд и иногда экономит очень много. - Запечатай. git commit -m "Первый коммит: рабочая версия проекта" Сообщение пиши для себя из будущего. Через месяц «update» тебе ничего не скажет.
- Создай пустой репозиторий на GitHub. Через сайт: New repository, имя, Private. Не ставь галочки «добавить README» и «добавить .gitignore» — иначе на той стороне появится своя история, и первый push упрётся в конфликт.
-
Свяжи локальный репозиторий с GitHub.
git remote add origin https://github.com/ТВОЙ_ЛОГИН/ИМЯ_РЕПО.git
origin— просто общепринятое имя для «основной дальней копии». -
Отправь.
git push -u origin master
Если ветка называется
main, подставь его —git statusпокажет имя в первой строке. Флаг-uнужен только в первый раз: он запоминает связку, дальше хватит простоgit push.
Что спросить у Клода
Я прошёл шаги до [номер] и получил вот такую ошибку: [текст целиком]. Объясни, что она означает и что делать. Я на Windows, оболочка — [какая]. Посмотри выводgit status и скажи, есть ли в списке что-то, чего не должно быть в репозитории: [вставь вывод]
Красные флаги
- Первый push упирается в конфликт. Почти всегда на GitHub при создании поставили галочку README. Разбирайся с этим, а не с командой.
- Сделал
git add ., не посмотревgit status. Проверь прямо сейчас, что уехало. .gitignoreдобавлен после первого коммита. Проверь историю на то, что успело попасть.
→ Дальше: Практика 2. Деплой руками
Деплой руками: три пути
Зачем это тебе. Три механизма из главы 9, разложенные по шагам. Пройди тот, что твой, — остальные просмотри по диагонали, чтобы знать, что они есть.
Путь 1. Платформа с автодеплоем
Когда этот путь твой: проект в GitHub, нужен результат сегодня, домен можно привязать позже.
- Зарегистрируйся через GitHub. Так платформа сразу увидит репозитории.
- Подключи репозиторий. Add new site → Import an existing project, выбери свой.
- Укажи ветку и папку публикации. Для чистой статики команда сборки пустая, папка публикации — та, где лежит
index.html. Ошибка на этом шаге даёт «страница не найдена» при живом деплое. - Дождись сборки и прочитай лог. Даже если всё зелёное — открой и посмотри, как он выглядит в норме. Когда сломается, ты будешь знать, с чем сравнивать.
- Открой выданный адрес. Он некрасивый, но рабочий и уже с сертификатом.
- Привяжи домен. Платформа скажет, какую запись завести. Дальше — глава 4.
Первое, что сломается: неверная папка публикации. Второе — сборка падает из-за файла, который есть у тебя, но не уехал в репозиторий.
Путь 2. Объектное хранилище
Когда этот путь твой: нужна максимальная дешевизна и предсказуемость, важна страна размещения, готов потратить час на первую настройку.
- Создай бакет. Имя часто должно совпадать с доменом — проверь требования до создания, переименовать нельзя.
- Включи режим раздачи сайта и укажи главную страницу (
index.html) и страницу ошибки. - Сделай содержимое публичным. Пока не сделаешь — будешь получать отказ в доступе и думать, что сломался деплой.
- Залей файлы. Первый раз можно через интерфейс, дальше — командой синхронизации или через автоматику.
- Проверь по служебному адресу до привязки домена. Так ты отделишь проблемы хранилища от проблем DNS.
- Привяжи домен и дождись сертификата. Обычно нужна дополнительная служебная запись, и выпуск занимает от минут до часов.
Первое, что сломается: права доступа. Второе — типы файлов: если хранилище отдаёт стили как обычный текст, браузер их проигнорирует, и сайт откроется голым.
Путь 3. Свой сервер
Когда этот путь твой: нужна круглосуточная работа — фоновые задачи, расписание, бот.
- Создай машину в панели провайдера. Самой дешёвой обычно хватает.
- Подключись по SSH. Первый раз спросит подтверждение ключа — это нормально.
- Забери код. git clone https://github.com/ЛОГИН/РЕПО.git cd РЕПО
- Поставь зависимости и задай переменные окружения. Секреты — в файл вне репозитория, а не в код.
- Запусти процесс так, чтобы он пережил закрытие терминала и поднимался сам после перезагрузки.
- Проверь, что он действительно работает, а не «запустился и упал»: посмотри статус и логи.
Первое, что сломается: процесс, умирающий вместе с твоим терминалом. Второе — отсутствующие переменные окружения, которых на твоей машине не видно, потому что там они есть.
Что спросить у Клода
Проведи меня по пути [номер] для моего проекта: [описание и где лежит]. Давай по одному шагу — я выполняю и пишу, что получилось, ты даёшь следующий. Деплой прошёл, открываю адрес — [что вижу]. Дай список причин от самой вероятной к редкой и скажи, как проверить каждую.Красные флаги
- «Страница не найдена» при успешном деплое. Папка публикации или имя главной страницы.
- Сайт открылся голым текстом. Стили не доехали или отдаются с неверным типом.
- Отказ в доступе. Права на хранилище, а не деплой.
- На сервере всё работало, пока не закрыл терминал. Процесс не настроен жить самостоятельно.
→ Дальше: Практика 3. Безопасность
Безопасность: что нельзя коммитить
Зачем это тебе. Утёкший ключ — одна из немногих ошибок в этом учебнике, которая стоит реальных денег и не откатывается через git. Роботы, сканирующие публичные репозитории на чужие ключи, работают круглосуточно и находят новый за минуты.
Готовый .gitignore
Положи в корень проекта. Комментарии оставь — через полгода они объяснят тебе твои же решения.
# Секреты. Главная строка файла. .env .env.* !.env.example # шаблон без значений — его как раз нужно хранить # Ключи и сертификаты *.pem *.key *.p12 id_rsa* # Зависимости: восстанавливаются по манифесту, в git не нужны node_modules/ venv/ __pycache__/ # Мусор системы и редактора .DS_Store Thumbs.db *.log .idea/ # Тяжёлое и чужое: выгрузки, архивы, персональные данные /private/ *.csv.bakСтрока !.env.example — не опечатка. Восклицательный знак означает исключение из правила выше: шаблон со списком нужных переменных и пустыми значениями хранить надо. Это документация, по которой ты сам через месяц поймёшь, что настраивать.
Куда класть секреты вместо кода
| Где | Что туда |
|---|---|
| Локально | Файл .env рядом с проектом, но вне git |
| Автоматика выкладки | Хранилище секретов репозитория. Виден только машине, подставляется в момент работы |
| Хостинг-платформа | Переменные окружения в настройках проекта |
| Свой сервер | Файл вне репозитория, доступный только владельцу |
Как проверить, не утекло ли уже
- Посмотри, что вообще отслеживается.git ls-files Пробеги глазами. Файлы с говорящими именами —
.env,config,secret,credentials— открой и проверь. - Поищи по всей истории, а не только по текущим файлам.git log -p -S "sk-" --all
git log -p -S "PASSWORD" --all Флаг
-Sищет коммиты, где строка появлялась или исчезала. Подставь префиксы ключей своих сервисов. - Проверь, что репозиторий действительно приватный, и посмотри список тех, у кого есть доступ. Там бывают неожиданные люди — соавторы старых экспериментов, интеграции, боты.
Если ключ утёк — порядок действий строго такой:
- Отзови и перевыпусти ключ. Прямо сейчас, до того как разберёшься, как он туда попал. Ключ, полежавший в публичном репозитории хоть минуту, считай скомпрометированным.
- Проверь, не пользовались ли им. У большинства сервисов есть журнал использования и счёт.
- Впиши файл в
.gitignore, чтобы это не повторилось. - Чистка истории — последний и необязательный шаг. Она сложная, ломает историю у всех копий и не отменяет пункт 1. Старый ключ уже мог быть скопирован.
Порядок именно такой, потому что первый пункт делает утечку безвредной, а все остальные — нет.
Правило при передаче проекта
Отдал проект другому человеку, показал экран на созвоне, дал доступ подрядчику — перевыпусти ключи после. Не потому что не доверяешь, а потому что дальше эти ключи живут вне твоего контроля: в чужой истории терминала, в записи созвона, в скриншоте.
Что спросить у Клода
Проверь этот проект на утечки: пройди по отслеживаемым файлам и по истории коммитов, ищи ключи, токены, пароли и персональные данные. Сначала покажи, что нашёл, — ничего не меняй без моей команды. Я запушил ключ от [сервис]. Скажи по шагам, что делать прямо сейчас, и где у этого сервиса отзывают и перевыпускают ключи. Собери.env.example по моему проекту: перечисли все переменные окружения, которые он использует, с комментарием, что это и где взять. Значения оставь пустыми.
Красные флаги
- В репозитории есть
.env. Перевыпускай ключи, не дочитывая эту страницу. - Ключ вставлен прямо в код «на время теста». Временное живёт дольше всего.
- Секрет пришёл тебе в мессенджере или почте. Он теперь навсегда в чужой переписке и в чужих бэкапах.
- Ты не знаешь, у кого есть доступ к репозиторию. Посмотри список — это две минуты.
- Показывал экран с открытым файлом настроек на записанном созвоне. Запись живёт вечно.
→ Дальше: Практика 4. Чеклист перед push
Чеклист перед git push
Зачем это тебе. Восемь вопросов, которые честно пробегаются за минуту. Чеклист длиннее минуты не выполняется никем и никогда — поэтому здесь ровно то, что окупается.
Минута перед пушем
- Что именно уезжает? git status git diff --staged Первая команда — список файлов, вторая — построчные изменения. Если видишь незнакомое — разберись до пуша, а не после.
- Что пропало? git status --short | findstr "^ D" Отдельный вопрос, потому что удаления замечают хуже, чем добавления. При синхронизирующем деплое случайно стёртый файл исчезнет и с живого сайта.
-
Нет ли секретов?
Пробеги список из шага 1 глазами:
.env, что-то со словомkey,token,secret,password, любые выгрузки с чужими данными. - Оно вообще работает? Открой локально и ткни в то, что менял. Звучит унизительно очевидно — и пропускается чаще всего.
- Та ли ветка? git branch --show-current Пять секунд против получаса разбирательств.
- Понятно ли сообщение коммита? Проверка: прочитает ли его человек через месяц и поймёт ли, что и зачем. «Правки» и «update» проверку не проходят.
- Знаю ли я, как откатиться? Не абстрактно, а конкретно: какая команда, какая кнопка. Если ответа нет — узнай сейчас, а не в момент, когда сайт лежит.
- Хорошее ли сейчас время? Пуш в пятницу вечером перед выходом из дома — классика жанра. Автоматика сработает через минуту, а чинить будет некому.
Пункты 1–3 обязательны всегда. Остальные — по ситуации, но именно они превращают чеклист из ритуала в инструмент.
Что спросить у Клода
Пройдись по чеклисту перед пушем за меня: покажи, что добавилось и что удалилось, проверь на секреты, назови текущую ветку и оцени сообщение коммита. Скажи прямо, если что-то выглядит подозрительно. Предложи сообщение коммита по текущим изменениям. Формат: одна строка сути, дальше при необходимости — почему. Без общих слов вроде «обновление».Красные флаги
- Пушишь, не посмотрев, что уезжает. Один раз из ста это будет дорого.
- В изменениях файлы, которых ты не трогал. Либо агент сделал больше, чем ты просил, либо это служебное, чему место в
.gitignore. - Больше двадцати файлов в одном коммите. Откатить его целиком будет означать «откатить всё сразу».
- Пуш прямо перед тем, как закрыть ноутбук. Проверить результат будет некому.
→ Дальше: Практика 5. Аварийные сценарии
Аварийные сценарии: сломалось — что делать
Зачем это тебе. В момент аварии думать некогда и нечем. Найди свой симптом, иди по пунктам сверху вниз. Порядок не случайный — от самого частого к самому редкому.
1. Сайт не открывается совсем
Проверь по порядку: открывается ли в приватном окне и с телефона по мобильному интернету (отсекает твой кэш и твою сеть) → не истёк ли домен → на месте ли DNS-записи → жив ли хостинг (статусная страница провайдера).
Как не повторить: включи автопродление домена и проверь, что уведомления идут на живую почту. Истёкший домен — самая обидная и самая частая причина.
2. Сайт открывается, но старый
Проверь: приватное окно → жёсткое обновление (Ctrl+F5) → прошла ли выкладка вообще (логи автоматики) → сброс кэша на стороне сети раздачи.
Как не повторить: привыкни проверять результат в приватном окне. Это отсекает 80% ложных тревог.
3. Выкладка прошла, изменений нет
Проверь: в ту ли ветку пушил → та ли папка публикации в настройках → не исключён ли изменённый файл правилом игнорирования → в логе выкладки видно, что файл действительно уехал.
Как не повторить: один раз прочитай лог успешной выкладки целиком. Дальше отличия будут бросаться в глаза.
4. Браузер ругается на сертификат
Проверь: на месте ли служебная TXT-запись для продления → не включил ли кто-то проксирование → совпадает ли имя в сертификате с адресом (частый случай: сертификат на site.ru, а открываешь www.site.ru).
Как не повторить: запиши, зачем заведена каждая служебная DNS-запись, прямо в комментарии к ней. Через полгода ты не вспомнишь и снесёшь при уборке.
5. Локально работает, на боевом нет
Проверь четыре причины по порядку: файл не уехал (он в .gitignore) → не заданы переменные окружения → разные версии → регистр в путях (у тебя Logo.PNG и logo.png — один файл, на сервере — два разных).
Как не повторить: заведи .env.example со списком нужных переменных и держи имена файлов в нижнем регистре.
6. Случайно удалил файл и закоммитил
Чинится. Найди коммит, где файл ещё был, и достань его оттуда:
git log --oneline -- путь/к/файлу git checkout ХЕШ_КОММИТА -- путь/к/файлуКак не повторить: пункт 2 чеклиста перед пушем — смотреть, что пропало.
7. Запушил секрет
Порядок жёсткий: отозвать и перевыпустить ключ прямо сейчас → проверить журнал использования и счёт → добавить файл в .gitignore → чистка истории последней и по желанию.
Как не повторить: практика 3 целиком.
8. Агент сломал проект, а коммита не было
Что можно попробовать: история чата агента — иногда прежнее содержимое файла видно там → локальная история файлов в редакторе, если он её ведёт → корзина, если файл удалён целиком.
А честный ответ такой: скорее всего, восстановить нечего. Это единственный пункт в списке, где нет надёжного способа. Git не поможет — сохранять было нечего. Перезаписанный файл не лежит в корзине.
Как не повторить: коммит перед тем, как дать агенту большую задачу. Одна команда, пять секунд, и этот пункт списка перестаёт существовать. Именно поэтому глава 7 говорит, что Git — это то, что позволяет разрешать агенту больше.
Что спросить у Клода
Симптом: [что вижу, дословно]. Последнее, что я менял: [что]. Не чини ничего сразу — дай пять гипотез по убыванию вероятности и способ проверить каждую. Я пройду и скажу, где остановился. Я удалил файл [какой] и уже закоммитил. Найди в истории последнюю версию и покажи команду, чтобы её вернуть. Объясни команду до того, как я её выполню.Красные флаги
- Чинишь, не проверив в приватном окне. Половина аварий — это кэш.
- Повторяешь действие в четвёртый раз, надеясь на другой результат. Остановись и проверь гипотезу.
- Просишь агента «просто почини», не описав симптом. Он начнёт менять всё подряд, и поломок станет больше.
- Правишь боевой сайт напрямую, чтобы «быстро починить». Следующая выкладка это затрёт, и авария вернётся.
→ Дальше: Практика 6. Что просить у ИИ
Что просить у ИИ, когда сломалась инфраструктура
Зачем это тебе. Весь этот учебник существует не чтобы ты выучил инфраструктуру наизусть, а чтобы ты знал, что спросить. Нет никого, кто знает Клода лучше самого Клода, — но вопрос надо задать. До этой страницы ты, возможно, просто не знал, что бывают такие вопросы.
Четыре правила формулировки
1. Симптом, а не диагноз. Ты не знаешь, что сломалось, — иначе не спрашивал бы. Назвав поломку своим именем, ты сужаешь поиск до своей же догадки, и агент послушно ищет там, где ты показал.
Было: «сломался деплой, почини».
Стало: «я запушил 20 минут назад, на сайте старая версия, в логах автоматики всё зелёное».
2. Контекст окружения в первой же реплике. Операционная система, хостинг, что менялось последним. Без этого агент по умолчанию предполагает Linux и выдаёт команды, которые у тебя не работают, — а вы оба потратите на это несколько попыток.
Было: «не работает команда».
Стало: «Windows 11, PowerShell, сайт на статике, вчера менял DNS. Команда падает вот так: [вывод целиком]».
3. Проси план проверки, а не решение. Это самое важное правило страницы. Агент, которого просят починить, начинает чинить — трогать файлы, менять настройки. Если гипотеза была неверна, ты получаешь исходную поломку плюс новые изменения, в которых уже не разобраться.
Было: «почини».
Стало: «дай пять гипотез по убыванию вероятности и как проверить каждую. Ничего не меняй, пока я не скажу».
4. Запрети менять то, что не объяснил. Простое правило: сначала объяснение, потом действие. Оно и тебя учит, и ловит случаи, когда агент собирается сделать не то.
Формулировка: «объясни, что делает эта команда и что она изменит на диске, до того как выполнять».
Почему «сделай лучше» не работает
У агента нет твоего критерия «лучше». Он начинает угадывать — и угадывает по среднему, то есть делает шаблонно. Ты смотришь на результат, он тебе не нравится, ты снова говоришь «сделай лучше», и цикл повторяется, сжигая лимиты.
Лечится переводом «лучше» в проверяемое: «сократи вдвое», «убери всё, что не отвечает на вопрос X», «сделай так, чтобы это открывалось за секунду». Критерий должен быть таким, чтобы вы оба могли посмотреть на результат и согласиться, выполнен он или нет.
Готовые запросы под восемь аварий
Сайт не открывается. Домен [имя], хостинг [какой], последнее изменение [что и когда]. Дай порядок проверки: домен, DNS, хостинг, кэш. По каждому пункту — команду или место, куда посмотреть. Ничего не меняй. Сайт открывается, но старый. Запушил [когда], в приватном окне тоже старый. Объясни, где ещё может кэшироваться и как это сбросить. Выкладка прошла, изменений нет. Вот лог: [вставь]. Скажи, уехал ли мой файл [имя] на самом деле, и если нет — почему. Ругается на сертификат. Вот текст ошибки: [дословно]. Проверь по порядку: срок, имя в сертификате, служебная запись, проксирование. Локально работает, на боевом нет. Проверь четыре причины по порядку: не уехавшие файлы, переменные окружения, версии, регистр в путях. Скажи, какая подходит под мой случай: [описание]. Удалил файл и закоммитил. Найди в истории последнюю версию [путь] и покажи команду восстановления. Объясни её до выполнения. Запушил ключ. Ключ от [сервис]. Скажи, где его отозвать и перевыпустить, и где посмотреть, пользовались ли им. Историю пока не трогай. Агент сломал проект без коммита. Помоги понять, что вообще можно попробовать восстановить. Если восстановить нечего — скажи прямо, я переживу.Красные флаги
- Пишешь «почини» и уходишь. Вернёшься к проекту, в котором изменено больше, чем было сломано.
- Пересказываешь ошибку своими словами. Вставляй текст дословно: половина смысла в деталях, которые ты сочтёшь неважными.
- Не сказал про Windows. Готовься к нескольким попыткам вслепую.
- Согласился на команду, которую не понял. Спроси, что она изменит и обратимо ли это. Хороший ответ на это есть всегда.
- Третий круг «сделай лучше». Останови и сформулируй проверяемый критерий.
→ Дальше: Практика 7. Настройка Windows
Настройка Windows под Claude Code
Зачем это тебе. Пара к главе 10. Полчаса один раз — и половина необъяснимых ошибок агента перестаёт случаться. Проходи по порядку, каждый шаг заканчивается проверкой.
Шаги
-
Выбери оболочку и закрепи выбор.
Открой PowerShell (не
cmd) и закрепи на панели задач, чтобы дальше всегда запускать одно и то же. Проверка: $PSVersionTable.PSVersion Если не сработало — ты вcmd, а не в PowerShell. Закрой и открой именно PowerShell. -
Проверь, какой Python реально вызывается.
python --version
python3 --version
Первая должна дать версию. Вторая — либо ошибку, либо открытие магазина приложений: это заглушка, не интерпретатор.
Если
pythonтоже открывает магазин — ты ещё не ставил настоящий Python, либо при установке не была отмечена галочка «Add to PATH». Поставь заново с галочкой. -
Включи режим UTF-8 глобально.
setx PYTHONUTF8 1
Обязательно открой новый терминал — переменная не появится в уже открытом. Проверка:
python -c "import sys; print(sys.flags.utf8_mode)"
Ждём
1. Получил0— терминал старый, перезапусти. -
Напиши блок про окружение в файл инструкций агента.
В
CLAUDE.mdв корне проекта (или в глобальный, если хочешь один раз на всё). Готовый текст — подставь свои значения: ## Рабочее окружение ОС: Windows 11. Пользовательский терминал: PowerShell. Оболочка для выполнения команд: [PowerShell / Git Bash] — используй ЕЁ синтаксис, не смешивай с другой. Python: вызывать `python`, НЕ `python3` (`python3` на этой машине — заглушка из Microsoft Store). Установка пакетов: `python -m pip`, не `pip3`. PYTHONUTF8=1 выставлен глобально — encoding='utf-8' в open() передавать не нужно. Пути: в кавычках, через прямые слэши — "C:/Users/имя/проект". Обратные слэши съедаются как экранирование. Проверка: начни новый диалог и спроси «в каком окружении мы работаем». Агент должен ответить по этому блоку, а не догадками. -
Настрой переводы строк — если в проекте есть скрипты для Linux-сервера.
Создай
.gitattributesв корне: *.sh text eol=lf Без этого Git на Windows может дописать в скрипты лишний символ, и на сервере они упадут сbad interpreter: /bin/bash^M. Файлов.shв проекте нет — шаг пропусти. - Проверь всё вместе. Попроси агента выполнить одну команду, которая задевает все настройки сразу: python -c "import sys,os; print(sys.version.split()[0], sys.flags.utf8_mode, os.getcwd())" Должны увидеть версию, единицу и путь к текущей папке — без ошибок кодировки и без нескольких попыток со стороны агента. Если агент пробует несколько раз — блок из шага 4 либо не написан, либо лежит не там, где агент его читает.
Что спросить у Клода
Собери блок про окружение для моегоCLAUDE.md. Не предполагай — проверь сам: версию ОС, какая оболочка, как называется интерпретатор, включён ли режим UTF-8. Впиши реальные значения и к каждому правилу добавь симптом, по которому его узнают.
Проверь, нет ли в проекте файлов с неправильными переводами строк, которые сломаются на Linux-сервере. Скажи, как починить это один раз для всего репозитория.
Красные флаги
- После
setxпроверяешь в том же окне. Переменная там не появится никогда. Новый терминал. python3открывает магазин приложений. Так и должно быть — используйpython.- Блок про окружение написан, а агент всё равно ошибается. Проверь, что файл лежит там, откуда агент читает инструкции, и что ты запускаешь его из корня проекта.
- В блоке написано «Windows» и больше ничего. Слишком общо, чтобы что-то изменить. Нужны конкретные имена команд и правила путей.
→ Дальше: Практика 8. Карта: что где посмотреть
Карта: что где посмотреть
Зачем это тебе. Теория держится в голове ровно до тех пор, пока ты не увидел её живьём. Эта страница — обратный указатель: не «тема → объяснение», а «проект → какие темы на нём видно».
Как пользоваться
Прочитал главу и не уверен, что понял, — найди в таблице проект, который её иллюстрирует, и посмотри, как там сделано. Одна и та же тема на трёх ступенях выглядит по-разному, и понимание приходит именно из сравнения: почему здесь так, а там иначе.
Что спросить у Клода
Вот мой проект: [описание и ссылка на репозиторий]. Разложи его по этой карте: какая ступень, какой механизм выкладки, где живут данные, где секреты. Скажи, что в нём стоит на ступени выше, чем нужно. Собери мне такую же таблицу по моим проектам — по каждому: ступень, хостинг, механизм выкладки, где данные. Я хочу видеть свою инфраструктуру одной страницей.Красные флаги
- Все твои проекты на третьей ступени. Скорее всего, две трети из них там не нужны, и ты платишь временем на обслуживание.
- Не можешь сказать, где лежат данные проекта. Значит не знаешь, что потеряешь при переезде и что не восстановится из репозитория.
- Ни одного примера, который можно открыть и посмотреть. Теория без живого примера выветривается за неделю.
→ Конец первой части. Дальше — к началу учебника.