M9K blog

Заметки ITшника обо всём

Путешествие в Сербию. Заметки. Бейсенпетак

Бейсенпетак[^1]. Между.

Путешествие начинается не в тот момент, когда в замочной скважине проворачивается ключ.

Путешествие начинается в тот момент, когда на почту с особо звонким уведомлением падает письмо с подтверждением билета.

Ты можешь сколько угодно быть прошаренным в дороге, аэропорты могут помнить тебя в лицо, ноги — вести привычными маршрутами «контроль — досмотр — погранконтроль — отстойник», и местами всё это происходит уже на автомате (здравствуй, чёртово DME; привет, проклятый MJZ). Но избавиться хоть от небольшого мандража, наверное, невозможно.

Пара часов не слишком судорожных сборов — попробуем на этот раз обойтись без рюкзака, — совмещённых с уборкой; несколько бесконечных проверок — пасош, акша, зарядки, ноутбуки, всё ли я взял? — и привычный скрежет металла в дверной скважине напоминает о том, что дорога, как говорили хоббиты у классика, — *«It’s a dangerous business, Frodo, going out your door»*. Куда же она нас приведёт от «дома»?

Новосибирский промозглый вечер встретил омерзительным накрапывающим холодным дождём. Знаете, то самое чувство, когда уже не знаешь, что лучше: всё ещё номинально осенний «у нас есть плюс» дождь или честный снег. Третий месяц осени через пару дней, для этих широт уже пора являться её величеству зиме.

Привычная срезка через подлесок, выцветшая панелька, убитая внутридомовая дорога — кочка на кочке, попробуй не упасть. Всё привычное — и мы выходим на станцию. Спасибо, в этом году граждане железнодорожники не закрывают служебную калитку (или, что тоже вероятно, магнитный замок сломан — и денег на его починку нет).

Перрон. Ожидаем. Несколько минут — и свет локомотива прорезает сырую ночную тьму, смазанную дымкой.

Мандраж сменяется холодной собранностью. Дорога дарит чувство цели — ты знаешь что, ты знаешь зачем, ты знаешь куда.

Электричка старая. Поднимаюсь. Двери с лязгом захлопываются. В вагоне немноголюдно. Старые лампы в цепи переменного тока, с явно уставшими жить эту жизнь дросселями, неприятно гудят, озаряя вагон болезненным жёлтым светом.

Поезд начинает движение.

Опять же, вопрос культуры эксплуатации. Табличка утверждает, что изделие было порождено на свет бодрым Демиховским машиностроительным заводом в 2009 году. Но выглядит оно так, как будто последние годы основным пунктом назначения было чистилище да пристань на Стиксе.

Тем разительнее контраст с условной линией Эноден — там тоже не хайтек, не поезда, сделанные завтра, но они так эксплуатируются, что нет разницы, когда был сделан поезд. Я не сторонник псевдорационализма месье Паршина («Почему Россия не Америка»), но от подобных вопросов отделаться не могу.

Невольно ловишь себя на мысли, что выключи свет — и этот вагон будет отлично смотреться на линии Янов — Копачи, что реальной, что вымышленной.

Поезд мерно стучит стыками, а я смотрю дальнейший маршрут. Такси, но откуда? Запускаю жёлтое приложение, смотрю прайс с Речника — да итить вас колотить, что так много-то?

Окей, смотрим варианты с метро. Маркса, Студенческая... Здравствуй, неевклидова зависимость стоимости от локации подачи. Вот формально Студенческая дальше от аэропорта, но цена поездки меньше, нежели с Маркса.

Выхожу. На перекрёстке многолюдно, несмотря на дождь. Несколько студенческих городков в небольшом радиусе создают отличную иллюзию жизни. Кидаю взгляд на альма-матер — почти всё в темноте, равно как и плакат «Технологии, которые работают». Ага, так и поверим. Прошло — сколько уже? — десять лет, но я так и не понял, что это было.

Смотрю в приложение ещё раз, в голову закрадывается мысль посмотреть альтернативу. Окей, сказано — сделано. Выставляю ставку, разброс встречных предложений — разница на треть. Окей, сегодня нас везёт серая «Камри».

Несколько минут ожидания на остановке — и, рассекая водную гладь (ливнёвки?), обгоняя автобус, подъезжает такси.

Вот тут наглядно о цветокоре. Вспоминаешь Рокпорт-Сити — и сразу чувствуется, что там была-то только тёплая летняя гроза. А тут, если сделать фотокарточку, будет холодное неприятное нечто.

Садимся, стартуем. Заднее сиденье неудобное, тесное — машина явно не была готова в своём посмертии работать такси.

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

Когда-то это казалось мне верхом цивилизации — торговая улица. Теперь же кажется верхом безвкусицы: батальоны кричащих табличек разной степени дешевизны, от секс-шопа до канцелярии, прямо маняще кричат: «Не заходи в меня».

На таком уровне всё-таки чувствуется масштаб города — будучи жителем миллионника, ты, как актёр на его сцене, физически не можешь фиксировать все изменения. С другой же стороны, «отсекай лишнее» — это не те изменения, которые действительно нужно держать в оперативном сознании.

Такси сворачивает на Ватутина — здесь перекопано, экстренная подготовка к отопительному сезону, начавшемуся уже месяц как. Сворачиваем у Труда / парка Кирова.

Тут тоже обновки — дорожники пытаются собрать развязку нового Ново-Николаевского моста. Символично, что название породило прям добротные волны бурления в СМИ. Оно вроде как должно было подчеркнуть преемственность эпох, де-мол, «мы не отказываемся от своей истории», но в реальности стало неприятным символом нафталиновых практик ушедшей эпохи — двигать сроки вправо.

Водитель медленно проехал изгибы развязки, выехал на Станционную — и я потерял интерес к дороге.

Этот район на внутренней карте, на подкорке сознания, был помечен как «проехать быстрее». Защитный механизм психики — вытеснение.

Дорога была пустой, и, втопив все как бы разрешённые +19,9 км/ч к разрешённой скорости, машина добралась до паркингов OVB минут за двадцать. Несколько раз мы неприятно проехали по множественным железнодорожным переездам, которые разве что напоминали о том, что этому месту определённо не помешал бы плохонький, но аэроэкспресс.

Машина остановилась в плотной цепи запаркованных машин возле внутреннего терминала.

Приложение, как и жёлтый монополист, предлагало поставить рейтинг пассажиру (водителю) и поездке (мне). Без задней мысли поставил пять звёзд (вопросов действительно нет), однако взгляд упал на телефон водителя, который выставил только четыре звезды.

Сразу захотелось с характерным южным акцентом спросить:

— Брат, слышь, ты что?

С мыслью, что я чего-то не понимаю в этой жизни, я попрощался с водителем и вышел в холодный неприветливый мир.

