версия 3, целиком
У версии 3 была карта с четырьмя направлениями: блог начинают читать, сайт становится местом, система следит сама за собой, и всё это тихо становится постоянным. Первая небольшая волна вышла на прошлой неделе. Это всё остальное, восемь изменений, вышедших вместе.
Блог начинают читать. Теперь можно подписаться по почте, на каждый пост или на еженедельную подборку, с шагом подтверждения и отпиской в один клик, которая никогда не просит войти в аккаунт. Блог теперь умеет и webmention: когда я ссылаюсь на чей-то сайт, его сервер об этом узнаёт, а когда кто-то ссылается сюда, я вижу это в очереди модерации, прежде чем что-либо появится под постом. И главное: блог теперь в фединтернете. Его можно читать из Mastodon или любого совместимого сервиса, и опубликованные посты попадают в ленту как заметка. Всё, что приходит обратно, ответы, лайки, репосты, хранится приватно только для меня и никогда не публикуется автоматически. Федеративная часть работает как отдельный маленький сервис, так что если я когда-нибудь захочу его убрать, я просто останавливаю один контейнер, и остальной сайт этого даже не заметит.
Сайт становится местом. Теперь есть раздел походов, turer, где каждый поход представляет собой GPX-трек, нарисованный на настоящей карте, а расстояние и набор высоты считаются из файла прямо при загрузке. Тайлы карты берутся из OpenStreetMap и загружаются только на этих страницах, о чём теперь прямо говорит страница о конфиденциальности. Есть дневник тренировок, простые структурированные записи со ссылкой на пост, когда забег заслуживает пары слов, а пост получает взамен небольшой блок со статистикой. И у рисунков наконец появился свой раздел, вместо того чтобы прятаться внутри фотоальбомов.

Новая страница дашбордов: ошибки, трафик, самые популярные посты и когда каждый сервис последний раз присылал строку лога.
Система следит сама за собой. В админке появились дашборды, построенные на данных аналитики и центрального хранилища логов, графики SVG написаны вручную, без всякой библиотеки для графиков. Рядом стоят оповещения: теперь каждый сервис присылает heartbeat, и если один из них замолкает или начинают сыпаться ошибки, мне приходит письмо. Настраивается из панели настроек, по умолчанию выключено, как и всё остальное здесь.
Кнопка публикации служит тем местом, где сходится вся волна. Публикация поста теперь ставит в очередь письма рассылки, ставит в очередь webmention для каждой внешней ссылки в нём и уведомляет подписчиков в фединтернете, и всё это происходит в рамках одного и того же перехода статуса:
if status == "published" && previousStatus != "published" {
if err := s.Queries.EnqueueNewsletterPost(ctx, updated.ID); err != nil {
recordErrorLog(r, http.StatusInternalServerError, "internal_error", ...)
}
if canonicalURL, err := s.Settings.GetString(ctx, "site.canonical_url"); err == nil {
webmention.EnqueueOutbound(ctx, s.Queries, updated.ID, canonicalURL, updated.Content)
}
go s.notifyFederationPublish(updated)
} else if previousStatus == "published" && status != "published" {
go s.notifyFederationUnpublish(updated)
}Слияние восьми веток в одну, вот где живут ошибки, и я собрал парочку. Две функции заняли один и тот же номер миграции базы данных, а инструмент миграций воспринимает это как два файла, каждый из которых настаивает, что он и есть шаг 21; один из них перенумеровали ещё до того, как что-либо запустилось. Новый федеративный сервис чуть не повторил старый сбой: несколько месяцев назад почтовый сервис молча стоял отключённым в продакшене из-за того, что одна переменная окружения была пустой, а в проводке федерации оказалась точно такая же переменная, пустая по умолчанию, готовая сделать в точности то же самое. На этот раз поймал до деплоя. А сама конфигурация деплоя вообще забыла, что новый сервис существует, из-за чего сервер попытался бы собрать исходный код, которого у него нет. Урок, который преподала версия 2, всё ещё в силе: правильный код, это только половина дела, вторая половина, это проводка вокруг него.
Вот и вся версия 3. На блог теперь можно подписаться, его можно читать и на него можно ссылаться. На сайте появились места, где можно гулять, бегать и рисовать. А когда что-то ломается в три часа ночи, он присылает мне письмо, вместо того чтобы ждать, пока это заметят.