[2026-11-01 12:07:53] syncthing: merge conflict — committed markers
This commit is contained in:
commit
839616ec1b
51 files changed
+8644
-129
No files matched your search
@@ -0,0 +1,155 @@
|
||||
В жизни – так мало приятных вещей:
|
||||
|
||||
Миска горячих наваристых щей,
|
||||
|
||||
Писать с балкона на разных людей,
|
||||
|
||||
Выебать пару красивых блядей,
|
||||
|
||||
Всё же – проснуться в похмелии жутком,
|
||||
|
||||
Шубы собольи дарить проституткам,
|
||||
|
||||
Пиздить в столовой кефир и котлеты,
|
||||
|
||||
В Крым добираться втроём без билетов,
|
||||
|
||||
Робко глядеть на красоток журнальных,
|
||||
|
||||
Секс вагинальный, а также анальный,
|
||||
|
||||
По голубям пиздануть из рогатки,
|
||||
|
||||
Маршировать с автоматом и в скатке,
|
||||
|
||||
К другу ввалиться в четыре утра,
|
||||
|
||||
Палкой картошку катить из костра,
|
||||
|
||||
|
||||
|
||||
Бегать по лесу с трёхцветным фонариком,
|
||||
|
||||
Лопать девчонкам по праздникам шарики,
|
||||
|
||||
В долг у дружка взять три тыщи надолго,
|
||||
|
||||
Вдруг без причины уехать на Волгу,
|
||||
|
||||
Пить самогонку, спешить на свидание,
|
||||
|
||||
Списывать перед английским задание,
|
||||
|
||||
Мордой в салате встречать Новый Год,
|
||||
|
||||
В баню ходить «для богатых господ»,
|
||||
|
||||
Долго купаться в пруду на баллоне,
|
||||
|
||||
Спать в таиландском массажном салоне,
|
||||
|
||||
Физику в мае опять прогулять,
|
||||
|
||||
В лёт по фламинго дуплетом стрелять,
|
||||
|
||||
Вспомнить разлуку с улыбкою странной,
|
||||
|
||||
Фильм посмотреть про любовь иностранный,
|
||||
|
||||
Влезть выше всех на кривую сосну,
|
||||
|
||||
Сдуру влюбиться в чужую жену,
|
||||
|
||||
Марки колоний в альбом собирать,
|
||||
|
||||
Ночью в учительской тайно насрать,
|
||||
|
||||
В Брисбене слопать яишню с беконом,
|
||||
|
||||
Штамп получить о разводе законном,
|
||||
|
||||
Снизу девчонкам смотреть на трусы,
|
||||
|
||||
Жарить с горошком кусок колбасы,
|
||||
|
||||
Песни в подъезде орать под гитару,
|
||||
|
||||
Слушать Deep Purple, Битлов и «Шизгару»,
|
||||
|
||||
Жить на Гоа, но болеть за «Зенит»,
|
||||
|
||||
Видеть, что хуй твой как дикий стоит,
|
||||
|
||||
Чтоб в день рожденья купили «конструктор»,
|
||||
|
||||
Чтоб парашют не запутал инструктор,
|
||||
|
||||
Сделать из трубки стреляющий пестик,
|
||||
|
||||
Вдуть среди свадьбы случайной невесте,
|
||||
|
||||
Прыгнуть на зонтике в речку с моста,
|
||||
|
||||
Встретить в Париже живого Хвоста,
|
||||
|
||||
Кружку налить в пивняке-автомате,
|
||||
|
||||
Вскрыть штык-ножом банку кильки в томате,
|
||||
|
||||
Выскочить пьяным в слезах на мороз,
|
||||
|
||||
Вновь появиться с охапкою роз,
|
||||
|
||||
Порно смотреть и ебаться жестоко,
|
||||
|
||||
Выпить с ребятами из «Кровостока»,
|
||||
|
||||
Спать с незнакомкой под вздохи Том-Уэйтса,
|
||||
|
||||
Опохмелиться на всё, что имеется,
|
||||
|
||||
Вылечить триппер и шляться по Ницце,
|
||||
|
||||
В сером халате съебать из больницы,
|
||||
|
||||
Ночью шампанское пить в Коктебеле,
|
||||
|
||||
Петь под пластинку Вано Мурадели,
|
||||
|
||||
Смыться с компанией из ресторана,
|
||||
|
||||
Сдёрнуть за сутки четыре стоп-крана,
|
||||
|
||||
Спрыгнуть в цветы на степном полустанке,
|
||||
|
||||
Джинсы купить у седой итальянки,
|
||||
|
||||
Ехать куда-то пять дней автостопом,
|
||||
|
||||
Выть под Майлс Дэвиса злые синкопы,
|
||||
|
||||
«Хуй» на машине гвоздём написать,
|
||||
|
||||
Двух каратистов на танцах не ссать,
|
||||
|
||||
Водку закусывать спинкой от тюльки,
|
||||
|
||||
В дождь, в три утра дозвониться до Юльки,
|
||||
|
||||
Дёрнуть из речки крючок с карасём,
|
||||
|
||||
|
||||
|
||||
Вот, к сожалению, в общем, и всё,
|
||||
|
||||
Что привлекает по жизни меня,
|
||||
|
||||
Всё остальное – поверьте – хуйня,
|
||||
|
||||
Жизнь состоит из прыщей и клещей,
|
||||
|
||||
В жизни так мало хороших вещей!
|
||||
|
||||
|
||||
|
||||
(с) orlusha
|
||||
@@ -0,0 +1,241 @@
|
||||
- Батя, ты? - голос у Буратино скрипел, как потертое седло.
|
||||
|
||||
- Открывай, свои, - нетрезво пробухтел кто-то.
|
||||
|
||||
- Свои в это время дома сидят. Пароль говори!
|
||||
|
||||
- Не все коту матрица!
|
||||
|
||||
- Так это ты, клубничный медвежонок! - деревянный мальчик открыл дверь.
|
||||
|
||||
- Так бы сразу и сказал. Когда бабулешки вернешь?
|
||||
|
||||
- Не нуди, Пиноккио, - Винни-пух был почему-то мрачен. - Есть что накатить?
|
||||
|
||||
- На вот полбанки табуретовки, для себя берег, на опохмелку.
|
||||
|
||||
|
||||
|
||||
- Даже немножечко, чайная ложечка, это уже хорошо! - задвинул любимый тост Пух и замахнул.
|
||||
|
||||
- А где же твой свиноподобный корефан? - поинтересовался Буратино.
|
||||
|
||||
- В этом-то вся и проблема, братуха. Свинья - она и в Африке свинья. Вот ты как к измене относишься?
|
||||
|
||||
- Да мы третью неделю на ней сидим. Самоделкина закрыли на днях. Насмотрелся "Бойцовского клуба" и замутил выпуск пластита в домашних условиях. Нас всех в отдел тягают сейчас...
|
||||
|
||||
- Ты не догоняешь, дубовенький ты мой - Это когда друг уходит, понимаешь?
|
||||
|
||||
- Уходит? Ну так догони его и пристрели, как собаку!
|
||||
|
||||
- Я че, по-твоему, дятел Вуди Вудпеккер? Нет его нигде, а то давно бы порешил.
|
||||
|
||||
- У Белоснежки был?
|
||||
|
||||
- Да уж конечно, - Пух косел. - Опять групповой секс с элементами садо-мазо и некрофилии и ничего нового. Тебя, кстати, приглашали...
|
||||
|
||||
- Я свой гвоздь не на помойке нашел, - отмахнулся Буратино, - а пятачка искать вместе будем. Аллигатор, па-а-дъем!!
|
||||
|
||||
Из-под лестницы выпал сине-зеленый Гена.
|
||||
|
||||
- Хелло, лох-несский монстр! - поприветствовал его Винни-Пух.
|
||||
|
||||
- Ты кого лохом назвал, гризли поролоновый? - взгляд крокодила был мутен, как воды Нила, откуда его выловили когда-то совсем крошечным крокодиленком. - Давайте быстро водки мне!
|
||||
|
||||
- Вот оно, лицо алкоголизма. - Буратино криво усмехнулся, затянувшись беломориной. - Накати, змей ты наш зеленый, да собирайся, по дороге расклад узнаешь...
|
||||
|
||||
...До Простоквашина добирались на трамвае. Пух и деревяшка держались молодцом, как будто трезвые, чего никак нельзя было сказать о Зеленой бестии, как его в такие моменты называли друзья.
|
||||
|
||||
- Голубой вагон бежит, качается! - затянул было Гена с глупой ухмылкой.
|
||||
|
||||
- Захлопни сундук, Годзилла, пока тебя тут голубым не сделали! - прошипел медведь.
|
||||
|
||||
- В голове опилки, да, да, да! - не унимался крокодил.
|
||||
|
||||
- Залепи дуло, Паваротти хренов!
|
||||
|
||||
- Приехали, выходим. - Буратино помог рептилии сойти с помощью маваши-гири...
|
||||
|
||||
- Кто там, в натуре? - галчонок, как всегда, тусовался у двери, осуществляя пропускной режим.
|
||||
|
||||
- Кто-кто. Почтальон Печкин, принес пол-литра для вашего мальчика! -съязвил Винни, которого слегка укачало в трамвае.
|
||||
|
||||
- А вот не надо ля-ля! Я уже давно как туточки! - Печкин, появившийся в проеме двери, выглядел оригинально. Кружевные дамские панталоны и ковбойская шляпа - немного неожиданно для сельского почтальона.
|
||||
|
||||
- А ты, я смотрю, все марочками увлекаешься, - хихикнул понимающе Буратино.
|
||||
|
||||
- Ра-бо-та у нас та-кая! - фальшиво пропел почтальон и рухнул, как подрубленный, строго в направлении севера. Внутренний компас его еще никогда не подводил. Перешагнув через безжизненное тело, герои вошли внутрь.
|
||||
|
||||
- Матроскин! Матроскин, мазафака!!! Где ты, отзовись!
|
||||
|
||||
- Да здесь я, под диван закатился. Ништяк, что вы приехали, пацаны! Теперь мы втрое больше сена для моей коровки заготовим!
|
||||
|
||||
- Мы по делу, - буркнул Винни. - Ты Пятачка не видел?
|
||||
|
||||
- Я ему давеча брякнул, что свиней хочу развести, так он и не появляется. Может, он не догнал чего? А в чем рамс?
|
||||
|
||||
- Да покрылся, гад, а куда - неизвестно. Мы это, Шарика возьмем с собой, он тут нюхом исключительным хвалился. С охотничьей собакой мы его влет возьмем.
|
||||
|
||||
- Ой, а он тоже куда-то запропастился, - стыдливо отвел глаза в сторону Матроскин. - Шашлычка не хотите?
|
||||
|
||||
- А самогоныч к шашлыкам есть? - встрял Гена. - Спрашиваешь...
|
||||
|
||||
|
||||
|
||||
На малину к Карабасу-Барабасу Матроскин, Буратино и Винни-Пух поехали уже без крокодила. Зеленый барагоз перекрылся и был оставлен спать валетом с Печкиным на раскладушке. Банда Барабаса как раз обмывала успешную премьеру, состоявшуюся в Местном ювелирном магазине. Сидевшие за столом Дуремар, Бармалей, Весельчак У и другие члены преступной группировки не удивились неожиданному визиту подвыпившей братвы.
|
||||
|
||||
|
||||
|
||||
- Ну а где же наш хороший, наш любимый крокодил? - поинтересовался Шер-Хан.
|
||||
|
||||
- Он с Тотошей и Кокошей с нами по делу проходил, - пояснил он тем, кто был не при делах.
|
||||
|
||||
- Нужен он тебе больно, шурин? Это ж катастрофа ходячая, - встрял Матроскин. - Скажите лучше, вы нашего поросенка Порки не видали?
|
||||
|
||||
- Поросенок тут и не отсвечивал! А вот этого молодого человека, деревянного по жизни, я сейчас, в натуре, на растопку пущу! - с ходу забуровил Барабас.
|
||||
|
||||
- Кто старое помянет, тот лох! - заявил Буратино. - А если тебя этот золотой ключик так парит, то я тебе за него бабками отдам.
|
||||
|
||||
- Да у меня такими ключами весь гараж завален! Тут дело в уважении. А ты меня прокинул, как фраера позорного. Где мой кукольный театр?
|
||||
|
||||
- Слушай, Карабас. Ты не прав. Я тебя уважаю, но и ты меня пойми. Не я твоих шестерок разогнал, ты их сам не удержал. А эту истеричку Мальвину можешь хоть завтра забирать, она у меня уже в почках сидит. И вообще, давай на базар серьезный позже пойдем... У нас пацан пропал, а ты мужчина реальный, со связями. К кому еще пойти, как не к тебе?
|
||||
|
||||
- Ладно, - поостыл малость Карабас. - Милости прошу к нашему шалашу. Балдейте пока, а я прозвон по точкам совершу.
|
||||
|
||||
|
||||
|
||||
Пока гопка расслаблялась, Борода срастил все темы.
|
||||
|
||||
|
||||
|
||||
- Нет нигде вашего свинопотама! Но есть вам смысл навестить трех подсвинков. Может, они в курсах...
|
||||
|
||||
- Ну, на дорожку. На святое дело идем, товарища из беды выручать, - двинул телегу Винни-Пух. Накатив все вместе по двести, троица направилась к выходу.
|
||||
|
||||
- Кто такие?- хрюкнул Ниф-Ниф в ответ на стук в дверь.
|
||||
|
||||
- Это мы... мы... мылиция, - промычал в ответ не совсем адекватный кот.
|
||||
|
||||
- А дома никого нет!
|
||||
|
||||
- А кто говорит?
|
||||
|
||||
- Вы говорите с автоответчиком. Просьба оставить свое сообщение после звукового сигнала. Хрю-ю-ю, хрю-ю-ю...
|
||||
|
||||
- Слушай, ты, автоминетчик, че ты тут цирк устроил. Это я, Винни, открывай!
|
||||
|
||||
|
||||
|
||||
Дверь открылась. Посреди комнаты валялся связанный волк - его вид очень развеселил друзей.
|
||||
|
||||
|
||||
|
||||
- За что вы его так?
|
||||
|
||||
- Посягал на частную собственность, - заявил Нуф-Нуф.
|
||||
|
||||
- Гражданин Волк, за порчу недвижимости...
|
||||
|
||||
- И Красной Шапочки! - закричала из кровати Красная Шапочка.
|
||||
|
||||
- ...и Красной Шапочки, - продолжил Нуф-Нуф, - вы приговариваетесь к съедению! Ха-ха-ха!!! Видел бы нас сейчас Учитель, Ганнибал Лектор, бог свиней-волкоедов!
|
||||
|
||||
- Я исправлюсь! - истошно завопил Волк, но его никто не слушал.
|
||||
|
||||
Наф-наф сосредоточенно натачивал тесак мясника, похрюкивая себе под нос "Нам не страшен серый волк, серый волк, серый волк...".
|
||||
|
||||
- Наф-Наф, брателло, вы Пятачка не видели?
|
||||
|
||||
- Я с этим выродком не общаюсь. Он мне вообще не родной. Слышь, Матроскин, ты волчатину готовить умеешь?
|
||||
|
||||
- Не-а, только собачатину, - кот покраснел.
|
||||
|
||||
- Какая разница - волчатина, собачатина... Тот же болт, только в левой руке.
|
||||
|
||||
- Не, в другой раз. Мы Пятачка ищем. Из угла раздалось жалобное шипение.
|
||||
|
||||
- Я злой и страшный серый волк, я в поросятах знаю толк...
|
||||
|
||||
- Серьезно что ли? - ухмыльнулся Наф-Наф.
|
||||
|
||||
- Говори, что про Пятачка знаешь, - встрепенулся Винни.
|
||||
|
||||
- А ВОТ ЧТО!!! - зарычал яростно волк, разрывая наручники. - Умрите! Умрите, грязные свиньи!!!
|
||||
|
||||
- Делаем ноги, пацаны, - шустро среагировал Буратино, - Пятачка здесь нет!
|
||||
|
||||
|
||||
|
||||
Перевести дух удалось лишь на крыше, у домика, где жил Карлсон. У того было не заперто. Карлсон и Чебурашка, как ни в чем не бывало, резались в очко на спине проигравшегося в пух и прах Малыша.
|
||||
|
||||
Протрезвевшие пятачкоискатели своим появлением нарушили мирный ход игры.
|
||||
|
||||
- Здорово, бродяги! Что, пришли к лучшему в мире Карлсону? А почему без подарков? А ты, шкура плюшевая, кстати, должен мне три банки меда.
|
||||
|
||||
- С какого это?..
|
||||
|
||||
- А с такого! Типа, не помнишь, как ты со мной спорил на три банки меда, что я не съем три банки меда? Проспорил, гони. Или уматывай отсюда.
|
||||
|
||||
- Потом разберетесь. Карлсон, к тебе поросенок не забегал?
|
||||
|
||||
- Который из них?
|
||||
|
||||
- Да тут один и остался, да и то теоретически - Пятачок.
|
||||
|
||||
- А остальных что, Волк сожрал? - прикололся Карлсон.
|
||||
|
||||
- Тут ты тупо угадал, Пропеллерхэд! И Красную Шапочку тоже!
|
||||
|
||||
- О, Красная Шапочка, любовь моя! - зарыдал Чебурашка. - А Гены, Гены там не было?
|
||||
|
||||
- Твой сперматозавр сам кого угодно сожрет - не прокормишь. И где его искать, мы знаем, а вот куда Пятачила делся - вопрос! Давай без байды, видел его или нет?
|
||||
|
||||
- А ты видел на входе табличку "Склад потерянных свиней"? - заорал Карлсон.
|
||||
|
||||
- После того как это свиномордие скинуло мне под видом шарика дырявый презик, я и сам его ищу!
|
||||
|
||||
- Может он съел чего? - наивно вклинился в разговор Малыш.
|
||||
|
||||
- Ты же сам, Винни, его грибами давеча кормил...
|
||||
|
||||
|
||||
|
||||
В лесу было накурено. Утомленные поисками Пятачка, кореша уныло брели по дороге, вымощенной желтым кирпичом. Далеко-далеко на луну завывал людоед.
|
||||
|
||||
- А может это он его... Того... этого?
|
||||
|
||||
- Так он и не скулил бы тогда, как побитая шлюха. Что делать-то будем?
|
||||
|
||||
- А че делать? Бухать будем, - брякнул усталый Винни-Пух.
|
||||
|
||||
- Пойдем ко мне, братва. Меня мама медовушкой подогрела...
|
||||
|
||||
- Ну, помянем раба божьего Пятачка. Славный был парень, хоть и свинья, - задвинул Буратино.
|
||||
|
||||
- А я его частенько поколачивал, - смахнул скупую слезинку Пух.
|
||||
|
||||
- Ты бросил меня, ты бросил меня, - затянул Матроскин и все подхватили.
|
||||
|
||||
- Когда ты ушел, я осталась одна!!!
|
||||
|
||||
- Сидим как-то по-сиротски, - издалека начал Буратино.
|
||||
|
||||
- Пух, у тебя, кроме сечки, нет никакой закуси? А то она мне еще с армии не лезет! Когда служил дуболомом у Урфина Джюса - только ею и кормили.
|
||||
|
||||
- Сейчас гляну чего-нибудь в подполе, - приподнялся нетвердо Пух.
|
||||
|
||||
- Где-то там Пятачок полбатона Докторской закурковал. Ему она уже ни к чему. Медвежонок открыл люк и спустился в подвал.
|
||||
|
||||
- Фу, как здесь воняет! Босота, посветите-ка мне, я, кажется, во что-то вляпался! Буратино просунул вниз руку с зажженной свечой. Взгляду нетрезвого Винни-Пуха предстало душераздирающее зрелище. В луже собственной Блевотины возлежал Пятачок, собственной персоной. Он сжимал в зубах огрызок недоеденной Докторской и тихо повизгивал во сне, дергая ножкой.
|
||||
|
||||
- Пятачок! Пацаны, это же Пятачок! - радостно заорал Винни. - Ты живой, дружище!!!
|
||||
|
||||
- Нет, мертвый, - прохрипел поросенок, сдувая прилипший к щеке бычок. – В глаза не свети, придурок.
|
||||
|
||||
Извлеченный на свет Пятачок первым делом потребовал водки, а потом Поведал свою грустную историю.
|
||||
|
||||
- Да че тут рассказывать-то. Лезу я, значит, за колбасой. А тут, гляжу, под лестницей банка. Помнишь, Винни, мы брагу на опилках ставили?
|
||||
|
||||
- А я думал, мы ее выпили давно. Брага... очень уж хитрый предмет.
|
||||
|
||||
- И очень жестокий, - добавил Пятачок. - Помню, решил попробовать... а тут и вы пришли. Гулянка продолжилась с новой силой. Теперь уже за здравие воскресшего из мертвых. Под стол попадали только к утру...
|
||||
@@ -0,0 +1,325 @@
|
||||
Есть мнение, что цивилизация развивается циклически, т.е. то, о чём говорят сейчас,
|
||||
|
||||
|
||||
|
||||
обсуждалось и раньше, и ещё раньше, и много раньше того времени. Понятное дело, что в
|
||||
|
||||
|
||||
|
||||
настоящее время способов получить информацию гораздо больше, чем, скажем, в Средние
|
||||
|
||||
|
||||
|
||||
Века. Если вспомнить о том, что основные новости люди узнавали в то время на ярмарках,
|
||||
|
||||
|
||||
|
||||
то это можно представить так:
|
||||
|
||||
средневековый город, рыночная площадь, толпа народа, на высоком помосте стоит
|
||||
|
||||
|
||||
|
||||
глашатай. Часы на городской ратуше отбивают сколько-то там времени, глашатай трубит в
|
||||
|
||||
|
||||
|
||||
рог, разворачивает свиток и громким голосом объявляет:
|
||||
|
||||
- почтенная публика, прошу минуту вашего внимания! В эфире еженедельная
|
||||
|
||||
|
||||
|
||||
информационно-аналитическая программа "Вестник Средневековья":
|
||||
|
||||
|
||||
|
||||
новости высоких технологий: на ярмарке в Ганновере было представлено новое поколение
|
||||
|
||||
|
||||
|
||||
абаков - счёты. Данная модель отличается более дружелюбным интерфейсом. Кроме того, на
|
||||
|
||||
|
||||
|
||||
счётах можно применять программное обеспечение с открытым кодом - арабские цифры.
|
||||
|
||||
|
||||
|
||||
Вообще, аналитики прогнозируют снижение рыночной доли, занимаемой римскими цифрами.
|
||||
|
||||
В тоже время интересная ситуация складывается и с монополизмом в области алфавита - к
|
||||
|
||||
|
||||
|
||||
латинице уже вышло столько локализаций, что компания-разработчик просто не в состоянии
|
||||
|
||||
|
||||
|
||||
оперативно отслеживать все изменения и выпускать новые манускрипты с правилами письма
|
||||
|
||||
|
||||
|
||||
и чтения. Растёт влияние кириллицы, арабской вязи и иероглифического письма. Правда, с
|
||||
|
||||
|
||||
|
||||
последним интересный момент - покуда компания-разработчик не решит проблему с
|
||||
|
||||
|
||||
|
||||
кодировкой, особой популярности данного вида письма на западном рынке ожидать не
|
||||
|
||||
|
||||
|
||||
приходится. Тем не менее, компания активно захватывает соседние ниши на рынке - в
|
||||
|
||||
|
||||
|
||||
частности, нишу, связанную со средствами хранения данных. Бумага, столь интенсивно
|
||||
|
||||
|
||||
|
||||
продвигаемая в качестве заменителя пергамента, рассчитана на потребителя с небольшим
|
||||
|
||||
|
||||
|
||||
доходом. На международной выставке-ярмарке "Шёлковый Путь" было представлено
|
||||
|
||||
|
||||
|
||||
оригинальное решение в области хранения данных - книга в переплёте. Это ещё один удар
|
||||
|
||||
|
||||
|
||||
по производителям пергамента.
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
новинки связи: на последней ярмарке в Лионе была представлена новая порода почтовых
|
||||
|
||||
|
||||
|
||||
голубей. Эту породу от прочих конкурентов выгодно отличают стильная белая тушка,
|
||||
|
||||
|
||||
|
||||
изящные крылья, точёные лапки, блестящие глаза и потрясающие хвостовые перья. Голуби в
|
||||
|
||||
|
||||
|
||||
современном мире - это идеальный способ для отправки коротких текстовых сообщений.
|
||||
|
||||
|
||||
|
||||
Очевидно, что время посыльных и гонцов безвозвратно уходит в прошлое.
|
||||
|
||||
"Голуби connecting people". Спрашивайте в лучших голубятнях вашего графства.
|
||||
|
||||
|
||||
|
||||
новости транспорта: во время последнего крестового похода на Иерусалим делегация
|
||||
|
||||
|
||||
|
||||
нашего княжества посетила крупный региональный конный салон. Особый ажиотаж наблюдался
|
||||
|
||||
|
||||
|
||||
на стенде арабских скакунов. Как было указано в пресс-релизе, новейшая модель в
|
||||
|
||||
|
||||
|
||||
базовой комплектации (сбруя, попона, седло) стоит полторы сотни золотых.
|
||||
|
||||
|
||||
|
||||
Дополнительный пакет (легкосплавные подковы, тюнинговая уздечка, стрижка гривы и
|
||||
|
||||
|
||||
|
||||
хвоста) обойдётся ещё в сумму порядка 20-30 золотых. Кони этой породы отличаются
|
||||
|
||||
|
||||
|
||||
большим запасом пробега и низким расходом топлива - всего стог сена и мешок овса на
|
||||
|
||||
|
||||
|
||||
неделю эксплуатации. Ведутся переговоры о поставке крупной партии скакунов на
|
||||
|
||||
|
||||
|
||||
европейский рынок.
|
||||
|
||||
|
||||
|
||||
обзор рынка недвижимости: стоимость участков под застройку в районе "Стоунхендж"
|
||||
|
||||
|
||||
|
||||
падает в связи с его удалённостью от городской инфраструктуры. Резко подорожали
|
||||
|
||||
|
||||
|
||||
земельные участки на восточной оконечности о. Сите в Париже - по слухам, там
|
||||
|
||||
|
||||
|
||||
начинается строительство современного культурного центра с большим концертным залом,
|
||||
|
||||
|
||||
|
||||
галереей современного искусства и обширной библиотекой.
|
||||
|
||||
Средняя цена предложения замковой недвижимости такова: в Болонии за пятибашенный замок
|
||||
|
||||
|
||||
|
||||
просят 1000-2000 золотых за акр, в Вестфалии и Лотарингии цена за акр трёхбашенного
|
||||
|
||||
|
||||
|
||||
замка составляет порядка 800-900 золотых, двухбашенного - 350 золотых. Элитные
|
||||
|
||||
|
||||
|
||||
многобашенные замки на берегах Темзы и Сены подскочили в цене на целых 500 золотых за
|
||||
|
||||
|
||||
|
||||
акр и в среднем стоят по 50-60 тысяч золотых за весь замковый комплекс.
|
||||
|
||||
|
||||
|
||||
новости кино: нашумевший блокбастер "Игорь против Половца" продолжает бить рекорды по
|
||||
|
||||
|
||||
|
||||
кассовым сборам. Готовится увидеть свет манускрипт по мотивам этой постановки. Если вы
|
||||
|
||||
|
||||
|
||||
хотите, чтобы у вашего менестреля был самый модный в этом сезоне полифонический
|
||||
|
||||
|
||||
|
||||
рингтон "Плач Ярославны", обращайтесь в ближайшее аббатство. Звонить в колокол
|
||||
|
||||
|
||||
|
||||
3-5-5-3. Звонок платный. О стоимости звонка узнавайте у привратника.
|
||||
|
||||
|
||||
|
||||
новости культуры: после необычайного успеха в Китае и Корее перспективная панк-группа
|
||||
|
||||
|
||||
|
||||
из Монголии "Чингиз-Хан" планирует мировое турне по странам Средней Азии и Закавказья.
|
||||
|
||||
|
||||
|
||||
В настоящее время группа находится на Руси и как передаёт отуда наш специальный
|
||||
|
||||
|
||||
|
||||
корреспондент Нестор Трублоггер, устроила прямо-таки дикий отжиг на вчерашнем концерте
|
||||
|
||||
|
||||
|
||||
в Киеве. В блиц-интервью лидер панк-группы заявил, что намерен также дать концерты в
|
||||
|
||||
|
||||
|
||||
Венгрии, Болгарии и, возможно, Северной Италии.
|
||||
|
||||
|
||||
|
||||
раздел "курьёзы": в ответ на выход книги Дж. Бруно "Таки она вертится" инквизицией был
|
||||
|
||||
|
||||
|
||||
спровоцирован флешмоб, достигший в настоящее время небывалого размаха. Жилище писателя
|
||||
|
||||
|
||||
|
||||
прямо-таки завалено анонимными булыжниками с надписью "аццкий сотона", "ниасилил" и
|
||||
|
||||
|
||||
|
||||
"фтопку". Интервью у писателя взять не удалось.
|
||||
|
||||
|
||||
|
||||
новости одной строкой: в Амстердаме легализовали шпанскую мушку.
|
||||
|
||||
|
||||
|
||||
объявление: крупной стабильно работающей компании с иностранным капиталом требуется
|
||||
|
||||
|
||||
|
||||
специалист на должность топ-феодала. Требования к кандидату: знание системы сбора
|
||||
|
||||
|
||||
|
||||
податей, опыт работы с дружинами, навыки руководства вассалами, успешные выступления
|
||||
|
||||
|
||||
|
||||
на рыцарских поединках. Проживанием (замок), служебным транспортом (лошадь),
|
||||
|
||||
|
||||
|
||||
обслуживающим персоналом (челядь), одеждой (латы, оружие) и визитками (щитами с
|
||||
|
||||
|
||||
|
||||
корпоративной символикой) обеспечиваем. Обращаться во дворец, спросить короля.
|
||||
|
||||
|
||||
|
||||
новости спорта: не так давно в товарищеском матче по хоккею на Ладожском зимнем дворце
|
||||
|
||||
|
||||
|
||||
спорта встретились сборная русичей и сборная тевтонцев. В итоге "Русичи" победили
|
||||
|
||||
|
||||
|
||||
"Тевтонцев" с разгромным счётом. На послематчевой пресс-конференции главный тренер
|
||||
|
||||
|
||||
|
||||
тевтонцев заявил, что игра показала также несостоятельность его команды и в таком виде
|
||||
|
||||
|
||||
|
||||
спорта как водное поло. "Экипировка наших игроков никуда не годится. Мы вынуждены
|
||||
|
||||
|
||||
|
||||
искать нового генерального спонсора нашей команды" - сказал в частности главный тренер
|
||||
|
||||
|
||||
|
||||
"Тевтонцев".
|
||||
|
||||
|
||||
|
||||
и в заключение о погоде: прогноз на ближайшее время мы, к сожалению, дать не в
|
||||
|
||||
|
||||
|
||||
состоянии, поскольку придворный звездочёт погиб во время последних опытов по получению
|
||||
|
||||
|
||||
|
||||
философского камня. Рекомендуем просто одеваться по сезону.
|
||||
|
||||
Оставайтесь с нами! С уважением, информационное агентство средневековых новостей.
|
||||
File diff suppressed because it is too large.
Load diff
@@ -0,0 +1,452 @@
|
||||
|
||||
Медведь, переминаясь с лапы на лапу, тревожно всматривался в кедровый бор у подножия сопки. Время от времени он дышал на стекло стереотрубы, подзывал зайца и вытирал ии объектив. Стереотрубу Мише подарили геологи, как и карабин, теодолит и кучу другого бесполезного в хозяйстве барахла. Той весной Топтыгин поднялся поздно, и, продирая глаза обходил свои владения, когда внезапно наткнулся на лагерь.
|
||||
|
||||
|
||||
|
||||
При виде медведя люди в лагере обрадовались, начали кричать, бегать, но когда тот подошел поближе, засмущались и быстро уплыли на лодке. Миша и сам был зверь застенчивый, поэтому просто перетаскал подарки в берлогу и долго разбирался, что тут к чему. Большинство приборов так и остались непонятными игрушками, но трубу Топтыгин полюбил и, прихватив с собой зайца, часто бродил по сопкам, любуясь видами.
|
||||
|
||||
|
||||
|
||||
Наконец между между стволами замелькало серое, и Хозяин Тайги облегченно вздохнул: до последнего момента он не был уверен, что Волка отпустят с заставы живым.
|
||||
|
||||
|
||||
|
||||
- Он что, всю дорогу бежал, что ли? - мяукнула Рысь.
|
||||
|
||||
|
||||
|
||||
Гигантская кошка обладала удивительно острым зрением и без всякой трубы видела ходящие ходуном бока соседушки. Багровый язык, свешенный чуть не до земли, говорил о том, что Волк действительно преодолел все двадцать километров без остановки. Наконец, Серый забрался на сопку и свалился прямо у ног Медведя.
|
||||
|
||||
|
||||
|
||||
- Все, больше не могу, - прохрипел он, - Дайте отдышаться.
|
||||
|
||||
|
||||
|
||||
И немедленно заснул. Медведь подождал пять минут, затем взял Волка за шиворот и слегка встряхнул.
|
||||
|
||||
|
||||
|
||||
- Сейчас-сейчас, еще минуточку, - пробормотал Волк, не открывая глаз.
|
||||
|
||||
- Серый, хватит придуриваться, - рявкнул Медведь.
|
||||
|
||||
- Все-все, уже проснулся, - Волк открыл глаза и протер их лапами.
|
||||
|
||||
- Так что тебе сказали? - спросил Топтыгин.
|
||||
|
||||
- Э-э-э, а можно меня на землю поставить? - робко поинтересовался Серый.
|
||||
|
||||
- А. Извини.
|
||||
|
||||
|
||||
|
||||
Волк встряхнулся и обвел собравшихся нехорошим взглядом:
|
||||
|
||||
|
||||
|
||||
- В общем, информация подтвердилась, - сказал он, - Целая бригада браконьеров, работает по заказу китайцев.
|
||||
|
||||
- И что им нужно? - нервно спросил Медведь.
|
||||
|
||||
- Ну... - помялся Волк, - Лапы медведя, уши рыси и тигриные...
|
||||
|
||||
|
||||
|
||||
Он приподнялся на задние лапы и что-то прошептал в ухо Тигру. Полосатый, обычно оранжевый, вдруг пожелтел со шкуры и очень плотно припал к земле.
|
||||
|
||||
|
||||
|
||||
- Яйца, значит, - вздохнул Медведь, - А что пограничники? Не помогут в этот раз?
|
||||
|
||||
- У них и так забот полон рот, - мрачно ответил Волк, - Косоглазые через Амур лезут - спасу нет, еле успевают отлавливать.
|
||||
|
||||
- Я бы попросил! - возмутился Заяц.
|
||||
|
||||
- Извини. Берта вот согласилась с нами поработать, у нее отпуск.
|
||||
|
||||
- Это твоя знакомая? - уточнил Медведь.
|
||||
|
||||
- Ну, почти, - Волк посмотрел в небо, - У нас через полтора месяца щенки будут. В порядке эксперимента разрешили.
|
||||
|
||||
- Понятно, - Топтигин осмотрел собравшихся, - Ну, стало быть, обороняться будем сами.
|
||||
|
||||
- Милиция велела передать, - добавил Серый, - Что искать их, если что не будут.
|
||||
|
||||
- Поня-я-ятненько, - мяукнула Рысь.
|
||||
|
||||
- Ладно, Заяц, можешь быть свободен, тебя это не касается, - приказал Хозяин Тайги.
|
||||
|
||||
- Фигу! Это мой лес! - храбро ответил Косой, - Сегодня вас, завтра им мои глаза потребуются или еще что-нибудь.
|
||||
|
||||
- Молодец, - Медведь осторожно потрепал Зайца по ушам, - Значит, план у нас будет такой...
|
||||
|
||||
|
||||
|
||||
*****
|
||||
|
||||
|
||||
|
||||
Волк и Берта неспешно трусили по тайге, уткнувшись носами в свежий след. браконьеров было семеро, и эти идиоты не нашли ничего лучше, чем, разделиться. Медведь взял на себя троих, за двоих отвечал тигр, Рыси и Волку с Бертой досталось по одному. Теперь нужно было только настигнуть своего мерзавца и наброситься на него сзади. Они гнали браконьера уже полтора часа, подбадривая его бодрым воем.
|
||||
|
||||
|
||||
|
||||
- Городской, - удовлетворенно заметил Волк, - Местный бы костер развел и за ним отсиделся.
|
||||
|
||||
- Не забывай, - нервно заметила овчарка, - У него карабин. Один раз бахнет - будешь потом свинец переваривать.
|
||||
|
||||
|
||||
|
||||
За время службы на границе Берта была ранена дважды и в таких вопросах считалась экспертом.
|
||||
|
||||
|
||||
|
||||
- Да брось, - хвастливо ответил Серый, - Он уже от страха не видит, куда бежит, еще немного...
|
||||
|
||||
- Стой, - овчарка замерла, и Волк, не успевший остановиться, проехал вперед на заднице несколько шагов.
|
||||
|
||||
- Что такое? - удивленно обернулся Волк
|
||||
|
||||
- Запах сильный, кажется он...
|
||||
|
||||
|
||||
|
||||
Над кустами медленно поднималось дуло винтовки.
|
||||
|
||||
|
||||
|
||||
- Берегись!
|
||||
|
||||
|
||||
|
||||
Берта рванулась вперед, но Серый сшиб ее плечом и кинулся в кусты сам. Раздался выстрел, короткий вой. Не помня себя от горя и ярости, овчарка бросилась в атаку, целясь туда, куда положено целиться служебной собаке...
|
||||
|
||||
|
||||
|
||||
*****
|
||||
|
||||
|
||||
|
||||
Заяц нашел Тигра посреди широкой старой гари. Могучий кот внимательно рассматривал широкую полосу распаханной и развороченной земле. Время от времени он опускал нос вниз, пытаясь принюхаться, но, вдохнув пыль и старую золу, чихал и опять усаживался на задницу. Заяц осторожно приблизился к Полосатому. Вообще-то, тигры не удостаивали косых своим вниманием, предпочитая зверей покрупнее, но кто его знает. Ополчение ополчением, а вдруг ему жрать захочется?
|
||||
|
||||
|
||||
|
||||
- Гумус, - задумчиво произнес Тигр, цепляя лапой землю.
|
||||
|
||||
- Что? - вежливо спросил заяц.
|
||||
|
||||
- Почва, плодородный слой, - все так же величественно ответил могучий зверь, - Все мы возвращаемся в гумус, давая жизнь травам, от трав кормятся благородные олени и прочие копытные, а они питают нас, мы же, когда придет срок, вернемся сюда, в гумус.
|
||||
|
||||
|
||||
|
||||
Заяц тактично помолчал. Тигров нередко пробивало на философию, Волк как-то рассказывал, что его зимой поймала одна Тигрица, и вместо того, чтобы разорвать, три часа читала выдержки из "Лунь Юй" и "Парадоксов".
|
||||
|
||||
|
||||
|
||||
- Понятно, - наконец нарушил молчание Косой, - А где браконьер?
|
||||
|
||||
- Ну... - пожал плечами Тигр, - где-то тут должен быть. Я на него стадо кабанов выгнал...
|
||||
|
||||
|
||||
|
||||
Полосатый встал и прошелся вдоль перепаханной полосы.
|
||||
|
||||
|
||||
|
||||
- В общем, похоже, он вернулся в гумус. Ладно, пойду второго искать.
|
||||
|
||||
- А что его искать? - Заяц, ждавший этого момента, надулся от гордости, - Пойдем, он тут, недалеко валяется.
|
||||
|
||||
- В каком смысле? - переспросил Тигр.
|
||||
|
||||
- Завалил я твоего второго, - чуть лопаясь от сознания собственного величия ответил Заяц.
|
||||
|
||||
- Хм-м-м, интересно, - пробормотал Тигр, - Ну, показывай.
|
||||
|
||||
|
||||
|
||||
Браконьер лежал в кустах без движения с закаченными глазами.
|
||||
|
||||
|
||||
|
||||
- Нда, действительно, - протянул Тигр, - Ладно, рассказывай, как ты его?
|
||||
|
||||
- На самом деле очень просто, - заторопился Заяц, - он идет такой, идет, а я прямо перед ним из травы как подпрыгну! Он брык - и лежит.
|
||||
|
||||
- Забавно, - позволил себе улыбнуться Тигр, - Причем, судя по запаху, еще и обделался. Ладно, оттащи куда-нибудь ружье, а я постараюсь преодолеть природную брезгливость и отнесу засранца на сборный пункт.
|
||||
|
||||
|
||||
|
||||
Заяц с трудом сдвинул винтовку с места и подумал, что, похоже, придется звать на помощь родственников. Полосатый, уже закинувший бесчувственного браконера себе на спину, внезапно обернулся.
|
||||
|
||||
|
||||
|
||||
- Заяц?
|
||||
|
||||
- Да? - Косой, пыхтя, пытался тянуть ружье за ремень.
|
||||
|
||||
- Ты молодец. Спасибо!
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
*****
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
- Ну ладно, ну перестань, - успокаивала Берта Волка.
|
||||
|
||||
- Что значит перестань? - визжал Серый, - Как это перестань? Думаешь я не видел, куда ты его кусала?
|
||||
|
||||
- Я очень испугалась, что он тебя застрелил, и сделала то, что нас учат делать, - объяснила овчарка.
|
||||
|
||||
- Вот так вот и положено? - кипятился Волк, - Думаешь мне приятно, что моя женщина хватала пастью за...
|
||||
|
||||
- Ну хватит! - гавкнула Берта, - Все овчарки хватают именно за это! Нас так готовят!
|
||||
|
||||
|
||||
|
||||
Волк несколько притормозил и недовечиво покосился на подругу.
|
||||
|
||||
|
||||
|
||||
- Все? И кобели тоже?
|
||||
|
||||
- И кобели, - твердо ответила овчарка.
|
||||
|
||||
|
||||
|
||||
Некоторое время оба бежали молча.
|
||||
|
||||
|
||||
|
||||
- Тяжелая у вас работа, - вздохнул Волк.
|
||||
|
||||
|
||||
|
||||
Дикий, протяжый вопль разорвал тишину ночного леса. Вопль столь жуткий, что Берта прижала уши к затылку, припала на живот и тихо заскулила.
|
||||
|
||||
|
||||
|
||||
- Эт-то что было? - заикаясь спросила отважная овчарка.
|
||||
|
||||
- Это? - шерсть на загривке у Волка встала дыбом, - Я тебе скажу что это было. Это рыси трахаются, вот что это было. Ну, скотина с кисточками, мы тут жизнью рискуем, а она... Можно подумать, это наши уши им нужны! Так, пойдем разбираться.
|
||||
|
||||
|
||||
|
||||
Припадая на раненую ногу, Волк похромал туда, где в ночи раздавались душераздирающие вопли. Взобравишись на сопку, Серый заорал:
|
||||
|
||||
|
||||
|
||||
- Рыся, ты где? Вылезай, скотина, опять валерьянки обожралась? А кто за тебя браконьеров ловить будет?
|
||||
|
||||
- Ну чего ты орешь, - ответило из кустов мягким, рокочущим баритоном.
|
||||
|
||||
|
||||
|
||||
В темноте зажглись две пары зеленых глаз, и Волк попятился. Ирис, супруг Рыси, считался мужчиной серьезным, ходили слухи, что с ним даже Топтыгин иногда здоровается первым. Однако праведный гнев, помноженный на боль в поврежденной лапе, взяли верх, и Серый грозно уткнулся носом в широкую хитрую рожу с бакенбарадми.
|
||||
|
||||
|
||||
|
||||
- В то врремя как весь лес в едином поррыве боррется с угррозой, - порыкивая начал Волк, - кое кто...
|
||||
|
||||
- Да ладно тебе, Волчик, - Рыся, потягиваясь, вышла из кустов и встала рядом с мужем.
|
||||
|
||||
- Привет, Берта. Мы своего браконьера обезвредили.
|
||||
|
||||
- Да? Ну и где он? - кипятился Волк.
|
||||
|
||||
- А вон, на дереве.
|
||||
|
||||
|
||||
|
||||
Ирис подошел к здоровенном кедру с абсолютно гладким стволом, и, встав на задние лапы, с душераздирающим скрежетом поточил о кору огромные когти.
|
||||
|
||||
|
||||
|
||||
- Муарррроуумуамуа, - произнес Рысь, тщательно выговаривая каждую букву.
|
||||
|
||||
|
||||
|
||||
Откуда-то из кроны донесся задушенный всхлип.
|
||||
|
||||
|
||||
|
||||
- Мы, собственно, его выследили, - объясняла Рыся Берте, - А когда он сел под деревом, занялись любовью. Он даже сапоги скинул, не говоря уж о винтовке.
|
||||
|
||||
- Пусть посидит пока, - лениво заметил Ирис, - Утром сам свалится. А ружье я пойду в болоте утоплю.
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
*****
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
Медведь сменил позицию и осторожно выглянул из-за камня. Пули цвикнули в полуметре от рыла и он откатился назад.
|
||||
|
||||
|
||||
|
||||
- Ну, скоро вы там? - прорычал Топтыгин.
|
||||
|
||||
- Сейчас все будет, Миша, - торопливо ответи енот, загоняя маленькими лапками последний патрон в обойму.
|
||||
|
||||
|
||||
|
||||
Огромные когти не давали Хозяину тайги перезаряжать карабин самому, пришлось привлечь старого знакомого. Енот пару зим пользовался топтигинской берлогой и теперь пришло время вернуть должок.
|
||||
|
||||
|
||||
|
||||
- На, держи.
|
||||
|
||||
|
||||
|
||||
Медведь подхватил карабин и, просунув коготь в спусковую скобу, выпалил в сторону кустов. В ответ прогремело несколько выстрелов, правое ухо обожгло болью.
|
||||
|
||||
|
||||
|
||||
- Миша, - осторожно сказал енот, - А у тебя в ухе дырка.
|
||||
|
||||
- Ничего, - сквозь клыки ответил Топтыгин, выпуская еще несколько пуль в сторону противника.
|
||||
|
||||
- Патронов у тебя еще на одну обойму, - добавил енот.
|
||||
|
||||
|
||||
|
||||
Медведь потер кровоточащее ухо лапой и осторожно высунулся из-за камня. Пуля ударила рядом, и осколки гранита больно посекли нос. Пора было менять позицию. Перестрелка продолжалась уже час, за это время медведь успел расстрелять большую часть оставшихся от геолгов патронов, но хуже всего было то, что вражеские пули разбили любимую стереотрубу. Вообще говоря, теперь все зависело от того, сработает ли вторая часть его гениального плана. Патроны кончались, горизонт уже засветлел, еще немного - и взойдет солнце. Топтыгин вздохнул, переполз за куст и открыл огонь. Он стрелял за свои лапы, за лапы всех медведей и медведиц, за уши рысей, за яйца тигров, за свой лес и свой Амур. Чувство собственного героизма и отважной обреченности переполнило косолапого и он громко заревел, бросая вызов браконьерам. Снова загрохотали выстрелы, вокруг падали срубленные пулями ветви.
|
||||
|
||||
|
||||
|
||||
- Врешь, не возмешь, - прохрипел Топтыгин.
|
||||
|
||||
|
||||
|
||||
- Туруру! Ла-ла-ла! Какой чудесный день! Какой чудесны пень! Кто лось - тот не олень!
|
||||
|
||||
|
||||
|
||||
Басовитый, трубящий рев раздался над лесом, сопровождаемый сучьев, ударами по чему-то мягкому и сдавленными воплями. Медведь обессиленно привалился к камню - помощь подошла вовремя.
|
||||
|
||||
|
||||
|
||||
- Это что? - осторожно спросил енот, прислушиваясь к звукам снизу, где, судя по всему, кого-то топтали ногами.
|
||||
|
||||
- Это лоси, - расслабленно ответил косолапый, - Я этих уродов отвлекал, а они бесшумно с тыла зашли.
|
||||
|
||||
|
||||
|
||||
Кому-то прописали крепкую саечку и тот же бас продолжил на мотив румынско группы, которую постоянно крутили на заставе:
|
||||
|
||||
|
||||
|
||||
- Хо-хо-хо! Как по лесу пробежал олень, озорной олень, зажигательный олень! Зацепился на бегу за пень!
|
||||
|
||||
- А... - енот собрался с духом и продолжил, - А чего это они?
|
||||
|
||||
- Понимаешь, - медведь прикладывал к простреленному уху подорожник, - У них сейчас гон. Поэтому они гонят. Постоянно. Не обращай внимания.
|
||||
|
||||
|
||||
|
||||
Из кустов вылетел огромный лось, недавно сбросивший рога.
|
||||
|
||||
|
||||
|
||||
- Ха-ха-ха! Мой добрый друг медведь! Ого-го-го! и маленький зверек с полосатой мордой!
|
||||
|
||||
- Енот, извините, - застенчиво представился Енот.
|
||||
|
||||
- Енот, уху-ху, какой великолепное, величественное, сексуально привлекательное имя! Не обращайте внимание, я гоню.
|
||||
|
||||
- Сексуально привлекательное? - робко спросил зверек у Косолапого.
|
||||
|
||||
- Не обращай внимания, он гонит, - заверил Медведь, - Нормальное имя, мужское такое, крепкое. Лось, спасибо, уж выручил так выручил.
|
||||
|
||||
- Да-да-да! Мы мужественные звери, мы должны помогать друг другу! Тем более, что им нужны были наши хвосты. У-дю-дю-дю, у-дю-дю-дю-дю, баю-баюшки баю, не ложися на краю. Там трое то ли пленных, то ли, мва-ха-ха, безвозвратных потерь. Ладно, мы поскакали, гон все-таки.
|
||||
|
||||
|
||||
|
||||
Лось большими скачками скрылся в лесу.
|
||||
|
||||
|
||||
|
||||
- Ну, брат Енот, пошли брать в плен, если осталось кого, - подытожил Медведь.
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
******
|
||||
|
||||
|
||||
|
||||
- Итак, подведем результаты, - начал Медведь.
|
||||
|
||||
|
||||
|
||||
Амур сиял на солнце, ветер гудел в кедрах, на сопке было тепло и ветренно. Среди трофеев нашлась зрительная труба и Косолапый был наверху блаженства. Партизанский отряд собрался на вершине каменной горки на том самом месте, где позавчера они получили страшное известие о браконьерах.
|
||||
|
||||
|
||||
|
||||
- Берта и Волк - один, покалечен.
|
||||
|
||||
- Жить будет, - заверил Волк.
|
||||
|
||||
- Любить - вряд ли, - оскалившись во всю пасть, добавила Берта.
|
||||
|
||||
- Тигр - один, тело не найдено, - продолжал Медведь.
|
||||
|
||||
- Эти кабаны... - досадливо поморщился Полосатый, - Впрочем, он вернулся к земле, чего еще может желать Совершенномудрый... Кому-нибудь другому.
|
||||
|
||||
- Заяц - один, целехонький. Молодец, Косой, не ожидал.
|
||||
|
||||
- Служу...
|
||||
|
||||
Донельзя гордый собой Заяц несколько секунд подыскивал, кому же он служит, затем рявкнул то, что не раз слышал от пограничных собак.
|
||||
|
||||
- Служу России!
|
||||
|
||||
|
||||
|
||||
Все на минуту замерли по сидке "смирно".
|
||||
|
||||
|
||||
|
||||
- Рыся и Ирис - один. Мертвый.
|
||||
|
||||
- Мы ни при чем, - оторвался от умывания Русь, - он сам свалился с дерева и шею свернул.
|
||||
|
||||
- Ага, после того, как ты забрался туда и поточил когти об его ветку. Ладно, проехали, искать их не будут. Ну и троих мы с лосями. Двух они затоптали совсем, а один вроде ничего. Вот его и допросим. Тигр, давай его сюда.
|
||||
|
||||
|
||||
|
||||
Еще позавчера Полосатый за такой тон вцепился бы Медведю в толстую морду, но теперь лишь хлестнул себя по бокам хвостом и притащи за шиворот зажмурившегося и тихо подвывающего мужика.
|
||||
|
||||
|
||||
|
||||
- Где-то у меня был разговорник, - кряхтя поднялся медведь, - Серый, куси его там, чтобы глаза открыл, только не до смерти...
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
*****
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
Василий Дормидонтович Плюев, браконьер со стажем, сквозь ватные штаны почувствовал мощные челюсти на своей заднице и, взвизгнув, открыл глаза. Прямо на него в упор смотрела огромная медвежья харя. Харя открыла пасть, обдав Плюева зловонием и продемонстрировав ужасные желыте клыки, и хрипло произнесла:
|
||||
|
||||
|
||||
|
||||
- Превед, кросавчег.
|
||||
|
||||
|
||||
|
||||
© И. Кошкин
|
||||
@@ -0,0 +1,127 @@
|
||||
То не ветер в поле дует, поднимая вихрем пыль.
|
||||
|
||||
Это мчится по дороге, скоростной автомобиль!
|
||||
|
||||
Под капотом - V12, в задних фонарях - ксенон,
|
||||
|
||||
И в торпеду ловко врезан видеомагнитофон.
|
||||
|
||||
|
||||
|
||||
За рулем - Геннадий Калов, знаменитость и герой
|
||||
|
||||
Все окрестные девчонки бегают за ним толпой.
|
||||
|
||||
Что ж за парень этот Гена? Отчего такой успех?
|
||||
|
||||
Гена ездит на "Калине"! От того он круче всех!
|
||||
|
||||
|
||||
|
||||
Гена едет по проспекту, музыка в окно звучит,
|
||||
|
||||
И восторженные взгляды привлекает как магнит.
|
||||
|
||||
Подъезжает к светофору, тормозят машины все.
|
||||
|
||||
Глядь: какой-то сраный Опель на соседней полосе.
|
||||
|
||||
|
||||
|
||||
"Эй!",- из Опеля чудила замахал рукой в окно -
|
||||
|
||||
"Ставлю сотню, что объеду на своей твое говно!"
|
||||
|
||||
"Да легко!" - в ответ Геннадий, только сдвинул кепку вбок,
|
||||
|
||||
"Я тебе, инопомойщик, преподам сейчас урок!"
|
||||
|
||||
|
||||
|
||||
Загорается зеленый! Рев мотора, визг и свист,
|
||||
|
||||
И... глотает дым покрышек офигевший опелист!
|
||||
|
||||
Гена добрый, хоть и быстрый. Милосерден, хоть и крут.
|
||||
|
||||
Неспеша припарковался. Ждет...проходит пять минут.
|
||||
|
||||
|
||||
|
||||
Подъезжает к Гене Опель. "Да! Респект тебе, чувак!
|
||||
|
||||
Слышал, что "Калина" едет, но не знал, что едет ТАК!!!
|
||||
|
||||
Что же, сто рублей по праву заслужил, братэлло, ты!
|
||||
|
||||
Подскажи, как оказался за рулем такой мечты?"
|
||||
|
||||
|
||||
|
||||
"Не грусти!", - сказал Геннадий, "С этим нет проблем сейчас,
|
||||
|
||||
Ведь серийно выпускает эти тачки "АвтоВАЗ".
|
||||
|
||||
"Раньше ездил на трамвае, в душном офисе сидел,
|
||||
|
||||
"Потным лохом", издеваясь, обзывал меня отдел.
|
||||
|
||||
|
||||
|
||||
Есть у них у всех машины: "Киа", "Дэу" и "Хендай".
|
||||
|
||||
На работе все на тачках. я ж, как лох, плетусь в трамвай.
|
||||
|
||||
Но однажды зырю телик, начался рекламный блок.
|
||||
|
||||
Вижу: "Город наш влюбился". Значит есть на свете Бог!
|
||||
|
||||
|
||||
|
||||
Он мои мольбы услышал, снизошел на благодать,
|
||||
|
||||
Именно такой машиной я хотел бы обладать!
|
||||
|
||||
Красота и динамичность, Управляемость, комфорт.
|
||||
|
||||
Это вам не сраный "Лансер". И не раздолбайка "Форд".
|
||||
|
||||
|
||||
|
||||
С той поры, как подменили. Потерял покой и сон,
|
||||
|
||||
Только выдали зарплату - я бегом в автосалон.
|
||||
|
||||
Там, с кредитом от "Сбербанка" я мечту свою купил,
|
||||
|
||||
Затонировал, сигналку и фаркоп установил".
|
||||
|
||||
|
||||
|
||||
И с тех пор, как прочь отъехал я от дилерских ворот,
|
||||
|
||||
В жизни у меня случился истинный переворот!
|
||||
|
||||
Подъезжаю я к конторе - собирается народ,
|
||||
|
||||
Все глазеют на "Калину", изумленье так и прет!
|
||||
|
||||
|
||||
|
||||
"Ай да Гена! Вот так тачка, молодец, мужик, респект!"
|
||||
|
||||
"Сразу видно чувство стиля и недюжий интеллект!"
|
||||
|
||||
И не вру! - но в перерыве, как минутка удалась,
|
||||
|
||||
Мне в приемной секретарша на копире отдалась."
|
||||
|
||||
|
||||
|
||||
"Мдааа..." - взохнул печально опель. "Мне бы также зажигать!
|
||||
|
||||
Все! Пошел свою помойку на базаре продавать!"
|
||||
|
||||
"А продам - куплю "Калину", так как твердо понял я:
|
||||
|
||||
Есть на свете две машины: ВАЗ и прочая фигня!"
|
||||
@@ -0,0 +1,139 @@
|
||||
1.
|
||||
- Ебать-колотить! - сказал Сталин. - Атомная бомба! Берия скромно потупил глазки. Курчатов немного запоздал, но тоже потупил и стал нервно дергать себя за бороду.
|
||||
- Это что же, взрывается? - спросил Сталин, постучав трубкой о железный бок бомбы.
|
||||
- Еще бы, товарищ Сталин! - ответил Курчатов, чувствуя, что вопрос направлен к нему. - Как… Как даст!
|
||||
- Как пизданет! - поддержал Берия.
|
||||
- Вот ведь придумали, - сказал Сталин, затягиваясь. - А что, сильно взрывается?
|
||||
- Я же говорю, товарищ Сталин - как даст!
|
||||
- Как пизданет! - снова поддержал Берия и сделал за очками страшные глаза, как бы говоря, что уж если пизданет, так в самом деле пизданет.
|
||||
- А что думает товарищ Жуков?
|
||||
Жуков вроде задремал, но вовремя очнулся.
|
||||
- Полезная вещь, - сказал маршал, звеня орденами. - Армии нужная.
|
||||
- Так, - мудро заметил Сталин. - Но надо ее испытать. Да, товарищ Ворошилов?
|
||||
- Обязательно, Коба, - поддержал железный нарком.
|
||||
- А на ком? На жидах?
|
||||
- На жидах не стоит, - смело сказал Берия. - Мы на них уже газы испытывали. Как-то нечестно получается.
|
||||
- В самом деле, в самом деле, - задумался Сталин, выпуская паровозные клубы дыма. - Обидеться могут евреи, да. Спасибо товарищу Берия за своевременное замечание. Вы, кстати, сами-то не жид будете, товарищ Берия? Сталин, как водится, удачно пошутил, и все засмеялись. Смеялись, потрясая бородами, Калинин и Курчатов, хихикал Жуков, хохотал Ворошилов, а Берия тонко улыбнулся и сказал:
|
||||
- Нет, товарищ Сталин, я мингрел.
|
||||
- Мингрел - хуй на печке грел, - еще раз удачно пошутил Сталин, и общество еще немного посмеялось. Наконец Сталин звякнул трубкой по бомбе и заметил:
|
||||
- Посмеялись - это хорошо, но мы не решили, на ком испытывать нашу атомную бомбу.
|
||||
- На японцах? - вопросительно спросил Ворошилов. - Японцев пленных у нас много, да и война еще не кончилась, новых наловим. Немцы с той войны тоже еще остались.
|
||||
- Немцы с японцами народ испытанный, - сказал Сталин. - Немцев с японцами мы уже били. Атомную же бомбу надо испытать на какой-то нации, которая нами со стороны бития еще не изучена. Правильно говорю, товарищ Курчатов?
|
||||
Хуй бы Курчатов возразил.
|
||||
|
||||
2.
|
||||
Бомбу положили в самолет и повезли бросать. В самолете сидели пилоты: трижды Герой Советского Союза товарищ Кожедуб и трижды Герой Советского Союза товарищ Покрышкин. Командиром экипажа был Кожедуб, потому что он во время войны сбил 62 самолета противника, а Покрышкин - всего 59. Поэтому Кожедуб грубо сказал Покрышкину, беседовавшему с техниками:
|
||||
- Хорош пиздеть, товарищ Покрышкин! Пора лететь бомбу бросать!
|
||||
- Извини, товарищ Кожедуб, - сказал Покрышкин и залез в самолет.
|
||||
Кожедуб повернул ключ зажигания, нажал на педаль, дернул рычаги, и краснозвездный самолет понесся по бетонной полосе секретного аэродрома.
|
||||
- Вот и улетели, - сказал Ворошилов, смахнув слезу.
|
||||
Самолет летел очень высоко. Кожедуб даже задремал от однообразия пейзажа за окном, а Покрышкин со скуки стал читать стихи:
|
||||
- Поздняя осень. Грачи улетели.
|
||||
Лес обнажился, поля опустели.
|
||||
Только не сжата полоска одна.
|
||||
Грустную думу наводит она...
|
||||
- Что за стихи читаешь, товарищ Покрышкин? - спросил, не открывая глаз, Кожедуб.
|
||||
- Товарища Сталина стихи, чьи же еще, - ответил Покрышкин.
|
||||
- Ну-ну. Ты порули пока, а я вздремну. Лететь-то далеко еще?
|
||||
- Километров тысячу пятьсот, - сказал Покрышкин, сверившись по карте.
|
||||
- Ну и подремлю. Разбуди, как бомбу кидать станешь.
|
||||
"А вот хуй тебе", - подумал Покрышкин мстительно.
|
||||
|
||||
3.
|
||||
Бомбу решили сбросить на Америку, в этом была великая идея товарища Сталина. Но он никак не мог догадываться, что Трумэн тоже построил атомную бомбу, и везут ее как раз сбросить на СССР. Даже не на СССР, а на Москву, чтобы убить товарища Сталина и Политбюро. Но Трумэн никак не мог догадываться, что товарищ Сталин и Политбюро уже уехали в большое подземное бомбоубежище, которое построили как раз в надежде, что сука Трумэн-таки решит сбросить атомную бомбу. Самолет под управлением американских пилотов "Энола Гей" летел как раз навстречу советскому самолету. "Энола Гей" назывался так потому, что на борту его летели пидарасы. Это не удивительно, потому что в Америке всегда было много пидарасов, так что найти подходящих среди летчиков не составило труда. В этом была тонкая издевка Трумэна над советским народом. Мол, прилетят американцы, сбросят бомбу и погибнет Сталин и все Политбюро. Русский народ наутро узнает об этом из газет и скажет друг другу: "Слыхали? Американцы-то товарища Сталина разбомбили и все Политбюро с ним!" - "Вот пидарасы!" А там и правда пидарасы. Вот же обидная оказия какая. В общем, пидарасы летели навстречу советскому самолету Кожедуба и Покрышкина, слушая Глена Миллера, а советские пилоты о том никак не подозревали. Курс самолетов пересекался примерно над Японией.
|
||||
|
||||
4.
|
||||
- Смотри, товарищ Кожедуб! - сказал Покрышкин, толкая командира ногой в бок. - Смотри: самолет!
|
||||
- Это еще что такое? - удивился Кожедуб, открыв глаза. В самом деле, навстречу летел большой самолет, с виду американский.
|
||||
- Это американцы летят, товарищ Кожедуб, - усилил его подозрения Покрышкин. - В нашу сторону летят! А за нами - Москва!
|
||||
- Ну-ка мы у них спросим, - принял решение Кожедуб и открыл форточку.
|
||||
- Эй, мужики! - заорал он по-американски, высунув голову. - Куда летим?
|
||||
"Так мы ему и скажем", - подумали американцы, а вслух сказали:
|
||||
- Да так. Катаемся.
|
||||
- Мы тоже, - соврал Кожедуб, а сам отметил, что под хвостом американского самолета подвешена здоровая бомба, небось атомная. Спрятавшись внутрь, он сказал Покрышкину:
|
||||
- Атомную бомбу везут, пидарасы. Звони товарищу Сталину.
|
||||
|
||||
5.
|
||||
Товарищ Сталин сидел в подземном бомбоубежище и спорил с Ворошиловым, пизданет бомба или не пизданет, когда подошел телефонист и сказал:
|
||||
- Вас, товарищ Сталин.
|
||||
Сталин строго спросил:
|
||||
- Кто?
|
||||
- Это Покрышкин, товарищ Сталин! - торопливо заговорил в трубке пилот. - Тут американцы, товарищ Сталин! Они, пидарасы, тоже бомбу везут!
|
||||
- Что же вы стали над ней в отупении? - спросил Сталин.
|
||||
- Да мы летим, товарищ Сталин! Просто задержались. Как-то нехорошо получается…
|
||||
- Мда… Ну, погодите там немного, я посоветуюсь с товарищами.
|
||||
Прикрыв ладонью трубку, Сталин сказал:
|
||||
- Покрышкин звонит. Говорит, американцы тоже бомбу везут, пидарасы.
|
||||
- Сбить, - сказал Ворошилов. - Сейчас истребительный полк поднимем.
|
||||
- Все бы тебе сбить, - сказал ворчливо Сталин. - Это и дурак может.
|
||||
Давай-ка вот что. Наберите мне по второму телефону Трумэна. А сам трубку открыл и говорит Покрышкину:
|
||||
- Вы там их задержите ненадолго, а мы решение примем.
|
||||
- Слушаюсь, товарищ Сталин!
|
||||
|
||||
6.
|
||||
Покрышкин закрыл трубку ладонью и сказал Кожедубу:
|
||||
- Пизди что хочешь, товарищ Кожедуб, а надо американский самолет задержать. Товарищ Сталин решение принимает. Кожедуб опять высунулся в форточку и говорит:
|
||||
- Эй, мужики! А что это у вас под хвостом висит?
|
||||
- Бомба, - говорят американцы.
|
||||
- А чего большая такая?
|
||||
- Да так, - отвечают американцы, - просто. А у вас?
|
||||
- И у нас тоже, - говорит Кожедуб.
|
||||
Внизу японцы собрались, думают, что такое. Стали из зенитных орудий стрелять, да все зря - самолеты-то высоко. Император Хирохито позвал камикадзе, велел им лететь и вражеские самолеты сбить. Но камикадзе, известное дело, пока ритуальные песни спели, сакэ выпили, повязки повязали… Японцы, одно слово.
|
||||
|
||||
7.
|
||||
Тем временем Сталина соединили с Трумэном.
|
||||
- Алло, мистер Трумэн?
|
||||
- Мистер Сталин? Как здоровье, как погода?
|
||||
- Вашими молитвами. Тут вот какое дело - самолетик наш один летел… над Японией…
|
||||
- Ну так на здоровье.
|
||||
- А тут ваш навстречу…
|
||||
- Так война у нас с ними.
|
||||
- А бомба зачем?
|
||||
- Так война у нас с ними! У вас тем более тоже бомба.
|
||||
Американцы-пидарасы Трумэну тоже позвонили, ясное дело.
|
||||
- Так война у нас с ними, - сказал Сталин. - Сейчас бомбу на них и бросим.
|
||||
- Так бросайте.
|
||||
- Нет уж, вы первые!
|
||||
- А вы обманете.
|
||||
- Мы?! Хоть раз обманули?!
|
||||
- Да до хуя.
|
||||
- И вы до хуя.
|
||||
- А вы коммунисты, коммунистам верить нельзя.
|
||||
- А вы буржуи, буржуям верить тоже нельзя, еще Ленин так велел.
|
||||
- Ваш Ленин мудак!
|
||||
- А ваш Линкольн жид и пидарас, а Вашингтон гондон, а Джефферсон долбоеб, а своей конституцией жопу подотрите в день независимости. И вообще, пошел на хуй. Сейчас трубку положу, - мудро сказал Сталин. На это Трумэн не нашелся что сказать и помолчал.
|
||||
- Хорошо, мистер Сталин, - сказал он. - Мы бомбу бросим. Но и вы бросайте!
|
||||
- Бросим-бросим, - заверил Сталин.
|
||||
|
||||
8.
|
||||
Американцы в самом деле бросили бомбу и полетели домой. Бомба упала и как пизданет! Наутро японцы по всей стране вышли читать газеты и говорят друг другу: "Слыхали? Американцы на Хиросиму бомбу кинули!" - "Вот пидарасы!".
|
||||
А там и правда пидарасы. Вот же обидная оказия какая, даже для японцев, даром что желторылый народец.
|
||||
А наши дальше летят над Японией.
|
||||
Тут Трумэн звонит Сталину и сердито так говорит:
|
||||
- Алло! Мистер Сталин! Это нечестно!
|
||||
- Наебал! Наебал! - обрадовался Сталин.
|
||||
- Это недостойно, - говорит Трумэн.
|
||||
- Мало ли.
|
||||
- Мы так не договаривались.
|
||||
- И хули?
|
||||
- Вы тоже обещали бомбу бросить!
|
||||
- А не бросили. Щас на вас скинем, ха-ха!
|
||||
- Тогда мы на вас другую бросим! У нас еще есть!
|
||||
- Секунду, мистер Трумэн, мне надо посоветоваться с Политбюро, - сказал Сталин, посерьезнев.
|
||||
- Очень даже может быть, что у них вторая бомба есть, - сказал Берия, выслушав.
|
||||
- А у нас разве нет?
|
||||
- Пока нет, товарищ Сталин, - испугался Курчатов. - Но скоро сделаем!
|
||||
- Поздно, - махнул рукой Сталин. - И что будем делать?
|
||||
- Давайте там и сбросим. Я ж говорил, на японцах испытаем, - предложил Ворошилов.
|
||||
- Ну ладно. Только не сразу. Пускай Трумэн там немного пообсирается, - сказал Сталин и снова связался с Трумэном.
|
||||
- Алло, мистер Трумэн? В общем, мы думаем.
|
||||
|
||||
9.
|
||||
Краснозвездный самолет кружил на Японией, вырабатывая остатки горючего. Трижды геройский экипаж доедал последнюю банку тушенки, когда с земли наконец пришло сообщение: "Хуячьте где поближе. Сталин".
|
||||
- Что там у нас? - обрадовался небритый Кожедуб, подтягивая поближе карту. - Так… Осака… Йокосука… Нагасаки…
|
||||
- Что-то у них все суки да ссаки, - брезгливо сказал Покрышкин, облизывая банку изнутри. - Какая там ссака последняя была?
|
||||
- На-га-саки, - прочел Кожедуб.
|
||||
- Вот и пизда им, - сказал Покрышкин, нажимая кнопку.
|
||||
|
||||
10.
|
||||
Так в 1945 году не случилось атомной войны между двумя великими державами.
|
||||
@@ -0,0 +1,77 @@
|
||||
От чего ты плачешь?
|
||||
|
||||
В чем причина слез?
|
||||
|
||||
Может быть тот Мальчик
|
||||
|
||||
Грусть тебе принес?
|
||||
|
||||
|
||||
|
||||
Он любил и клялся
|
||||
|
||||
В верности тебе
|
||||
|
||||
После вы расстались
|
||||
|
||||
Сами по себе..
|
||||
|
||||
|
||||
|
||||
Ты наверно веришь
|
||||
|
||||
Всем его словам..
|
||||
|
||||
Ты все это стерпишь
|
||||
|
||||
Боль уйдет к годам..
|
||||
|
||||
|
||||
|
||||
Ты уже не будешь
|
||||
|
||||
Той простою Ей.
|
||||
|
||||
Но ты не забудешь
|
||||
|
||||
Тех счастливых дней.
|
||||
|
||||
|
||||
|
||||
Расскажи котенок,
|
||||
|
||||
В чем причина слез?
|
||||
|
||||
Ты ведь не ребенок!
|
||||
|
||||
Это не всерьез!
|
||||
|
||||
|
||||
|
||||
Разбегутся мысли,
|
||||
|
||||
Повернет река..
|
||||
|
||||
Тучи, что нависли
|
||||
|
||||
Пустятся в бега..
|
||||
|
||||
|
||||
|
||||
Ты найдешь другого,
|
||||
|
||||
Вновь придет любовь..
|
||||
|
||||
Пусть и не такого,
|
||||
|
||||
Но ведь все же Вновь..
|
||||
|
||||
|
||||
|
||||
В жизни канут море
|
||||
|
||||
Миллионы грёз
|
||||
|
||||
И поймешь ты вскоре
|
||||
|
||||
В чем причина слез...
|
||||
@@ -0,0 +1,43 @@
|
||||
У толчка полоскался алкаш Алексей,
|
||||
А Вован не хотел за бухлом.
|
||||
Алексей извергал из себя пескарей,
|
||||
Нямыч ныл о бутылке с вином..
|
||||
|
||||
Алексей вдруг изрек: «Я покину толчек,
|
||||
Если ты мне наполнишь бокал!»..
|
||||
Ну а Нямыч налил до краев в свой бокал
|
||||
Тем чем только что долго блевал…
|
||||
|
||||
-Видишь, там на горе-еее..
|
||||
Возвышается дом!
|
||||
|
||||
А в нем десяток ребят..
|
||||
Заливают бухло-ом!
|
||||
|
||||
Я там помнится на-ам
|
||||
Эту дрянь покупал…
|
||||
Пошли в магазин, пошли в магазин, пошли в магазин вдвое-ем!
|
||||
|
||||
….
|
||||
|
||||
-Но Вован, в унитазе блястит блевота,
|
||||
Черный муха кружит над толчком!
|
||||
Пожалей ты меня, принеси мне бухла,
|
||||
А магАзин оставь напотом…
|
||||
|
||||
Охуел тут Вовчик и стукнул всердцах
|
||||
По глади ванны рукой..
|
||||
-Ты верно слабак!
|
||||
..И Алёша в слезах
|
||||
Продолжил плеваться едой…..
|
||||
|
||||
-Видишь, там на горе-еее..
|
||||
Возвышается дом!
|
||||
|
||||
Пошли, там купим пивка-аа
|
||||
Побухаем, споё-ом..
|
||||
|
||||
А когда надое-ест
|
||||
Побежим от ларька..
|
||||
|
||||
Блевать под забор, Блевать под забор, Блевать под забор вдвое-ем!
|
||||
@@ -0,0 +1,305 @@
|
||||
Бывает быстро и случайно,
|
||||
|
||||
Когда ее совсем не ждешь
|
||||
|
||||
Любовь нагрянет невзначай, но
|
||||
|
||||
К кому любовь – не разберешь..
|
||||
|
||||
|
||||
|
||||
Бывало, хочешь всех и сразу,
|
||||
|
||||
Бывало, не влечет никто,
|
||||
|
||||
Бывали стервы и заразы..
|
||||
|
||||
Но!.. не случался дед-пихто!
|
||||
|
||||
|
||||
|
||||
О нет, ну что вы! Я не гомик!
|
||||
|
||||
Я не люблю дедов и баб!
|
||||
|
||||
Я просто мирный тихий гномик..
|
||||
|
||||
Люблю котов, курей, собак..
|
||||
|
||||
|
||||
|
||||
Ну накрайняк и мокрощелку
|
||||
|
||||
Могу забацать невзначай..
|
||||
|
||||
Однако лучшая девчонка
|
||||
|
||||
Во всей деревне – Колонча..
|
||||
|
||||
|
||||
|
||||
Ее прозвали Тетей Степой,
|
||||
|
||||
Она у кладбища жила..
|
||||
|
||||
И то и дело, ненароком,
|
||||
|
||||
У мертвецов в рот хуй брала..
|
||||
|
||||
|
||||
|
||||
И так, было, возьмет умело,
|
||||
|
||||
Так перекрутит, засосет,
|
||||
|
||||
Что половину хладнотелых
|
||||
|
||||
Буквально прям и затрясет!
|
||||
|
||||
|
||||
|
||||
Боялись девку парни наши..
|
||||
|
||||
Не только мертвых воскрешать..
|
||||
|
||||
Умела.. как ее! Наташа!
|
||||
|
||||
Но и живых ртом умерщвлять!
|
||||
|
||||
|
||||
|
||||
И до сих пор все слухи ходят,
|
||||
|
||||
Что некрофилов по утрам
|
||||
|
||||
На кладбище глухом находят
|
||||
|
||||
Усохших, мертвых! Тут и там!
|
||||
|
||||
|
||||
|
||||
То дохлую давно уж ведьму
|
||||
|
||||
Желают в ротик отодрать,
|
||||
|
||||
Те что хотят (как по поверью)
|
||||
|
||||
Себя ко Дьяволу продать!
|
||||
|
||||
|
||||
|
||||
…
|
||||
|
||||
|
||||
|
||||
Живу я щас на тихой даче,
|
||||
|
||||
Прям в доме био-туалет!
|
||||
|
||||
Валяюсь и дрочу в придачу
|
||||
|
||||
Уже каких то тыщу лет..
|
||||
|
||||
|
||||
|
||||
История давно начАлась
|
||||
|
||||
По меркам Пушкина – Пиздец!
|
||||
|
||||
Ты бы подруга обкончалась,
|
||||
|
||||
Если б услышала конец!
|
||||
|
||||
|
||||
|
||||
А началось все в том далеком..
|
||||
|
||||
Тыща пятнадцатом году,
|
||||
|
||||
Когда заехал в невысокий,
|
||||
|
||||
Но славный домик. На пруду.
|
||||
|
||||
|
||||
|
||||
Однако ж вскоре возле дома
|
||||
|
||||
Нашел я человека труп..
|
||||
|
||||
Мне ситуация знакома!
|
||||
|
||||
Не раз таких ложил под сруб..
|
||||
|
||||
|
||||
|
||||
Ну думаю, труп сам тут умер..
|
||||
|
||||
Стоял, упал и охладел.
|
||||
|
||||
Но думаю, какого хуя,
|
||||
|
||||
Этот мудак сортир задел?!
|
||||
|
||||
|
||||
|
||||
Забыли. Сбросил труп в болото.
|
||||
|
||||
Его там быстро не нашли..
|
||||
|
||||
Но что-то стало мне охото
|
||||
|
||||
Потрахать бабу на печи!
|
||||
|
||||
|
||||
|
||||
И стал искать я кандидатку..
|
||||
|
||||
Животных хуй терпеть не мог..
|
||||
|
||||
Увидел вдруг старушку-бабку..
|
||||
|
||||
Совсем все спало между ног!
|
||||
|
||||
|
||||
|
||||
Но чу! Когда я отвернулся,
|
||||
|
||||
Я услыхал медовый глас!
|
||||
|
||||
Ойой! Голубчик! Ты б вернулся!
|
||||
|
||||
Я берегла себя для Вас!
|
||||
|
||||
|
||||
|
||||
Я охуел от тех наездов!
|
||||
|
||||
Ебать бабульку - Во дела!
|
||||
|
||||
Но так меня тоска по сЕксу
|
||||
|
||||
Под это время заебла,
|
||||
|
||||
|
||||
|
||||
Что развернулся.. И опешил!
|
||||
|
||||
Вместо бабульки предо мной
|
||||
|
||||
Стоит девченка, с кошку весом,
|
||||
|
||||
Но с высоченной головой..
|
||||
|
||||
|
||||
|
||||
Признаца я любил стройнушек..
|
||||
|
||||
Но не таких же в самом де!
|
||||
|
||||
Эх жалко нету с чаем плюшек..
|
||||
|
||||
Эк зачасалося в ялде!!
|
||||
|
||||
|
||||
|
||||
Но девка вышла не простая..
|
||||
|
||||
Она мне сразу не дала..
|
||||
|
||||
Взяла под яйца как родная
|
||||
|
||||
И молча к дому повела..
|
||||
|
||||
|
||||
|
||||
Разделась.. Красоваться стала..
|
||||
|
||||
Вздрочнула, словно не при мне..
|
||||
|
||||
Но! Мне потрогать не давала!
|
||||
|
||||
Не подпускала, блядь, к себе!
|
||||
|
||||
|
||||
|
||||
И так, и эдак я подлазил,
|
||||
|
||||
И гладить пробовал, лизал!
|
||||
|
||||
И спереди вставал и сзади!
|
||||
|
||||
.. В конце концов мой хуй упал!
|
||||
|
||||
|
||||
|
||||
Ну не дала мне, идиоту!
|
||||
|
||||
И яйца щемит, что не в мочь!
|
||||
|
||||
И побежал я на болото,
|
||||
|
||||
Осуществить свой мирный дроч.. ☹
|
||||
|
||||
|
||||
|
||||
А баба, словно так и ждала,
|
||||
|
||||
Вдруг похуярила за мной!
|
||||
|
||||
Достала два больших кинжала
|
||||
|
||||
И притаила за спиной..
|
||||
|
||||
|
||||
|
||||
Но я просек ее подлянку!
|
||||
|
||||
Ебаться хоть и жуть хотел!
|
||||
|
||||
И уж подумал: лесбиянка!..
|
||||
|
||||
Да как въебу ей в нос ногой!
|
||||
|
||||
|
||||
|
||||
Бабища право охуела,
|
||||
|
||||
От этой наглости со мной..
|
||||
|
||||
Но.. сразу на коленки села..
|
||||
|
||||
И потянулась за ялдой.
|
||||
|
||||
|
||||
|
||||
С тех пор я стал ваще бессмертный
|
||||
|
||||
Лишь только насморк заебал..
|
||||
|
||||
Да и мой хуй (он был конкретный!)
|
||||
|
||||
С тех пор как кочерыжка стал…
|
||||
|
||||
|
||||
|
||||
С тех пор ебу собак и кошек..
|
||||
|
||||
Ну бабок изредка каких..
|
||||
|
||||
Иль на панели мандавошек..
|
||||
|
||||
Хоть мой размер смущает их..
|
||||
|
||||
|
||||
|
||||
Но все же я скажу вам, други..
|
||||
|
||||
Быть может это сгоряча..
|
||||
|
||||
Но лучше всех блядей в округе
|
||||
|
||||
Сосет (и дрочит) КОЛОНЧА! :))
|
||||
|
||||
|
||||
|
||||
(c) mallexxx
|
||||
@@ -0,0 +1,65 @@
|
||||
В моих глазах туман и.. пусто,
|
||||
|
||||
И опустились руки – крылья птицы.
|
||||
|
||||
А на душе темно, тоскливо, грустно..
|
||||
|
||||
И по ночам уже никто не снится..
|
||||
|
||||
|
||||
|
||||
Хотя полно друзей - родных и близких,
|
||||
|
||||
Которые Сейчас живут, не искрой,
|
||||
|
||||
Которой я сгорел недавно тихо
|
||||
|
||||
И пал на дно душой, в ущелье низко..
|
||||
|
||||
|
||||
|
||||
Моя душа – как сигареты пепел,
|
||||
|
||||
Остались в ней одни тоска и горесть..
|
||||
|
||||
..Который радостно сдувает ветер,
|
||||
|
||||
И оголяет.. суку, совесть.
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
pre:
|
||||
|
||||
В моих глазах туман и.. пусто
|
||||
|
||||
И часты боли в пояснице
|
||||
|
||||
А на душе тоскливо, грустно..
|
||||
|
||||
Мне по ночам никто не снится..
|
||||
|
||||
|
||||
|
||||
Хотя полно друзей и близких,
|
||||
|
||||
Которые Живут, не искрой,
|
||||
|
||||
Которою сгорел я тихо
|
||||
|
||||
И пал на дно душою низко..
|
||||
|
||||
|
||||
|
||||
Моя душа – как будто пепел,
|
||||
|
||||
В ней лишь одни тоска и горесть..
|
||||
|
||||
..Который раздувает ветер,
|
||||
|
||||
И оголяет.. суку, совесть.
|
||||
@@ -0,0 +1,53 @@
|
||||
Я б хотел жить в воде,
|
||||
|
||||
Но не знаю кем быть:
|
||||
|
||||
Я б наверно стал белым китом!
|
||||
|
||||
Я бы плавал в морях
|
||||
|
||||
И глушил бы я рыб
|
||||
|
||||
Своим белым большим плавником!
|
||||
|
||||
|
||||
|
||||
Или будь я змеёй,
|
||||
|
||||
Я бы ползал в полях
|
||||
|
||||
И пугал бы народ во дворе!
|
||||
|
||||
И любить бы наверно
|
||||
|
||||
Так сильно, в сердцах,
|
||||
|
||||
Я не смог бы так близко к земле...
|
||||
|
||||
|
||||
|
||||
Или Вот! Я хочу
|
||||
|
||||
Черной птицою стать
|
||||
|
||||
И.. Парить высоко над землей!
|
||||
|
||||
Я б любил вас как Предков
|
||||
|
||||
Любимых своих
|
||||
|
||||
И любовь бы была неземной!
|
||||
|
||||
|
||||
|
||||
Но увы, суждено мне
|
||||
|
||||
Земным умереть,
|
||||
|
||||
Человеком, как я не хочу!
|
||||
|
||||
Песню я допою,
|
||||
|
||||
Мне ведь Нужно допеть!
|
||||
|
||||
Но потом непременно умру!
|
||||
@@ -18,7 +18,7 @@ updated: 2026-05-17
|
||||
|
||||
## Подарки
|
||||
|
||||
- [ ] Powerball
|
||||
- [x] Powerball
|
||||
- [ ] Чугунок
|
||||
- [ ] Керамика: вазы, тарелки ручной работы
|
||||
- [ ] Гончарный круг
|
||||
|
||||
@@ -139,6 +139,7 @@ Hub: [[personal/projects/media-pipeline-tracker-parsers|Media Pipeline Roadmap]]
|
||||
- [[personal/projects/virfield|Virfield — macOS VM control plane]] — релиз, статус и каноническая документация.
|
||||
|
||||
- [[docker_colima_setup|Docker Colima Setup]]
|
||||
- [[personal/tech/macos-voom-cleanup|macOS — автоматическая очистка: Voom, Eagle, Docker и бэкапы]]
|
||||
- [[truenas-remote-access-reverse-proxy|TrueNAS Remote Access]]
|
||||
- [[Swift cross-platform testing|Swift Cross-Platform Testing]]
|
||||
- [[Dyld dynamic interposing|Dyld Dynamic Interposing]]
|
||||
|
||||
@@ -0,0 +1,263 @@
|
||||
---
|
||||
title: Выборочный бэкап Mac на Kraken
|
||||
updated: '2026-10-23'
|
||||
tags:
|
||||
- backup
|
||||
- backrest
|
||||
- restic
|
||||
- macos
|
||||
- kraken
|
||||
- instructions
|
||||
---
|
||||
# Выборочный бэкап Mac на Kraken
|
||||
|
||||
## Текущая схема
|
||||
|
||||
На Mac установлены Backrest 1.14.1 и restic 0.19.1. Backrest работает как служба пользователя macOS `sh.brew.backrest` через LaunchAgent и доступен по адресу <http://127.0.0.1:9898>. Его окно или браузер держать открытым не требуется; пользователь должен войти в macOS, Mac должен быть включён и иметь доступ к Kraken во время задания. Движок restic создаёт шифрованные снимки и отправляет их по SFTP. На Kraken нужен только SSH/SFTP-сервер; Backrest или restic на сервере не установлены и не требуются.
|
||||
|
||||
Рабочий репозиторий Backrest: `kraken-mbp-black`. Адрес restic:
|
||||
|
||||
```text
|
||||
sftp:kraken@192.168.1.14:/srv/dev-disk-by-uuid-6194539b-03e0-4f33-986b-4da09834e82f/backups/mbp-black/restic
|
||||
```
|
||||
|
||||
Сейчас используется прямой локальный IP `192.168.1.14`. За пределами домашней сети этот адрес недоступен; автоматическое переключение на VPN не настроено. Не следует считать ночное задание успешным, если Mac был вне локальной сети или спал.
|
||||
|
||||
Конфигурация Backrest хранится в `/Users/admin/.config/backrest/config.json` с правами `0600`; она содержит пароль репозитория. Такой же пароль сохранён в связке ключей macOS: служба `backrest-kraken-restic`, учётная запись `admin`. Пароль не записан в этой заметке. Для восстановления после утраты Mac нужна отдельная копия пароля вне самого Mac; наличие такой копии пока не подтверждено.
|
||||
|
||||
Для «Полного доступа к диску» macOS добавлены оба файла:
|
||||
|
||||
- `/opt/homebrew/Cellar/backrest/1.14.1/bin/backrest`
|
||||
- `/Users/admin/.local/share/backrest/restic`
|
||||
|
||||
После обновления Backrest, если путь к бинарнику изменится, права доступа к диску нужно проверить повторно.
|
||||
|
||||
## Планы и расписание
|
||||
|
||||
Все три плана используют локальное время Mac и один репозиторий `kraken-mbp-black`. Для каждого плана настроено хранение **3 последних снимков** (`policyKeepLastN: 3`): после будущих запусков Backrest будет убирать более старые снимки этого плана из истории. Встроенная очистка `prune` запланирована **по воскресеньям в 06:00** по локальному времени Mac (`maxUnusedPercent: 10`); она освобождает место, занятое уже удалёнными снимками. Отдельного скрипта нет. [Backrest: Retention и Prune](https://garethgeorge.github.io/backrest/introduction/getting-started).
|
||||
|
||||
### Домашняя папка — `kraken-home`
|
||||
|
||||
Ежедневно в **03:00**. Источник: `/Users/admin`. Включён `--one-file-system`, поэтому другие тома не обходятся. Действуют 114 правил исключения ниже. Сохраняются документы, проекты, настройки и другие файлы домашней папки, не подпавшие под эти правила. Общего исключения `.git` нет.
|
||||
|
||||
### Выборочные системные файлы — `kraken-system`
|
||||
|
||||
Ежедневно в **03:30**. Включён `--one-file-system`. Источники в текущей конфигурации:
|
||||
|
||||
```text
|
||||
/Library/Audio/Impulse Responses
|
||||
/Library/Fonts
|
||||
/Library/LaunchDaemons/ai.virfield.lume.plist
|
||||
/Library/LaunchDaemons/ai.virfield.virfieldd.plist
|
||||
/Library/LaunchDaemons/com.cloudflare.cloudflared.plist
|
||||
/Library/LaunchDaemons/top.eagle.wg-auto.plist
|
||||
/Library/WebServer/Documents
|
||||
/Users/Shared/obsidian
|
||||
/opt/homebrew/etc
|
||||
/private/etc/apache2
|
||||
/private/etc/hosts
|
||||
/usr/local/bin
|
||||
```
|
||||
|
||||
Для этого плана действуют 37 правил исключения ниже.
|
||||
|
||||
### PostgreSQL — `kraken-postgresql`
|
||||
|
||||
Ежедневно в **04:30**. Снимок создаётся потоком команды `pg_dumpall` без промежуточного локального файла:
|
||||
|
||||
```text
|
||||
--stdin-filename postgresql-all.sql --stdin-from-command -- /opt/homebrew/bin/pg_dumpall -l postgres
|
||||
```
|
||||
|
||||
В снимке находится один логический дамп `postgresql-all.sql`, включая базы и глобальные объекты PostgreSQL. Для восстановления его нужно подать в `psql` на подготовленном сервере; полноценное восстановление этого дампа пока не проверено. Старые локальные дампы `/Users/admin/.local/share/mbp-black-postgresql` исключены из домашнего плана.
|
||||
|
||||
## Правила исключения
|
||||
|
||||
Это точные правила из действующей конфигурации Backrest на 23 октября 2026 года. Перед изменением правил проверяйте список в интерфейсе Backrest; конфигурация может измениться позже этой записи. Каталоги вроде `node_modules`, `.venv`, кэши, сборочные артефакты, установочные образы и lock-файлы не попадают в снимки. Маски с `**` действуют на любой глубине.
|
||||
|
||||
### `kraken-home` — 114 правил
|
||||
|
||||
```text
|
||||
/Users/admin/DuckDuckGo
|
||||
/Users/admin/Downloads
|
||||
/Users/admin/.colima
|
||||
/Users/admin/Library/Developer
|
||||
/Users/admin/Library/Caches
|
||||
/Users/admin/.local/share/balda-workspace/backups
|
||||
/Users/admin/.virfield-v2/cache
|
||||
/Users/admin/go/pkg/mod
|
||||
/Users/admin/.npm
|
||||
/Users/admin/.gradle/caches
|
||||
/Users/admin/.gradle/daemon
|
||||
/Users/admin/.gradle/wrapper/dists
|
||||
/Users/admin/.swiftpm/cache
|
||||
/Users/admin/Library/pnpm/store
|
||||
/Users/admin/.cache/uv
|
||||
/Users/admin/*/**/.gradle
|
||||
/Users/admin/Developer/**/build
|
||||
/Users/admin/Developer/**/Build
|
||||
/Users/admin/Developer/**/dd
|
||||
/Users/admin/Developer/personal-os/tools/rlm-lab/.runtime/models
|
||||
/Users/admin/Developer/personal-os/tools/rlm-lab/.runtime/uv-cache
|
||||
/Users/admin/Developer/personal-os/tools/rlm-lab/.runtime/deno-cache
|
||||
/Users/admin/Developer/personal-os/tools/rlm-lab/.runtime/npm-cache
|
||||
/Users/admin/Library/Application Support/Claude/Cache
|
||||
/Users/admin/Library/Application Support/Claude/Code Cache
|
||||
/Users/admin/.Trash
|
||||
/Users/admin/Library/Application Support/Steam/steamapps/common
|
||||
/Users/admin/.android/avd
|
||||
/Users/admin/Library/Android/sdk
|
||||
/Users/admin/.ollama/models
|
||||
/Users/admin/.cache/huggingface/hub
|
||||
/Users/admin/Library/Application Support/Google/Chrome/OptGuideOnDeviceModel
|
||||
/Users/admin/docker/balda-mm-mac/state-failed-upstream-*
|
||||
/Users/admin/docker/balda-mm-mac/state/setup-backups
|
||||
/Users/admin/Library/org.swift.swiftpm/swift-sdks
|
||||
/Users/admin/.vscode/extensions
|
||||
/Users/admin/.cursor/extensions
|
||||
/Users/admin/Library/Containers/com.apple.CoreDevice.CoreDeviceService/Data/Library/Caches
|
||||
/Users/admin/haos/haos_generic-*.img
|
||||
/Users/admin/haos/haos_generic-*.img.xz
|
||||
/Users/admin/Library/Application Support/Dash/DocSets
|
||||
/Users/admin/Library/Application Support/Code/CachedExtensionVSIXs
|
||||
/Users/admin/Library/Application Support/Google/GoogleUpdater/crx_cache
|
||||
/Users/admin/Library/Logs
|
||||
/Users/admin/Library/Application Support/com.apple.wallpaper/aerials/videos
|
||||
/Users/admin/whisper-env
|
||||
/Users/admin/Library/Application Support/Claude/vm_bundles
|
||||
/Users/admin/Developer/dyld_shared_cache_*
|
||||
/Users/admin/Developer/Big Sur Libraries
|
||||
/Users/admin/Library/Application Support/Asana/Cache
|
||||
/Users/admin/Library/Application Support/Asana/Code Cache
|
||||
/Users/admin/Library/Application Support/Asana/Service Worker/CacheStorage
|
||||
/Users/admin/Library/Application Support/YandexMusic/Cache
|
||||
/Users/admin/Library/Application Support/YandexMusic/Code Cache
|
||||
/Users/admin/Library/Application Support/Spotify/PersistentCache
|
||||
/Users/admin/Library/Application Support/Code/Cache
|
||||
/Users/admin/Library/Application Support/Code/logs
|
||||
/Users/admin/Library/Application Support/Code/CachedData
|
||||
/Users/admin/Library/Application Support/Code/Crashpad
|
||||
/Users/admin/Library/Application Support/Mattermost/Cache
|
||||
/Users/admin/Library/Application Support/Mattermost/Code Cache
|
||||
/Users/admin/Library/Containers/Mattermost.Desktop/Data/Library/Application Support/Mattermost/Code Cache
|
||||
/Users/admin/Library/Containers/com.apple.mediaanalysisd/Data/Library/Caches
|
||||
/Users/admin/Library/Application Support/zoom.us/data/UnifyWebView_Cache
|
||||
/Users/admin/Library/Application Support/Steam/Steam.AppBundle
|
||||
/Users/admin/Library/Application Support/Steam/appcache
|
||||
/Users/admin/Library/Application Support/Steam/depotcache
|
||||
/Users/admin/Library/Application Support/Steam/logs
|
||||
/Users/admin/.cache/codex-runtimes
|
||||
/Users/admin/.local/share/claude/versions
|
||||
/Users/admin/.local/share/cursor-agent/versions
|
||||
/Users/admin/.local/share/uv/python
|
||||
**/media_files_db/out
|
||||
**/media_files_db/cache
|
||||
/Users/admin/Virtual Machines.localized/Windows 95*.utm
|
||||
/Users/admin/Library/Containers/com.duckduckgo.macos.browser.debug
|
||||
.build
|
||||
.build-*
|
||||
DerivedData
|
||||
deriveddata
|
||||
derviveddata
|
||||
.deriveddata
|
||||
.dd
|
||||
WebKitBuild
|
||||
node_modules
|
||||
.venv
|
||||
venv
|
||||
__pycache__
|
||||
.pytest_cache
|
||||
.mypy_cache
|
||||
.ruff_cache
|
||||
.next
|
||||
.nuxt
|
||||
.turbo
|
||||
.parcel-cache
|
||||
.cxx
|
||||
.kotlin
|
||||
**/Carthage/Build
|
||||
*.pyc
|
||||
*.pyo
|
||||
.DS_Store
|
||||
._*
|
||||
*.dmg
|
||||
*.xip
|
||||
*.lock
|
||||
*.lockb
|
||||
Package.resolved
|
||||
package-lock.json
|
||||
npm-shrinkwrap.json
|
||||
pnpm-lock.yaml
|
||||
pnpm-lock.yml
|
||||
packages.lock.json
|
||||
*.pgdump
|
||||
/Users/admin/.local/share/mbp-black-postgresql
|
||||
```
|
||||
|
||||
### `kraken-system` — 37 правил
|
||||
|
||||
```text
|
||||
.build
|
||||
.build-*
|
||||
DerivedData
|
||||
deriveddata
|
||||
derviveddata
|
||||
.deriveddata
|
||||
.dd
|
||||
WebKitBuild
|
||||
node_modules
|
||||
.venv
|
||||
venv
|
||||
__pycache__
|
||||
.pytest_cache
|
||||
.mypy_cache
|
||||
.ruff_cache
|
||||
.next
|
||||
.nuxt
|
||||
.turbo
|
||||
.parcel-cache
|
||||
.cxx
|
||||
.kotlin
|
||||
**/Carthage/Build
|
||||
*.pyc
|
||||
*.pyo
|
||||
.DS_Store
|
||||
._*
|
||||
*.dmg
|
||||
*.xip
|
||||
*.lock
|
||||
*.lockb
|
||||
Package.resolved
|
||||
package-lock.json
|
||||
npm-shrinkwrap.json
|
||||
pnpm-lock.yaml
|
||||
pnpm-lock.yml
|
||||
packages.lock.json
|
||||
*.pgdump
|
||||
```
|
||||
|
||||
## Проверенный результат
|
||||
|
||||
На 23 октября 2026 года созданы снимки всех трёх планов. Системный снимок завершился успешно; `/private/etc/hosts` восстановлен и совпал побайтно. PostgreSQL-снимок завершился успешно; `postgresql-all.sql` имеет размер 26 485 621 820 байт, однако полное восстановление базы не проверялось.
|
||||
|
||||
Домашний снимок `25ecd67531c890fcbe76f4142d189fa369e33be7a5aaf3be76f99e85f20f8d59` сохранён с предупреждением: обработано 448 705 файлов, 21 защищённый служебный файл macOS не удалось прочитать даже после выдачи Full Disk Access. Ошибки относятся к `com.apple.milod`, индексу `CoreSpotlight/NSFileProtectionComplete` и одному файлу настроек `group.com.apple.secure-control-center-preferences`. Два других файла из домашнего снимка восстановлены и совпали с оригиналами побайтно.
|
||||
|
||||
Команда `restic check` проверила структуру репозитория и все четыре снимка без ошибок. Она сообщила о 192 дополнительных файлах пакетов после прерванных попыток; это не ошибка целостности. Лимит трёх версий и расписание `prune` установлены после этой проверки; их первый автоматический запуск ещё не проверен.
|
||||
|
||||
В папке назначения `/srv/dev-disk-by-uuid-6194539b-03e0-4f33-986b-4da09834e82f/backups/mbp-black/` находится только `restic/`.
|
||||
|
||||
## Проверка и восстановление
|
||||
|
||||
Для обычной работы откройте <http://127.0.0.1:9898>, выберите нужный план и снимок. По завершении ночного задания проверьте его статус: **Success** или **Warning/Error**. Домашний план сейчас показывает **Warning** из-за 21 недоступного файла; этот статус не следует принимать за полностью успешный бэкап.
|
||||
|
||||
Для восстановления отдельных файлов выберите снимок в Backrest, найдите файл и восстановите его в отдельный каталог, затем сравните с оригиналом перед заменой. Для аварийного восстановления без Backrest можно установить restic, подключиться к указанному SFTP-репозиторию и использовать пароль репозитория. Без пароля содержимое снимков не прочитать.
|
||||
|
||||
Проверка через терминал на этом Mac (пароль берётся из связки ключей, в команду и заметку не записывается):
|
||||
|
||||
```sh
|
||||
RESTIC_REPOSITORY='sftp:kraken@192.168.1.14:/srv/dev-disk-by-uuid-6194539b-03e0-4f33-986b-4da09834e82f/backups/mbp-black/restic'
|
||||
restic --password-command 'security find-generic-password -a admin -s backrest-kraken-restic -w' -r "$RESTIC_REPOSITORY" snapshots
|
||||
restic --password-command 'security find-generic-password -a admin -s backrest-kraken-restic -w' -r "$RESTIC_REPOSITORY" check
|
||||
```
|
||||
|
||||
Для восстановления целого снимка выберите в Backrest отдельную папку назначения с достаточным свободным местом. Не восстанавливайте сразу поверх работающей системы или базы PostgreSQL.
|
||||
@@ -3,8 +3,8 @@ title: Отметка «просмотрено» из Lampa → watchlist.md
|
||||
type: plan
|
||||
status: implemented-bug-open-markwatched-insert
|
||||
namespace: personal
|
||||
created: 2026-09-23T00:00:00.000Z
|
||||
updated: '2026-09-27T00:00:00.000Z'
|
||||
created: '2026-09-23T00:00:00.000Z'
|
||||
updated: '2026-10-30'
|
||||
tags:
|
||||
- lampac
|
||||
- lampa
|
||||
@@ -17,10 +17,19 @@ related:
|
||||
- '[[family/projects/watchlist-automation]]'
|
||||
- '[[personal/plans/lampac-watchlist-plugin]]'
|
||||
- '[[family/documents/movies-watchlist]]'
|
||||
- '[[personal/tech/lampac-truenas]]'
|
||||
---
|
||||
|
||||
# Отметка «просмотрено» из Lampa → `movies-watchlist.md`
|
||||
|
||||
## Обновление источника истории — 2026-10-30
|
||||
|
||||
Активная TimeCode перенесена на TrueNAS; все 9 записей сохранены. Kraken читает общий HTTPS dump API через приватную переменную `LAMPAC_TIMECODE_DB`; поддержка API реализована и запушена в [watchlist-sync, 3810d77](https://github.com/mallexxx/watchlist-sync/commit/3810d77). Код развёрнут на Kraken, dry-run прочитал9 записей без изменений списка.
|
||||
|
||||
Единственный писатель Obsidian и генератор каталога остаётся на Kraken; на NAS публикуются готовые JSON. Синхронизации SQLite нет. Локальная SQLite Kraken сохранена для отката и больше не является активным источником ночного шага. Реальная API-запись и сохранность прогресса проверены до/после NAS-бэкапа.
|
||||
|
||||
Актуальная схема, права WAL/SHM и бэкапы — [[personal/tech/lampac-truenas]]. Ниже сохранена история предыдущей реализации и её отдельных замечаний; это обновление меняет источник данных и не заявляет исправление всех исторических вопросов разметки списка.
|
||||
|
||||
> **Проблема (Alex, 2026-09-23):** «А у нас из лампы уходят отметки просмотрено в список галочками как было в jellyfin?»
|
||||
> Ответ: **нет**. Задача — сделать, чтобы уходили.
|
||||
|
||||
|
||||
Executable → Regular
+94
-1
@@ -2,7 +2,7 @@
|
||||
|
||||
Проверено: **2026-10-16** (практика UI-тестов — 2026-10-17, см. раздел ниже). Последний опубликованный stable Latest и установленная версия — [v2.1.1](https://github.com/mallexxx/virfield/releases/tag/v2.1.1), source `2c64888abed617722e79d618dd4911efa0c4b126`. Релиз опубликован после явного подтверждения владельца. Архив macOS ARM64 и SHA256SUMS скачаны с публичных URLs без авторизации; содержимое побайтно совпадает с проверенным установленным пакетом. Предыдущая публикация: [[personal/projects/virfield-release-v2.1.0]].
|
||||
|
||||
Текущий local/GitHub `main`: **`2c64888abed617722e79d618dd4911efa0c4b126`**, checkout чистый, локально и на origin только `main`. Изменение исправляет обработку ошибки `launchctl bootstrap` уже зарегистрированного собственного guest Keychain agent: recovery разрешён только после проверки точного launchd job, затем остаются все прежние native readiness gates. Добавлены закрытый bootstrap diagnostic и regression с настоящим shell-блоком; контрфактический тест на старом коде воспроизвёл отказ. Make check/race, Staticcheck, module verify, Govulncheck и make check из распакованного точного кандидата прошли.
|
||||
На 2026-10-16 local/GitHub `main` был **`2c64888abed617722e79d618dd4911efa0c4b126`**; актуальный локальный `main` и состояние production указаны в разделе «Текущая работа 2026-10-23» ниже. Изменение исправляет обработку ошибки `launchctl bootstrap` уже зарегистрированного собственного guest Keychain agent: recovery разрешён только после проверки точного launchd job, затем остаются все прежние native readiness gates. Добавлены закрытый bootstrap diagnostic и regression с настоящим shell-блоком; контрфактический тест на старом коде воспроизвёл отказ. Make check/race, Staticcheck, module verify, Govulncheck и make check из распакованного точного кандидата прошли.
|
||||
|
||||
## Установленная версия и проверка обновления
|
||||
|
||||
@@ -57,11 +57,70 @@ macOS make check/build/Staticcheck прошли; настоящий read-only vo
|
||||
- Тайминги: prepare до `ready` ≈40 с для обеих VM; release → `released` ≈7 с (job сначала `delete_dispatched`, итоговое состояние читать из `vm_lease`, не ждать только `virfield_job`).
|
||||
- **Запись экрана**: на `uitest-27-v1` `screencapture -v` работает по обычному SSH; на macOS 12 (`developer-v1`) `capture error`, нет Screen Recording TCC, SIP включён. Если нужна запись на старых VM, нужен golden с заранее выданным разрешением.
|
||||
- **UI automation**: macOS 12 VM — Developer Mode уже включён, sudo без пароля, но `automationmodetool enable-automationmode-without-authentication` нужно выполнить; `ui_testing` проба помогла бы здесь. Для запуска из SSH нужна консольная GUI-сессия (Terminal `.command`).
|
||||
- **`ready` не подтверждает готовность UI Automation — повторно 2026-10-21.** Две свежие VM, `monterey-xcode-13.4.1` (Tart, macOS 12.7.6/21H1320, ARM64, Xcode 13.4.1/13F100) и `htpc-sonoma-14-xcode-16.2` (node VM, macOS 14.8.9/23J631, Intel, Xcode 16.2/16C5032a), получили успешный prepare и lease `ready`. При этом `/usr/bin/automationmodetool` на обеих сообщил `Automation Mode is disabled` и `This device requires user authentication to enable Automation Mode`. Developer Mode был включён, `admin` входил в `_developer`, консольная сессия принадлежала `admin`. XCTest runner загрузился, но запуск через Terminal и напрямую через pinned SSH завершился `Timed out while enabling automation mode`, exit 65, **0 выполненных тестов**. `sudo automationmodetool enable-automationmode-without-authentication` затем сообщил успех; повторная проверка уже показывала `DOES NOT REQUIRE user authentication`, однако проверенный повтор по-прежнему завершился timeout до тестовых методов. Контрольные минимальные UI-тесты, собранные локально штатными SDK Xcode 13.4.1 на Monterey и Xcode 16.2 на Sonoma (без нового bundle и без shim), тоже завершились `Timed out while enabling automation mode`, exit 65, до тестового метода. Поэтому проблема ещё не закрыта, а совместимость исполнения нового bundle этим прогоном не доказана. Нужны явная проверка Automation Mode при UI-readiness, подготовка соответствующего UI-профиля и короткий настоящий XCUITest с ненулевым числом выполненных тестов; native GUI/Keychain readiness этого не заменяет. Leases: `lease-9ec9281c953de634a53572e293862901`, `lease-6994a85f7abcefd367dd40d45b08e87b`.
|
||||
- **Уточнение UI-readiness, 2026-10-22:** последующая проверка через pinned SSH без Screen Sharing на новых leases `lease-202db9fd4686e87363ac66171657ba21` (Sonoma Intel/Xcode 16.2) и `lease-22c0cfb96e3253d3ed1f7d8ebee6ab77` (Monterey ARM/Xcode 13.4.1) выполнила настоящие native XCUITest probes: 1/1 на каждой OS. На Sonoma один и тот же CI test bundle выполнил PrintingTests 7/7 и с упакованным runtime, и со штатным XCTest 16. На Monterey исправленный AddressBarSearchQueryEditingTests прошёл 26/26 с первой попытки; полный сброс состояния подтверждён только перед первым методом (flags 1 + 25×0). Для старого XCTest потребовались завершение своего target app между процессами, подготовка autocomplete fixture через defaults и отключение вложенного синтеза событий из TCC polling timer. Это снимает утверждение, что UI Automation на этих образах вообще невозможно запустить, но не доказывает первопричину прежнего automation-mode timeout и не заменяет readiness probe в Virfield. Отдельный sandbox запуск Monterey завис в системных Keychain вызовах до создания окна; продолжается диагностика. ARM Sonoma crash из CI не воспроизведён на Intel. Доказательства сохранены в `/tmp/prebuilt-ui-fix-results/` (включая `monterey-final-evidence.tar.gz`, `sonoma-native-runtime-evidence.tar.gz`).
|
||||
- **Дополнительная UI-квалификация 2026-10-22:** Sonoma Intel/Xcode16.2 выполнила также AppStoreSandboxUITests2/2 с изолированным временным keychain; исходные default/search lists восстановлены в GUI и SSH audit sessions. Один лишь SSH unlock не гарантирует доступа GUI app: запуск App Store блокировался в Keychain до native GUI unlock/selection. Native SDK13 контроль Monterey нашёл Customize на новой вкладке (XCUITest assertion1/1); sandbox-класс прошёл NTP после замены element timeout5s на navigation timeout, но затем General Settings перестала отвечать. Sample: `NSPathControlView.updateNSView → NSPathCell.setURL → FileProvider/CloudDocsFileProvider → fp_isInSyncableRootFast → open`; это не доказанный бесконечный SwiftUI layout loop и не failure загрузки XCTest bundle. В VM виден запрос доступа Review к Downloads. Проверка разрешения folder privacy ожидает человеческого согласия: автоматический approval review отклонил выдачу доступа. Cancel/Deny и перезапуск устаревших UI helpers не закрыли квалификационный gap. Monterey смешанный прогон1 выполненный метод+1 OS skip завершился успешно; all-skipped по-прежнему ошибка. Новый Sequoia lease `lease-e22b152c5d0d4c9bc8540b3bdf9a90e7` готов, macOS15.8.1/Xcode26.3, но Automation Mode disabled/requires user authentication; native UI пока не запускался, изменение unattended-политики также ждёт явного разрешения после auto-review отказа. Loader-only631UI+5Perf+5Sync успешен. На GitHub ARM14 и15 точечные классы прошли в обоих режимах на1066967a82; финальные полные UI/Sync/Performance на7cbda2bc49 ещё выполняются. Дополнительные receipts: `/tmp/prebuilt-ui-fix-results/sonoma-appstore-evidence.tar.gz`, `monterey-additional-evidence.tar.gz`.
|
||||
- Remote shell zsh: нет `timeout`, `$var` не разбивается на слова — при автоматизации писать скрипты файлами.
|
||||
- Запуск из `xcodebuild test-without-building -xctestrun` по скопированным `Products` (macOS 27) работает; `Scheme`-pre-actions (`clean-app.sh`, `tests-server`) при этом **не** выполняются.
|
||||
- Повторы `vm_acquire` — с новым idempotency key, если меняется ключ SSH/шаблон; тот же ключ и body только для настоящего retry.
|
||||
- Клиентская сторона (не virfield): auto-mode classifier заблокировал `vm_acquire` для шаблона, который пользователь не называл; разрешение нужно давать явно.
|
||||
|
||||
## Диагностика DDG Review Keychain, 2026-10-23
|
||||
|
||||
**Классификация: проблема дополнительного test fixture; дефект подписи приложения или Virfield не подтверждён.** Подпись Review `Developer ID Application: Duck Duck Go, Inc. (HKE973VLUW)` прошла `codesign --verify --deep --strict` в VM. Речь о runtime-ключе шифрования данных браузера, а не о приватном ключе сертификата сборки. Подпись идентифицирует приложение для проверки доступа, но не разблокирует keychain; см. [Apple: Access Control Lists](https://developer.apple.com/documentation/security/access-control-lists).
|
||||
|
||||
В lease `lease-f7b5ad7345b33883e6ef9062062125f7` клиент тестов сам создал дополнительный `workspace/fire-regression/keychain-fixture/review.keychain-db`, записал синтетический AES fixture и затем изменил default/search list VM на этот keychain. Это не keychain, подготовленный Virfield. Через System Events прочитан точный запрос: “DuckDuckGo Review wants to use the ‘review’ keychain. Please enter the keychain password.” Успешные CLI unlock и отдельный GUI helper (status 0) не доказали доступ target app. Точная причина повторного запроса разблокировки этого fixture не установлена; необходимость менять ACL `login` из этого запроса не следует. ACL существующего ключа в `login` не изменялся.
|
||||
|
||||
Контроль на свежем lease `lease-190e6d0deae478e311732c28e898f902`, тот же golden `image-f11d9a1ee2991eada08c4f734c33df6d`, тот же подписанный app (Signed Time 11:17:24 UTC), **без дополнительного keychain и без изменения ACL**: до запуска отсутствовали обе версии browser encryption item; приложение само создало v2 item в штатном `login` (metadata cdat 11:52:35 UTC). SecurityAgent отсутствовал. XCTest после обычной подготовки UI fixture запустил Review, загрузил тестовую страницу и дошёл до Fire-диалога без запроса Keychain.
|
||||
|
||||
Первые два контрольных запуска не являются успешными UI-прогонами: первый остановился в LetsMove `PFMoveToApplicationsFolderIfNecessary → NSAlert.runModal` (подтверждено sample), второй — на отсутствующем loopback tests-server. После установки существующей в репозитории настройки `moveToApplicationsFolderAlertSuppress` и запуска штатного tests-server третий дошёл до Fire-диалога. Его итоговый xcresult не экспортирован: lease удалён через journal cleanup в 11:57:26 UTC при expires_at 12:50:44 UTC. Предыдущий lease аналогично удалён в 11:48:21 UTC при expires_at 12:16:36 UTC. Из исследующего чата release для этих двух VM не вызывался; инициатор cleanup по доступному журналу не установлен. Полный зелёный UI-прогон этим контролем **не подтверждён**.
|
||||
|
||||
Практическое правило для DDG Review: сначала использовать штатные default/search list и дать приложению создать собственный тестовый runtime-ключ; не добавлять отдельный keychain по предположению о неисправной подписи. При необходимости отдельного fixture проверять доступ именно target app в контексте его запуска. Готовность native GUI/SSH probe Virfield и наличие подписи сами по себе не квалифицируют произвольный дополнительный keychain.
|
||||
|
||||
## Прерывание Fire UI из-за внешнего диска, 2026-10-23
|
||||
|
||||
На macOS 12.7.6 / Xcode 13.4.1 / SIP off полный прогон 13 Fire + 2 Downloads завершился 15/15 без failures/skips; xcresult экспортирован и SHA-256 проверен (`391574a0ecdb749b51ed2ec00f21a41095d01ad1c05ae64f59c2251590607ab1`). Использовался подписанный Developer ID Review, штатный login keychain, без дополнительного keychain и изменения ACL.
|
||||
|
||||
Повтор на финальном UI fixture-коммите `895a1208cb` в lease `lease-7c4845485566c07b3c81d4c7ce5cd29f` прервался по инфраструктурной причине: в 14:49:40 UTC Virfield зарегистрировал `vm_drift`. Host unified log подтверждает unmount Samsung970EVO (`disk7s1`) в 14:49:42 UTC и повторное монтирование после unclean unmount в 14:50:30 UTC. Tart PID 89926 оставался жив, но `lsof` показывал revoked дескрипторы и недоступный cwd; SSH перестал отвечать. Это потеря backing storage запущенной VM, а не установленный дефект подписи/keychain. Причина самого отключения внешнего диска не установлена. После `cleanup succeeded` и состояния `released` обнаружен оставшийся Tart PID 89926 с точными аргументами этого удалённого worker; каталога VM уже не было. Штатный `resolve` отказал (`only leases needing attention can be resolved`). После проверки released lease, отсутствующего каталога и точного PID/argv выполнен SIGTERM только этого orphan-процесса, его завершение подтверждено. Следовательно, успешный cleanup после потери backing volume в этом случае не подтвердил завершение процесса Tart. Штатная revalidation не прошла проверку running VM + SSH; lease освобождён через `vm_release`, cleanup `job-ebcdd093838c10a1b4a1d26b417e38d3` succeeded. Прерванный повтор не считается результатом тестов.
|
||||
|
||||
## Зависание AppleParavirtGPU в Monterey UI worker, 2026-10-23
|
||||
|
||||
В свежем SIP-off Monterey lease `lease-50a13570aea1fc5518cd0bad61f42e3d` на штатном keychain первые 6 UI-методов прошли. Следующий остановился в XCTest `click` при подготовке клика в исходной очистке, до проверяемого закрытия Fire Window. `sample` runner: `_XCUIMatchingPointInFrameUsingContext`; `sample testmanagerd`: `_XCT_requestScreenshot → ImageIO HEIF → VideoToolbox → Metal → AppleParavirtGPUMetalIOGPUFamily`. Главный поток Review ожидал обычное событие в run loop; AppKit NSPersistentUI snapshot queue также ждала IOSurface. Guest kernel log: `Trying to restart GPU (Undefined)...` и `stalling for detach from AppleParavirtGPU`. Повторного unmount внешнего диска в этот период не зарегистрировано.
|
||||
|
||||
Это подтверждённая остановка графического стека VM; причина его зависания и необходимость исправления в Virfield пока не установлены. Нельзя считать её дефектом подписи/keychain или успешным тестом. Собраны три sample, kernel log, частичный xcresult; owned xcodebuild остановлен SIGINT. Архив SHA-256: `2355f674562533ead70b8f8e68cf5cfea1403dd00f8d9e3b863dd8c36a8047e0`. Все оставшиеся методы завершились успешно в двух коротких прогонах на свежих worker: `final895-a` 5/5 и `final895-c` 4/4, zero failures/skips; ранее в прерванном запуске прошли 6 других методов. Проверена уникальная совокупность всех 13 текущих Fire + 2 Downloads на коммите `895a1208cb` и одинаковый SHA-256 адаптированного под SDK13.4 runner (`2302bd20941f9229eb870dd3f5a48571e7a531ac21fe61bea03a79835337f8cc`). Assertions/timeouts не ослаблялись, анимация и GPU не отключались. Прерванный xcresult сохранён как Failed с двумя cancellation errors; его отменённый метод повторно прошёл в `final895-a`. Архивы результатов экспортированы и сверены: A `913b7e9b8be10e47df616c6d1be18698a90d140bc20f9857f933f090a2d44614`, C `da7b0a3d01b4026e2ea745e6a0a58bf813b99c52d47d7fb7cc41bbaabe5d2427`.
|
||||
|
||||
## Текущая работа 2026-10-23: UI readiness
|
||||
|
||||
Локальный `main` содержит коммиты `fd980dd`, `c7d75e7`, `1126997`, `6203177`, `5f605d8`, `7b5c124`, `4e913d5`, `5800007`; рабочее дерево чистое. Полный `make check` с race-тестами прошёл. Кэш Xcode на Mac очищен с 41 до 19 ГБ: распакованные копии удалены после сверки XIP, четыре XIP сохранены; код повторяет очистку. Для новых Xcode-образов и disposable workers действуют настройка unattended Automation Mode и native XCUITest gate 1/1; установленный daemon проверен на свежем Monterey образе и аренде. Остальные физические node-хосты требуют отдельного повторного сквозного прогона.
|
||||
|
||||
Cold boot двух node VM на htpc выявил ошибки прежней установленной версии: Sonoma `lease-1e935304d66b68d41c7850a89f79d0ae` получил SSH примерно через 17 минут, Finder стабилизировался позже двухминутного desktop timeout; Sequoia `lease-1140ca109abe50cf3c095ae5c24a496b` дал временную ошибку чтения модели. Код увеличил бюджет node-lease до 45 минут, desktop до пяти минут и повторяет временно неудавшееся чтение модели. Обе VM требовали аутентификации Automation Mode. Sequoia lease удалён после подтверждения владельца; прежние временные leases позднее освобождены. Повторный прогон на этих node-хостах ещё не зафиксирован.
|
||||
|
||||
Production 2026-10-23 обновлён clean-сборкой коммита `5800007`, подписанной доступным Apple Development сертификатом с прежним Team ID `E3R68ED529`; backup не создавался. Демон перезапущен и обслуживает действующие аренды. Старые временные leases освобождены. Full Disk Access после переподписи и свежие прогоны на всех физических node-хостах ещё требуют отдельной приёмки; Screen Recording/Downloads TCC конкретных приложений требует системного согласия.
|
||||
|
||||
**SIP-off исправление внедрено, 2026-10-23:** коммит `4e913d5` делает SIP-disabled обязательным для новых образов и аренд, блокирует SIP-on источники и проверяет фактический `csrutil status` клона до `ready`. Для Monterey 12.7.6/21H1320 подготовлена чистая SIP-off Tart-основа, опубликована в приватном GHCR и закреплена digest `sha256:3733c94473dd603e048b64000db273a63fd0c8e5520d674cede1be9dad78cfee` в production config. Встроенный `image-create` собрал golden `monterey-xcode-13.4.1-sip-off` с Xcode 13.4.1/13F100; квалификация после reboot подтвердила SIP off, unattended Automation Mode и native XCUITest 1/1. Свежая арендованная VM `lease-b88068aa62098d8c02a659f2ab5593f7` повторила `csrutil status: disabled`, `DOES NOT REQUIRE user authentication`, Xcode 13.4.1 и XCUITest 1/1; её cleanup succeeded. Старый SIP-on golden удалён через `image-delete`, запись старого шаблона удалена из production config. Временные импорт и клонированные VM очищены. На htpc свежие Sonoma 14.8.9/Xcode 16.2 и Sequoia 15.8.1/Xcode 26.3 leases прошли SIP-off, unattended Automation Mode и XCUITest 1/1; обе проверочные аренды удалены. mbp2014 Monterey — физический MacBookPro11,1 (`kern.hv_vmm_present=0`), а не VM: SIP показывает custom configuration, консоль была заблокирована и UI smoke завершился `Running Background` (1 failure). Его `ready` подтверждает SSH, не UI; проверочная аренда удалена. Три остальных mbp2014 шаблона помечены `artifact_missing`. Остальные VM/хосты сквозным прогоном ещё не охвачены.
|
||||
|
||||
## Цель: самостоятельный инстанс на поддерживаемом оборудовании
|
||||
|
||||
**Статус 2026-10-23: не реализовано и не принято.** Каждый разработчик устанавливает **свой** Virfield со своими config, state, token, образами и MCP. Общий командный сервер, общий operator token и RBAC между разработчиками не входят в эту цель. «Одна кнопка» означает единый установщик или мастер, который определяет возможности машины, выполняет доступные шаги и показывает только неизбежные системные подтверждения. Не обещать запуск на оборудовании, где macOS VM технически недоступна; показывать конкретное ограничение до установки.
|
||||
|
||||
### Проверенные пробелы
|
||||
|
||||
1. README сейчас требует вручную установить Go/Python/Tart/Packer, клонировать и собрать проект, выполнить init, редактировать config.json, копировать бинарники, запускать daemon и отдельно регистрировать MCP. init не получает готовый образ. Это не самостоятельная установка в несколько действий.
|
||||
2. Linux node VM требует вручную установить qcow2 bootstrap и OpenCore, настроить SSH, Podman/KVM/TUN, admin/sudo и профили. Автоматический путь от чистого поддерживаемого Linux-хоста до готового golden отсутствует.
|
||||
3. Клиенту без virfield CLI приходится вручную создавать SSH-ключ, pinned known_hosts и config. Локальная установка должна создавать и хранить их сама; приватный ключ остаётся на машине владельца.
|
||||
4. В продуктовой справке и docs использовалось собственное имя узла htpc (удалено из checkout 2026-10-23; выпуск ещё не собран). Runtime не проверял строку htpc, но node startup deadline 45 минут и desktop deadline 5 минут выбраны по замеру одного нашего cold boot. Кроме того, стандартные VM-рецепты и init предполагают гостевой admin с домашним каталогом /Users/admin. Это контракт конкретного профиля образа, а не путь аккаунта владельца на хосте; мастер должен выбирать совместимый профиль и проверять его, а бюджеты и требования к гостю не выводить из нашего оборудования.
|
||||
5. Monterey на установленном clean release `5800007` проверен через встроенный image-create, квалификацию образа и свежую аренду с native XCUITest 1/1. Свежие Sonoma/Sequoia Intel leases на htpc прошли UI readiness и XCUITest 1/1. Для остальных конфигураций и независимой установки нужен сквозной прогон и воспроизводимый релизный пакет.
|
||||
6. SIP-off критерий для Monterey закрыт: новый digest-pinned источник, golden и fresh lease проверены после reboot, старый SIP-on golden и шаблон удалены. Общее требование «SIP отключён на каждой VM» закреплено в коде и проверено на свежих Tart Monterey и node VM Sonoma/Sequoia; остальные доступные VM шаблоны ещё требуют сквозной проверки. Физический mbp2014 не является VM. Screen Recording/Accessibility/TCC конкретных workload отдельно не подтверждены; SIP-off сам по себе не доказывает их доступность.
|
||||
7. Web UI, HTTP API и MCP имеют разные наборы операций. Для одного собственного инстанса допустим owner token; ранее предложенный общий командный RBAC не является блокером этой цели. Требуется полный поддерживаемый локальный цикл через web UI и MCP, включая ясную диагностику и безопасные повторы.
|
||||
|
||||
### Порядок исправления и критерии
|
||||
|
||||
1. **Матрица поддержки и preflight.** Явно описать поддерживаемые хосты и провайдеры; определить OS/архитектуру, гипервизор, виртуализацию, свободные CPU/RAM/диск, доступ к storage, Xcode/Apple prerequisites и права. Возвращать причину и действие для каждого отказа. Все пути, имена узлов, порты и бюджеты брать из выбора пользователя или обнаруженного окружения, не из нашего deployment.
|
||||
2. **Пакет и мастер установки.** Подписанный проверяемый пакет без обязательной сборки исходников. Мастер создаёт отдельные private config/state/token, предлагает storage, получает/проверяет pinned base, регистрирует собственный сервис и MCP в выбранном клиенте; шаги идемпотентны и дают rollback. Для node backend автоматизировать поддерживаемый bootstrap или до выбора явно сообщать, что он пока не поддерживает one-click.
|
||||
3. **Параметризовать готовность и приватность.** Вместо одного фиксированного 45/5-минутного бюджета использовать профиль провайдера и конфигурируемые пределы с безопасными default, общей deadline и фазовой диагностикой. Обязательный gate для каждого нового образа и клона: SIP-off; SIP-on образ нельзя публиковать или выдавать в lease. Существующие SIP-on goldens пересоздать из совместимого SIP-off источника и подтвердить после reboot; активные VM не менять на месте. Все Xcode-образы и рабочие клоны подтверждать native XCUITest с >=1 выполненным тестом до ready; проверить на быстрых и медленных хостах. Отдельно объявлять и проверять нужные workload capabilities (например Screen Recording, Accessibility, доступ к защищённым папкам) внутри создания образа или подготовки lease. Если требуемое разрешение не получено, lease не должен объявляться готовым к такому workload. Пользовательский тестовый скрипт не должен настраивать TCC/SIP/Automation Mode.
|
||||
4. **Одинаковый продуктовый цикл в UI и MCP.** Создание образа, Apple sign-in при необходимости, acquire, локальный SSH identity/config, выполнение workload через SSH, экспорт, renew/recovery и release доступны без ручного JSON, known_hosts и работы с каталогом daemon. Операции опираются на один API и одинаковые durable job/idempotency semantics.
|
||||
5. **Приёмка независимого пользователя.** На чистых поддерживаемых Apple Silicon Mac и Linux/KVM-хосте, с пустыми config/state и без наших путей/образов, пройти мастер → подключить UI/MCP → создать golden → получить VM → выполнить build и XCUITest → экспортировать результат → release. Повторить после restart, медленного cold boot, потери сети, нехватки диска и истечения Apple session. Выпускать только clean signed package с hashes и протоколом этих прогонов.
|
||||
|
||||
## Ограничения и дальнейший план
|
||||
|
||||
Следующие задачи не входят в принятую установленную VM/MCP/Broker-приёмку и не объявляются реализованными:
|
||||
@@ -72,7 +131,41 @@ macOS make check/build/Staticcheck прошли; настоящий read-only vo
|
||||
- Реализовать signed node-agent, WoL relay/power intents, grants/connectors и physical-host/browser desktop при отдельном приоритете.
|
||||
- Развивать /api/v3 capability selection, Target/EnvironmentProfile/ConnectionGrant, short-lived access, VS Code extension и linked Console/Broker flows.
|
||||
- Расширить crash/host-loss/partition/full-disk matrix, metrics/alerts, signed promotion/revocation.
|
||||
- [x] Изучить MDM для VM Virfield: способ подключения, требования, польза и решение (итог ниже, 2026-10-23).
|
||||
|
||||
Broker reviewer исправление уже входит в запушенный Broker main `13c29ac`. Завершённые локальные и remote ветки Broker удалены после содержательной сверки, reviewer worktree сохранён detached. Архив исходного patch: [[personal/projects/archive/virfield-release-cleanup-2026-10-16/docs/acceptance/broker-reviewer-readonly]].
|
||||
|
||||
Детальные прежние планы сохранены в [[personal/projects/archive/virfield-release-cleanup-2026-10-16/docs/VIRFIELD-3-PLAN]] и архиве superpowers. Их старые pending-статусы не заменяют результаты выше. Автоматизация остаётся на паузе по указанию пользователя.
|
||||
|
||||
## MDM для Virfield: исследование и решение (2026-10-23)
|
||||
|
||||
**Решение: не включать MDM в текущий путь создания disposable VM.** Virfield не содержит MDM-сервера, enrollment profile или операции регистрации VM. Сейчас он применяет SIP/Automation Mode/TCC через guest scripts и проверяет результат на образе; native XCUITest даёт прямое доказательство готовности runner. MDM не исправляет сам по себе прежний пропуск Automation Mode.
|
||||
|
||||
Подключение потребовало бы отдельного MDM-провайдера, HTTPS endpoint, сертификата APNs, identity certificate для каждого гостя, enrollment profile и регистрации каждой VM. Для Apple Business Manager/ADE нужны ещё организационные связи и назначение устройств; пригодность ADE именно для наших виртуальных Mac не подтверждена и должна проверяться на отдельном disposable образе. Клонирование уже зарегистрированного golden недопустимо как проектное допущение: enrollment и identity нужно создавать для каждого worker отдельно, а при release удалять запись и сертификаты на сервере.
|
||||
|
||||
Польза возможна для долговечных физических Mac: централизованные настройки и аудит, управляемые приложения, отдельные PPPC разрешения (например Full Disk Access и PostEvent). Для краткоживущих VM цена — внешний сервис, сертификаты, сеть/APNs, регистрация и очистка каждого worker. Главное ограничение для UI-тестов: Apple не разрешает MDM-профилем заранее дать ScreenCapture; только запретить. На macOS 27 старый PPPC grant для Accessibility убран; новый declarative AppSettings предлагает пользователю запрос согласия, но не выдаёт доступ без него. Поэтому MDM не заменяет наши UI-readiness проверки, настройку Automation Mode и человеческое согласие там, где его требует macOS.
|
||||
|
||||
Источники Apple: [MDM enrollment](https://developer.apple.com/documentation/devicemanagement/deploying-device-management-enrollment-profiles), [инфраструктура/APNs](https://support.apple.com/en-gb/guide/deployment/depceaf9c713/web), [PPPC и ScreenCapture](https://developer.apple.com/documentation/devicemanagement/privacypreferencespolicycontrol/services-data.dictionary), [macOS 27 AppSettings](https://developer.apple.com/documentation/devicemanagement/appsettings). Проверка текущего кода: `internal/qualify/automation.go`, `internal/guestscripts/security.sh`, `internal/guestscripts/provision27.sh`, `internal/config/config.go`.
|
||||
|
||||
|
||||
## Баг: ложная занятость VM при отключённом Tart storage (2026-10-26)
|
||||
|
||||
**Причина подтверждена по коду и текущему статусу Virfield.** Когда все настроенные Tart storage недоступны (сейчас `samsung-tart` сообщает `volume_unmounted`), `internal/tart/client.go` подставляет `HostUsed = HostMax`, чтобы закрыть запуск. Контроллер затем считает это реальными неизвестными VM: `capacityOn` показывает два «дополнительных слота», а `resources()` выставляет `resource_unknown: An active VM is missing from inventory`. Это не две реальные VM и не нехватка CPU/RAM; это синтетическое значение, ошибочно использованное как счётчик.
|
||||
|
||||
### Путь исправления
|
||||
|
||||
- Оставлять `HostUsed` и `UsedVMs` счётчиками фактически наблюдаемых VM; не использовать их для кодирования запрета.
|
||||
- Закрывать локальную capacity отдельно, когда ни один primary Tart storage недоступен, и показывать конкретный blocker, например `storage container samsung-tart unavailable: volume_unmounted`.
|
||||
- Передавать тот же blocker в ошибку acquire, чтобы объяснение не говорило о занятых слотах, если слоты фактически свободны.
|
||||
- Сохранить fail-closed поведение: недоступный storage не должен позволять запуск/сборку, а доступный другой primary storage не должен блокироваться без необходимости.
|
||||
- Регрессии: все storage отключены → фактическое `used=0`, `available=0`, причина — storage; нет ложной ошибки про отсутствующую активную VM. Также проверить смешанный случай с одним доступным storage и обычный доступный Tart путь.
|
||||
|
||||
### Текущее состояние
|
||||
|
||||
В `~/Developer/virfield` создан незакоммиченный локальный черновик: удалена подстановка `HostUsed = HostMax`; storage blocker перенесён в расчёт capacity; сообщение отказа включает blockers; добавлены regression tests. Прошли `go test ./internal/tart ./internal/control ./internal/domain` и `git diff --check`. Полные проверки `make check`/build, deployment и production-проверка ещё не выполнены. Изменения не закоммичены и не запушены; локальная `main` уже содержит 10 коммитов сверх `origin/main`, поэтому перед push нужно проверить полный набор коммитов.
|
||||
|
||||
### Приёмка после деплоя
|
||||
|
||||
1. На действующем статусе при отключённом диске увидеть фактическое число VM, `available=0` и точную причину storage; ошибка «active VM is missing from inventory» отсутствует.
|
||||
2. Убедиться, что lease/build не стартует через недоступное хранилище.
|
||||
3. После монтирования диска дождаться свежего inventory и проверить доступность шаблонов и нормальное распределение слотов.
|
||||
@@ -1,5 +1,7 @@
|
||||
# Docker на Mac — проблема с диском и сборкой образов
|
||||
|
||||
> **2026-10-21: действующие автоматические правила** — [[personal/tech/macos-voom-cleanup|Voom, Eagle и автоматическая очистка Mac]]. Там описаны расписания, сроки, защита данных и ограничения Docker. Ниже сохранены исторические разборы и ручные сценарии очистки.
|
||||
|
||||
_Последнее обновление: 2026-09-29_
|
||||
|
||||
> **2026-09-29: выполнена большая чистка, освобождено 41 ГБ** (57 ГБ → 16 ГБ, 61% → 17%).
|
||||
|
||||
@@ -159,7 +159,30 @@ ssh truenas_admin@mallexxx.duckdns.org \
|
||||
|
||||
## Восстановление quarantine
|
||||
|
||||
Если Prowlarr показывает старый `IndexerStatus`, сначала сделать backup SQLite. Остановить только Prowlarr, удалить только записи `IndexerStatus`, проверить `PRAGMA quick_check`, запустить и выполнить реальный search. Не удалять `prowlarr.db` и не считать health единственным тестом.
|
||||
При старом предупреждении сначала подтвердить реальный search, выполнить одиночный штатный тест соответствующего индексатора и обновить health. Для Lidarr этот путь проверен 2026-10-26: RuTracker test + `CheckHealth` сняли предупреждение без редактирования БД. При API-тестировании использовать действующие секреты, а не маскированные значения из GET. Ручная очистка `IndexerStatus` — резервный способ только при неработающем штатном восстановлении: backup SQLite, остановка только затронутого сервиса, изменение только нужного статуса, `PRAGMA quick_check`, запуск и реальный search. Не удалять всю БД и не считать health единственным тестом.
|
||||
|
||||
## Повторный сбой 2026-10-26 UTC / 2026-10-27 Бишкек
|
||||
|
||||
Проверено на Taiga; различать два независимых дефекта.
|
||||
|
||||
1. **Фактические отказы поиска:** Prowlarr писал `SQLiteException Busy (5): database is locked`. У RuTracker ошибки зафиксированы в 16:08:13 UTC и 17:20:59 UTC, в том числе в `GetCookies → ProviderStatusRepository.FindByProviderId`, до обращения к трекеру. Аналогичные ошибки были у Kinozal, NoNaMeClub и RuTor. Позже такие же блокировки продолжались в Lidarr. Это не доказательство потери авторизации RuTracker.
|
||||
2. **Ошибка watchdog:** старый скрипт искал `id="logged-in-username"` через grep в сыром JSON FlareSolverr. Кавычки HTML в JSON экранированы, поэтому рабочая авторизация ошибочно считалась потерянной и session пересоздавалась каждые пять минут. На одной живой сессии подтверждено: parsed HTML logged-in=true, старый grep=false.
|
||||
|
||||
Исправлен `/mnt/RED_2TB/docker/arr/flaresolverr-entrypoint.sh`: сначала разбирается JSON, затем проверяется HTML. Повторный login выполняется при явно обнаруженной форме входа; ошибки транспорта, challenge и некорректный ответ считаются неопределённым состоянием и не уничтожают действующую сессию. Таймаут проверки согласован с `BROWSER_TIMEOUT=180000`: 180 секунд внутри FlareSolverr и 240 секунд у curl. Смена egress-IP по-прежнему вызывает восстановление.
|
||||
|
||||
Backup исходного скрипта:
|
||||
`/mnt/RED_2TB/docker/arr/flaresolverr-entrypoint.sh.before-json-auth-fix-20261026T175021Z`.
|
||||
Перезапущен только FlareSolverr; SQLite вручную не редактировалась.
|
||||
|
||||
Приёмка:
|
||||
- синтаксис shell и пять проверок классификатора ответа прошли;
|
||||
- после перезапуска и очередного пятиминутного цикла вход сохранился, HTTP 200, ложных refresh в логах нет;
|
||||
- реальный поиск Prowlarr по RuTracker: HTTP 200, 50 результатов за 17 секунд;
|
||||
- одиночный штатный тест RuTracker в Lidarr прошёл;
|
||||
- после `CheckHealth` предупреждение о недоступных индексаторах исчезло; осталось только уведомление об обновлении Lidarr;
|
||||
- поисковые проверки не запускали новые скачивания.
|
||||
|
||||
Ограничение: причина локальных блокировок SQLite не устранена этим изменением. На NAS измерено `/proc/pressure/io`: some около 66–70%, full около 50–54%; ZFS pool ONLINE без ошибок, первый mirror заполнен почти полностью (1.79 TiB занято, 27 GiB свободно), новый mirror почти пуст. Это подтверждает высокое ожидание I/O и неравномерное размещение данных, но не доказывает единственную причину блокировки. Настройки ZFS, маршрутизация и мониторинг музыкальной библиотеки не менялись.
|
||||
|
||||
## Итоговый рабочий результат
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
---
|
||||
title: home-network-config — skill notes
|
||||
created: '2026-09-23'
|
||||
updated: '2026-09-23'
|
||||
updated: '2026-10-30'
|
||||
type: tech
|
||||
namespace: personal
|
||||
tags:
|
||||
@@ -81,6 +81,14 @@ if ifconfig | grep -q 10.99.0.2; then nc 10.99.1.2 22; else nc kraken 22; fi
|
||||
- Kraken Samba: `map to guest = bad user` обязателен в `[global]` для guest-доступа.
|
||||
- USB-девайсы в docker: `/dev/serial/by-id/...` **НЕ работают**, только `/dev/ttyUSB<N>`.
|
||||
|
||||
## Телевизор в Новосибирске — проверено 2026-10-30
|
||||
|
||||
- **Konka Q85, 85″, webOS 7.5.6**: текущий адрес `192.168.2.124`, сетевое имя `LGwebOSTV`, сеть OpenWrt `192.168.2.2`.
|
||||
- Установлен Homebrew Channel 0.7.3, root проверен после перезагрузки. Выполнено обратимое отключение ACR, рекламы, диагностики, рекомендаций и голосовых/ThinQ-компонентов; защищённые системные службы сохранены.
|
||||
- Подробный статус, ограничения проверок, доступ и откат: [[personal/tech/konka-q85-novosibirsk]].
|
||||
- Это отдельный ТВ; сведения о `192.168.1.70` / webOS 5.4.2 из [[family/how-to/htpc-webos-luna]] к нему не относятся.
|
||||
- Прямой SSH по ключу к `root@192.168.2.2` в этой сессии проверен. SSH на самом ТВ не включали; для управления использовали WSS `3001` и Homebrew.
|
||||
|
||||
## Связанное
|
||||
|
||||
- [[family/how-to/rasputin-router]] — policy routing, `ip rule`, транзит между сегментами
|
||||
|
||||
@@ -0,0 +1,186 @@
|
||||
---
|
||||
title: 'Konka Q85 — Новосибирск: статус и изменения'
|
||||
created: '2026-10-30'
|
||||
updated: '2026-10-30'
|
||||
type: tech
|
||||
tags:
|
||||
- tv
|
||||
- konka
|
||||
- webos
|
||||
- novosibirsk
|
||||
- homebrew
|
||||
- privacy
|
||||
related:
|
||||
- '[[personal/tech/home-network-config]]'
|
||||
- '[[family/how-to/htpc-webos-luna]]'
|
||||
- '[[personal/tech/lampac-truenas]]'
|
||||
---
|
||||
# Konka Q85 — Новосибирск: статус и изменения
|
||||
|
||||
## Lampac установлен и проверен — 2026-10-30
|
||||
|
||||
Установлен `com.lampac.tv` версии1.0.0 через существующий Homebrew Channel с проверкой SHA256. Сервер и сохранённый `lampac_url`: `http://192.168.2.197:9118` (TrueNAS). Полная схема: [[personal/tech/lampac-truenas]].
|
||||
|
||||
Настройки клиента: **`proxy_tmdb=true`, `proxy_tmdb_auto=false`**. Автоопределение региона выключало прокси и ломало встроенные постеры, хотя Catalog уже был настроен. На сервере прокси отдельно включён для TMDB API/изображений, `posterApi` и `serverproxy.image`; глобальный прокси видео не включён.
|
||||
|
||||
Подтверждены поиск «дюна» через клавиатуру без JavaScript-ошибок, 7 встроенных и28 собственных постеров (сломанных0), начало прямого воспроизведения тестового H.264640×360 с NAS (`readyState=4`, ошибок нет). Длительное воспроизведение/онлайн-раздача и звук на слух отдельно не подтверждены. Общая история на TrueNAS через API; репликации SQLite нет.
|
||||
|
||||
При работе Lampac доступна CDP-цель9998: выбирать по URL с `com.lampac.tv`, ждать `appready`. Root-вызов Homebrew через `PalmServiceBridge` проверен также из контекста установленного Lampac; SSH/Telnet на ТВ ради этого не включали. Диагностические ответы не выводить поверх приложения. Временные HTTP-установщик на роутере18085 и SSH-перенаправления после работы удалены. Настройки root/privacy ниже не менялись.
|
||||
|
||||
Состояние проверено **2026-10-30** во время настройки телевизора. Местоположение — Новосибирск, по указанию владельца. Это отдельный телевизор; не путать с ТВ `192.168.1.70` / webOS 5.4.2 из [[family/how-to/htpc-webos-luna]].
|
||||
|
||||
## Устройство и сеть
|
||||
|
||||
- Konka, диагональ 85″ — со слов владельца; модель, сообщаемая самим ТВ: **Q85**.
|
||||
- ПО: **04.56.00** — сообщено владельцем; API полной версии ПО отказал в доступе, поэтому это значение не выдаём за независимо прочитанное.
|
||||
- webOS **7.5.6**, DVB — непосредственно прочитано с телевизора.
|
||||
- Ядро: `5.4.96-115.28.1.27.mirima.1`, архитектура `aarch64`.
|
||||
- Текущий адрес: **192.168.2.124**, имя DHCP: `LGwebOSTV`, MAC: `7c:64:6c:33:82:37`. Это обнаруженный адрес, закрепление DHCP не проверялось и не настраивалось.
|
||||
- Шлюз OpenWrt: **192.168.2.2**, Xiaomi Redmi Router AX6S. SSH `root@192.168.2.2` по настроенному ключу проверен.
|
||||
- WSS управления ТВ: `192.168.2.124:3001`. Выполнено сопряжение с подтверждением на экране. Соединение WS на 3000 сбрасывалось; для работы использовали WSS 3001.
|
||||
- SSH на самом ТВ не включали. Проверенные до настройки порты 22, 9922 и 9991 были закрыты; доступ SSH к роутеру не означает наличия SSH на телевизоре.
|
||||
|
||||
Связанный документ сети: [[personal/tech/home-network-config]].
|
||||
|
||||
## Root и Homebrew
|
||||
|
||||
2026-10-30 выполнен jailbreak через **DangBro**. На ТВ подтверждено наличие `com.webos.app.dangbei-overlay`; код запускался в его контексте. Проверенный установщик и Homebrew Channel раздавались временно с роутера, без прошивки системных разделов.
|
||||
|
||||
- Установлен **Homebrew Channel 0.7.3**, appId `org.webosbrew.hbchannel`.
|
||||
- Прямой вызов `id` вернул `uid=0(root) gid=0(root)`; root повторно подтверждён после перезагрузок.
|
||||
- Приложение LG Developer Mode `com.palmdts.devmode` удалено установщиком, поскольку конфликтует с сохранением root. Повторно устанавливать его без проверки совместимости не следует.
|
||||
- Включившийся при установке Telnet без пароля отключён, закрытие порта 23 проверено. Сохранён флаг `/var/luna/preferences/webosbrew_telnet_disabled`.
|
||||
- Временные серверы на роутере `:18085` остановлены; их каталоги, установщики и тестовые ролики на роутере удалены. Постоянной службы на роутере для этих изменений нет.
|
||||
|
||||
## Найденное состояние до отключения
|
||||
|
||||
- LivePlus был включён: `option.livePlus = "on"`, `eulaStatus.acrOnAllowed = true`.
|
||||
- Были приняты голосовые согласия: `voiceAllowed = true`, `voice2Allowed = true`.
|
||||
- `additionalDataAllowed` и `shoppingOnAllowed` были `true`.
|
||||
- Реклама главного экрана и рекомендации уже были выключены: `general.homePromotion = "off"`, `other.contentRecommendation = "off"`.
|
||||
- Согласия на персонализированную рекламу и удалённую диагностику уже были выключены.
|
||||
- Работали рекламные, диагностические, рекомендательные и голосовые службы, в том числе `admanager`, `contentminer`, `rdxd`, `uploadd`, `remotelogger`, `service-logger`, `voiceinput`, `voiceconductor`, `nlpmanager`, `performer`.
|
||||
- Установлены LivePlus/ACR-компоненты для HDMI, рекламные оболочки, Alexa, Google Assistant и Алиса. Само наличие пакета или процесса не доказывает запись разговоров либо отправку данных.
|
||||
- Homebrew уже монтировал очереди `rdxd/uploadd` только для чтения; это ограничение диагностических очередей, а не полное отключение ACR.
|
||||
- В отдельном снимке сети внешних TCP-соединений не было. Длительное наблюдение, расшифровка трафика и доказательство отсутствия периодических отправок не выполнялись.
|
||||
|
||||
## Что отключено по согласованию владельца
|
||||
|
||||
Отключены найденные компоненты следующих групп:
|
||||
|
||||
- ACR и реклама: `acr2`, `admanager`, `adoverlay-service`.
|
||||
- Диагностика и загрузка журналов: `rdxd`, `uploadd`, `remotelogger`, `service-logger`.
|
||||
- Рекомендации и уведомления: `contentminer`, `nudge`, `sportsalarm`.
|
||||
- Голос, Alexa и ThinQ/IoT: `voiceinput`, `voiceconductor`, `nlpmanager`, `performer`, `amazon-alexa-adapter`, `amazon-alexa-vsk`, `lg.thinqai.adapter`, `iot-client`, `mqtt-client`.
|
||||
- `musicrecognition` предусмотрен списком отключений, но при проверке соответствующая программа не найдена; не считать её установленной или реально отключённой.
|
||||
|
||||
LivePlus переведён в `off`. В существующем объекте согласий выключены ACR, голосовые, рекламные, дополнительные данные и shopping-согласия; общие условия, разрешение сети и непонятный по назначению `chpAllowed` сохранены.
|
||||
|
||||
**Следствие:** голосовой поиск, Alexa и связанные ThinQ/IoT-функции больше не должны работать. Приложения Google Assistant/Алисы и другие системные оболочки не удалялись; отключён обслуживающий голосовой тракт.
|
||||
|
||||
## Как устроены изменения
|
||||
|
||||
Системные программы не стирались и не перезаписывались. Поверх выбранных исполняемых файлов, включая уже существовавшие копии в sandbox-каталогах, монтируется в памяти безвредный скрипт с `exit 0`. Выбранные systemd-службы останавливаются; оставшиеся целевые процессы завершаются. При итоговой проверке целевых процессов не было, ошибок подмен не было.
|
||||
|
||||
Файлы на телевизоре:
|
||||
|
||||
- Управление: `/var/lib/konka-privacy/control.py`.
|
||||
- Исходные настройки и состояния служб: `/var/lib/konka-privacy/before.json`.
|
||||
- Список временных подмен: `/var/lib/konka-privacy/mounts.json`.
|
||||
- Автозапуск Homebrew: `/var/lib/webosbrew/init.d/70-konka-privacy`.
|
||||
- Журнал применения после загрузки: `/tmp/konka-privacy-boot.log`.
|
||||
- Флаг запрета применения: `/var/lib/konka-privacy/disabled`.
|
||||
- Отметка успешной итоговой проверки: `/var/lib/konka-privacy/verified`.
|
||||
|
||||
**Особенность:** во время проверки webOS восстановила часть согласий и LivePlus при перезагрузке. Поэтому настройки повторно выключаются в автозапуске вместе со службами. Обработчик ждёт 35 секунд после вызова из загрузочного механизма Homebrew; отключения не действуют с самой первой секунды включения. На проверенной загрузке успешный результат получен примерно на 83-й секунде uptime.
|
||||
|
||||
При первичной проверке был предусмотрен автоматический откат, если итоговая проверка не завершится. Сейчас отметка `verified` уже существует: **не рассчитывать на автоматический откат будущих изменений**, использовать команды ниже.
|
||||
|
||||
## Что сохранено
|
||||
|
||||
`sdx`, `ss.gateway`, SAM, Luna Hub, настройки, системный интерфейс, сеть, HDMI, видеовывод и звуковые службы не включены в список отключений. Приложения не удалялись, домашний экран не заменялся, системные плитки не скрывались, перезапуск SAM для таких изменений не выполнялся.
|
||||
|
||||
Системные разделы, загрузчик, ядро и прошивка не перезаписывались. Блокировку обновлений и новые DNS/hosts-списки эта настройка не добавляла.
|
||||
|
||||
## Проверка результата
|
||||
|
||||
После повторной перезагрузки подтверждены:
|
||||
|
||||
- root: `uid = 0`;
|
||||
- LivePlus: `off`; выбранные согласия выключены;
|
||||
- отсутствие работающих целевых процессов;
|
||||
- активное состояние SAM, Luna Hub, surface-manager, umediaserver, videooutputd, audiooutputd и audiod;
|
||||
- наличие процессов `sdx`, `SettingsService`, `connmand`;
|
||||
- наличие обработчика автозагрузки и отметки успешной проверки;
|
||||
- воспроизведение отдельного тестового H.264-видео: время 12.082 секунды, 640×360, `readyState = 4`, ошибок нет; видеовывод MAIN подключён и не muted, около 24 кадров/с.
|
||||
|
||||
Один предварительный тест с коротким зацикленным роликом получил ошибку декодирования; этот результат не считали подтверждением нормального воспроизведения. После завершения автоприменения выполнены отдельные успешные проверки, включая более длинный ролик без цикла.
|
||||
|
||||
Физическое звучание динамиков, сигнал внешнего HDMI-устройства, все стриминговые приложения и цикл сна/пробуждения отдельно не проверялись. Активность звуковых служб не равна проверке звука на слух.
|
||||
|
||||
До изменений уже были failed-unit: `accountmanager`, `bugreportd`, `crashreportd`, `dropbear`, `kadpd`, `kdrivers`. Итоговый список совпал с исходным; не приписывать эти состояния выполненному отключению.
|
||||
|
||||
## Откат и диагностика
|
||||
|
||||
Команды выполнять **в root-контексте на телевизоре**, а не на OpenWrt.
|
||||
|
||||
Проверка:
|
||||
|
||||
```sh
|
||||
python3 /var/lib/konka-privacy/control.py status
|
||||
cat /tmp/konka-privacy-boot.log
|
||||
```
|
||||
|
||||
Полный откат с восстановлением исходных настроек и удалением автозапуска отключений:
|
||||
|
||||
```sh
|
||||
python3 /var/lib/konka-privacy/control.py restore
|
||||
```
|
||||
|
||||
После успешного отката полностью перезагрузить ТВ. Режим standby не заменяет полную перезагрузку.
|
||||
|
||||
Для запрета повторного применения при следующей полной загрузке:
|
||||
|
||||
```sh
|
||||
touch /var/lib/konka-privacy/disabled
|
||||
```
|
||||
|
||||
Затем полностью перезагрузить ТВ. Этот способ снимает временные подмены за счёт перезагрузки, но **сам по себе не восстанавливает прежние значения согласий**; для полного возврата нужен `restore`.
|
||||
|
||||
Не удалять `before.json` перед откатом.
|
||||
|
||||
## Доступ для дальнейшего обслуживания
|
||||
|
||||
Проверенный путь этой сессии: SSH к OpenWrt → временная локальная раздача страницы → WSS-сопряжение с ТВ → запуск страницы через `com.webos.app.dangbei-overlay` → вызов Homebrew из `PalmServiceBridge`:
|
||||
|
||||
```js
|
||||
var bridge = new PalmServiceBridge();
|
||||
bridge.onservicecallback = function (result) { /* обработать JSON-ответ */ };
|
||||
bridge.call(
|
||||
"luna://org.webosbrew.hbchannel.service/exec",
|
||||
JSON.stringify({command: "python3 /var/lib/konka-privacy/control.py status"})
|
||||
);
|
||||
```
|
||||
|
||||
Это работает в подходящем приложении на ТВ, а не в обычном браузере компьютера. Прямой запрос `ssap://org.webosbrew.hbchannel.service/exec` через WSS вернул 404; не считать его рабочим способом root-доступа. Обычное открытие страницы установщика на компьютере тоже не выполняет код в контексте ТВ.
|
||||
|
||||
Для `luna-send` на **этом** телевизоре проверен явный appId:
|
||||
|
||||
```sh
|
||||
luna-send -w 5000 -n 1 -f -a org.webosbrew.hbchannel.service \
|
||||
luna://com.webos.settingsservice/getSystemSettings \
|
||||
'{"category":"option","keys":["livePlus"]}'
|
||||
```
|
||||
|
||||
Не переносить сюда без проверки рецепты старого ТВ с webOS 5.4.2. Секреты сопряжения и приватные SSH-ключи в заметку не копировать. Временную раздачу после обслуживания останавливать.
|
||||
|
||||
## Источники использованных решений
|
||||
|
||||
- [DangBro](https://github.com/azoffshowy/dangbro) — выполненный способ root.
|
||||
- [Homebrew Channel](https://github.com/webosbrew/webos-homebrew-channel).
|
||||
- [lg-webos-ad-killer](https://github.com/nurikk/lg-webos-ad-killer) — примеры обратимого отключения; готовый полный скрипт на ТВ не устанавливался.
|
||||
- [CleanYourTV для webOS: debloat](https://lasharor.github.io/cleanyourtv-WebOS/debloat/) — группы служб и временные подмены.
|
||||
- [RootMyTV: системные разделы не перезаписывать](https://rootmy.tv/warning).
|
||||
- [Glasshouse issue 366](https://github.com/rorygallagher2024/glasshouse/issues/366) — проблемы изображения/звука при перезапуске SAM.
|
||||
|
||||
Публичного проверенного списка отключений именно для Konka Q85 / webOS 7.5.6 в ходе поиска не найдено. Основание текущего статуса — фактические проверки этого телевизора, а не обещание совместимости чужого полного набора изменений.
|
||||
@@ -1,7 +1,7 @@
|
||||
---
|
||||
title: Lampac — развёртывание и эксплуатация (Кра́кен)
|
||||
created: '2026-09-22'
|
||||
updated: '2026-09-25'
|
||||
updated: '2026-11-01'
|
||||
type: tech
|
||||
namespace: personal
|
||||
tags:
|
||||
@@ -21,10 +21,35 @@ related:
|
||||
- '[[personal/tech/multistream-single-flow-limit]]'
|
||||
- '[[family/how-to/kraken-network]]'
|
||||
- '[[family/how-to/tv-luna-send]]'
|
||||
- '[[personal/tech/lampac-truenas]]'
|
||||
---
|
||||
|
||||
# Lampac — развёртывание и эксплуатация (Кра́кен)
|
||||
|
||||
## Kraken: дисковый кэш TorrServer — проверено 2026-11-01
|
||||
|
||||
На Kraken стандартный RAM-кэш96 МиБ заменён на **2 ГиБ кэша на диске**: `CacheSize=2147483648`, `UseDisk=true`, `TorrentsSavePath=/lampac/cache/torrserver`, `RemoveCacheOnDrop=true`.
|
||||
|
||||
Хост-каталог: `/srv/dev-disk-by-uuid-6194539b-03e0-4f33-986b-4da09834e82f/lampac/cache/torrserver`; используется существующий постоянный cache bind mount. Настройка сохраняется в `data/ts/settings.json`. Перед переключением было около1,2 ТБ свободного места; активных раздач не было. Старые настройки и список торрентов сохранены с mode0600 в `backups/kraken-disk-cache-20261101/`.
|
||||
|
||||
Применено через авторизованный локальный API TorrServer внутри контейнера; пароль из `data/ts/accs.db` не публикуется. Контейнер не пересоздавался, явный Docker-лимит памяти Kraken не добавлялся и не менялся. Это2 ГиБ **дискового**, а не зарезервированного RAM-кэша; рабочая память и освобождаемый файловый кэш ОС остаются.
|
||||
|
||||
Проверены API и сохранённый конфиг. Отдельный временный Ubuntu-торрент подтвердил реальную запись8 файлов фрагментов на диск (около1,98 МБ) и чтение1 МиБ потока HTTP Range. Тестовая раздача удалена после проверки. Видео не переводилось на сетевой прокси.
|
||||
|
||||
Штатная смена настроек MatriX.135 сбрасывает активные торренты и заново подключает движок; если фильм открыт при будущей смене режима, может потребоваться открыть его повторно. Описание общей схемы — [[personal/tech/lampac-truenas]], инструкция — [lampac-scripts/deploy/README.md](https://git.mallexxx.duckdns.org/git_admin/lampac-scripts/src/branch/main/deploy/README.md).
|
||||
|
||||
## Актуальная схема на 2026-10-30: Kraken + TrueNAS
|
||||
|
||||
Рабочая схема, адреса, настройки и восстановление — [[personal/tech/lampac-truenas]]. Официальный Lampac1.87.3: Kraken arm64, TrueNAS amd64; наш репозиторий — аддон, не форк сервера. Репозиторий и инструкция: [lampac-scripts/deploy](https://git.mallexxx.duckdns.org/git_admin/lampac-scripts/src/branch/main/deploy/README.md).
|
||||
|
||||
На TrueNAS приложение работает в `/mnt/RED_2TB/docker/lampac`, LAN `http://192.168.2.197:9118`; клиент Konka Q85 в Новосибирске (`192.168.2.124`) установлен и проверен. Прокси только метаданных/постеров: отдельный `lampac-egress` через Kraken; глобальный прокси видео не включён. На Konka обязательно `proxy_tmdb=true`, `proxy_tmdb_auto=false`; настроены также `tmdb.proxyapi/proxyimg`, `posterApi`, `serverproxy.image`.
|
||||
|
||||
Общая TimeCode теперь на TrueNAS, Kraken обращается через HTTPS API с отдельным `history_key` и тем же `uid`. Синхронизации SQLite нет; 9 записей сохранены. Генератор каталога/писатель Obsidian один, на Kraken; на NAS передаются только готовые JSON. Бэкап NAS учитывает uid950/uid1000: БД/WAL/SHM mode0664, group1000. Запись после бэкапа проверена.
|
||||
|
||||
Ошибка поиска `title.toLowerCase()` исправлена в Catalog-аддоне: discovery каждого источника привязан к имени каталога, отдельная повторная регистрация поиска убрана. Проверены реальный поиск на ТВ, встроенные и собственные постеры, прямое тестовое воспроизведение. Подробные границы проверки — в новой заметке.
|
||||
|
||||
Ниже сохранена история настройки Kraken за сентябрь; прежние указания читать активную историю из локальной SQLite Kraken заменены схемой выше.
|
||||
|
||||
> Технический справочник. Развёрнуто 2026-09-22. План и статус шагов — [[personal/plans/lampac-kraken]].
|
||||
|
||||
## 🔴 2026-09-25: деплой `plugin.js` модуля Catalog — контракт и подводные камни
|
||||
|
||||
@@ -0,0 +1,112 @@
|
||||
---
|
||||
title: Lampac на TrueNAS и Konka Q85 — рабочая схема
|
||||
created: '2026-10-30'
|
||||
updated: '2026-11-01'
|
||||
type: tech
|
||||
namespace: personal
|
||||
tags:
|
||||
- lampac
|
||||
- truenas
|
||||
- konka
|
||||
- webos
|
||||
- timecode
|
||||
related:
|
||||
- '[[personal/tech/lampac-deployment]]'
|
||||
- '[[personal/tech/konka-q85-novosibirsk]]'
|
||||
- '[[family/how-to/truenas-infrastructure]]'
|
||||
---
|
||||
# Lampac на TrueNAS и Konka Q85 — рабочая схема
|
||||
|
||||
## Kraken: дисковый кэш TorrServer — проверено 2026-11-01
|
||||
|
||||
На Kraken стандартный RAM-кэш96 МиБ заменён на **2 ГиБ кэша на диске**: `CacheSize=2147483648`, `UseDisk=true`, `TorrentsSavePath=/lampac/cache/torrserver`, `RemoveCacheOnDrop=true`.
|
||||
|
||||
Хост-каталог: `/srv/dev-disk-by-uuid-6194539b-03e0-4f33-986b-4da09834e82f/lampac/cache/torrserver`; используется существующий постоянный cache bind mount. Настройка сохраняется в `data/ts/settings.json`. Перед переключением было около1,2 ТБ свободного места; активных раздач не было. Старые настройки и список торрентов сохранены с mode0600 в `backups/kraken-disk-cache-20261101/`.
|
||||
|
||||
Применено через авторизованный локальный API TorrServer внутри контейнера; пароль из `data/ts/accs.db` не публикуется. Контейнер не пересоздавался, явный Docker-лимит памяти Kraken не добавлялся и не менялся. Это2 ГиБ **дискового**, а не зарезервированного RAM-кэша; рабочая память и освобождаемый файловый кэш ОС остаются.
|
||||
|
||||
Проверены API и сохранённый конфиг. Отдельный временный Ubuntu-торрент подтвердил реальную запись8 файлов фрагментов на диск (около1,98 МБ) и чтение1 МиБ потока HTTP Range. Тестовая раздача удалена после проверки. Видео не переводилось на сетевой прокси.
|
||||
|
||||
Штатная смена настроек MatriX.135 сбрасывает активные торренты и заново подключает движок; если фильм открыт при будущей смене режима, может потребоваться открыть его повторно. Описание общей схемы — [[personal/tech/lampac-truenas]], инструкция — [lampac-scripts/deploy/README.md](https://git.mallexxx.duckdns.org/git_admin/lampac-scripts/src/branch/main/deploy/README.md).
|
||||
|
||||
Проверено 2026-10-30. Lampac развёрнут на TrueNAS, клиент установлен на Konka Q85 в Новосибирске. Это аддон к официальному серверу, не форк Lampac.
|
||||
|
||||
## Дисковый кэш TorrServer — обновление 2026-10-31
|
||||
|
||||
**Текущая настройка: 2 ГиБ кэша на диске**, не в RAM: `UseDisk=true`, `CacheSize=2147483648`, `TorrentsSavePath=/lampac/cache/torrserver`, `RemoveCacheOnDrop=true`. На хосте это `/mnt/RED_2TB/docker/lampac/cache/torrserver`, существующий постоянный cache bind mount. Лимит памяти контейнера возвращён с4 к **2 ГиБ**. После перехода фактическое потребление контейнера было около1 ГиБ. ОС/ZFS могут использовать освобождаемую память для файлового кэша; это не отдельная обязательная RAM-буферизация2 ГиБ в TorrServer.
|
||||
|
||||
Первоначально оставлен стандартный RAM-кэш96 МиБ, затем просьба увеличить его была неверно интерпретирована как2 ГиБ RAM. Владелец уточнил, что не хотел занимать столько оперативной памяти. После проверки исходников MatriX.135 включён штатный дисковый backend; ограничения, мешающего писать кэш на диск, нет.
|
||||
|
||||
Применение через оболочку Lampac `/ts/settings` вернуло500 и не изменило настройку. Повтор через авторизованный **локальный** API TorrServer `127.0.0.1:9085` внутри контейнера с приватными данными `data/ts/accs.db` сработал. Порт9085 наружу не открывался. Штатный SetSettings сбрасывает активные торренты/подключает движок заново, поэтому воспроизведение при смене режима может потребовать повторного открытия. Не обещать применение без сброса активного буфера.
|
||||
|
||||
Проверено фактически: `UseDisk=true` в API и сохранённом `data/ts/settings.json`; появились4 файла фрагментов,16 МиБ на диске; HTTP Range-запрос видеопотока получил206 и прочитал1 МиБ. Контейнер не пересоздавался. Прежние настройки: `backups/torrserver-before-disk-cache.json`, Compose: `backups/compose-before-disk-cache.yml`.
|
||||
|
||||
Фильм «Красота по-американски» — Remux31,37 ГиБ, средний битрейт36,9 Мбит/с. Замеры скачивания25–43 Мбит/с, запас в буфере ТВ4,8–6с. Поток шёл напрямую с `192.168.2.197:9118/ts/stream/…`; прокси обслуживал TMDB. Увеличение кэша сглаживает временные просадки после заполнения, но не устраняет постоянную нехватку скорости раздачи. Файлы кэша вручную при активном потоке не удалять.
|
||||
|
||||
## Серверы и исходники
|
||||
|
||||
- TrueNAS: `truenas_admin@mallexxx.duckdns.org`, каталог `/mnt/RED_2TB/docker/lampac`, адрес приложения `http://192.168.2.197:9118`.
|
||||
- Обычный Docker Compose, не TrueNAS Apps. Контейнер `lampac`: официальный образ `ghcr.io/lampac-nextgen/lampac:1.87.3`, amd64, лимиты 2 ГБ RAM / 1 CPU; кэш TorrServer — 2 ГиБ на диске, порт опубликован только на LAN-адресе. GPU-транскодирование не настроено.
|
||||
- Kraken остаётся на официальном arm64-образе 1.87.3 и прежнем адресе `http://192.168.1.14:9118`.
|
||||
- Mac: `/Users/admin/Developer/lampac-scripts`, ветка `main`, [Gitea](https://git.mallexxx.duckdns.org/git_admin/lampac-scripts).
|
||||
- Генератор: `/Users/admin/Developer/watchlist-sync`, ветка `main`, [GitHub](https://github.com/mallexxx/watchlist-sync).
|
||||
- Точные Compose, init.conf, шаблоны и инструкция восстановления — [deploy/README.md](https://git.mallexxx.duckdns.org/git_admin/lampac-scripts/src/branch/main/deploy/README.md). Приватные ключи и рабочие конфиги с секретами в git не добавляются.
|
||||
|
||||
## Konka и встроенные постеры
|
||||
|
||||
Konka Q85: `192.168.2.124`, webOS 7.5.6; приложение `com.lampac.tv` версии 1.0.0 установлено через существующий Homebrew Channel с проверкой SHA256 пакета. Его `lampac_url` в localStorage: `http://192.168.2.197:9118`. Настройку root/privacy не меняли; Developer Mode не устанавливали.
|
||||
|
||||
Пустые постеры имели два отдельных условия: NAS не получал TMDB напрямую, а клиентская автоматика могла выключать прокси. На ТВ сохранены **`proxy_tmdb=true` и `proxy_tmdb_auto=false`**. Одной настройки серверного poster fetcher недостаточно: при выключенном клиентском флаге CUB обращается к `image.tmdb.org` напрямую.
|
||||
|
||||
На NAS отдельный контейнер `lampac-egress` предоставляет SOCKS только внутри сети Lampac, без опубликованного порта. Он использует существующий авторизованный маршрут `kraken-user` через Caddy/VLESS и Kraken. Его приватный конфиг: `config-module/egress.json`, mode0640, group1000; шаблон без клиентского ID — в репозитории.
|
||||
|
||||
Прокси `socks5://lampac-egress:1080` включён в:
|
||||
|
||||
- `tmdb.proxyapi` и `tmdb.proxyimg` — встроенные TMDB/CUB;
|
||||
- `posterApi` — постеры карточек Catalog;
|
||||
- `serverproxy.image` — обработчик изображений.
|
||||
|
||||
**Глобальный прокси для HTTP/видео не включён.** Проверенный тестовый видеопоток шёл напрямую с LAN-адреса NAS. Общий `vless-proxy` не меняли; при проверке его исходящие TLS-соединения обрывались. Это наблюдение на дату настройки, а не установленная причина отказа общей инфраструктуры.
|
||||
|
||||
Внутренний вход Caddy — `192.168.2.197:8443`, TLS-имя `vpn.mallexxx.duckdns.org`. На `192.168.2.197:443` находится интерфейс TrueNAS: использовать его вместо 8443 нельзя, сертификат другой.
|
||||
|
||||
## Единая история без синхронизации SQLite
|
||||
|
||||
Рабочая TimeCode находится на TrueNAS в постоянном `database/TimeCode.sql`. Kraken-клиент обращается к тому же серверу через HTTPS API. **Двусторонней репликации SQLite, rsync БД или общего сетевого файла БД нет.**
|
||||
|
||||
История из Kraken перенесена один раз штатными `/timecode/dump` → `/timecode/set`; сохранены все 9 записей и их прогресс. Оба сервера используют одинаковый серверный `instance.uid`; профили остаются отдельными областями. Старая БД Kraken оставлена для отката.
|
||||
|
||||
В существующем HTTPS-сайте Caddy выделен префикс `https://git.mallexxx.duckdns.org/lampac-history` с точным списком TimeCode-маршрутов. Без правильного `history_key` — 404; прочие маршруты Lampac наружу через него не открыты. Gitea продолжает работать. Выполнен reload Caddy, не перезапуск общего сервиса.
|
||||
|
||||
Ключ транспорта называется **`history_key`, не `token`**: `token` в Lampac меняет владельца данных. В сгенерированном клиенте и чтение, и запись должны независимо передавать `uid`; это проверяется исполнением реальных URL-методов в тесте.
|
||||
|
||||
Kraken: приватный результат `scripts/build_timecode.py` установлен в `config-module/timecode-plugin.js`, примонтирован в `/lampac/module/Sync/TimeCode/plugin.js:ro`. NAS использует штатный локальный TimeCode-клиент. Межсайтовые WebSocket-уведомления не добавлялись; прогресс читается при обновлении карточки/таймлайна.
|
||||
|
||||
## Каталог и отметки Obsidian
|
||||
|
||||
Единственный генератор и писатель Obsidian остаётся на Kraken. Ночной `/home/kraken/scripts/watchlist-nightly.sh` после сборки каталога публикует готовые JSON на NAS через `publish_feed.py`.
|
||||
|
||||
На NAS ключ приёма ограничен `restrict` и forced command `receive_feed.py --root /mnt/RED_2TB/docker/lampac`. Принимаются только файлы каталога; SQL, ссылки, пути вне разрешённого списка и код отклоняются. Файлы заменяются атомарно по одному, карточки раньше основного манифеста. Проверена публикация 544 файлов.
|
||||
|
||||
`watchlist-sync` читает общий HTTPS dump через `LAMPAC_TIMECODE_DB` в приватном `.env`. Проверен dry-run: 9 записей, изменений списка не внесено. Второй генератор/писатель на NAS не запущен. Порог отметки фильма — 90%; существующее поведение сериалов этим изменением не расширялось.
|
||||
|
||||
## Данные и бэкапы
|
||||
|
||||
Постоянные `wwwroot` и `data` при первой установке нужно заполнить из образа до запуска. Пустые bind mounts скрывают и frontend, и резервные Cloudflare IP-файлы; при недоступной сети это приводило к падению старта. Конфиги должны читаться uid1000: режим0600 после SCP для `init.conf` не подходит.
|
||||
|
||||
Контейнер пишет от uid1000/gid1000, администратор NAS — uid950 в группе1000. **`TimeCode.sql`, `-wal`, `-shm` должны иметь mode0664 и group1000.** Read-only SQLite-подключение тоже может создавать WAL/SHM. Первый бэкап от uid950 создал их с0644, после чего сервер не мог записывать прогресс. Владельцы/права исправлены, старые подключения закрыты перезапуском только Lampac.
|
||||
|
||||
`scripts/backup_history.py` перед открытием проверяет group write, закрывает подключения, использует SQLite online backup и проверку целостности. NAS crontab: ежедневно04:27 по времени хоста, хранение30 дней в `backups/timecode`. Часовой пояс приложения — Asia/Novosibirsk; расписание cron не следует автоматически считать этим часовым поясом. Это локальный бэкап, не синхронизация БД.
|
||||
|
||||
После исправления проверена API-запись **до и после повторного бэкапа**; все 9 записей и значения прогресса сохранены. Для отката сохранены прежние Compose/Caddy/настройки и снимки истории. Живую БД обычным копированием не подменять.
|
||||
|
||||
## Что проверено
|
||||
|
||||
- HTTP200 и окончание запуска `Configure complete`; одного Docker healthcheck недостаточно.
|
||||
- Реальный поиск «дюна» на Konka через экранную клавиатуру: результаты получены, JavaScript-ошибок нет, вкладка watchlist одна.
|
||||
- На видимом экране: 7 встроенных и28 каталожных постеров загружены, сломанных0; настройки прокси подтверждены после перезагрузки приложения.
|
||||
- Плеер Lampac декодировал тестовый H.264-поток640×360 с NAS: время увеличивалось, `readyState=4`, ошибки отсутствовали. Непрерывный пяти-/десятиминутный тест, реальная онлайн-раздача и звук на слух отдельно не подтверждены.
|
||||
- 10 автоматических тестов: 5 поиска, 3 развёртывания/истории/бэкапа, 2 чтения TimeCode API.
|
||||
- Изменения запушены в обе репозитории; локальные копии в Developer обновлены. Временный установщик на роутере18085, ролик и диагностические SSH-перенаправления удалены.
|
||||
|
||||
Связано: [[personal/tech/lampac-deployment]], [[personal/tech/konka-q85-novosibirsk]], [[family/how-to/truenas-infrastructure]], [[personal/plans/lampac-watched-to-watchlist]].
|
||||
@@ -0,0 +1,265 @@
|
||||
---
|
||||
title: 'macOS — Voom, Eagle и автоматическая очистка'
|
||||
type: how-to
|
||||
status: active
|
||||
created: '2026-10-21'
|
||||
updated: '2026-10-21'
|
||||
tags:
|
||||
- macos
|
||||
- maintenance
|
||||
- voom
|
||||
- docker
|
||||
- eagle-dashboard
|
||||
aliases:
|
||||
- Автоматическая очистка Mac
|
||||
- Voom и Eagle
|
||||
related:
|
||||
- '[[personal/tech/docker-mac-disk-issues]]'
|
||||
- '[[personal/tech/eagle-dashboard-launchd]]'
|
||||
- '[[personal/projects/virfield]]'
|
||||
---
|
||||
# macOS — Voom, Eagle и автоматическая очистка
|
||||
|
||||
Состояние проверено **21 октября 2026** по установленным скриптам, конфигурациям и включённым заданиям Eagle. Это описание действующих правил; разовые ручные удаления могли быть шире автоматической политики.
|
||||
|
||||
## Сетап и расписание
|
||||
|
||||
Управление — [Eagle Dashboard → Crons](http://127.0.0.1:8880/?tab=crons). Eagle управляет пользовательскими LaunchAgent macOS; отдельных дублирующих расписаний в Codex нет. Все четыре задания включены. `RunAtLoad=false`: загрузка задания сама по себе не запускает очистку.
|
||||
|
||||
| Задание в Eagle | Label | Расписание |
|
||||
|---|---|---|
|
||||
| Очистка артефактов и симуляторов — каждые 2 часа | `local.voom.cleanup` | Каждые 7200 секунд |
|
||||
| Docker — кэш и старые образы | `com.voom.docker-policy` | Каждые 7200 секунд |
|
||||
| Бэкапы Balda и Virfield — хранить сутки | `com.voom.backup-retention` | Каждые 7200 секунд |
|
||||
| Штатная очистка кэшей — воскресенье, 12:00 | `local.voom.weekly-caches` | Воскресенье, 12:00 по локальному времени Mac |
|
||||
|
||||
Период проверки и возраст удаления — разные параметры: например, бэкапы проверяются раз в два часа, а удаляются после суток.
|
||||
|
||||
### Установленные файлы
|
||||
|
||||
Базовый каталог: `/Users/admin/.local/share/voom-cleanup/` (`~/.local/share/voom-cleanup`). Python: `/opt/homebrew/bin/python3`. Voom: `~/.local/bin/voom`.
|
||||
|
||||
| Файл | Назначение |
|
||||
|---|---|
|
||||
| `cleanup.py` | Основной проход: временные файлы, Xcode/SwiftPM, симуляторы, merged worktree |
|
||||
| `tmp_cleanup.py` | Помощник для `/private/tmp`, вызывается основным проходом |
|
||||
| `docker_cleanup.py`, `docker_images.py` | BuildKit, наблюдение за ссылками образов и их ограниченная очистка |
|
||||
| `docker-policy.json` | Параметры Docker |
|
||||
| `docker-image-observations.json` | История наблюдаемых ссылок контейнеров; нужна для отсчёта 30 дней |
|
||||
| `backup_cleanup.py`, `backup-policy.json` | Суточное хранение явно перечисленных бэкапов |
|
||||
| `weekly-caches.py` | Штатные команды uv, npm и Homebrew |
|
||||
|
||||
Скрипты используют блокировки, чтобы повторный запуск того же задания не шёл параллельно предыдущему.
|
||||
|
||||
### Что сейчас действительно включено
|
||||
|
||||
На момент проверки существуют все три файла разрешения:
|
||||
|
||||
- `enable-deletion` — основной проход с `--apply`.
|
||||
- `enable-docker-deletion` — Docker с `--apply`.
|
||||
- `enable-tmp-deletion` — отдельное разрешение удаления из `/private/tmp`.
|
||||
|
||||
**Очистка `/private/tmp` включена.** Основной скрипт вызывает `run_cleanup(apply and not args.scan_only)`. Прежний вызов `run_cleanup(False)` заменён. Одного изменения описания Eagle для включения недостаточно — проверены и код, и файл разрешения.
|
||||
|
||||
Бэкапы запускаются отдельным заданием с `--apply`, без дополнительного файла разрешения. Немедленный разовый запуск при установке этого задания не выполнялся; расписание включено. Успех конкретного прохода проверяется по отчёту, отдельно от факта включения задания.
|
||||
|
||||
## Worktree и артефакты Xcode/SwiftPM
|
||||
|
||||
### Worktree
|
||||
|
||||
Репозиторий: `~/DuckDuckGo/apple-browsers.git`.
|
||||
|
||||
- Voom удаляет вмерженные worktree без локальных изменений; merge через squash/rebase проверяется с GitHub.
|
||||
- `main`, ветки Git, заблокированные worktree и worktree с защищаемыми локальными изменениями сохраняются.
|
||||
- Используются `--remove-merged-worktrees --github-merged-worktrees` с явным исключением `main`.
|
||||
|
||||
### Стандартный DerivedData
|
||||
|
||||
Каталог: `~/Library/Developer/Xcode/DerivedData`.
|
||||
|
||||
Проектная папка подходит для удаления, если:
|
||||
|
||||
1. Её `WorkspacePath` указывает на уже отсутствующий проект в домашнем каталоге; либо
|
||||
2. Во всём содержимом нет изменений **48 часов**, и `LastAccessedDate` не указывает на недавнее обращение.
|
||||
|
||||
Требуются метаданные проекта или узнаваемые признаки Xcode output. Общие кэши без таких признаков сохраняются. Для возрастного правила учитывается максимум `mtime` и `ctime` всех элементов, включая каталоги; перед удалением условие перепроверяется.
|
||||
|
||||
### Внутрипроектные папки
|
||||
|
||||
Поиск **рекурсивный** внутри:
|
||||
|
||||
- `~/Developer`
|
||||
- `~/DuckDuckGo`
|
||||
- `~/.codex/worktrees`
|
||||
- `~/Documents/Codex`
|
||||
- `~/Documents/code`
|
||||
|
||||
| Имена каталогов | Условие |
|
||||
|---|---|
|
||||
| `.build` | 48 часов без изменений во всём дереве и признаки SwiftPM: `workspace-state.json`, `build.db`, `debug.yaml` или `release.yaml` |
|
||||
| `dd`, `deriveddata`, `DerivedData`, `.build-dd` | 48 часов без изменений во всём дереве и признаки Xcode output |
|
||||
|
||||
Имена Xcode-папок сравниваются без учёта регистра. Признаки Xcode: например, `Build/Intermediates.noindex/XCBuildData/build.db`, либо `info.plist` с `WorkspacePath` вместе со стандартными каталогами результатов сборки. Одного имени папки недостаточно.
|
||||
|
||||
При обходе пропускаются ссылки, `.git`, `node_modules`, `.venv`, `venv`, `target`, `.Trash`, `SourcePackages` и сами корни артефактов. Внутри найденного корня возраст проверяется по всему содержимому.
|
||||
|
||||
Основной проход откладывает удаление при обнаружении процессов сборки `xcodebuild`, `swift-build`, `swiftc`, `swift-frontend`, `clang`, `ld` или при невозможности проверить процессы.
|
||||
|
||||
### Исключения VS Code/DDG — 2026-10-23
|
||||
|
||||
Подкаталоги `.build/xcode-editor/` и `.build/vscode-local/` сохраняются целиком, включая профиль `config.json` и manifest интеграции. Если `.build` содержит эти подкаталоги и признаки SwiftPM, очистка выбирает только остальные дочерние элементы старше 48 часов; свежесть защищённых настроек не удерживает старые соседние артефакты. Перед удалением повторно проверяется, что защищённые подкаталоги не появились в выбранной целиком `.build`.
|
||||
|
||||
То же исключение применяется в `/private/tmp`: эти два подкаталога не обходятся и защищены повторной проверкой перед unlink. Корневой `buildServer.json` вне `.build` проектное правило не затрагивает. Правила DerivedData и удаления worktree этим изменением не менялись.
|
||||
|
||||
## Симуляторы Xcode
|
||||
|
||||
- Используется **непустой `lastUsedAt`** из `device.plist`.
|
||||
- Давность последнего использования — **от 7 дней**.
|
||||
- Последнее использованное устройство сохраняется; при одинаковой максимальной дате сохраняются все совпадения.
|
||||
- Запущенные устройства сохраняются. Непосредственно перед удалением повторно проверяются даты и состояние через `simctl`; удаляется только `Shutdown`.
|
||||
- Устройства без даты использования не удаляются. Возраст создания и `lastBootedAt` не подставляются вместо `lastUsedAt`.
|
||||
- Принудительной остановки и `simctl delete all` нет.
|
||||
|
||||
## `/private/tmp`: 4 часа
|
||||
|
||||
Удаление включено в основном проходе раз в два часа.
|
||||
|
||||
- Рассматриваются обычные файлы любых расширений, включая исходники, патчи, логи и результаты сборок.
|
||||
- Условие: **не менее 4 часов с `mtime` каждого файла**. `ctime` и возраст родительской папки не используются.
|
||||
- Старый файл может быть удалён рядом со свежим; свежий файл внутри старой папки сохраняется.
|
||||
- Открытые файлы сохраняются. Открытый каталог или рабочий каталог процесса защищает всё своё поддерево. Проверка — через `lsof`.
|
||||
- Ссылки, сокеты, специальные файлы, чужие владельцы и другие файловые системы пропускаются. Непустые каталоги целиком не удаляются; пустые каталоги скрипт также отдельно не убирает.
|
||||
- Перед удалением перепроверяются inode, размер, `mtime`, принадлежность, открытые пути; проход по каталогам выполняется без следования ссылкам.
|
||||
- При недоступности `lsof` удаление запрещено. При активной сборке удаление откладывается.
|
||||
|
||||
## Бэкапы Balda и Virfield: сутки
|
||||
|
||||
Порог — **24 часа**. Для снимка берётся самая новая дата создания (`birthtime`) или `mtime` во всём дереве. Это защищает свежие APFS-клоны, у которых сохранились старые даты содержимого. Недавнее изменение любого элемента откладывает удаление всего снимка.
|
||||
|
||||
### Balda
|
||||
|
||||
Полностью проверяются отдельные снимки внутри:
|
||||
|
||||
- `~/.local/share/balda-workspace/backups/`
|
||||
- `~/Docker/balda-mm-mac/state/setup-backups/`
|
||||
- `~/Docker/balda-mm-eagle/state/setup-backups/`
|
||||
|
||||
Только в корнях `~/Docker/balda-mm-mac/` и `~/Docker/balda-mm-eagle/` дополнительно выбираются:
|
||||
|
||||
- Каталоги/файлы `backup-*`, `state-backup-*`, `state-failed-*`.
|
||||
- Файлы с шаблонами `*.before-*`, `*.backup`, `*.backup-*`, `*.bak`, `*.bak-*`.
|
||||
|
||||
Рабочие `state`, текущие Compose/config-файлы и рабочая БД под эти шаблоны не попадают.
|
||||
|
||||
### Virfield
|
||||
|
||||
- `backups/` и `migration-backups/` внутри `~/.virfield-tart/` и `~/.virfield-v2/`.
|
||||
- `~/.virfield-v2/upgrades/`.
|
||||
- `~/.virfield-v2/retained-maintenance/`.
|
||||
- В корнях `~/.virfield-tart/` и `~/.virfield-v2/` — только резервные файлы `*.before-*`, `*.backup`, `*.backup-*`, `*.bak`, `*.bak-*`.
|
||||
|
||||
Рабочие `state.db`, `images`, `leases`, `nodes`, текущие конфиги и обычные диски VM целями не являются.
|
||||
|
||||
### Защита бэкапов
|
||||
|
||||
- Используемый снимок или его содержимое сохраняются по проверке `lsof`; использование выделенного каталога бэкапов также защищает его содержимое.
|
||||
- Возраст, inode и открытые пути проверяются повторно перед удалением.
|
||||
- Корни со ссылками в пути, чужие владельцы, другие файловые системы, сокеты и специальные файлы пропускаются с записью в отчёт.
|
||||
- Ссылки внутри снимка не обходятся. Для удаления read-only каталогов снимка добавляются права только владельцу каталогов; файлы и внешние цели ссылок не изменяются.
|
||||
- Последний бэкап не закреплён навсегда: по этой политике все подходящие снимки старше суток могут быть удалены.
|
||||
|
||||
## Docker
|
||||
|
||||
Цель жёстко закреплена: context **`colima`**, builder **`colima`**, socket `/Users/admin/.colima/default/docker.sock`. Перед работой проверяется соответствие контекста и работающего builder. Другие и неактивные builders не запускаются.
|
||||
|
||||
### BuildKit cache
|
||||
|
||||
| Тип | Минимальное неиспользование |
|
||||
|---|---:|
|
||||
| Обычный поддерживаемый build cache | 14 дней от `LastUsedAt` |
|
||||
| Cache mounts и распознанные слои установки зависимостей | 30 дней от `LastUsedAt` |
|
||||
|
||||
Зависимости распознаются по типу `exec.cachemount` и описаниям с apt/apk/dnf/yum, pip/uv, npm/pnpm/yarn, cargo, gem/bundler/composer, `go mod`.
|
||||
|
||||
Сохраняются `InUse`, `Shared`, internal/frontend, неизвестные типы и записи без корректной даты. Удаление ограничено точным списком cache-ID и фильтром возраста; BuildKit повторно проверяет использование. Broad `--all` не используется.
|
||||
|
||||
### Образы: 30 дней без наблюдаемых ссылок
|
||||
|
||||
Область автоматической очистки:
|
||||
|
||||
- `execution-broker` и `execution-broker-*`.
|
||||
- `execution-prism-adapter`.
|
||||
- `balda` и `balda-*`, включая старые обычные версии.
|
||||
- Образы без тегов и без digest-reference.
|
||||
|
||||
Условия и исключения:
|
||||
|
||||
- Нет ссылок **любых контейнеров**, включая остановленные, не менее 30 дней по журналу наблюдений.
|
||||
- При появлении ссылки таймер сбрасывается; после исчезновения начинается новый отсчёт.
|
||||
- Сохраняются образы, найденные в доступных файлах конфигураций и переменных окружения работающих контейнеров.
|
||||
- Для обычных версий сохраняется одна самая новая сборка **для каждого repository** по Docker `Created`; одинаковые максимальные даты сохраняются все. Это дата сборки, а не сравнение номеров версий.
|
||||
- Явно тестовые/временные/резервные Balda-теги (`test`, `temp`, `tmp`, `scratch`, `fixture`, `acceptance`, `prNN`, `backup`, `bak`, `rollback`) могут истечь и без сохранения «последнего тестового» образа.
|
||||
- Для Broker дополнительно защищены теги/имена с `rollback`, `base`, `accepted`, `approved`, `stable`, `latest`, `current`, `production`, `prod`. Эти закрепления могут сохранять больше одной версии.
|
||||
- Для Balda постоянная защита всех исторических версий отключена; действуют ссылки, конфигурации, последняя обычная версия и срок 30 дней.
|
||||
- Перед каждым удалением повторно проверяются Docker inventory, конфигурации, ссылки, возраст наблюдений и теги. Удаление — по точному ID без `--force`, с `--no-prune`.
|
||||
|
||||
`docker-image-observations.json` отражает периодические наблюдения за ссылками контейнеров. Он **не даёт полного last used**: использование в `FROM` и короткоживущие контейнеры между проверками могут не попасть в историю. Нельзя подменять эти 30 дней возрастом создания образа. История начата 21 октября 2026; потеря журнала запускает отсчёт заново.
|
||||
|
||||
### Известные ограничения Docker
|
||||
|
||||
- Именованные образы вне списка выше сохраняются независимо от отсутствия контейнеров. Например: **Mattermost**, `budget-*`, `workspace-smb`, `workspace-nfs-client`, `ssh-manager-isolation-fixture`, `go-cli*`, базовые Go/Node/Python и прочие внешние образы.
|
||||
- Для Mattermost отсутствие ссылок контейнеров/конфигураций проверено; причина сохранения — ограничение списка разрешённых имён.
|
||||
- При нескольких тегах удаление по ID может закончиться конфликтом; скрипт сохраняет образ и пишет `kept_conflict_or_error`.
|
||||
- Полной очистки графа скрытых промежуточных образов нет: используется `/system/df` и `--no-prune`. Проявившийся безымянный родитель должен отдельно попасть под возрастное правило; ручная дочистка всей цепочки была шире автоматической политики.
|
||||
- **Контейнеры, volumes и networks автоматически не удаляются.** Удаление Broker/restore-контейнеров 21 октября было отдельным ручным действием.
|
||||
|
||||
## Еженедельное обслуживание кэшей
|
||||
|
||||
По воскресеньям в 12:00 выполняются штатные команды:
|
||||
|
||||
```sh
|
||||
/opt/homebrew/bin/uv cache prune
|
||||
/opt/homebrew/bin/npm cache verify
|
||||
/opt/homebrew/bin/brew cleanup
|
||||
```
|
||||
|
||||
Возраст и выбор данных определяют сами инструменты. `npm cache verify` проверяет/обслуживает кэш; полного удаления всего npm-кэша правило не обещает. Автообновление Homebrew на время этого задания отключено.
|
||||
|
||||
## Что ещё не входит в автоматические правила
|
||||
|
||||
- `WebKitBuild` из Downloads и архив прошивки iPhone `.ipsw`: 21 октября удалены вручную, общих правил для них нет.
|
||||
- Android SDK исключён из согласованной очистки; отдельно его не трогать.
|
||||
- Claude VM bundles/Cowork VM не очищаются этим сетапом.
|
||||
- Все произвольные кэши приложений, все Docker images или все файлы Downloads не охватываются широким правилом.
|
||||
|
||||
## Проверка, отчёты и управление
|
||||
|
||||
JSON-отчёты в `~/.local/share/voom-cleanup/`:
|
||||
|
||||
| Отчёт | Что смотреть |
|
||||
|---|---|
|
||||
| `last-report.json` | Xcode/SPM, симуляторы, worktree, сводка tmp |
|
||||
| `tmp-report.json` | Кандидаты tmp, `deleted_files`, `deletion_deferred`, ошибки |
|
||||
| `docker-report.json` | BuildKit, образы, причины сохранения, результаты удаления |
|
||||
| `backup-report.json` | Бэкапы, возраст, занятые пути, результаты и ошибки |
|
||||
| `weekly-caches-report.json` | Exit code и вывод каждой штатной команды |
|
||||
|
||||
Основные логи: `launchd.log`, `launchd.stderr.log`; для еженедельного задания — `weekly-caches.log`, `weekly-caches.stderr.log`.
|
||||
|
||||
Включённое задание и поле `apply` сами по себе не подтверждают освобождение места: проверять время отчёта, `results`, ошибки и причины отложенного удаления. Основной скрипт при активной сборке может завершиться до обновления `last-report.json`; смотреть также лог и отдельный `tmp-report.json`.
|
||||
|
||||
Предпросмотр без удаления:
|
||||
|
||||
```sh
|
||||
/opt/homebrew/bin/python3 ~/.local/share/voom-cleanup/cleanup.py --scan-only
|
||||
/opt/homebrew/bin/python3 ~/.local/share/voom-cleanup/tmp_cleanup.py
|
||||
/opt/homebrew/bin/python3 ~/.local/share/voom-cleanup/docker_cleanup.py
|
||||
/opt/homebrew/bin/python3 ~/.local/share/voom-cleanup/backup_cleanup.py
|
||||
/opt/homebrew/bin/python3 ~/.local/share/voom-cleanup/weekly-caches.py --check
|
||||
```
|
||||
|
||||
`--scan-only` у основного скрипта показывает кандидатов артефактов/симуляторов/tmp, но пропускает Voom-проход worktree. Эти проверки могут обновлять отчёты; Docker также обновляет журнал наблюдений.
|
||||
|
||||
Для паузы задания использовать Eagle → Crons. Чтобы отключить только tmp, можно переименовать `enable-tmp-deletion`; остальные задачи основного прохода сохранят свои настройки. Для бэкапов отдельного файла разрешения нет — управлять их заданием в Eagle. Не создавать второе расписание поверх существующих labels.
|
||||
|
||||
Связанные заметки: [[personal/tech/eagle-dashboard-launchd|Eagle и launchd]], [[personal/tech/docker-mac-disk-issues|Docker на Mac: диск и история очисток]], [[personal/tech/docker_colima_setup|Colima]], [[personal/projects/virfield|Virfield]].
|
||||
@@ -1,7 +1,7 @@
|
||||
---
|
||||
title: Xray Reverse Tunnel — Kraken ↔ TrueNAS
|
||||
created: '2026-09-01'
|
||||
updated: '2026-09-23'
|
||||
updated: '2026-10-30'
|
||||
type: tech
|
||||
namespace: personal
|
||||
tags:
|
||||
@@ -18,8 +18,7 @@ related:
|
||||
- '[[family/how-to/kraken-access]]'
|
||||
- '[[family/how-to/rasputin-router]]'
|
||||
- '[[personal/tech/xray-outbound-subscription-3xui]]'
|
||||
downgrade_to_26.4.25: >-
|
||||
portal+bridge BOTH pinned to 26.4.25; required but insufficient by itself.
|
||||
downgrade_to_26.4.25: portal+bridge BOTH pinned to 26.4.25; required but insufficient by itself.
|
||||
verified_fix_2026_09_02: >-
|
||||
Kraken bridge must use Docker network_mode: host; Docker bridge/NAT reset the
|
||||
VLESS reverse mux. REALITY+Vision verified end-to-end with Kraken egress.
|
||||
@@ -27,58 +26,33 @@ verified_fix_2026_09_02: >-
|
||||
|
||||
# Xray Reverse Tunnel — Kraken ↔ TrueNAS
|
||||
|
||||
> ## ✅ 2026-09-30 — ПРИЧИНА НАЙДЕНА И УСТРАНЕНА: `dockerd` УБИТ SIGKILL MID-RESTORE → КОНТЕЙНЕРЫ ЗАПИСАНЫ КАК «ОСТАНОВЛЕННЫЕ ВРУЧНУЮ»
|
||||
>
|
||||
> **Запрос Alex:** почему не работают профили 3x-ui (`reality primary`/`kraken-user`, `cf fallback`/`vless-space`) и обратный прокси через Кра́кен.
|
||||
>
|
||||
> **Итог: `kraken-user` МЁРТВ, `user1` и `vless-space` ЖИВЫ.** Проверено локальными docker-клиентами на Mac:
|
||||
>
|
||||
> | Профиль | Ожидаемый egress | Фактический egress | Статус |
|
||||
> |---|---|---|---|
|
||||
> | `user1` (direct) | TrueNAS `90.189.160.148` | `90.189.160.148` | ✅ жив |
|
||||
> | `kraken-user` (via reverse) | Кра́кен `92.62.77.233` | `92.62.77.233` **после фикса** | ⚠️ **был мёртв 3 дня** |
|
||||
> | `vless-space` (подписка) | Стокгольм `195.72.61.192` | `195.72.61.192` (geo: Sweden/Stockholm) | ✅ жив |
|
||||
>
|
||||
> ⚠️ **Питфолл замера:** `api.ipify.org` отдаёт разные IP в зависимости от edge Cloudflare — при первом тесте `vless-space` показал `104.28.225.223` (это Cloudflare, НЕ egress). **Проверять egress через `ip-api.com` / смотреть geo**, а не только `api.ipify.org`.
|
||||
>
|
||||
> ### 🔴 ИСТИННАЯ ПРИЧИНА (не конфиг, не версия, не REALITY)
|
||||
>
|
||||
> **`xray-reverse-bridge` на Кра́кене был `Exited (2)`, up-time НОЛЬ — 3 дня.** Кра́кен жив (uptime 2 дня 21 ч, LAN `192.168.1.14`), диск `sda1` примонтирован, docker `active`. Мёртв был **только контейнер**.
|
||||
>
|
||||
> **Полная цепочка (доказано journalctl):**
|
||||
>
|
||||
> | Время (локальное +06:00, boot 2026-09-27 16:23) | Событие |
|
||||
> |---|---|
|
||||
> | 16:24:05 | `dockerd` PID **1385** стартует, начинает `Restoring containers` |
|
||||
> | 16:24:08 | `failed to register container name ... "name is reserved"` для sonarr/radarr/jellyfin/prowlarr/rclone/transmission/hermes-kraken/portainer/cloudflared |
|
||||
> | 16:24:40 | восстанавливает контейнер `8a0246d2...` (создаёт scope) |
|
||||
> | **16:25:35** | **`docker.service: State 'stop-sigterm' timed out. Killing.` → `Killing process 1385 (dockerd) with SIGKILL` → `Main process exited, code=killed, status=9/KILL` → `Failed with result 'timeout'`** |
|
||||
> | 16:25:35 | systemd стартует docker заново → `dockerd` PID **3750** |
|
||||
> | 16:26:28 | `Daemon has completed initialization` |
|
||||
>
|
||||
> **Механизм отказа:** systemd убил `dockerd` **посреди восстановления контейнеров**. Контейнеры, не успевшие восстановиться, были записаны в состоянии `exited` с **`Restarts=0`** — а поскольку daemon был убит, а не остановлен gracefully, политика `unless-stopped` сохранилась как «остановлен вручную». Новый daemon (PID 3750) их **не поднял** — для него это были намеренно остановленные контейнеры.
|
||||
>
|
||||
> 🔴 **Это НЕ bridge-специфичный баг.** Тем же сбоем одновременно легли три независимых контейнера:
|
||||
> `radarr` Exit=137 (SIGKILL), `sonarr` Exit=0, `prowlarr` Exit=137 — у всех `Restarts=0`, все с политикой `unless-stopped`, все до сих пор `exited`.
|
||||
>
|
||||
> **Ключевой диагностический признак:** *«контейнер с `unless-stopped` лежит в `Exited`, `RestartCount=0`, а хост живёт неделями»* → смотреть `journalctl -u docker` на `stop-sigterm timed out` / `SIGKILL` вокруг времени последнего boot. Это не конфиг контейнера.
|
||||
>
|
||||
> ### ✅ ФИКС (применён 2026-09-30)
|
||||
> ```bash
|
||||
> ssh kraken@192.168.1.14 'cd /home/kraken/xray-reverse && sudo -n docker compose up -d'
|
||||
> ```
|
||||
> Через ~2 с bridge установил канал: `dialing TCP to mallexxx.duckdns.org:12346` → `received request for udp:reverse:0`.
|
||||
> **Проверка end-to-end:** SOCKS `:12345` → `92.62.77.233` (Кра́кен), портал `ESTABLISHED ::ffff:172.16.1.7:12346 ← ::ffff:92.62.77.233:1963`.
|
||||
>
|
||||
> ### ⚠️ ОСТАЁТСЯ ПРОБЛЕМОЙ (не устранено)
|
||||
> 1. **Причина остановки docker при boot не найдена.** `TimeoutStartUSec=infinity`, но убил **stop**-путь (`TimeoutStopUSec=1min 30s`). Вероятно, кто-то/что-то инициировало `systemctl stop docker`/`restart` в 16:24-16:25 (watchtower? OMV?). **Требует отдельного разбора** — иначе повторится.
|
||||
> 2. **`radarr`, `sonarr`, `prowlarr` до сих пор `exited`** — не подняты (вне задачи, но факт).
|
||||
> 3. **Самолечения нет.** `unless-stopped` при таком сбое не помогает. Кандидат: systemd-timer или healthcheck, поднимающий bridge, если он down.
|
||||
>
|
||||
> ### Обратный прокси (Кра́кен → LAN TrueNAS) — НЕ работает, и это ОЖИДАЕМО
|
||||
> Проверено живьём: портал в **исходном** состоянии (`routing: local → reverse-out` только), бридж — `inbounds: null`. Правило `192.168.2.0/24 → direct` отсутствует. То есть эксперимент 2026-09-23 **откачен корректно**, конфиги не тронуты. Направление «в чужую приватную сеть» reverse-каналом **не реализуется по дизайну Xray** — см. раздел «🚫 АРХИТЕКТУРНЫЙ ПРЕДЕЛ» ниже. Обратный прокси в смысле *egress локальных клиентов через Кра́кен* (`kraken-user`) — **работает** после фикса.
|
||||
>
|
||||
> **Локальные клиенты для проверки (на Mac):** `/Users/admin/xray-test/clients/{user1,kraken-user,vless-space}.json`, порты `10801/10802/10803`. Запуск: `docker run -d --name t-<n> -v /Users/admin/xray-test/clients/<n>.json:/etc/xray/config.json:ro -p <port>:<port> teddysun/xray:26.4.25`. В образе **нет `curl`** — тестировать отдельным контейнером `--network host curlimages/curl`.
|
||||
## Эксплуатация и автозапуск
|
||||
|
||||
Актуально на 2026-10-30. Туннель работает: HTTPS-запрос с TrueNAS через SOCKS `127.0.0.1:12345` выходит с адреса Kraken. При проверке Kraken: `217.29.24.185`, TrueNAS напрямую: `90.189.160.148`. WAN-IP может меняться; сравнивать с живым запросом на Kraken.
|
||||
|
||||
**Причина остановки bridge:** Monit перезапускал containerd и Docker во время загрузки хоста. Docker не завершал остановку за 90 секунд и получал SIGKILL; bridge сохранялся с `HasBeenManuallyStopped=true`, поэтому `unless-stopped` не поднимал его.
|
||||
|
||||
**Действующая настройка Kraken:**
|
||||
- `/etc/monit/conf.d/docker` — только уведомления при отсутствии процесса и ошибке Docker socket; команд запуска, остановки и перезапуска нет. Docker управляется systemd.
|
||||
- Зависимость Docker от монтирования диска в `docker.service.d/mounts.conf` сохранена.
|
||||
- `/etc/systemd/system/xray-reverse-bridge.service` — включённый oneshot-юнит после `docker.service`, подключён к `multi-user.target` и `docker.service`. Выполняет из `/home/kraken/xray-reverse`:
|
||||
`docker compose up -d --no-build --pull never xray-reverse-bridge`.
|
||||
- Юнит обеспечивает запуск при загрузке хоста и запуске Docker; это не периодическая проверка здоровья туннеля. `ExecStop` отсутствует.
|
||||
- Bridge: `teddysun/xray:26.4.25`, `network_mode: host`, `restart: unless-stopped`.
|
||||
|
||||
**Проверка:**
|
||||
|
||||
```bash
|
||||
# Kraken: SSH, служба и контейнер
|
||||
ssh kraken@ssh-kraken.qentra.top 'systemctl is-active xray-reverse-bridge; docker inspect xray-reverse-bridge --format "{{.State.Status}}"; curl -4 -fsS --max-time 15 https://api.ipify.org'
|
||||
|
||||
# TrueNAS: реальный запрос через туннель
|
||||
ssh truenas_admin@mallexxx.duckdns.org 'curl -4 -fsS --max-time 20 --socks5-hostname 127.0.0.1:12345 https://api.ipify.org'
|
||||
```
|
||||
|
||||
Оба запроса должны завершиться успешно и показать один адрес. Сквозной запрос и новое SSH-подключение проверены; Docker и Cloudflare не перезапускались. Автозапуск настроен и включён, но перезагрузкой хоста пока не проверен.
|
||||
|
||||
Для повторного запуска bridge без перезапуска Docker: `sudo systemctl restart xray-reverse-bridge.service`.
|
||||
|
||||
> ## ✅ 2026-09-23 — КАНАЛ ЖИВ, ПРОВЕРЕНО END-TO-END ПОСЛЕ ПОЧИНКИ 20.09. IP КРА́КЕНА ИЗМЕНИЛСЯ.
|
||||
>
|
||||
|
||||
Reference in new issue
Block a user