Рядом был запаркован «хоккейный» автобус, из которого выходили парни в форме магнитогорского «Металлурга». Видимо, сегодня была игра.

На первом досмотре многолюдно, но особого кипиша нет. Граждане-чопокузетовцы из САБа даже не стали просить включать ноутбуки. Что ж, приемлемо.

По пути в международник заглянул в уборную. Авиасейлс по-прежнему держит марку странного маркетинга («Это вам за терпение» — и статуэтка «Оскара»).

Прохожу в международник. Летим сегодня казахским лоукостером, нужно сделать так, чтоб сумка была меньше семи килограммов.

Ранее днём пробовал зарегистрироваться онлайн, но нынешняя реинкарнация Qazaq Air (которую приватили, и контора с названием «Сарык-конура» принесла денег в бюджет Казахстана) — VietJet Qazaqstan — тонко намекнула на очередь.

На табло одна стойка, 72. Подхожу.

Что ж, вечер перестаёт быть томным — очередь, к счастью, не колбаской. Но заслуга это всего лишь DHC-шки, которая не способна взять столько пассажиров, чтоб породить очередь-гаргантюа.

Аэропорт — место, где сталкиваются люди с разными паспортами из разных миров. Так и здесь — чуть больше половины очереди с синими паспортами Ұлы Дала.

Поток движется неспешно. Плюсом передо мной стоит разноголосая компания из подростков лет десяти. Унаследованный класс «спортсмен», число наследований — 8...15. Они замедляют движение потока, ибо к их документам добавляется доверенность сопровождающего и проверка, скорее всего, документов от родителей.

За неспешным движением очереди пролетает минут двадцать пять.

Наконец моя очередь. Дама на стойке не проявляет никакого интереса к моей ручной клади — привет, PPK, — отдаёт посадочник и отпускает восвояси.

Перепаковка имущества, второй этаж, скучающий первый кордон:

— Куда летите?

— Астана.

— Вам на пограничный.

И я уже стою в очереди на получение заветной отметки о выезде.

Передо мной женщина, синий паспорт. «Любуюсь» нововведениями со сбором биометрии. Ей-богу, это не то, что нужно было заимствовать.

Рядом стоит девушка в форме ФСБ, осматривает очередь. Всегда интересовало, какая мотивация в мире тысяч дорог идти именно этим? Непонятно.

Зелёный свет, посмотрите в камеру, цель выезда?

Осмотр паспорта, богатого историческим материалом, занимает *чуть больше* времени, чем хотелось бы моей психике, — нервничаю. Наконец заветная отметка — и счастливого пути.

Ещё штамп, финальный досмотр — к счастью, тоже ленивый, — и я в накопителе.

Накопитель пустой, следующий рейс только через пять часов. Времени до посадки ещё около часа.

Прохожу мимо едальни — и понимаю, что проголодался. Что ж, ценник местный мы знаем, но тут есть вай-фай.

Девочка-официант принимает заказ на пасту и лимонад — самое, наверное, дешёвое и питательное, что тут есть. Я же тем временем достаю ноутбук и ухожу в цифровой эскапизм черноконсольного мира.

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

Впрочем, мы здесь не за этим.

До посадки ещё пять минут — рачун, картица! — и мы выходим к гейту.

Потихоньку собирается очередь.

Подходит мужик, явный покоритель какого-то из локальных квазибаров, — в состоянии на грани «состояния, порочащего человеческое достоинство». С силой дёргает дверь, прохрюкивает:

— Кто тут на Астану?

Наворачивает пару кругов, теряет посадочный, обретает его вновь, докапывается до пограничницы. Вижу пасош — синий. Я бы поостерёгся так себя вести, но пьяному море по колено.

Посадку объявляют почти вовремя.

Почему почти? А/к ранее потратила некоторое количество усилий на рассылку писем, де-мол, вылет будет раньше на 500 наносекунд. В итоге реальное время вылета совпало с запланированным изначально.

Наверное, это важно с точки зрения обмена бумагами с пограничной службой — полётное задание, согласование пересечения границы, — но для клиентского сервиса спорно.

Дождь не успокаивается. Подкатывает автобус, мокрый пол, запотевшие стёкла. Сквозь них мерцают огни аэродрома.

Небольшая петля — наша дэшка стоит напротив старых телетрапов со стороны посадки на 15/21. В порту, не слишком оживлённом, на перроне из оперативного — два борта.

Чрево самолёта пожирает пассажиров.

Дэшка, нацфлаг, упоминание Канады, чутка перекрашенная ливрея — она у а/к скучно-белая, меняли логотипы.

Сегодня полный рейс, все хотят выбраться из 1/6.

Загружаюсь одним из последних, место в середине самолёта у окна. Тесновато.

Соседи памятуют об изделиях киевского КБ Антонова. Занятная метафора — смешной забавный рафик от мира авиации. Я Ан-24 застал по студенчеству, с эпитетом «смешной», пожалуй, поспорю, но запомнить стоит.

Что хорошо в маленьком турбопропе — это внезапность.

Короткая скороговорка стюардесс — билингвово, запуск двигателей, и мы уже катим на исполнительный.

На часах почти час, рабочий день за спиной — сознание уже тонко намекает на режим мейнтенанса. Что хорошего пришло с возрастом, так это способность проваливаться в сон даже в таком неудобном положении.

Лёту два часа, сон беспокойный — *«In my restless dreams...»*, но общая усталость вгоняет организм в *dream mode* даже во время какой-то возни в салоне.

*«...I see this town»* — Astana.

Новая скороговорка где-то над Сарыобой — и через несколько минут шасси уже бодро катятся по полосе.

Выходим. В порту сухо, но чувствуется степь — дует неприятный ветер.

Хорошо-то как!

Вдали светится здание терминала әуежай. Подсознательно кажется, что добавили чутка сатурейшена в картинку — уж больно приятно выбраться из повседневного *прокажённого*.

Телефон бодро ловит местную сеть. Режим «путешествие» переключился окончательно — я готов впитывать этот мир.

План: попасть на трансфер.

Реальность оказалась прозаичнее. Автобус докатил до терминала, и, попробовав пройти по табличке «Трансферные рейсы», я упёрся в пустую стойку. До рейса ещё несколько часов, видимо, трансфер работает только по факту стыковок.

Сотрудник NQZ отправляет на паспортный контроль.

Что ж, штампики!

Вот честное слово, паспортный контроль Астаны — очень странное место.

Страны СНГ выползли из «союзной» преисподни уже тридцать лет с гаком как. Свои языки и символы, кто-то успел даже поменять графику письменности — и формально, кстати, РК относится к таким странам.

Но тут меня встречает ожидаемое кириллическое «Қош келдіңіздер» (что иронично на фоне северных погранпереходов, где уже повсеместно латиница).

Разрешения на въезд — нововведение 2026 года — тоже никто не спрашивал.

Две-три минуты в очереди, цель визита, откуда-куда — и приветливый край степей распахивает передо мной двери.

Фоном мысль — не поехать ли в город. Отгоняю — силы нужно поберечь.

Иду в терминал, пытаюсь пройти в отстойник.

Не пущает! Совсем не пускает! Абсолютли!

Сотрудник отправляет на стойку а/к.

Соображаю: до вылета четыре часа, возможно, ещё нет регистрации. Подхожу к стойке СКАТа — девушки за ней подтверждают мою догадку.

Принято, будем развлекаться.

Следующая крамольная мысль — поспать.

Я знаю, что в аэропорту есть капсульный отель. Я как-то его ранее бронировал, но так и не побывал.

Подхожу, смотрю прайс, смотрю кабинки — понимаю, что добавлять боль в спине к своему анамнезу не стоит. В капсуле я могу разместиться ну разве что в позе эмбриона.

Рядом кофейня «Блэк Рэббит».

Достаём нормальную карточку; латте, вафельная трубочка; седлаем стойку с розетками.

Собираюсь было раздавать сеть с телефона, но, проверив эфир, обнаруживаю публичную.

Окей, +10 очков Когтеврану за томность ночи.

Запускается браузер, устанавливается сессия до домашней инфраструктуры — и тут меня оглушает мысль: всё, тут это не нужно.

Срезаем настройки, ноутбук радостно подтверждает смену локации — а вместе с тем начинает нормально работать то, что в *прокажённой* повседневности приходится заставлять работать с бубном.

Инстаграм полон пассажей про ностальгию по ИКЕА, и вот я из них. И для всех *«нашли по чему скучать и сожалеть»* есть набор персональных проклятий.

Скучать по *норме* — это не грех, а с пассажами *«нашли по чему скучать»* можно смело докатиться в обратном направлении истории.

В общем, хочешь сделать человеку хорошо — верни ему отобранное.

Неспешно, в электрических снах, проходит пара часов. Пора собираться.

Дубль два — сканирую посадочный, и на этот раз врата рая распахиваются.

Эскалатор, паспортный контроль, новый вопрос «Работаете или живёте?», на который приходится дать грустный ответ, — и второй незапланированный штамп мой.

Пока стоял в очереди, разглядывал пассажиров. Насколько смешно грести под одну гребёнку национальности абсолютно разных людей!

Здесь на контроле уже без шуток — достаньте ноутбуки, включите, покажите. Достаньте повербанк.

Пока разбирался с ноутбуками, отвернулся от зоны, где смотрели сумку. Прохожу, забираю — и понимаю, что не вижу повербанк.

Что за дела-то?

Беру сумку, перерываю — нет.

Обращаюсь к сотрудникам — де-мол, печаль-тоска, кража на пустом месте. Ожидаемо удостаиваюсь второго досмотра — действительно нет.

Говорят, сейчас поднимем записи с камер.

Десять минут томительного ожидания, за время которых я уже мысленно попрощался с девайсом.

Подходит парень, грит: на тебе, парень, изоленту — повербанк на выбор.

У парня с собой три одинаковых банки, одна из которых моя.

Забавная эта ваша штука — тервер. Какова вероятность в одном аэропорту получить случайное событие, при котором на одной ленте будут вещи пассажиров с одинаковыми батареями?

Забираю банку — вроде моя, — благодарю.

До посадки ещё сорок минут. Иду наверх, там ещё одна кофейня с розетками.

*One more latte*, вдали виднеется реклама вечно жёлтой программы.

Б-же, прошло много лет, но платформа мать-её-за-ногу-«1С:Предприятие» меня пугает и по сей день.

Наконец, час икс.

На стойке очередь, пассажирами дирижирует слегка нервный мужчина под сорок.

В голове почему-то балетное Хачатуряна — вот эти та-та-ТА-та, под бодрый речитатив «мы с тобой обязательно встретимся, ты да я».

Да, Астана, открытие ты моё 2020-х, мы с тобой ещё обязательно встретимся, но пока — пока.

Автобус. Вслушиваюсь в речь.

В нашем коде новые ноты.

Я привык за много лет к звучанию казахского — язык не учил, максимум мой — смешные бытовые фразы да то, что ловишь на улицах.

В нашей же мелодии появилось что-то новое и смутно знакомое.

Так и есть: рядом стоят двое патлатых мужчин в годах, српски језик. Речь воспринимаема, но смысл ускользает.

Колико пара — сколько стоит?

Воспринято, но слишком медленно, нить потеряна. Впрочем, мы летим же в Србију, было бы странно удивляться.

Автобус катит по полосе. Останавливаемся почти там же, где я был четыре часа назад.

Дэшка, на которой прилетел. Ещё одна дэшка, на заправке, готовится к покорению Омска.

Чуть поодаль — привет с «родины», тушка, то ли МВДшная, то ли СЛОшная, белая ливрея, синие полосы. Слепящий свет не даёт увидеть регу.

Зато видна рега моей сегодняшней небесной колесницы — UP-B3741.

Я, кажется, сегодня и тут последний.

Ветер продувает, рядом ходит что-то насвистывающий себе под нос сотрудник авиакомпании.

Рассматриваю автобус: «Закон и порядок начинается с каждого». Ага, новая реинкарнация «Коррупция тоқта».

Время уже седьмой час, но на небе ни единой полоски света, намекающей на скорый рассвет.

Фары рисуют на полосе красивое рассеянное. Эх, телевик бы сюда, да лоу-ки.

Поднимаюсь по трапу. Пилоты в кабине готовят небесную симфонию.

Уважаемый, ответственный труд — сюита на небесных овцах, покоряющих бесконечность.

Две стюардессы приветствуют. За мной поднимается сотрудник авиакомпании.

71 пакс, 41 багажное. Бординг комплитед.

Ага, рейс будет полупустым. Ну, меньше народу — больше кислороду.

Главное — СКАТ, не отменяйте рейс за нерентабельностью. У меня нет 100500 денег платить постоянно «Сибири» за их очевидно возросшие хотелки за IST, ласкаво молим.

Приветствует ваш командир, Константин Беляков.

Что ж, Константин, сюита, шесть часов, форте, меццо-форте, чтоб прям от души.

Стюардессы готовятся ко взлёту. Здесь трёхъязычие, и, видимо, есть какой-то регламент на скороговорки по таймингам.

Наверное, это и есть реальное знание языка на C1+, чтоб такое понимать.

Из бонусов — запрет пересаживаться просто так, это платная услуга... по крайней мере, пока мы на земле.

Самолёт стартует на рулёжку, долго катится к полосе.

Разбег — и мы покидаем твердь земную. А вместе с тем проваливается в пустоту и сознание.

Спасибо организму — к концу третьего десятка он научился-таки спать, игнорируя внешние раздражители.

Ненадолго, впрочем.

*Wake on LAN* проходит по нервным окончаниям в тот момент, когда по проходу, мерно шебурша колёсиками, поехала сервисная тележка.

Кинул взгляд на часы — стюардессы явно решили не откладывать обеспечение пассажиров бортовым питанием в долгий ящик. Прошло едва ли пятьдесят минут со взлёта.

Касалетка, общий паёк. Прошу кофе — в обыденной жизни я пью его столько, что давно уже выработалась резистентность. Стаканчиком больше, стаканчиком меньше.

К чести СКАТа (а скорее, к бесчестию коллапсирующих на грани рентабельности эрэфийских авиакомпаний) и к моему приятному удивлению (в личном рейтинге а/к граждане были лоукостерами) — пайка по набору была моё почтение.

Уплетаю овощной салат — как сейчас модно говорят, коул-слоу, — уставился в иллюминатор сквозь сидящего у окна пассажира.

Высота меняет восприятие вкуса — отсюда и фантастическая любовь к томатному соку, и банальный кекс кажется мишленовским блюдом.

За окном начал брезжить пастельный рассвет, озаряя мир мягкими тёплыми розово-красными оттенками. Режимное время, как-никак.

Расправившись с касалеткой (на алюминии было тиснение логотипа а/к; опять же — не экономят), погрузился в мысли.

Полёт в среднем про то, что нужно познать себя, — а в нашем случае это развлечение на четверть суток.

Дорога приносит освобождение от мирских забот, но заботы душевные — они здесь, на месте. И попробуй только от них уйти.

Вот пункт назначения.

Строго говоря, я отдаю себе отчёт, что Београд в ранжире мировых столиц — не изюм, совсем не изюм. Но это одно из тех мест, где внутреннее беспокойное «я» чуточку успокаивается.

Вот это странное чувство (как говорят, засосало под ложечкой), когда перед глазами мелькают Майлина и Кульджинский тракт, а в данном случае — Радиофар.

Оно отличается от чувства восторженного туриста в каком-нибудь условном Токио или Пусане. Там ты смотришь красивое, но вместе с тем чувствуешь отстранённость — нужно родиться здесь, чтоб быть своим.

*Сингидунум* же — место, где можно мимикрировать под своего.

Если математически лаконично: в задаче многокритериальной оптимизации «успокоение душевных терзаний» зависимость внутри области решений основных критериев от того, является ли локация пребывания А-городом, минимальна.

Встаю, нужно размяться.

Где-то на первых рядах сидит пилот — сквозь утеплённую безрукавку видны пилотские лычки, четыре штуки. КВС, видимо, на разворотный рейс.

В руках планшет, смотрит что-то батальное про WWI. *The War That Will End War*, точка отсчёта нынешнего мира, тревожащая тема.

Опять же, мы летим в Сербию, где идолы Принципа — Чёрной руки — Белой руки — Млада Босна занимают достойные места в местном национальном пантеоне этнобилдинга. Два выстрела в Сараево, война кузенов, вот это всё.

Чуть поодаль кто-то невежливый, без наушников, залипает во что-то громкое.

Дохожу до входного тамбура.

Глаз натыкается на смартфон стюардессы, оранжевый яблокофон в чехле со стикерами персонажей «Зверополиса».

Почему-то всегда профессия стюардессы казалась максимально отстранённой от обычного мира — ты живёшь везде и нигде.

Из-за этого образ всегда нейтрально — будем честными — сексуализированно-мегерский. Этакая холодная властительница мира на высоте 10 000 футов над землёй. А тут что-то человеческое.

Возвращаюсь обратно.

Фоново: шығу скоро сменится излазом.

По прогнозу сегодня обещают облачность — и реальность с прогнозом не расходится. За бортом бесконечное кисельное марево.

GPS пока ещё врёт — мы с гарантией ещё где-то над Чёрным морем, но метка показывает параллельные измерения Брянщины.

Где-то читал, что кто-то из европейских авиакомпаний начнёт внедрять системы, устойчивые к спуфингу сигнала. Пока же — гадай, где мы находимся.

Томительное ожидание, и наконец-то позиция принимает кириллический вид.

Округи-околии, скоро будут општине.

Проходит ещё двадцать минут, и начинается аутро — бодрая скороговорка Константина:

*«Құрметті жолаушылар, біз төмендеуді бастадық... We are now descending into Belgrade... Ускоро слећемо на аеродром у Београду».*

Самолёт пробивает молоко, и показывается земля.

Вот такая осень мне нравится — за иллюминатором зелёный мир, где жёлтое золото багрянца лишь задаёт акценты, а не является лейтмотивом.

Где-то там, в кабине, пилоты отслеживают глиссаду.

Невидимый мир ILS, общения Београда-контроль и Београда-рулёжки — в какой-то из других жизней я бы стал пилотом.

200 футов, 100, 50...

Илы, Тушки, Боинги, Макдуглы, Аны, Аирбасы — всё видел, но момент касания шасси с полосой всегда волнительный.

Мягонькое соприкосновение (где-то на подкорке впечатан афганский спуск IKT) — и наш борт задорно катится к телетрапам.

Последние ноты — паркинг позишн, *disarmed*, *cross-check*, мы-благодарим-за-выбор-нашей-авиакомпании (сегодня всё по протоколу, без души), сборы (благо лук осенний, много не нужно) — и мы уже на выходе.

Көп вам рақмет, пан Беляков, сізге рақмет, вам, прекрасные стюардессы.

Это были утомительные шесть часов.

Самолёт встал дальше, чем обычно, поэтому путь по терминалу оказывается длиннее обычного.

Никола Тесла довольно крупный для не очень, в среднем, большого Београда, и до погранконтроля я иду минут десять. Впрочем, грех жаловаться — отличная разминка для кровотока в затёкших ногах.

На контроле многолюдно — видимо, кто-то ещё прилетел вместе с нами.

Очередь движется быстро. Выбираю кабинку «Для служебного пользования».

Подхожу, даю паспорт.

Дама на контроле протягивает руку.

Секунда.

Открывает страницу в начале.

Секунда.

Взгляд в лицо.

Секунда.

Штамп.

— Хвала.

Серьёзно, а можно так же в стране-эмиссии паспорта?

Вместе с осознанием, что я прибыл, внутренние часы ускоренно проматывают стрелки.

Петак.

*Ако вам живот да лимунове, направите од њих лимунаду и почастите њоме живот, ђубре једно!*

—-

[^1]: Бейсенпетак — авторский неологизм, образованный слиянием казахского «бейсенбі» (четверг) и сербского «петак» (пятница). Обозначает состояние между двумя днями, странами и этапами путешествия.

Suno. «Мы знаем как».

По мотивам нынешней поездки в Сербию немного оптимистичного околополитического

В Зре́нянине улицы пахнут дождём,
И ветер гуляет по ним напролом.
На площади голуби делят асфальт,
И город живёт, не пытаясь блистать.

Бетонные башни хранят урожаи
Воспоминаний о будущем рае.
Когда-то здесь знали, куда всё идёт,
И верили: завтра их не подведёт.

На старой стене полустёртое «Банат»,
И буквы сквозь трещины смотрят назад.
Здесь столько границ проходило когда-то,
Что краска стареет медленней карты.

Когда-то чертили прекрасные схемы,
Считали тонны, решали проблемы.
А нынче завод — декорация к фильму,
Где главные роли достались полыни.

И кто-то опять нарисует маршрут,
Где нас непременно к успеху ведут.
Где завтра расписано вплоть до деталей,
Но только реальность в расчёт не включали.

*Mi známo káko! Mi známo káko!*
На белом плакате уверенный знак.
Мы строили завтра в бетоне, в веках,
Но завтра построилось как-то не так.

*Zaslužújete bólje!*
Да кто бы, скажи мне, поспорить посмел?
Мы все заслужили немного побольше,
Чем список несбывшихся правильных дел.

У церкви ржавеет высокая крыша,
А небо молчит, словно больше не слышит.
Здесь разные кресты над одной мостовой,
И каждый по-своему спорит с судьбой.

Мадонна глядит из старинной ниши,
На город, что дышит всё тише и тише.
Ей сверху виднее, как движется век,
Как мало успел простой человек.

На кладбище Марковы — три фотокарточки,
Три жизни, три взгляда из каменной рамочки.
Они торопились, любили, скучали,
О чём-то мечтали, чего-то не знали.

Наверное, кто-то боялся простуды,
Кто-то ругался из-за посуды.
Кто-то смеялся над глупой рекламой,
Кто-то звонил своей старенькой маме.

И всё это больше не входит в отчёты,
Не числится в планах, не требует квоты.
История любит большие масштабы,
Но люди живут не масштабно, а рядом.

И если над городом снова туман,
И если у времени собственный план,
То, может, не стоит искать оправданий
Тому, что осталось от наших желаний.

*Mi známo káko! Mi známo káko!*
На белом плакате уверенный знак.
Мы строили завтра в бетоне, в веках,
Но завтра построилось как-то не так.

*Zaslužújete bólje!*
Да кто бы, скажи мне, поспорить посмел?
Мы все заслужили немного побольше,
Чем список несбывшихся правильных дел.

У речки Бегей зеленеет поверхность,
Как будто природа скрывает погрешность.
В воде отражаются старые стены,
Не зная, какие грядут перемены.

На площади плакат обещает нам лучшее,
И фраза звучит удивительно созвучно
Всем тем, кто когда-то стоял у станка
И тоже уверенно знал, что и как.

Но нет, это вовсе не повод смеяться
Над теми, кто хочет за завтра сражаться.
Пускай ошибались отцы и деды,
Но нам не достались в наследство запреты.

И снова на улицах новые лица,
И снова история хочет случиться.
Никто не уверен, что знает ответ,
Но ждать идеального времени нет.

И я не хочу быть всезнающей тётей,
Которая скажет: «Да вы не поймёте».
Пусть новое завтра не выдаст гарантий —
Оно не обязано жить заветами партии.

Mi známo káko! Mi známo káko!
На белом плакате уверенный знак.
Мы строили завтра в бетоне, в веках,
Но завтра построилось как-то не так.

Zaslužújete bólje...
И, может быть, это единственный факт:
Мы правда заслуживаем чего-то получше,
Но кто нам сказал, что мы знаем как?

This will be Half-Life 2 in 2026

Рекомендации youtube в кои-то веки подкинули рандомную годноту, которая смогла мне вернуть мой 2005-ый.
Прошло 20+ лет, а пиратка на 2CD до сих пор в сердечке.

Стан

Шёл сегодня к станции, никого не трогал, думал о чём-то своём, продумывал лирику для Suno. Даже при использовании LLM без вычитки человеком — никуда. Заклинило на сербском стан — квартира.

В русском тоже есть стан. Военный стан, казачий стан, стан разбойников. А ещё Казахстан, Узбекистан, Афганистан и целая география прочих «-станов».

Неужели всё это как-то связано или просто созвучие?

Быстрогуглинг показал: да, связано. Причём настолько давно, что тогда ещё ни сербов, ни русских, ни персов в привычном нам понимании не существовало.

У всей этой истории общий праиндоевропейский корень *steh₂- — «стоять».

От него славянский «стан» — место, где остановились, расположились, обосновались. У сербов это постепенно превратилось в квартиру. У персов -stān стало обозначать место, область, страну. А потом этот суффикс разошёлся по географическим названиям, в том числе тюркским.

Английское stand, немецкое stehen, латинское stāre — всё оттуда же.

У серба стан — квартира, у перса — целая страна, у русского — место, где расположились лагерем. Масштабы разные, а смысл примерно один: пришёл, остановился, обосновался. Одна простая мысль — прошла разными дорогами сквозь тысячу лет.

И ведь никто ни с кем не договаривался. Просто языки разошлись каждый своей дорогой, а древний корень остался.

Пока всё это выяснял, дошел до перрона. Который на станции. А «станция» пришла к нам через латинское statio, тоже от того самого корня.

Fogwalk

Никогда не понимал концепции Threads — метовского ответа масковскому Твиттеру. В условиях RU-сегмента это выглядит как поле для диссов из эпохи «расцвета русского рэпа»: кто больше и громче накинет с лопаты, тот и соберёт аудиторию. По крайней мере, в том алгоритмическом пузыре, который подсовывает мне смежный IG.

Но сегодня случилось чудо — в рекомендации завезли годноту. Собственно, сабж — Fogwalk.

Концепт простой: взять идею дополненной реальности Pokémon GO, выпилить покемонов, прикрутить механику «тумана войны» из RPG/стратегий середины 2000-х (здравствуй, Oblivion, привет HoMM 3), упаковать всё это в приложение на базе OSM и добавить геймификацию прогулок.

Сверху накидывается философская мысль о том, в каком микроскопическом пространстве мы живём в повседневности, хотя мир вокруг огромен. Carpe diem, фигли.

Судя по репе разработчика, fullstack web developer + LLM запилили годноту. Прошёлся по окрестной срани, чутка докинулся дофамином.

Suno. «Два выстрела в Сараево».

Подписан на канал историка Софии Широгоровой и периодически залипаю на посты. Пусть местами оптика рассмотрения вопросов вызывает скепсис — обзоры тематической литературы вызывают интерес. Да и стиль изложения — для публичного истпопа, да в публичном поле, да на темы, которые по понятным причинам в RU-сегменте сети вызывают брожение говн — забейте интереса ради сочетание фамилии и ЖЖ (бггг,оно ещё живое) в поисковик  — просто приятен и как минимум вызывает доверие источниками.

Забавным экспериментом скинул один из постов в LLM и получил вполне себе лирику Sabaton — style, которую и не грех закинуть в Suno.

Лирика:

Июнь. Сараево. Жара.
Империя ещё жива.
И не подозревает свет,
Что прежней жизни больше нет.

Шесть заговорщиков у моста,
А смелость кончилась с утра.
Один застыл, другой дрожал,
А третий бросил — не попал.

И яд не яд, и речка мелка́,
Смерть отказа́ла — вот дела́!
Эрцге́рцог е́дет на приём,
А мы с тобою кофе пьём.

Гаврило, мальчик, девятнадцать,
Ты так мечтал героем стать.
Но так легко в чужую вечность
Два пистолетных выстрела послать.

Два выстрела в Сараево —
И целый век пошёл ко дну.
Хотели выстрелить в империю,
А разбудили мировую войну.

Два выстрела — две жизни,
А следом миллионы могил.
Хотели трон имперский смять,
А миру выпало сгорать.

Гаврило пьёт остывший кофе,
Провален план, окончен день.
А рядом кортеж на повороте
Вдруг замирает, словно тень.

Неверный поворот — мгновенье,
Водитель пятится назад.
И вот уже одно решенье
И мир шагает прямо в ад.

Он вышел. Выстрел. Тишина.
София падает без слов.
И начинается война —
Пока лишь в головах послов.

Два выстрела в Сараево —
И целый век пошёл ко дну.
Хотели выстрелить в империю,
А разбудили мировую войну.

Два выстрела — две жизни,
А следом миллионы могил.
Хотели трон имперский смять,
А миру выпало сгорать.

А дальше — ноты, ультиматум,
И август в траурном дыму.
Вчера мальчишки шли к экзаменам,
Сегодня — в землю и во тьму.

Гаврило гаснет за решёткой,
Европа гибнет на полях.
И кто-то с картой и указкой
Рисует стрелки на костях.

Ни честь держав, ни злая месть
Не стоят жизни тех, кто есть.
Ведь каждый павший на войне
Был целым миром на земле.

Два выстрела в Сараево —
И целый век пошёл ко дну.
Хотели выстрелить в империю,
А разбудили мировую войну.

Два выстрела. Две жизни.
Миллионы сломанных судеб.
И снова кто-то обещает:
Последней эта бойня станет.

Июнь. Сараево. Жара.
Остывший кофе. Тишина.
Всего два выстрела с утра —
И мир сгорит дотла.

Вечерний selfhosted. 2.5D — параллакс в браузере.

Владение несколькими IG-аккаунтами, из которых только один реально активный-активный, позволяет выйти из информационного алгоритмического пузыря. Наткнулся на Web-дизайнера, делающего прикольные сайты — визитки. С точки зрения прикладного использования человека, познавшего grep и cat, это понятное дело, специфический изюм — сайт должен быть про быстроту поиска информации — в этом отношение условный tsukumo, вывалившийся прямиком из нулевых отправит в ноудаун все нынешние модные-и-красивые дизайнерские сайты, но иногда можно поиграться и в красивости.

Внимание привлёк Milkmaid
Цитирую:

Эффект строится из фотографии и карты глубины — изображения в оттенках серого, где яркость задаёт условное расстояние до камеры. Для новых фотографий карту оценивает нейросеть по одному кадру.

Фотография преобразуется в облако цветных точек. Каждая точка получает цвет исходного пикселя, положение по горизонтали и вертикали и смещение в глубину. При необходимости создаются дополнительные слои с небольшим отступом. Они добавляют плотность облаку, но не восстанавливают скрытые части объектов.

При повороте сцены ближние и дальние точки смещаются на экране по-разному. Этот параллакс создаёт ощущение объёма. У краёв изображения прозрачность точек постепенно уменьшается, поэтому фотография мягко растворяется в фоне.

Движение рассчитывается как система частиц: у каждой точки есть исходное положение и скорость. Виртуальная пружина возвращает её на место, затухание гасит колебания, а вихревое поле и воздействие курсора отклоняют от исходной позиции. Кнопка сборки убирает рассеивание, после чего облако восстанавливает изображение.

Python заранее готовит фотографию и карту глубины. Отрисовка и движение частиц выполняются на видеочипе устройства через WebGL 2. Получается интерактивная 2.5D-сцена: небольшой поворот выглядит объёмно, но посмотреть за предметы или увидеть их обратную сторону нельзя.

Selfhost demo в стилистике

Вечерняя нейрогенерация

После очередного грустного рабочего понедельника (как ноне говорят в мемчиках, «батрачка»), между обработкой давно просроченных фотосетов с воркшопов, залип на генератор изображений ChatGPT. На старте пользования я его избегал, ибо работал он не слишком быстро — и картинки генерил не самые интересные. Но — в мире моделей T2I всё меняется очень быстро. Плюс, сам процесс — это возможность хоть немного приблизиться к тому чувству, которые ощущают действительно творческие люди — это какой-никакой, но путь к дофамину, эндорфину и прочей сложной химии мозга.

Suno. «Мирна ноћ».

И ещё один нейроэксперимент, на этот раз с перекрёстной валидацией текста LLM — ибо проверить корректность текста по причинам незнания целевого языка я не могу. Вероятно (~99.9%) для носителя языка будет звучать неестественно ( с учётом того, что Suno может пропеть практически всё, не взирая на ударения), но с музыкальной точки зрения звучит приятно, и даже с нотками оригинала (который, опять же, использовать в насквозь коммерческом продукте) — нельзя. Обложка трека — интерпретация реальной фотографии by me.

Кро́вови дрхте под те́ретом да́на,
Не́бески па́стир о́блаке на́паса.
Град за́сипа ноћ са́чмом све́тала,
Ал’ ноћ је ја́ча — све јој при́пада.

О́нима што ле́жу — спо́којан сан,
Ми́рна ноћ.
О́нима што ле́жу — спо́којан сан,
Ми́рна ноћ.

Че́кала сам то вре́ме, и вре́ме је сти́гло,
О́ни што су ћу́тали, сад ди́жу глас.
Ко не́ма шта да че́ка, се́да у се́дло,
Ни́ко их не мо́же сти́ћи, не мо́же сти́ћи.

А о́нима што ле́жу — спо́којан сан,
Ми́рна ноћ.
О́нима што ле́жу — спо́којан сан,
Ми́рна ноћ.

Ко́мшије до́лазе — чу́ју то́пот ко́пита,
Не да им да за́спе, ре́мети им сан.
Ко не́ма шта да че́ка, кре́ће на пут,
О́ни што су спа́сени — о́ни што су спа́сени.

А о́нима што ле́жу — спо́којан сан,
Ми́рна ноћ.
О́нима што ле́жу — спо́којан сан,
Ми́рна ноћ.

Suno. «Белград, 05:24».

В мае 2024 года я впервые оказался в Белграде. Ранний прилёт, рассвет над крылом самолёта, почти пустые улицы, троллейбусные провода и архитектура, в которой смешались несколько эпох. Первое впечатление оказалось странным: город совершенно незнакомый, но при этом подозрительно узнаваемый. Кириллица, обшарпанные фасады, роскошная лепнина, кондиционеры на балконах, граффити и афиши русскоязычных музыкантов.

В тот раз я поселился на Светогорска и буквально сразу после заселения отправился изучать город. Прогулка по центру довольно быстро привела меня к разрушенному зданию Генштаба. В результате осталось несколько десятков фотографий и немало впечатлений.

Предыдущий трек о Белграде были LLM-переработкой моих же собственных дневниковых текстов. Здесь же цепочка другая: Image → Text → Sound. После небольшой корректуры получился «Белград, 05:24»  — холодный, немного ироничный рассказ о городе, в котором знакомые буквы складываются в чужие слова.

Воистину странное время: умный и хитрый статанализатор научился вполне убедительно выражать эмоции.

Контекст метафор:

05:24 — время первого снимка, скормленного LLM. Никакой нумерологии, просто удачно получилось.

Светогорска и семь названий. Одна из исходных фотографий — табличка с историческими именами улицы. Два белых голубя, Светогорская, Битольская, Жоржа Клемансо, снова Светогорская, Лоле Рибара и опять Светогорская. Семь периодов, несколько политических эпох и одна улица, которая никуда не делась.

Генштаб. Комплекс зданий Генерального штаба Югославии пострадал во время бомбардировок НАТО в 1999 году. Я фотографировал его утром 8 мая 2024-го, спустя ровно четверть века после одного из ударов по комплексу. Совпадение дат обнаружил анализ LLM

«МЫ ЕСТЬ!» — не абстрактный экзистенциальный лозунг, а реальная афиша концертного фильма Ромы Либерова, попавшая в кадр. Среди участников — Noize MC.

Лирика:

Восьмое мая.
Пять двадцать четыре.
Доброе утро, Белград.

Рассвет разливается тонкой полоской,
Крыло самолёта разрезало тьму.
И город встречает улыбкой неброской,
Как будто давно я знакома ему.

Здесь утро встречает клубками проводов,
Балконами, пылью, рекламой аптек.
И город, похоже, к приезду готов:
Он видел таких уже тысячу лет.

Кириллица смотрит со старых домов,
Знакомые буквы — чужие названья.
И город из сотни забытых миров
Мне выдал прописку без права свиданья.

А улицы помнят чужие порядки,
И время застряло в бетонных стенах.
Здесь прошлое вечно играет в прятки,
Но прячется плохо в соседних дворах.

Белград, пять двадцать четыре,
Рассвет на чужой стороне.
Я снова одна в этом мире,
Который знаком почему-то мне.

Белград, пять двадцать четыре,
И май отражается в стекле.
Мы прежде друг друга не знали,
Но виделись будто во сне.

Здесь улица семь раз меняла названье,
Два белых голубя, Лоле Рибар.
У каждого века своё оправданье,
У каждого времени — новый кошмар.

На старом подъезде фамилии в ряд,
Здесь русский и сербский почти побратимы.
Знакомые буквы со мной говорят,
Но мы друг для друга непереводимы.

Роскошная лепни́на, ржавый балкон,
И плющ забирается выше антенны.
История пишет очередной закон,
А стены не ждут никакой перемены.

И если мне скажут: «Начни всё сначала»,
Я спрошу у таблички на старой стене:
«Скажите, вам легче от новых названий?»
Она промолчит, как положено ей.

Белград, пять двадцать четыре,
Рассвет на чужой стороне.
Я снова одна в этом мире,
Который знаком почему-то мне.

Белград, пять двадцать четыре,
И май отражается в стекле.
Мы прежде друг друга не знали,
Но виделись будто во сне.

Восьмое мая. Утро серого цвета,
Разбитый Генштаб неподвижно стоит.
Двадцать пять лет. Не случилось ответа,
А город молчит — но бетон говорит.

На стенах — «МЫ ЕСТЬ!», чуть подальше — ругательства,
А рядом афиши, футбол и металл.
Здесь каждое новое доказательство,
Что мир до конца ничего не понял —
И не узнал.

На башнях бетонных кондиционеры,
Машины, деревья, обычная жизнь.
И все революции, лозунги, меры
Смешались в короткое слово «держись».

Здесь не обещают счастливого завтра,
Не просят забыть и не учат прощать.
И город, уставший от собственной правды,
Не просит остаться, не велит уезжать.

Белград, пять двадцать четыре,
Рассвет на чужой стороне.
Я больше не гостья в этом мире —
Он странно похож на меня во сне.

Белград, пять двадцать четыре,
Мой рейс растворился во мгле.
Мы столько всего пережили,
Чтоб просто остаться на этой земле.

Восьмое мая.
Пять двадцать четыре.
Знакомые буквы.
Чужие слова.

Мы есть.

Мониторинг релизов GitHub

Очередной небольшой эксперимент с вайбкодингом — Bash-скрипт для отслеживания новых релизов в GitHub-репозиториях.

Раз в сутки проверяет заданный список проектов через GitHub API и отправляет уведомления в Telegram: версия, ссылка и краткий список изменений.

Поддерживает SOCKS5-прокси, хранит историю обработанных релизов, умеет работать в режиме dry-run. Конфигурация — JSON и .env. Зависимости — Bash, curl и jq.

Сейчас используется для мониторинга Lychee, Firefly III и Memos.

Никаких постоянно работающих сервисов: обычный скрипт, запускаемый через cron.

Репа

Миграция Lychee 6 -> 7 в Docker (LXC)

Развлекался намедни обновлением Lychee с миграцией с базового LXC-контейнера Debian 12 -> Debian 13
Исходно: Lychee 6.10.3 в Debian 12 LXC. База — MariaDB 10.
Данные приложения находились в:

/lychee/conf
/lychee/uploads
/lychee/sym
/lychee/pictures
/lychee/db

Цель: обновить приложение и MariaDB 10->11
В Lychee 7 изменилась структура каталогов внутри контейнера (см. Update Guide))

Новая схема:

volumes:
  - ./lychee/uploads:/app/public/uploads
  - ./lychee/logs:/app/storage/logs
  - ./lychee/tmp:/app/storage/tmp
  - ./lychee/storage/app:/app/storage/app

База смонтирована в локальную директорию, но т. к. хочу поднять версию базы, делаем миграцию через дамп.

docker exec lychee_db \
  mysqldump \
  -u root \
  -p'PASSWORD' \
  --single-transaction \
  lychee > /lychee/lychee.sql

Переносим всё другой сервер, восстанавливаем.

APP_KEY

В Lychee 7 обязателен `APP_KEY`. Без него контейнер завершается с ошибкой:

ERROR: APP_KEY is not set

Ключ можно сгенерировать:

echo "base64:$(openssl rand -base64 32)"

и передать контейнеру:

environment:
  APP_KEY: "base64:..."

Восстановление базы

docker compose up -d lychee_db

Восстанавливаем дамм.

docker exec -i lychee_db \
  mariadb \
  -u root \
  -p'PASSWORD' \
  lychee <lychee.sql

В MariaDB 11 используется клиент `mariadb`, а не старое имя `mysql`.

Пересчёт статистики

После успешного запуска Lychee 7 стоит пересчитать размеры альбомов и thumbnails

docker exec -it lychee php artisan lychee:recompute-album-sizes

и статистику альбомов:

docker exec -it lychee php artisan lychee:recompute-album-stats

Reverse proxy

После миграции при работе через Nginx возникала плавающая 502, причём выглядела она интересно — на одном и том же ПК веб-морда могла открывать в одном браузере, и не открывать в другом. В логах:

upstream sent too big header while reading response header from upstream

Проблема решилась увеличением proxy buffers:

Эгея. Хроники обновления.

Когда-то, в далёкие времена ковида и окончательного огосударствления ВК, посетила меня идея поднять свой бложик на Aegea. Поднимал его я на актуальном тогда Proxmox 5, ещё ого-го как живом CentOS 7 в LXC. Внутри была, страшно сказать, MariaDB 5 и несвежий апачик. Утекло с тех лет много воды: контейнер несколько раз менял хостовый Proxmox, но внутрянку я не трогал.

И тут зачесались руки привести историческую инфраструктуру в CI-ный вид: плейбук там, плейбук тут.

База — Debian 13, обновление с миграцией на свежую версию движка, потому что с 2020 года Aegea я обновлял всего один раз.

Вообще, это заметка должна была быть одой LLM и нытьём на тему того, что нейросети заменят админодевопсов нафиг.

И, в общем и целом, я был в восторге. Написав некоторую длинную портянку текста о том, что, как и почему, я получил длинный плейбук, который, без шуток, выполнился с первого захода. И это с учётом того, что исходный сервер настраивал админ с сильно меньшим пониманием жизни и профессии.

Отрефлексировать я это отрефлексировал тем, что ТЗ было составлено с кучей ограничений, которые человек без опыта ковыряния во всём этом просто не сформулировал бы. Машине скормили хороший запрос — машина выдала хороший результат. Плейбук был запущен, и через пару минут я получил рабочий блог.

Но рефлексия не удалась.

При попытке загрузить картинку в новый пост ловлю: «не удалось зарегистрировать загруженный файл».
В nginx access log:

POST /@ajax/file-upload/?entity=note&entity-id=247 HTTP/1.1" 200

При этом в /var/www/blog/pictures появлялись временные файлы:

-rw------- 1 www-data www-data 0 upload-XXXXXX

Очевидное: место, права, лимиты на аплоад php, просто загрузку — проверил. PHP корректно получал файл:
Движок в фришной версии обфусцирован, разбираться в коде — неблагодарное дело — мы холопоадмины, наше дело логи читать. Достаём BFG.

strace -ff $(ps aux | awk '/php-fpm: pool www/ && !/awk/ {printf "-p %s ", $2}') -o /tmp/egeya-upload.strace

Проблема раз:

rename("/tmp/phpXXXX", "/var/www/blog/pictures/upload-XXXX") = -1 EXDEV

Ошибка:

EXDEV (Invalid cross-device link)

означает попытку `rename()` между разными файловыми системами.

Смотрю на вывод df -T в исходной системе, и в target — и понимаю, что Debian (не)смог. /tmp теперь не реальный каталог, а временная фс tmpfs в памяти

Схема проблемы:
/tmp
|
| tmpfs
|
X rename()
|
/var/www/blog/pictures
|
| root filesystem

PHP создавал временный upload-файл в /tmp.
Эгея использовала move_uploaded_file(), который внутри PHP может выполнить быстрый rename().
Но rename(), как оказалось, между разными файловыми системами невозможен.
Бахнул отдельный временный каталог на той же файловой системе, где и бложик.

mkdir -p /var/www/blog/tmp
chown www-data:www-data /var/www/blog/tmp
chmod 700 /var/www/blog/tmp

В PHP-FPM :

upload_tmp_dir = /var/www/blog/tmp

После перезапуска:

systemctl restart php8.2-fpm

цепочка стала:
/var/www/blog/tmp/phpXXXX
|
| rename()
v
/var/www/blog/pictures/upload-XXXX
Ошибка EXDEV исчезла — но аплоад не заработал.
Достаём BFG второй раз.

strace -ff $(ps aux | awk '/php-fpm: pool www/ && !/awk/ {printf "-p %s ", $2}') -o /tmp/egeya-upload.strace

Видим, что Эгея хочет поделиться тайнами мироздания в лог, но не может. Чиним и это.

touch /var/www/blog/user/logs/main.log

Повторяем аплоад. В логе:

Process image: Done
Register upload: <, , add, Array>
Ajax file upload: couldn’t register upload

Явно не по фэншую, не хватает параметров. Смотрим консоль отладки. Должны быть entity и entity-id
Смотрим в nginx. Конфиг нагенерила LLM по мотивам того, что было в сети — и он был рабочий...формально.

location / {
    log_not_found off;
    try_files $uri $uri/ /index.php?go=$uri;
}

Запрос /@ajax/file-upload/?entity=note&entity-id=247 после try_files превращался в /index.php?go=/@ajax/file-upload/. Параметры говорили «Мұнда параметрлер жоқ қой, иттер»
Меняем чудо-LLM на рабочее:

location / {
    log_not_found off;
    rewrite ^(.*)$ /index.php?go=$1 last;
}

Смысл изменения:
try_files при внутреннем перенаправлении формирует новый URI и может потерять исходную строку параметров.
rewrite ... last выполняет внутренний rewrite с сохранением исходных GET-параметров. Рестартуем Nginx.

Бинго!

Социалочка

Намедни закинул обрезанную версию обзора на Cost of Hope в профильное хранилище дядюшки Габена. Мой поток сознания не то, чтобы сильно уникален и не единичен даже для cyrillic сегмента — на основной проект всего 107k+ отзывов, на DLC — под две.

И тем необычнее в рамках понятных грустных обстоятельств и реалий года 2026 видеть на почте:

Стоит ребятам отдать должное — следят за комьюнити, даже в известных обстоятельствах. Пусть даже и ответ логичный «мы делаем то, что делаем, потому что продаётся».
Дякую, приємно.

Ранее Ctrl + ↓