Compare commits

..

No commits in common. "3d7016a480c21232efcd59a19407680b96cce383" and "1cbbb645fb805ff018e8639da9bba41b0ab8bd68" have entirely different histories.

428 changed files with 134653 additions and 31 deletions

21
.gitignore vendored
View File

@ -1,21 +0,0 @@
# Hugo generated files
public/
resources/_gen/
.hugo_build.lock
# OS files
.DS_Store
Thumbs.db
# Editor files
.vscode/
.idea/
*.swp
*.swo
*~
# Temporary files
*.tmp
*.log
FETCH_HEAD

View File

@ -31,7 +31,7 @@ enableEmoji = true
series = "series"
[sitemap]
changefreq = 'weekly' # Реалистичное значение для блога
changefreq = 'daily'
filename = 'sitemap.xml'
priority = 0.5

View File

@ -2,7 +2,7 @@
title: "Блог на Hugo в K3s: часть 1 - архитектура и первый запуск"
date: 2026-01-03
draft: false
description: "Переезд с Jekyll на Hugo: выбор темы Blowfish, настройка K3s кластера и два окружения с нуля. Старт цикла о production блоге на Open Source стеке."
description: "Как я переехал с Jekyll на Hugo, почему выбрал тему Blowfish и как настроил два окружения с нуля. Начало цикла о том как я строил oakazanin.ru."
tags: ["hugo", "blowfish", "gitea", "homelab", "devops"]
categories: ["Веб-разработка"]
series: ["Блог на Hugo в K3s"]

View File

@ -2,7 +2,7 @@
title: "Блог на Hugo в K3s: часть 2 - деплой в кластер"
date: 2026-01-08
draft: false
description: "Деплой Hugo в K3s: NFS хранилище, Hugo Builder с webhook, Nginx с Prometheus exporter и автоматический SSL от Let's Encrypt."
description: "NFS хранилище, Hugo Builder с webhook listener, Nginx с Prometheus exporter и автоматический SSL от Let's Encrypt. Полный деплой production окружения."
tags: ["hugo", "k3s", "kubernetes", "nfs", "traefik", "cert-manager"]
categories: ["Kubernetes", "Веб-разработка"]
series: ["Блог на Hugo в K3s"]

View File

@ -2,7 +2,7 @@
title: "Блог на Hugo в K3s: часть 3 - development окружение"
date: 2026-01-15
draft: false
description: "Dev окружение для Hugo в K3s: отдельный Hugo Builder, Nginx и Basic Auth через Traefik. Проверяем статьи до публикации в production."
description: "Второй пайплайн для ветки dev с отдельным Hugo Builder, Nginx и защитой через Basic Auth. Тестируем изменения перед публикацией в production."
tags: ["hugo", "k3s", "kubernetes", "traefik", "basic-auth"]
categories: ["Веб-разработка", "DevOps практики"]
series: ["Блог на Hugo в K3s"]

View File

@ -2,7 +2,7 @@
title: "Блог на Hugo в K3s: часть 4 - выбор Git workflow"
date: 2026-02-16
draft: false
description: "Одна папка или две для dev и production? Разбираем Git workflow для Hugo блога в K3s — переключение веток против отдельных директорий."
description: "Две папки или одна с переключением веток? Разбираем варианты организации работы с dev и production окружениями на практических примерах."
tags: ["git", "workflow", "devops", "hugo"]
categories: ["Веб-разработка", "DevOps практики"]
series: ["Блог на Hugo в K3s"]

View File

@ -2,7 +2,7 @@
title: "Блог на Hugo в K3s: часть 5 - что делать когда всё внезапно сломалось"
date: 2026-02-17
draft: false
description: "Алгоритм диагностики Hugo блога в K3s за 5 минут: от DNS до пода. Сайт отдаёт 503 — находим причину без паники."
description: "Сайт работал вчера, а сегодня 503. Алгоритм диагностики Kubernetes проблем за 5 минут - от DNS до пода, без паники и танцев с бубном."
tags: ["kubernetes", "k3s", "traefik", "debugging", "nginx", "troubleshooting"]
categories: ["Kubernetes", "DevOps практики"]
series: ["Блог на Hugo в K3s"]

View File

@ -2,7 +2,7 @@
title: "Блог на Hugo в K3s: часть 6 - миграция между namespace"
date: 2026-02-18
draft: false
description: "Переносим сервисы между namespace в Kubernetes: экспорт манифестов, миграция NFS данных, новый SSL за 32 секунды. Реальный пример с Gitea."
description: "Как правильно переносить сервисы между namespace в Kubernetes - от экспорта манифестов до зачистки мусора. Реальный пример: переносим Gitea с NFS данными, получаем новый SSL за 32 секунды."
tags: ["kubernetes", "k3s", "gitea", "devops", "homelab", "namespace"]
categories: ["Kubernetes", "DevOps практики"]
series: ["Блог на Hugo в K3s"]

View File

@ -2,7 +2,7 @@
title: "K3s HA для homelab: архитектура без боли"
date: 2025-10-14
draft: false
description: "K3s HA кластер для homelab: архитектура с 3 master нодами и embedded etcd. 50MB бинарник вместо 1.5GB зависимостей — почему это работает."
description: "Полноценный Kubernetes в бинарнике на 50MB вместо 1.5GB зависимостей. Разбираем архитектуру K3s HA кластера: почему именно 3 master ноды, зачем embedded etcd и сколько ресурсов закладывать."
tags: ["kubernetes", "k3s", "homelab", "proxmox", "architecture", "ha", "devops"]
categories: ["Kubernetes", "Homelab"]
series: ["K3s HA кластер для homelab"]

View File

@ -2,7 +2,7 @@
title: "K3s HA для homelab: Готовим инфраструктуру в Proxmox"
date: 2025-10-21
draft: false
description: "Готовим инфраструктуру для K3s в Proxmox: 5 VM с Debian 12, настройка сети, отключение swap. Пошаговая инструкция без сюрпризов."
description: "Создаём 5 VM в Proxmox с Debian 12, настраиваем сеть, отключаем swap и готовим систему для K3s. Пошаговая инструкция без сюрпризов."
tags: ["kubernetes", "k3s", "homelab", "proxmox", "infrastructure", "debian", "devops"]
categories: ["Kubernetes", "Homelab"]
series: ["K3s HA кластер для homelab"]

View File

@ -2,7 +2,7 @@
title: "K3s HA для homelab: Ставим K3s HA кластер"
date: 2025-11-02
draft: false
description: "Устанавливаем K3s HA кластер: 3 master и 2 worker ноды за 15 минут. Один curl-скрипт на ноду — и кластер готов к работе."
description: "Один curl-скрипт на каждую ноду - и через 15 минут у вас работающий HA-кластер. Устанавливаем K3s на 3 master и 2 worker ноды, настраиваем kubectl."
tags: ["kubernetes", "k3s", "homelab", "installation", "ha", "etcd", "devops"]
categories: ["Kubernetes", "Homelab", "DevOps практики"]
series: ["K3s HA кластер для homelab"]

717
public/404.html Normal file
View File

@ -0,0 +1,717 @@
<!doctype html>
<html
lang="ru"
dir="ltr"
class="scroll-smooth"
data-default-appearance="dark"
data-auto-appearance="false"><head><script src="/livereload.js?mindelay=10&amp;v=2&amp;port=1313&amp;path=livereload" data-no-instant defer></script>
<meta charset="utf-8">
<meta http-equiv="content-language" content="ru">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<meta name="theme-color">
<title>404 Page not found &middot; Олег Казанин</title>
<meta name="title" content="404 Page not found &middot; Олег Казанин">
<link rel="canonical" href="http://192.168.11.190:1313/404.html">
<meta name="author" content="Олег Казанин">
<link href="https://t.me/oa_msk" rel="me">
<link href="https://oakazanin.ru/" rel="me">
<link href="https://git.jn4.ru/astronit" rel="me">
<link href="https://obrtv.ru/a/chiefengineer" rel="me">
<meta property="og:url" content="http://192.168.11.190:1313/404.html">
<meta property="og:site_name" content="Олег Казанин">
<meta property="og:title" content="404 Page not found">
<meta property="og:locale" content="ru">
<meta property="og:type" content="website">
<meta name="twitter:card" content="summary">
<meta name="twitter:title" content="404 Page not found">
<link
type="text/css"
rel="stylesheet"
href="/css/main.bundle.min.b5bc3f4587655153415b7825fd1716f97df9c99f87c23f81146f4dd4f9f49f04ad031e3b5f0ee5c0416707a1455ca2cfa8fc1f3a19ece1486b0126dcd310a63e.css"
integrity="sha512-tbw/RYdlUVNBW3gl/RcW&#43;X35yZ&#43;Hwj&#43;BFG9N1Pn0nwStAx47Xw7lwEFnB6FFXKLPqPwfOhns4UhrASbc0xCmPg==">
<script
type="text/javascript"
src="/js/appearance.min.a0c4d367419d691bf95fc98ffcaf55ce81db3412c3dfbd6c4fbe968f56f77347f5a8512b0916a65a5f496dbec1ef0590dbadcf2fbd0de3c919e525f11c32d0e3.js"
integrity="sha512-oMTTZ0GdaRv5X8mP/K9VzoHbNBLD371sT76Wj1b3c0f1qFErCRamWl9Jbb7B7wWQ263PL70N48kZ5SXxHDLQ4w=="></script>
<script src="/lib/zoom/zoom.min.umd.a527109b68c082a70f3697716dd72a9d5aa8b545cf800cecbbc7399f2ca6f6e0ce3e431f2062b48bbfa47c9ea42822714060bef309be073f49b9c0e30d318d7b.js" integrity="sha512-pScQm2jAgqcPNpdxbdcqnVqotUXPgAzsu8c5nyym9uDOPkMfIGK0i7&#43;kfJ6kKCJxQGC&#43;8wm&#43;Bz9JucDjDTGNew=="></script>
<script
defer
type="text/javascript"
id="script-bundle"
src="/js/main.bundle.min.858f7f82734cfae08d59fcf8d0eb186f01706a84e2f7d20d39edfd7bc8bed6166e02d5c65ecce1de82b1ac52d1e01d77bd1a82d19186fdae5fe6e12d867fcf68.js"
integrity="sha512-hY9/gnNM&#43;uCNWfz40OsYbwFwaoTi99INOe39e8i&#43;1hZuAtXGXszh3oKxrFLR4B13vRqC0ZGG/a5f5uEthn/PaA=="
data-copy="Копировать"
data-copied="Скопировано"></script>
<script type="module" src="/js/firebase.min.cad74e0625f72f359ec6d6fed579b87733749de70400e7614048050ed08832ee3f58983d5d139fb1ddc5f7f2f5047d45ed80ec923534a3660fc3a7965f936866.js" integrity="sha512-ytdOBiX3LzWextb&#43;1Xm4dzN0necEAOdhQEgFDtCIMu4/WJg9XROfsd3F9/L1BH1F7YDskjU0o2YPw6eWX5NoZg=="></script>
<link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png">
<link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png">
<link rel="icon" type="image/png" sizes="16x16" href="/favicon-16x16.png">
<link rel="manifest" href="/site.webmanifest">
<script type="application/ld+json">
[{
"@context": "https://schema.org",
"@type": "Article",
"articleSection": "Олег Казанин",
"name": "404 Page not found",
"headline": "404 Page not found",
"inLanguage": "ru",
"url" : "http://192.168.11.190:1313/404.html",
"author" : {
"@type": "Person",
"name": "Олег Казанин"
},
"mainEntityOfPage": "true",
"wordCount": "0"
}]
</script>
</head>
<body class="flex flex-col h-screen m-auto leading-7 max-w-7xl px-6 sm:px-14 md:px-24 lg:px-32 text-lg bg-neutral text-neutral-900 dark:bg-neutral-800 dark:text-neutral bf-scrollbar">
<div id="the-top" class="absolute flex self-center">
<a
class="px-3 py-1 text-sm -translate-y-8 rounded-b-lg bg-primary-200 focus:translate-y-0 dark:bg-neutral-600"
href="#main-content">
<span class="font-bold text-primary-600 pe-2 dark:text-primary-400">&darr;</span>
Перейти к основному содержимому
</a>
</div>
<div class="min-h-[148px]"></div>
<div class="fixed inset-x-0 z-100">
<div
id="menu-blur"
class="absolute opacity-0 inset-x-0 top-0 h-full single_hero_background nozoom backdrop-blur-2xl shadow-2xl bg-neutral/25 dark:bg-neutral-800/25"></div>
<div class="relative m-auto leading-7 max-w-7xl px-6 sm:px-14 md:px-24 lg:px-32">
<div class="main-menu flex items-center w-full gap-2 p-1 pl-0">
<div>
<a href="/" class="flex">
<span class="sr-only">Олег Казанин</span>
<img
src="/img/logo.png"
width="285"
height="175"
class="logo max-h-20 max-w-20 object-scale-down object-left nozoom"
alt="">
</a>
</div>
<div class="flex items-center ms-auto">
<div class="hidden md:flex">
<nav class="flex items-center gap-x-5 h-12">
<a
href="/about/"
class="flex items-center bf-icon-color-hover"
aria-label="Об авторе"
title="Кто это пишет и зачем">
<span class="text-base font-medium break-normal">
Об авторе
</span>
</a>
<a
href="/posts/"
class="flex items-center bf-icon-color-hover"
aria-label="Статьи"
title="Статьи">
<span class="text-base font-medium break-normal">
Статьи
</span>
</a>
<a
href="/cheatsheets/"
class="flex items-center bf-icon-color-hover"
aria-label="Шпаргалки"
title="Шпаргалки">
<span class="text-base font-medium break-normal">
Шпаргалки
</span>
</a>
<button
id="search-button"
aria-label="Search"
class="text-base bf-icon-color-hover"
title="Поиск (/)">
<span class="relative block icon"><svg aria-hidden="true" focusable="false" data-prefix="fas" data-icon="search" class="svg-inline--fa fa-search fa-w-16" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path fill="currentColor" d="M505 442.7L405.3 343c-4.5-4.5-10.6-7-17-7H372c27.6-35.3 44-79.7 44-128C416 93.1 322.9 0 208 0S0 93.1 0 208s93.1 208 208 208c48.3 0 92.7-16.4 128-44v16.3c0 6.4 2.5 12.5 7 17l99.7 99.7c9.4 9.4 24.6 9.4 33.9 0l28.3-28.3c9.4-9.4 9.4-24.6.1-34zM208 336c-70.7 0-128-57.2-128-128 0-70.7 57.2-128 128-128 70.7 0 128 57.2 128 128 0 70.7-57.2 128-128 128z"/></svg>
</span>
</button>
<div class="flex items-center">
<button
id="appearance-switcher"
aria-label="Dark mode switcher"
type="button"
class="text-base bf-icon-color-hover">
<div class="flex items-center justify-center dark:hidden">
<span class="relative block icon"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path fill="currentColor" d="M32 256c0-123.8 100.3-224 223.8-224c11.36 0 29.7 1.668 40.9 3.746c9.616 1.777 11.75 14.63 3.279 19.44C245 86.5 211.2 144.6 211.2 207.8c0 109.7 99.71 193 208.3 172.3c9.561-1.805 16.28 9.324 10.11 16.95C387.9 448.6 324.8 480 255.8 480C132.1 480 32 379.6 32 256z"/></svg>
</span>
</div>
<div class="items-center justify-center hidden dark:flex">
<span class="relative block icon"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path fill="currentColor" d="M256 159.1c-53.02 0-95.1 42.98-95.1 95.1S202.1 351.1 256 351.1s95.1-42.98 95.1-95.1S309 159.1 256 159.1zM509.3 347L446.1 255.1l63.15-91.01c6.332-9.125 1.104-21.74-9.826-23.72l-109-19.7l-19.7-109c-1.975-10.93-14.59-16.16-23.72-9.824L256 65.89L164.1 2.736c-9.125-6.332-21.74-1.107-23.72 9.824L121.6 121.6L12.56 141.3C1.633 143.2-3.596 155.9 2.736 164.1L65.89 256l-63.15 91.01c-6.332 9.125-1.105 21.74 9.824 23.72l109 19.7l19.7 109c1.975 10.93 14.59 16.16 23.72 9.824L256 446.1l91.01 63.15c9.127 6.334 21.75 1.107 23.72-9.822l19.7-109l109-19.7C510.4 368.8 515.6 356.1 509.3 347zM256 383.1c-70.69 0-127.1-57.31-127.1-127.1c0-70.69 57.31-127.1 127.1-127.1s127.1 57.3 127.1 127.1C383.1 326.7 326.7 383.1 256 383.1z"/></svg>
</span>
</div>
</button>
</div>
</nav>
</div>
<div class="flex md:hidden">
<div class="flex items-center h-14 gap-4">
<button
id="search-button-mobile"
aria-label="Search"
class="flex items-center justify-center bf-icon-color-hover"
title="Поиск (/)">
<span class="relative block icon"><svg aria-hidden="true" focusable="false" data-prefix="fas" data-icon="search" class="svg-inline--fa fa-search fa-w-16" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path fill="currentColor" d="M505 442.7L405.3 343c-4.5-4.5-10.6-7-17-7H372c27.6-35.3 44-79.7 44-128C416 93.1 322.9 0 208 0S0 93.1 0 208s93.1 208 208 208c48.3 0 92.7-16.4 128-44v16.3c0 6.4 2.5 12.5 7 17l99.7 99.7c9.4 9.4 24.6 9.4 33.9 0l28.3-28.3c9.4-9.4 9.4-24.6.1-34zM208 336c-70.7 0-128-57.2-128-128 0-70.7 57.2-128 128-128 70.7 0 128 57.2 128 128 0 70.7-57.2 128-128 128z"/></svg>
</span>
</button>
<button
id="appearance-switcher-mobile"
type="button"
aria-label="Dark mode switcher"
class="flex items-center justify-center text-neutral-900 hover:text-primary-600 dark:text-neutral-200 dark:hover:text-primary-400">
<div class="dark:hidden">
<span class="relative block icon"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path fill="currentColor" d="M32 256c0-123.8 100.3-224 223.8-224c11.36 0 29.7 1.668 40.9 3.746c9.616 1.777 11.75 14.63 3.279 19.44C245 86.5 211.2 144.6 211.2 207.8c0 109.7 99.71 193 208.3 172.3c9.561-1.805 16.28 9.324 10.11 16.95C387.9 448.6 324.8 480 255.8 480C132.1 480 32 379.6 32 256z"/></svg>
</span>
</div>
<div class="hidden dark:block">
<span class="relative block icon"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path fill="currentColor" d="M256 159.1c-53.02 0-95.1 42.98-95.1 95.1S202.1 351.1 256 351.1s95.1-42.98 95.1-95.1S309 159.1 256 159.1zM509.3 347L446.1 255.1l63.15-91.01c6.332-9.125 1.104-21.74-9.826-23.72l-109-19.7l-19.7-109c-1.975-10.93-14.59-16.16-23.72-9.824L256 65.89L164.1 2.736c-9.125-6.332-21.74-1.107-23.72 9.824L121.6 121.6L12.56 141.3C1.633 143.2-3.596 155.9 2.736 164.1L65.89 256l-63.15 91.01c-6.332 9.125-1.105 21.74 9.824 23.72l109 19.7l19.7 109c1.975 10.93 14.59 16.16 23.72 9.824L256 446.1l91.01 63.15c9.127 6.334 21.75 1.107 23.72-9.822l19.7-109l109-19.7C510.4 368.8 515.6 356.1 509.3 347zM256 383.1c-70.69 0-127.1-57.31-127.1-127.1c0-70.69 57.31-127.1 127.1-127.1s127.1 57.3 127.1 127.1C383.1 326.7 326.7 383.1 256 383.1z"/></svg>
</span>
</div>
</button>
<input type="checkbox" id="mobile-menu-toggle" autocomplete="off" class="hidden peer">
<label for="mobile-menu-toggle" class="flex items-center justify-center cursor-pointer bf-icon-color-hover">
<span class="relative block icon"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><path fill="currentColor" d="M0 96C0 78.33 14.33 64 32 64H416C433.7 64 448 78.33 448 96C448 113.7 433.7 128 416 128H32C14.33 128 0 113.7 0 96zM0 256C0 238.3 14.33 224 32 224H416C433.7 224 448 238.3 448 256C448 273.7 433.7 288 416 288H32C14.33 288 0 273.7 0 256zM416 448H32C14.33 448 0 433.7 0 416C0 398.3 14.33 384 32 384H416C433.7 384 448 398.3 448 416C448 433.7 433.7 448 416 448z"/></svg>
</span>
</label>
<div
role="dialog"
aria-modal="true"
style="scrollbar-gutter: stable;"
class="fixed inset-0 z-50 invisible overflow-y-auto px-6 py-20 opacity-0 transition-[opacity,visibility] duration-300 peer-checked:visible peer-checked:opacity-100 bg-neutral-50/97 dark:bg-neutral-900/99
bf-scrollbar">
<label
for="mobile-menu-toggle"
class="fixed end-8 top-5 flex items-center justify-center z-50 h-12 w-12 cursor-pointer select-none rounded-full bf-icon-color-hover border bf-border-color bf-border-color-hover bg-neutral-50 dark:bg-neutral-900">
<span class="relative block icon"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><path fill="currentColor" d="M310.6 361.4c12.5 12.5 12.5 32.75 0 45.25C304.4 412.9 296.2 416 288 416s-16.38-3.125-22.62-9.375L160 301.3L54.63 406.6C48.38 412.9 40.19 416 32 416S15.63 412.9 9.375 406.6c-12.5-12.5-12.5-32.75 0-45.25l105.4-105.4L9.375 150.6c-12.5-12.5-12.5-32.75 0-45.25s32.75-12.5 45.25 0L160 210.8l105.4-105.4c12.5-12.5 32.75-12.5 45.25 0s12.5 32.75 0 45.25l-105.4 105.4L310.6 361.4z"/></svg>
</span>
</label>
<nav class="mx-auto max-w-md space-y-6">
<div class="px-2">
<a
href="/about/"
aria-label="Об авторе"
class="flex items-center gap-4 group bf-icon-color-hover text-neutral-700 dark:text-neutral-200">
<span title="Кто это пишет и зачем" class="text-2xl font-bold tracking-tight">
Об авторе
</span>
</a>
</div>
<div class="px-2">
<a
href="/posts/"
aria-label="Статьи"
class="flex items-center gap-4 group bf-icon-color-hover text-neutral-700 dark:text-neutral-200">
<span title="Статьи" class="text-2xl font-bold tracking-tight">
Статьи
</span>
</a>
</div>
<div class="px-2">
<a
href="/cheatsheets/"
aria-label="Шпаргалки"
class="flex items-center gap-4 group bf-icon-color-hover text-neutral-700 dark:text-neutral-200">
<span title="Шпаргалки" class="text-2xl font-bold tracking-tight">
Шпаргалки
</span>
</a>
</div>
</nav>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<script
type="text/javascript"
src="/js/background-blur.min.605b3b942818f0ab5a717ae446135ec46b8ee5a2ad12ae56fb90dc2a76ce30c388f9fec8bcc18db15bd47e3fa8a09d779fa12aa9c184cf614a315bc72c6c163d.js"
integrity="sha512-YFs7lCgY8KtacXrkRhNexGuO5aKtEq5W&#43;5DcKnbOMMOI&#43;f7IvMGNsVvUfj&#43;ooJ13n6EqqcGEz2FKMVvHLGwWPQ=="
data-blur-id="menu-blur"></script>
<div class="relative flex flex-col grow">
<main id="main-content" class="grow">
<h1 class="mb-3 text-4xl font-extrabold">Страница не найдена: в замешательстве:</h1>
<p class="mt-8 mb-12 text-neutral-400 dark:text-neutral-500">
Ошибка 404
</p>
<div class="prose dark:prose-invert">
<p>Похоже, запрошенная вами страница не существует.</p>
</div>
<div
id="scroll-to-top"
class="fixed bottom-6 end-6 z-50 transform translate-y-4 opacity-0 duration-200">
<a
href="#the-top"
class="pointer-events-auto flex h-12 w-12 items-center justify-center rounded-full bg-neutral/50 text-xl text-neutral-700 hover:text-primary-600 dark:bg-neutral-800/50 dark:text-neutral dark:hover:text-primary-400"
aria-label="Пролистать наверх"
title="Пролистать наверх">
&uarr;
</a>
</div>
</main><footer id="site-footer" class="py-10 print:hidden">
<nav class="flex flex-row pb-4 text-base font-medium text-neutral-500 dark:text-neutral-400 ">
<ul class="flex list-none flex-col sm:flex-row">
<li class=" flex mb-1 text-end sm:mb-0 sm:me-7 sm:last:me-0 ">
<a
class="decoration-primary-500 hover:underline hover:decoration-2 hover:underline-offset-2 flex items-center"
href="/tags/"
title="Теги">
Теги
</a>
</li>
<li class=" flex mb-1 text-end sm:mb-0 sm:me-7 sm:last:me-0 ">
<a
class="decoration-primary-500 hover:underline hover:decoration-2 hover:underline-offset-2 flex items-center"
href="/categories/"
title="Категории">
Категории
</a>
</li>
</ul>
</nav>
<div class="flex items-center justify-between">
<p class="text-sm text-neutral-500 dark:text-neutral-400">
&copy;
2026
Олег Казанин
</p>
<p class="text-xs text-neutral-500 dark:text-neutral-400">
Работает на <a class="hover:underline hover:decoration-primary-400 hover:text-primary-500"
href="https://gohugo.io/" target="_blank" rel="noopener noreferrer">Hugo</a> &amp; <a class="hover:underline hover:decoration-primary-400 hover:text-primary-500"
href="https://blowfish.page/" target="_blank" rel="noopener noreferrer">Blowfish</a>
</p>
</div>
<script>
mediumZoom(document.querySelectorAll("img:not(.nozoom)"), {
margin: 24,
background: "rgba(0,0,0,0.5)",
scrollOffset: 0,
});
</script>
</footer>
<div
id="search-wrapper"
class="invisible fixed inset-0 flex h-screen w-screen cursor-default flex-col bg-neutral-500/50 p-4 backdrop-blur-sm dark:bg-neutral-900/50 sm:p-6 md:p-[10vh] lg:p-[12vh] z-500"
data-url="http://192.168.11.190:1313/">
<div
id="search-modal"
class="flex flex-col w-full max-w-3xl min-h-0 mx-auto border rounded-md shadow-lg top-20 border-neutral-200 bg-neutral dark:border-neutral-700 dark:bg-neutral-800">
<header class="relative z-10 flex items-center justify-between flex-none px-2">
<form class="flex items-center flex-auto min-w-0">
<div class="flex items-center justify-center w-8 h-8 text-neutral-400">
<span class="relative block icon"><svg aria-hidden="true" focusable="false" data-prefix="fas" data-icon="search" class="svg-inline--fa fa-search fa-w-16" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path fill="currentColor" d="M505 442.7L405.3 343c-4.5-4.5-10.6-7-17-7H372c27.6-35.3 44-79.7 44-128C416 93.1 322.9 0 208 0S0 93.1 0 208s93.1 208 208 208c48.3 0 92.7-16.4 128-44v16.3c0 6.4 2.5 12.5 7 17l99.7 99.7c9.4 9.4 24.6 9.4 33.9 0l28.3-28.3c9.4-9.4 9.4-24.6.1-34zM208 336c-70.7 0-128-57.2-128-128 0-70.7 57.2-128 128-128 70.7 0 128 57.2 128 128 0 70.7-57.2 128-128 128z"/></svg>
</span>
</div>
<input
type="search"
id="search-query"
class="flex flex-auto h-12 mx-1 bg-transparent appearance-none focus:outline-dotted focus:outline-2 focus:outline-transparent"
placeholder="Поиск"
tabindex="0">
</form>
<button
id="close-search-button"
class="flex items-center justify-center w-8 h-8 text-neutral-700 hover:text-primary-600 dark:text-neutral dark:hover:text-primary-400"
title="Закрыть (Esc)">
<span class="relative block icon"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><path fill="currentColor" d="M310.6 361.4c12.5 12.5 12.5 32.75 0 45.25C304.4 412.9 296.2 416 288 416s-16.38-3.125-22.62-9.375L160 301.3L54.63 406.6C48.38 412.9 40.19 416 32 416S15.63 412.9 9.375 406.6c-12.5-12.5-12.5-32.75 0-45.25l105.4-105.4L9.375 150.6c-12.5-12.5-12.5-32.75 0-45.25s32.75-12.5 45.25 0L160 210.8l105.4-105.4c12.5-12.5 32.75-12.5 45.25 0s12.5 32.75 0 45.25l-105.4 105.4L310.6 361.4z"/></svg>
</span>
</button>
</header>
<section class="flex-auto px-2 overflow-auto">
<ul id="search-results">
</ul>
</section>
</div>
</div>
</div>
</body>
</html>

1064
public/about/index.html Normal file

File diff suppressed because it is too large Load Diff

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

BIN
public/apple-touch-icon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.3 KiB

856
public/authors/index.html Normal file
View File

@ -0,0 +1,856 @@
<!doctype html>
<html
lang="ru"
dir="ltr"
class="scroll-smooth"
data-default-appearance="dark"
data-auto-appearance="false"><head><script src="/livereload.js?mindelay=10&amp;v=2&amp;port=1313&amp;path=livereload" data-no-instant defer></script>
<meta charset="utf-8">
<meta http-equiv="content-language" content="ru">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<meta name="theme-color">
<title>Authors &middot; Олег Казанин</title>
<meta name="title" content="Authors &middot; Олег Казанин">
<link rel="canonical" href="http://192.168.11.190:1313/authors/">
<link rel="alternate" type="application/rss+xml" href="/authors/index.xml" title="Олег Казанин" />
<meta name="author" content="Олег Казанин">
<link href="https://t.me/oa_msk" rel="me">
<link href="https://oakazanin.ru/" rel="me">
<link href="https://git.jn4.ru/astronit" rel="me">
<link href="https://obrtv.ru/a/chiefengineer" rel="me">
<meta property="og:url" content="http://192.168.11.190:1313/authors/">
<meta property="og:site_name" content="Олег Казанин">
<meta property="og:title" content="Authors">
<meta property="og:locale" content="ru">
<meta property="og:type" content="website">
<meta name="twitter:card" content="summary">
<meta name="twitter:title" content="Authors">
<link
type="text/css"
rel="stylesheet"
href="/css/main.bundle.min.8bef0953ac7ae43aab1ba235d4df9cb29be7107c6f8de2fc281d504cc77d40bd80183fe93e6c8d96480fb0065184b63f24c8b33974ce850cbe070cafcf9dc107.css"
integrity="sha512-i&#43;8JU6x65DqrG6I11N&#43;cspvnEHxvjeL8KB1QTMd9QL2AGD/pPmyNlkgPsAZRhLY/JMizOXTOhQy&#43;Bwyvz53BBw==">
<script
type="text/javascript"
src="/js/appearance.min.a0c4d367419d691bf95fc98ffcaf55ce81db3412c3dfbd6c4fbe968f56f77347f5a8512b0916a65a5f496dbec1ef0590dbadcf2fbd0de3c919e525f11c32d0e3.js"
integrity="sha512-oMTTZ0GdaRv5X8mP/K9VzoHbNBLD371sT76Wj1b3c0f1qFErCRamWl9Jbb7B7wWQ263PL70N48kZ5SXxHDLQ4w=="></script>
<script src="/lib/zoom/zoom.min.umd.a527109b68c082a70f3697716dd72a9d5aa8b545cf800cecbbc7399f2ca6f6e0ce3e431f2062b48bbfa47c9ea42822714060bef309be073f49b9c0e30d318d7b.js" integrity="sha512-pScQm2jAgqcPNpdxbdcqnVqotUXPgAzsu8c5nyym9uDOPkMfIGK0i7&#43;kfJ6kKCJxQGC&#43;8wm&#43;Bz9JucDjDTGNew=="></script>
<script
defer
type="text/javascript"
id="script-bundle"
src="/js/main.bundle.min.858f7f82734cfae08d59fcf8d0eb186f01706a84e2f7d20d39edfd7bc8bed6166e02d5c65ecce1de82b1ac52d1e01d77bd1a82d19186fdae5fe6e12d867fcf68.js"
integrity="sha512-hY9/gnNM&#43;uCNWfz40OsYbwFwaoTi99INOe39e8i&#43;1hZuAtXGXszh3oKxrFLR4B13vRqC0ZGG/a5f5uEthn/PaA=="
data-copy="Копировать"
data-copied="Скопировано"></script>
<script type="module" src="/js/firebase.min.cad74e0625f72f359ec6d6fed579b87733749de70400e7614048050ed08832ee3f58983d5d139fb1ddc5f7f2f5047d45ed80ec923534a3660fc3a7965f936866.js" integrity="sha512-ytdOBiX3LzWextb&#43;1Xm4dzN0necEAOdhQEgFDtCIMu4/WJg9XROfsd3F9/L1BH1F7YDskjU0o2YPw6eWX5NoZg=="></script>
<script id="firebase-config"
type="application/json"
data-views="views_taxonomy_authors"
data-likes="likes_taxonomy_authors">
{
"config": {
"apiKey": "AIzaSyBBfzADrGgnwTIyW67gfZSrAtkoybxvmdI",
"authDomain": "oakazanin-hugo-blowfish.firebaseapp.com",
"projectId": "oakazanin-hugo-blowfish",
"storageBucket": "oakazanin-hugo-blowfish.firebasestorage.app",
"messagingSenderId": "945151844512",
"appId": "1:945151844512:web:22602cc010f5b7e0cca9c5",
"measurementId": ""
}
}
</script>
<link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png">
<link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png">
<link rel="icon" type="image/png" sizes="16x16" href="/favicon-16x16.png">
<link rel="manifest" href="/site.webmanifest">
<script type="application/ld+json">
[{
"@context": "https://schema.org",
"@type": "Article",
"articleSection": "Authors",
"name": "Authors",
"headline": "Authors",
"inLanguage": "ru",
"url" : "http://192.168.11.190:1313/authors/",
"author" : {
"@type": "Person",
"name": "Олег Казанин"
},
"mainEntityOfPage": "true",
"wordCount": "0"
}]
</script>
</head>
<body class="flex flex-col h-screen m-auto leading-7 max-w-7xl px-6 sm:px-14 md:px-24 lg:px-32 text-lg bg-neutral text-neutral-900 dark:bg-neutral-800 dark:text-neutral bf-scrollbar">
<div id="the-top" class="absolute flex self-center">
<a
class="px-3 py-1 text-sm -translate-y-8 rounded-b-lg bg-primary-200 focus:translate-y-0 dark:bg-neutral-600"
href="#main-content">
<span class="font-bold text-primary-600 pe-2 dark:text-primary-400">&darr;</span>
Перейти к основному содержимому
</a>
</div>
<div class="min-h-[148px]"></div>
<div class="fixed inset-x-0 z-100">
<div
id="menu-blur"
class="absolute opacity-0 inset-x-0 top-0 h-full single_hero_background nozoom backdrop-blur-2xl shadow-2xl bg-neutral/25 dark:bg-neutral-800/25"></div>
<div class="relative m-auto leading-7 max-w-7xl px-6 sm:px-14 md:px-24 lg:px-32">
<div class="main-menu flex items-center w-full gap-2 p-1 pl-0">
<div>
<a href="/" class="flex">
<span class="sr-only">Олег Казанин</span>
<img
src="/img/logo.png"
width="285"
height="175"
class="logo max-h-20 max-w-20 object-scale-down object-left nozoom"
alt="">
</a>
</div>
<div class="flex items-center ms-auto">
<div class="hidden md:flex">
<nav class="flex items-center gap-x-5 h-12">
<a
href="/about/"
class="flex items-center bf-icon-color-hover"
aria-label="Об авторе"
title="Кто это пишет и зачем">
<span class="text-base font-medium break-normal">
Об авторе
</span>
</a>
<a
href="/posts/"
class="flex items-center bf-icon-color-hover"
aria-label="Статьи"
title="Статьи">
<span class="text-base font-medium break-normal">
Статьи
</span>
</a>
<a
href="/cheatsheets/"
class="flex items-center bf-icon-color-hover"
aria-label="Шпаргалки"
title="Шпаргалки">
<span class="text-base font-medium break-normal">
Шпаргалки
</span>
</a>
<button
id="search-button"
aria-label="Search"
class="text-base bf-icon-color-hover"
title="Поиск (/)">
<span class="relative block icon"><svg aria-hidden="true" focusable="false" data-prefix="fas" data-icon="search" class="svg-inline--fa fa-search fa-w-16" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path fill="currentColor" d="M505 442.7L405.3 343c-4.5-4.5-10.6-7-17-7H372c27.6-35.3 44-79.7 44-128C416 93.1 322.9 0 208 0S0 93.1 0 208s93.1 208 208 208c48.3 0 92.7-16.4 128-44v16.3c0 6.4 2.5 12.5 7 17l99.7 99.7c9.4 9.4 24.6 9.4 33.9 0l28.3-28.3c9.4-9.4 9.4-24.6.1-34zM208 336c-70.7 0-128-57.2-128-128 0-70.7 57.2-128 128-128 70.7 0 128 57.2 128 128 0 70.7-57.2 128-128 128z"/></svg>
</span>
</button>
<div class="flex items-center">
<button
id="appearance-switcher"
aria-label="Dark mode switcher"
type="button"
class="text-base bf-icon-color-hover">
<div class="flex items-center justify-center dark:hidden">
<span class="relative block icon"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path fill="currentColor" d="M32 256c0-123.8 100.3-224 223.8-224c11.36 0 29.7 1.668 40.9 3.746c9.616 1.777 11.75 14.63 3.279 19.44C245 86.5 211.2 144.6 211.2 207.8c0 109.7 99.71 193 208.3 172.3c9.561-1.805 16.28 9.324 10.11 16.95C387.9 448.6 324.8 480 255.8 480C132.1 480 32 379.6 32 256z"/></svg>
</span>
</div>
<div class="items-center justify-center hidden dark:flex">
<span class="relative block icon"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path fill="currentColor" d="M256 159.1c-53.02 0-95.1 42.98-95.1 95.1S202.1 351.1 256 351.1s95.1-42.98 95.1-95.1S309 159.1 256 159.1zM509.3 347L446.1 255.1l63.15-91.01c6.332-9.125 1.104-21.74-9.826-23.72l-109-19.7l-19.7-109c-1.975-10.93-14.59-16.16-23.72-9.824L256 65.89L164.1 2.736c-9.125-6.332-21.74-1.107-23.72 9.824L121.6 121.6L12.56 141.3C1.633 143.2-3.596 155.9 2.736 164.1L65.89 256l-63.15 91.01c-6.332 9.125-1.105 21.74 9.824 23.72l109 19.7l19.7 109c1.975 10.93 14.59 16.16 23.72 9.824L256 446.1l91.01 63.15c9.127 6.334 21.75 1.107 23.72-9.822l19.7-109l109-19.7C510.4 368.8 515.6 356.1 509.3 347zM256 383.1c-70.69 0-127.1-57.31-127.1-127.1c0-70.69 57.31-127.1 127.1-127.1s127.1 57.3 127.1 127.1C383.1 326.7 326.7 383.1 256 383.1z"/></svg>
</span>
</div>
</button>
</div>
</nav>
</div>
<div class="flex md:hidden">
<div class="flex items-center h-14 gap-4">
<button
id="search-button-mobile"
aria-label="Search"
class="flex items-center justify-center bf-icon-color-hover"
title="Поиск (/)">
<span class="relative block icon"><svg aria-hidden="true" focusable="false" data-prefix="fas" data-icon="search" class="svg-inline--fa fa-search fa-w-16" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path fill="currentColor" d="M505 442.7L405.3 343c-4.5-4.5-10.6-7-17-7H372c27.6-35.3 44-79.7 44-128C416 93.1 322.9 0 208 0S0 93.1 0 208s93.1 208 208 208c48.3 0 92.7-16.4 128-44v16.3c0 6.4 2.5 12.5 7 17l99.7 99.7c9.4 9.4 24.6 9.4 33.9 0l28.3-28.3c9.4-9.4 9.4-24.6.1-34zM208 336c-70.7 0-128-57.2-128-128 0-70.7 57.2-128 128-128 70.7 0 128 57.2 128 128 0 70.7-57.2 128-128 128z"/></svg>
</span>
</button>
<button
id="appearance-switcher-mobile"
type="button"
aria-label="Dark mode switcher"
class="flex items-center justify-center text-neutral-900 hover:text-primary-600 dark:text-neutral-200 dark:hover:text-primary-400">
<div class="dark:hidden">
<span class="relative block icon"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path fill="currentColor" d="M32 256c0-123.8 100.3-224 223.8-224c11.36 0 29.7 1.668 40.9 3.746c9.616 1.777 11.75 14.63 3.279 19.44C245 86.5 211.2 144.6 211.2 207.8c0 109.7 99.71 193 208.3 172.3c9.561-1.805 16.28 9.324 10.11 16.95C387.9 448.6 324.8 480 255.8 480C132.1 480 32 379.6 32 256z"/></svg>
</span>
</div>
<div class="hidden dark:block">
<span class="relative block icon"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path fill="currentColor" d="M256 159.1c-53.02 0-95.1 42.98-95.1 95.1S202.1 351.1 256 351.1s95.1-42.98 95.1-95.1S309 159.1 256 159.1zM509.3 347L446.1 255.1l63.15-91.01c6.332-9.125 1.104-21.74-9.826-23.72l-109-19.7l-19.7-109c-1.975-10.93-14.59-16.16-23.72-9.824L256 65.89L164.1 2.736c-9.125-6.332-21.74-1.107-23.72 9.824L121.6 121.6L12.56 141.3C1.633 143.2-3.596 155.9 2.736 164.1L65.89 256l-63.15 91.01c-6.332 9.125-1.105 21.74 9.824 23.72l109 19.7l19.7 109c1.975 10.93 14.59 16.16 23.72 9.824L256 446.1l91.01 63.15c9.127 6.334 21.75 1.107 23.72-9.822l19.7-109l109-19.7C510.4 368.8 515.6 356.1 509.3 347zM256 383.1c-70.69 0-127.1-57.31-127.1-127.1c0-70.69 57.31-127.1 127.1-127.1s127.1 57.3 127.1 127.1C383.1 326.7 326.7 383.1 256 383.1z"/></svg>
</span>
</div>
</button>
<input type="checkbox" id="mobile-menu-toggle" autocomplete="off" class="hidden peer">
<label for="mobile-menu-toggle" class="flex items-center justify-center cursor-pointer bf-icon-color-hover">
<span class="relative block icon"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><path fill="currentColor" d="M0 96C0 78.33 14.33 64 32 64H416C433.7 64 448 78.33 448 96C448 113.7 433.7 128 416 128H32C14.33 128 0 113.7 0 96zM0 256C0 238.3 14.33 224 32 224H416C433.7 224 448 238.3 448 256C448 273.7 433.7 288 416 288H32C14.33 288 0 273.7 0 256zM416 448H32C14.33 448 0 433.7 0 416C0 398.3 14.33 384 32 384H416C433.7 384 448 398.3 448 416C448 433.7 433.7 448 416 448z"/></svg>
</span>
</label>
<div
role="dialog"
aria-modal="true"
style="scrollbar-gutter: stable;"
class="fixed inset-0 z-50 invisible overflow-y-auto px-6 py-20 opacity-0 transition-[opacity,visibility] duration-300 peer-checked:visible peer-checked:opacity-100 bg-neutral-50/97 dark:bg-neutral-900/99
bf-scrollbar">
<label
for="mobile-menu-toggle"
class="fixed end-8 top-5 flex items-center justify-center z-50 h-12 w-12 cursor-pointer select-none rounded-full bf-icon-color-hover border bf-border-color bf-border-color-hover bg-neutral-50 dark:bg-neutral-900">
<span class="relative block icon"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><path fill="currentColor" d="M310.6 361.4c12.5 12.5 12.5 32.75 0 45.25C304.4 412.9 296.2 416 288 416s-16.38-3.125-22.62-9.375L160 301.3L54.63 406.6C48.38 412.9 40.19 416 32 416S15.63 412.9 9.375 406.6c-12.5-12.5-12.5-32.75 0-45.25l105.4-105.4L9.375 150.6c-12.5-12.5-12.5-32.75 0-45.25s32.75-12.5 45.25 0L160 210.8l105.4-105.4c12.5-12.5 32.75-12.5 45.25 0s12.5 32.75 0 45.25l-105.4 105.4L310.6 361.4z"/></svg>
</span>
</label>
<nav class="mx-auto max-w-md space-y-6">
<div class="px-2">
<a
href="/about/"
aria-label="Об авторе"
class="flex items-center gap-4 group bf-icon-color-hover text-neutral-700 dark:text-neutral-200">
<span title="Кто это пишет и зачем" class="text-2xl font-bold tracking-tight">
Об авторе
</span>
</a>
</div>
<div class="px-2">
<a
href="/posts/"
aria-label="Статьи"
class="flex items-center gap-4 group bf-icon-color-hover text-neutral-700 dark:text-neutral-200">
<span title="Статьи" class="text-2xl font-bold tracking-tight">
Статьи
</span>
</a>
</div>
<div class="px-2">
<a
href="/cheatsheets/"
aria-label="Шпаргалки"
class="flex items-center gap-4 group bf-icon-color-hover text-neutral-700 dark:text-neutral-200">
<span title="Шпаргалки" class="text-2xl font-bold tracking-tight">
Шпаргалки
</span>
</a>
</div>
</nav>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<script
type="text/javascript"
src="/js/background-blur.min.605b3b942818f0ab5a717ae446135ec46b8ee5a2ad12ae56fb90dc2a76ce30c388f9fec8bcc18db15bd47e3fa8a09d779fa12aa9c184cf614a315bc72c6c163d.js"
integrity="sha512-YFs7lCgY8KtacXrkRhNexGuO5aKtEq5W&#43;5DcKnbOMMOI&#43;f7IvMGNsVvUfj&#43;ooJ13n6EqqcGEz2FKMVvHLGwWPQ=="
data-blur-id="menu-blur"></script>
<div class="relative flex flex-col grow">
<main id="main-content" class="grow">
<div id="hero" class="h-[150px] md:h-[200px]"></div>
<div class="fixed inset-x-0 top-0 h-[800px] single_hero_background nozoom">
<img
id="background-image"
src="/img/background_hu_42f1c83933308119.png"
role="presentation"
loading="eager"
decoding="async"
fetchpriority="high"
class="absolute inset-0 w-full h-full object-cover"
>
<div
class="absolute inset-0 bg-gradient-to-t from-neutral dark:from-neutral-800 to-transparent mix-blend-normal"></div>
<div
class="absolute inset-0 opacity-60 bg-gradient-to-t from-neutral dark:from-neutral-800 to-neutral-100 dark:to-neutral-800 mix-blend-normal"></div>
</div>
<div
id="background-blur"
class="fixed opacity-0 inset-x-0 top-0 h-full single_hero_background nozoom backdrop-blur-xl bg-neutral-100/75 dark:bg-neutral-800/60"></div>
<script
type="text/javascript"
src="/js/background-blur.min.605b3b942818f0ab5a717ae446135ec46b8ee5a2ad12ae56fb90dc2a76ce30c388f9fec8bcc18db15bd47e3fa8a09d779fa12aa9c184cf614a315bc72c6c163d.js"
integrity="sha512-YFs7lCgY8KtacXrkRhNexGuO5aKtEq5W&#43;5DcKnbOMMOI&#43;f7IvMGNsVvUfj&#43;ooJ13n6EqqcGEz2FKMVvHLGwWPQ=="
data-blur-id="background-blur"
data-image-id="background-image"
data-image-url="/img/background_hu_42f1c83933308119.png"></script>
<header class="mt-5">
<h1 class="mt-5 text-4xl font-extrabold text-neutral-900 dark:text-neutral">Authors</h1>
<div class="mt-1 mb-2 text-base text-neutral-500 dark:text-neutral-400 print:hidden">
<div class="flex flex-row flex-wrap items-center">
</div>
</div>
</header>
<section class="flex flex-wrap max-w-prose -mx-2 overflow-hidden">
</section>
<div
id="scroll-to-top"
class="fixed bottom-6 end-6 z-50 transform translate-y-4 opacity-0 duration-200">
<a
href="#the-top"
class="pointer-events-auto flex h-12 w-12 items-center justify-center rounded-full bg-neutral/50 text-xl text-neutral-700 hover:text-primary-600 dark:bg-neutral-800/50 dark:text-neutral dark:hover:text-primary-400"
aria-label="Пролистать наверх"
title="Пролистать наверх">
&uarr;
</a>
</div>
</main><footer id="site-footer" class="py-10 print:hidden">
<nav class="flex flex-row pb-4 text-base font-medium text-neutral-500 dark:text-neutral-400 ">
<ul class="flex list-none flex-col sm:flex-row">
<li class=" flex mb-1 text-end sm:mb-0 sm:me-7 sm:last:me-0 ">
<a
class="decoration-primary-500 hover:underline hover:decoration-2 hover:underline-offset-2 flex items-center"
href="/tags/"
title="Теги">
Теги
</a>
</li>
<li class=" flex mb-1 text-end sm:mb-0 sm:me-7 sm:last:me-0 ">
<a
class="decoration-primary-500 hover:underline hover:decoration-2 hover:underline-offset-2 flex items-center"
href="/categories/"
title="Категории">
Категории
</a>
</li>
</ul>
</nav>
<div class="flex items-center justify-between">
<p class="text-sm text-neutral-500 dark:text-neutral-400">
&copy;
2026
Олег Казанин
</p>
<p class="text-xs text-neutral-500 dark:text-neutral-400">
Работает на <a class="hover:underline hover:decoration-primary-400 hover:text-primary-500"
href="https://gohugo.io/" target="_blank" rel="noopener noreferrer">Hugo</a> &amp; <a class="hover:underline hover:decoration-primary-400 hover:text-primary-500"
href="https://blowfish.page/" target="_blank" rel="noopener noreferrer">Blowfish</a>
</p>
</div>
<script>
mediumZoom(document.querySelectorAll("img:not(.nozoom)"), {
margin: 24,
background: "rgba(0,0,0,0.5)",
scrollOffset: 0,
});
</script>
</footer>
<div
id="search-wrapper"
class="invisible fixed inset-0 flex h-screen w-screen cursor-default flex-col bg-neutral-500/50 p-4 backdrop-blur-sm dark:bg-neutral-900/50 sm:p-6 md:p-[10vh] lg:p-[12vh] z-500"
data-url="http://192.168.11.190:1313/">
<div
id="search-modal"
class="flex flex-col w-full max-w-3xl min-h-0 mx-auto border rounded-md shadow-lg top-20 border-neutral-200 bg-neutral dark:border-neutral-700 dark:bg-neutral-800">
<header class="relative z-10 flex items-center justify-between flex-none px-2">
<form class="flex items-center flex-auto min-w-0">
<div class="flex items-center justify-center w-8 h-8 text-neutral-400">
<span class="relative block icon"><svg aria-hidden="true" focusable="false" data-prefix="fas" data-icon="search" class="svg-inline--fa fa-search fa-w-16" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path fill="currentColor" d="M505 442.7L405.3 343c-4.5-4.5-10.6-7-17-7H372c27.6-35.3 44-79.7 44-128C416 93.1 322.9 0 208 0S0 93.1 0 208s93.1 208 208 208c48.3 0 92.7-16.4 128-44v16.3c0 6.4 2.5 12.5 7 17l99.7 99.7c9.4 9.4 24.6 9.4 33.9 0l28.3-28.3c9.4-9.4 9.4-24.6.1-34zM208 336c-70.7 0-128-57.2-128-128 0-70.7 57.2-128 128-128 70.7 0 128 57.2 128 128 0 70.7-57.2 128-128 128z"/></svg>
</span>
</div>
<input
type="search"
id="search-query"
class="flex flex-auto h-12 mx-1 bg-transparent appearance-none focus:outline-dotted focus:outline-2 focus:outline-transparent"
placeholder="Поиск"
tabindex="0">
</form>
<button
id="close-search-button"
class="flex items-center justify-center w-8 h-8 text-neutral-700 hover:text-primary-600 dark:text-neutral dark:hover:text-primary-400"
title="Закрыть (Esc)">
<span class="relative block icon"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><path fill="currentColor" d="M310.6 361.4c12.5 12.5 12.5 32.75 0 45.25C304.4 412.9 296.2 416 288 416s-16.38-3.125-22.62-9.375L160 301.3L54.63 406.6C48.38 412.9 40.19 416 32 416S15.63 412.9 9.375 406.6c-12.5-12.5-12.5-32.75 0-45.25l105.4-105.4L9.375 150.6c-12.5-12.5-12.5-32.75 0-45.25s32.75-12.5 45.25 0L160 210.8l105.4-105.4c12.5-12.5 32.75-12.5 45.25 0s12.5 32.75 0 45.25l-105.4 105.4L310.6 361.4z"/></svg>
</span>
</button>
</header>
<section class="flex-auto px-2 overflow-auto">
<ul id="search-results">
</ul>
</section>
</div>
</div>
</div>
</body>
</html>

15
public/authors/index.xml Normal file
View File

@ -0,0 +1,15 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
<title>Authors on Олег Казанин</title>
<link>http://192.168.11.190:1313/authors/</link>
<description>Recent content in Authors on Олег Казанин</description>
<generator>Hugo -- gohugo.io</generator>
<language>ru</language>
<managingEditor>oakazanin@ya.ru (Олег Казанин)</managingEditor>
<webMaster>oakazanin@ya.ru (Олег Казанин)</webMaster>
<copyright>© 2026 Олег Казанин</copyright>
<atom:link href="http://192.168.11.190:1313/authors/index.xml" rel="self" type="application/rss+xml" />
</channel>
</rss>

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,65 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
<title>DevOps Практики on Олег Казанин</title>
<link>http://192.168.11.190:1313/categories/devops-%D0%BF%D1%80%D0%B0%D0%BA%D1%82%D0%B8%D0%BA%D0%B8/</link>
<description>Recent content in DevOps Практики on Олег Казанин</description>
<generator>Hugo -- gohugo.io</generator>
<language>ru</language>
<managingEditor>oakazanin@ya.ru (Олег Казанин)</managingEditor>
<webMaster>oakazanin@ya.ru (Олег Казанин)</webMaster>
<copyright>© 2026 Олег Казанин</copyright>
<lastBuildDate>Wed, 18 Feb 2026 00:00:00 +0000</lastBuildDate><atom:link href="http://192.168.11.190:1313/categories/devops-%D0%BF%D1%80%D0%B0%D0%BA%D1%82%D0%B8%D0%BA%D0%B8/index.xml" rel="self" type="application/rss+xml" />
<item>
<title>Блог на Hugo в K3s: часть 6 - миграция между namespace</title>
<link>http://192.168.11.190:1313/posts/blog-part-6-namespace-migration/</link>
<pubDate>Wed, 18 Feb 2026 00:00:00 +0000</pubDate>
<author>oakazanin@ya.ru (Олег Казанин)</author>
<guid>http://192.168.11.190:1313/posts/blog-part-6-namespace-migration/</guid>
<description></description>
<media:content xmlns:media="http://search.yahoo.com/mrss/" url="http://192.168.11.190:1313/posts/blog-part-6-namespace-migration/featured.png" />
</item>
<item>
<title>Блог на Hugo в K3s: часть 5 - что делать когда всё внезапно сломалось</title>
<link>http://192.168.11.190:1313/posts/blog-part-5-debugging/</link>
<pubDate>Tue, 17 Feb 2026 00:00:00 +0000</pubDate>
<author>oakazanin@ya.ru (Олег Казанин)</author>
<guid>http://192.168.11.190:1313/posts/blog-part-5-debugging/</guid>
<description></description>
<media:content xmlns:media="http://search.yahoo.com/mrss/" url="http://192.168.11.190:1313/posts/blog-part-5-debugging/featured.png" />
</item>
<item>
<title>Блог на Hugo в K3s: часть 4 - выбор Git workflow</title>
<link>http://192.168.11.190:1313/posts/blog-part-4-git-workflow/</link>
<pubDate>Mon, 16 Feb 2026 00:00:00 +0000</pubDate>
<author>oakazanin@ya.ru (Олег Казанин)</author>
<guid>http://192.168.11.190:1313/posts/blog-part-4-git-workflow/</guid>
<description></description>
<media:content xmlns:media="http://search.yahoo.com/mrss/" url="http://192.168.11.190:1313/posts/blog-part-4-git-workflow/featured.png" />
</item>
<item>
<title>Блог на Hugo в K3s: часть 3 - development окружение</title>
<link>http://192.168.11.190:1313/posts/blog-part-3-dev-environment/</link>
<pubDate>Thu, 15 Jan 2026 00:00:00 +0000</pubDate>
<author>oakazanin@ya.ru (Олег Казанин)</author>
<guid>http://192.168.11.190:1313/posts/blog-part-3-dev-environment/</guid>
<description></description>
<media:content xmlns:media="http://search.yahoo.com/mrss/" url="http://192.168.11.190:1313/posts/blog-part-3-dev-environment/featured.png" />
</item>
<item>
<title>K3s HA для homelab: Ставим K3s HA кластер</title>
<link>http://192.168.11.190:1313/posts/k3s-part3-installation/</link>
<pubDate>Sun, 02 Nov 2025 00:00:00 +0000</pubDate>
<author>oakazanin@ya.ru (Олег Казанин)</author>
<guid>http://192.168.11.190:1313/posts/k3s-part3-installation/</guid>
<description></description>
<media:content xmlns:media="http://search.yahoo.com/mrss/" url="http://192.168.11.190:1313/posts/k3s-part3-installation/featured.png" />
</item>
</channel>
</rss>

View File

@ -0,0 +1,9 @@
<!DOCTYPE html>
<html lang="ru">
<head>
<title>http://192.168.11.190:1313/categories/devops-%D0%BF%D1%80%D0%B0%D0%BA%D1%82%D0%B8%D0%BA%D0%B8/</title>
<link rel="canonical" href="http://192.168.11.190:1313/categories/devops-%D0%BF%D1%80%D0%B0%D0%BA%D1%82%D0%B8%D0%BA%D0%B8/">
<meta charset="utf-8">
<meta http-equiv="refresh" content="0; url=http://192.168.11.190:1313/categories/devops-%D0%BF%D1%80%D0%B0%D0%BA%D1%82%D0%B8%D0%BA%D0%B8/">
</head>
</html>

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,45 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
<title>Homelab on Олег Казанин</title>
<link>http://192.168.11.190:1313/categories/homelab/</link>
<description>Recent content in Homelab on Олег Казанин</description>
<generator>Hugo -- gohugo.io</generator>
<language>ru</language>
<managingEditor>oakazanin@ya.ru (Олег Казанин)</managingEditor>
<webMaster>oakazanin@ya.ru (Олег Казанин)</webMaster>
<copyright>© 2026 Олег Казанин</copyright>
<lastBuildDate>Sun, 02 Nov 2025 00:00:00 +0000</lastBuildDate><atom:link href="http://192.168.11.190:1313/categories/homelab/index.xml" rel="self" type="application/rss+xml" />
<item>
<title>K3s HA для homelab: Ставим K3s HA кластер</title>
<link>http://192.168.11.190:1313/posts/k3s-part3-installation/</link>
<pubDate>Sun, 02 Nov 2025 00:00:00 +0000</pubDate>
<author>oakazanin@ya.ru (Олег Казанин)</author>
<guid>http://192.168.11.190:1313/posts/k3s-part3-installation/</guid>
<description></description>
<media:content xmlns:media="http://search.yahoo.com/mrss/" url="http://192.168.11.190:1313/posts/k3s-part3-installation/featured.png" />
</item>
<item>
<title>K3s HA для homelab: Готовим инфраструктуру в Proxmox</title>
<link>http://192.168.11.190:1313/posts/k3s-part2-infrastructure/</link>
<pubDate>Tue, 21 Oct 2025 00:00:00 +0000</pubDate>
<author>oakazanin@ya.ru (Олег Казанин)</author>
<guid>http://192.168.11.190:1313/posts/k3s-part2-infrastructure/</guid>
<description></description>
<media:content xmlns:media="http://search.yahoo.com/mrss/" url="http://192.168.11.190:1313/posts/k3s-part2-infrastructure/featured.png" />
</item>
<item>
<title>K3s HA для homelab: архитектура без боли</title>
<link>http://192.168.11.190:1313/posts/k3s-part1-architecture/</link>
<pubDate>Tue, 14 Oct 2025 00:00:00 +0000</pubDate>
<author>oakazanin@ya.ru (Олег Казанин)</author>
<guid>http://192.168.11.190:1313/posts/k3s-part1-architecture/</guid>
<description></description>
<media:content xmlns:media="http://search.yahoo.com/mrss/" url="http://192.168.11.190:1313/posts/k3s-part1-architecture/featured.png" />
</item>
</channel>
</rss>

View File

@ -0,0 +1,9 @@
<!DOCTYPE html>
<html lang="ru">
<head>
<title>http://192.168.11.190:1313/categories/homelab/</title>
<link rel="canonical" href="http://192.168.11.190:1313/categories/homelab/">
<meta charset="utf-8">
<meta http-equiv="refresh" content="0; url=http://192.168.11.190:1313/categories/homelab/">
</head>
</html>

View File

@ -0,0 +1,941 @@
<!doctype html>
<html
lang="ru"
dir="ltr"
class="scroll-smooth"
data-default-appearance="dark"
data-auto-appearance="false"><head><script src="/livereload.js?mindelay=10&amp;v=2&amp;port=1313&amp;path=livereload" data-no-instant defer></script>
<meta charset="utf-8">
<meta http-equiv="content-language" content="ru">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<meta name="theme-color">
<title>Категории &middot; Олег Казанин</title>
<meta name="title" content="Категории &middot; Олег Казанин">
<link rel="canonical" href="http://192.168.11.190:1313/categories/">
<link rel="alternate" type="application/rss+xml" href="/categories/index.xml" title="Олег Казанин" />
<meta name="author" content="Олег Казанин">
<link href="https://t.me/oa_msk" rel="me">
<link href="https://oakazanin.ru/" rel="me">
<link href="https://git.jn4.ru/astronit" rel="me">
<link href="https://obrtv.ru/a/chiefengineer" rel="me">
<meta property="og:url" content="http://192.168.11.190:1313/categories/">
<meta property="og:site_name" content="Олег Казанин">
<meta property="og:title" content="Категории">
<meta property="og:locale" content="ru">
<meta property="og:type" content="website">
<meta name="twitter:card" content="summary">
<meta name="twitter:title" content="Категории">
<link
type="text/css"
rel="stylesheet"
href="/css/main.bundle.min.8bef0953ac7ae43aab1ba235d4df9cb29be7107c6f8de2fc281d504cc77d40bd80183fe93e6c8d96480fb0065184b63f24c8b33974ce850cbe070cafcf9dc107.css"
integrity="sha512-i&#43;8JU6x65DqrG6I11N&#43;cspvnEHxvjeL8KB1QTMd9QL2AGD/pPmyNlkgPsAZRhLY/JMizOXTOhQy&#43;Bwyvz53BBw==">
<script
type="text/javascript"
src="/js/appearance.min.a0c4d367419d691bf95fc98ffcaf55ce81db3412c3dfbd6c4fbe968f56f77347f5a8512b0916a65a5f496dbec1ef0590dbadcf2fbd0de3c919e525f11c32d0e3.js"
integrity="sha512-oMTTZ0GdaRv5X8mP/K9VzoHbNBLD371sT76Wj1b3c0f1qFErCRamWl9Jbb7B7wWQ263PL70N48kZ5SXxHDLQ4w=="></script>
<script src="/lib/zoom/zoom.min.umd.a527109b68c082a70f3697716dd72a9d5aa8b545cf800cecbbc7399f2ca6f6e0ce3e431f2062b48bbfa47c9ea42822714060bef309be073f49b9c0e30d318d7b.js" integrity="sha512-pScQm2jAgqcPNpdxbdcqnVqotUXPgAzsu8c5nyym9uDOPkMfIGK0i7&#43;kfJ6kKCJxQGC&#43;8wm&#43;Bz9JucDjDTGNew=="></script>
<script
defer
type="text/javascript"
id="script-bundle"
src="/js/main.bundle.min.858f7f82734cfae08d59fcf8d0eb186f01706a84e2f7d20d39edfd7bc8bed6166e02d5c65ecce1de82b1ac52d1e01d77bd1a82d19186fdae5fe6e12d867fcf68.js"
integrity="sha512-hY9/gnNM&#43;uCNWfz40OsYbwFwaoTi99INOe39e8i&#43;1hZuAtXGXszh3oKxrFLR4B13vRqC0ZGG/a5f5uEthn/PaA=="
data-copy="Копировать"
data-copied="Скопировано"></script>
<script type="module" src="/js/firebase.min.cad74e0625f72f359ec6d6fed579b87733749de70400e7614048050ed08832ee3f58983d5d139fb1ddc5f7f2f5047d45ed80ec923534a3660fc3a7965f936866.js" integrity="sha512-ytdOBiX3LzWextb&#43;1Xm4dzN0necEAOdhQEgFDtCIMu4/WJg9XROfsd3F9/L1BH1F7YDskjU0o2YPw6eWX5NoZg=="></script>
<script id="firebase-config"
type="application/json"
data-views="views_taxonomy_categories"
data-likes="likes_taxonomy_categories">
{
"config": {
"apiKey": "AIzaSyBBfzADrGgnwTIyW67gfZSrAtkoybxvmdI",
"authDomain": "oakazanin-hugo-blowfish.firebaseapp.com",
"projectId": "oakazanin-hugo-blowfish",
"storageBucket": "oakazanin-hugo-blowfish.firebasestorage.app",
"messagingSenderId": "945151844512",
"appId": "1:945151844512:web:22602cc010f5b7e0cca9c5",
"measurementId": ""
}
}
</script>
<link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png">
<link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png">
<link rel="icon" type="image/png" sizes="16x16" href="/favicon-16x16.png">
<link rel="manifest" href="/site.webmanifest">
<script type="application/ld+json">
[{
"@context": "https://schema.org",
"@type": "Article",
"articleSection": "Категории",
"name": "Категории",
"headline": "Категории",
"inLanguage": "ru",
"url" : "http://192.168.11.190:1313/categories/",
"author" : {
"@type": "Person",
"name": "Олег Казанин"
},
"copyrightYear": "2026",
"dateCreated": "2026-02-23T00:00:00\u002b00:00",
"datePublished": "2026-02-23T00:00:00\u002b00:00",
"dateModified": "2026-02-23T00:00:00\u002b00:00",
"mainEntityOfPage": "true",
"wordCount": "0"
}]
</script>
</head>
<body class="flex flex-col h-screen m-auto leading-7 max-w-7xl px-6 sm:px-14 md:px-24 lg:px-32 text-lg bg-neutral text-neutral-900 dark:bg-neutral-800 dark:text-neutral bf-scrollbar">
<div id="the-top" class="absolute flex self-center">
<a
class="px-3 py-1 text-sm -translate-y-8 rounded-b-lg bg-primary-200 focus:translate-y-0 dark:bg-neutral-600"
href="#main-content">
<span class="font-bold text-primary-600 pe-2 dark:text-primary-400">&darr;</span>
Перейти к основному содержимому
</a>
</div>
<div class="min-h-[148px]"></div>
<div class="fixed inset-x-0 z-100">
<div
id="menu-blur"
class="absolute opacity-0 inset-x-0 top-0 h-full single_hero_background nozoom backdrop-blur-2xl shadow-2xl bg-neutral/25 dark:bg-neutral-800/25"></div>
<div class="relative m-auto leading-7 max-w-7xl px-6 sm:px-14 md:px-24 lg:px-32">
<div class="main-menu flex items-center w-full gap-2 p-1 pl-0">
<div>
<a href="/" class="flex">
<span class="sr-only">Олег Казанин</span>
<img
src="/img/logo.png"
width="285"
height="175"
class="logo max-h-20 max-w-20 object-scale-down object-left nozoom"
alt="">
</a>
</div>
<div class="flex items-center ms-auto">
<div class="hidden md:flex">
<nav class="flex items-center gap-x-5 h-12">
<a
href="/about/"
class="flex items-center bf-icon-color-hover"
aria-label="Об авторе"
title="Кто это пишет и зачем">
<span class="text-base font-medium break-normal">
Об авторе
</span>
</a>
<a
href="/posts/"
class="flex items-center bf-icon-color-hover"
aria-label="Статьи"
title="Статьи">
<span class="text-base font-medium break-normal">
Статьи
</span>
</a>
<a
href="/cheatsheets/"
class="flex items-center bf-icon-color-hover"
aria-label="Шпаргалки"
title="Шпаргалки">
<span class="text-base font-medium break-normal">
Шпаргалки
</span>
</a>
<button
id="search-button"
aria-label="Search"
class="text-base bf-icon-color-hover"
title="Поиск (/)">
<span class="relative block icon"><svg aria-hidden="true" focusable="false" data-prefix="fas" data-icon="search" class="svg-inline--fa fa-search fa-w-16" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path fill="currentColor" d="M505 442.7L405.3 343c-4.5-4.5-10.6-7-17-7H372c27.6-35.3 44-79.7 44-128C416 93.1 322.9 0 208 0S0 93.1 0 208s93.1 208 208 208c48.3 0 92.7-16.4 128-44v16.3c0 6.4 2.5 12.5 7 17l99.7 99.7c9.4 9.4 24.6 9.4 33.9 0l28.3-28.3c9.4-9.4 9.4-24.6.1-34zM208 336c-70.7 0-128-57.2-128-128 0-70.7 57.2-128 128-128 70.7 0 128 57.2 128 128 0 70.7-57.2 128-128 128z"/></svg>
</span>
</button>
<div class="flex items-center">
<button
id="appearance-switcher"
aria-label="Dark mode switcher"
type="button"
class="text-base bf-icon-color-hover">
<div class="flex items-center justify-center dark:hidden">
<span class="relative block icon"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path fill="currentColor" d="M32 256c0-123.8 100.3-224 223.8-224c11.36 0 29.7 1.668 40.9 3.746c9.616 1.777 11.75 14.63 3.279 19.44C245 86.5 211.2 144.6 211.2 207.8c0 109.7 99.71 193 208.3 172.3c9.561-1.805 16.28 9.324 10.11 16.95C387.9 448.6 324.8 480 255.8 480C132.1 480 32 379.6 32 256z"/></svg>
</span>
</div>
<div class="items-center justify-center hidden dark:flex">
<span class="relative block icon"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path fill="currentColor" d="M256 159.1c-53.02 0-95.1 42.98-95.1 95.1S202.1 351.1 256 351.1s95.1-42.98 95.1-95.1S309 159.1 256 159.1zM509.3 347L446.1 255.1l63.15-91.01c6.332-9.125 1.104-21.74-9.826-23.72l-109-19.7l-19.7-109c-1.975-10.93-14.59-16.16-23.72-9.824L256 65.89L164.1 2.736c-9.125-6.332-21.74-1.107-23.72 9.824L121.6 121.6L12.56 141.3C1.633 143.2-3.596 155.9 2.736 164.1L65.89 256l-63.15 91.01c-6.332 9.125-1.105 21.74 9.824 23.72l109 19.7l19.7 109c1.975 10.93 14.59 16.16 23.72 9.824L256 446.1l91.01 63.15c9.127 6.334 21.75 1.107 23.72-9.822l19.7-109l109-19.7C510.4 368.8 515.6 356.1 509.3 347zM256 383.1c-70.69 0-127.1-57.31-127.1-127.1c0-70.69 57.31-127.1 127.1-127.1s127.1 57.3 127.1 127.1C383.1 326.7 326.7 383.1 256 383.1z"/></svg>
</span>
</div>
</button>
</div>
</nav>
</div>
<div class="flex md:hidden">
<div class="flex items-center h-14 gap-4">
<button
id="search-button-mobile"
aria-label="Search"
class="flex items-center justify-center bf-icon-color-hover"
title="Поиск (/)">
<span class="relative block icon"><svg aria-hidden="true" focusable="false" data-prefix="fas" data-icon="search" class="svg-inline--fa fa-search fa-w-16" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path fill="currentColor" d="M505 442.7L405.3 343c-4.5-4.5-10.6-7-17-7H372c27.6-35.3 44-79.7 44-128C416 93.1 322.9 0 208 0S0 93.1 0 208s93.1 208 208 208c48.3 0 92.7-16.4 128-44v16.3c0 6.4 2.5 12.5 7 17l99.7 99.7c9.4 9.4 24.6 9.4 33.9 0l28.3-28.3c9.4-9.4 9.4-24.6.1-34zM208 336c-70.7 0-128-57.2-128-128 0-70.7 57.2-128 128-128 70.7 0 128 57.2 128 128 0 70.7-57.2 128-128 128z"/></svg>
</span>
</button>
<button
id="appearance-switcher-mobile"
type="button"
aria-label="Dark mode switcher"
class="flex items-center justify-center text-neutral-900 hover:text-primary-600 dark:text-neutral-200 dark:hover:text-primary-400">
<div class="dark:hidden">
<span class="relative block icon"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path fill="currentColor" d="M32 256c0-123.8 100.3-224 223.8-224c11.36 0 29.7 1.668 40.9 3.746c9.616 1.777 11.75 14.63 3.279 19.44C245 86.5 211.2 144.6 211.2 207.8c0 109.7 99.71 193 208.3 172.3c9.561-1.805 16.28 9.324 10.11 16.95C387.9 448.6 324.8 480 255.8 480C132.1 480 32 379.6 32 256z"/></svg>
</span>
</div>
<div class="hidden dark:block">
<span class="relative block icon"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path fill="currentColor" d="M256 159.1c-53.02 0-95.1 42.98-95.1 95.1S202.1 351.1 256 351.1s95.1-42.98 95.1-95.1S309 159.1 256 159.1zM509.3 347L446.1 255.1l63.15-91.01c6.332-9.125 1.104-21.74-9.826-23.72l-109-19.7l-19.7-109c-1.975-10.93-14.59-16.16-23.72-9.824L256 65.89L164.1 2.736c-9.125-6.332-21.74-1.107-23.72 9.824L121.6 121.6L12.56 141.3C1.633 143.2-3.596 155.9 2.736 164.1L65.89 256l-63.15 91.01c-6.332 9.125-1.105 21.74 9.824 23.72l109 19.7l19.7 109c1.975 10.93 14.59 16.16 23.72 9.824L256 446.1l91.01 63.15c9.127 6.334 21.75 1.107 23.72-9.822l19.7-109l109-19.7C510.4 368.8 515.6 356.1 509.3 347zM256 383.1c-70.69 0-127.1-57.31-127.1-127.1c0-70.69 57.31-127.1 127.1-127.1s127.1 57.3 127.1 127.1C383.1 326.7 326.7 383.1 256 383.1z"/></svg>
</span>
</div>
</button>
<input type="checkbox" id="mobile-menu-toggle" autocomplete="off" class="hidden peer">
<label for="mobile-menu-toggle" class="flex items-center justify-center cursor-pointer bf-icon-color-hover">
<span class="relative block icon"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><path fill="currentColor" d="M0 96C0 78.33 14.33 64 32 64H416C433.7 64 448 78.33 448 96C448 113.7 433.7 128 416 128H32C14.33 128 0 113.7 0 96zM0 256C0 238.3 14.33 224 32 224H416C433.7 224 448 238.3 448 256C448 273.7 433.7 288 416 288H32C14.33 288 0 273.7 0 256zM416 448H32C14.33 448 0 433.7 0 416C0 398.3 14.33 384 32 384H416C433.7 384 448 398.3 448 416C448 433.7 433.7 448 416 448z"/></svg>
</span>
</label>
<div
role="dialog"
aria-modal="true"
style="scrollbar-gutter: stable;"
class="fixed inset-0 z-50 invisible overflow-y-auto px-6 py-20 opacity-0 transition-[opacity,visibility] duration-300 peer-checked:visible peer-checked:opacity-100 bg-neutral-50/97 dark:bg-neutral-900/99
bf-scrollbar">
<label
for="mobile-menu-toggle"
class="fixed end-8 top-5 flex items-center justify-center z-50 h-12 w-12 cursor-pointer select-none rounded-full bf-icon-color-hover border bf-border-color bf-border-color-hover bg-neutral-50 dark:bg-neutral-900">
<span class="relative block icon"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><path fill="currentColor" d="M310.6 361.4c12.5 12.5 12.5 32.75 0 45.25C304.4 412.9 296.2 416 288 416s-16.38-3.125-22.62-9.375L160 301.3L54.63 406.6C48.38 412.9 40.19 416 32 416S15.63 412.9 9.375 406.6c-12.5-12.5-12.5-32.75 0-45.25l105.4-105.4L9.375 150.6c-12.5-12.5-12.5-32.75 0-45.25s32.75-12.5 45.25 0L160 210.8l105.4-105.4c12.5-12.5 32.75-12.5 45.25 0s12.5 32.75 0 45.25l-105.4 105.4L310.6 361.4z"/></svg>
</span>
</label>
<nav class="mx-auto max-w-md space-y-6">
<div class="px-2">
<a
href="/about/"
aria-label="Об авторе"
class="flex items-center gap-4 group bf-icon-color-hover text-neutral-700 dark:text-neutral-200">
<span title="Кто это пишет и зачем" class="text-2xl font-bold tracking-tight">
Об авторе
</span>
</a>
</div>
<div class="px-2">
<a
href="/posts/"
aria-label="Статьи"
class="flex items-center gap-4 group bf-icon-color-hover text-neutral-700 dark:text-neutral-200">
<span title="Статьи" class="text-2xl font-bold tracking-tight">
Статьи
</span>
</a>
</div>
<div class="px-2">
<a
href="/cheatsheets/"
aria-label="Шпаргалки"
class="flex items-center gap-4 group bf-icon-color-hover text-neutral-700 dark:text-neutral-200">
<span title="Шпаргалки" class="text-2xl font-bold tracking-tight">
Шпаргалки
</span>
</a>
</div>
</nav>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<script
type="text/javascript"
src="/js/background-blur.min.605b3b942818f0ab5a717ae446135ec46b8ee5a2ad12ae56fb90dc2a76ce30c388f9fec8bcc18db15bd47e3fa8a09d779fa12aa9c184cf614a315bc72c6c163d.js"
integrity="sha512-YFs7lCgY8KtacXrkRhNexGuO5aKtEq5W&#43;5DcKnbOMMOI&#43;f7IvMGNsVvUfj&#43;ooJ13n6EqqcGEz2FKMVvHLGwWPQ=="
data-blur-id="menu-blur"></script>
<div class="relative flex flex-col grow">
<main id="main-content" class="grow">
<div id="hero" class="h-[150px] md:h-[200px]"></div>
<div class="fixed inset-x-0 top-0 h-[800px] single_hero_background nozoom">
<img
id="background-image"
src="/img/background_hu_42f1c83933308119.png"
role="presentation"
loading="eager"
decoding="async"
fetchpriority="high"
class="absolute inset-0 w-full h-full object-cover"
>
<div
class="absolute inset-0 bg-gradient-to-t from-neutral dark:from-neutral-800 to-transparent mix-blend-normal"></div>
<div
class="absolute inset-0 opacity-60 bg-gradient-to-t from-neutral dark:from-neutral-800 to-neutral-100 dark:to-neutral-800 mix-blend-normal"></div>
</div>
<div
id="background-blur"
class="fixed opacity-0 inset-x-0 top-0 h-full single_hero_background nozoom backdrop-blur-xl bg-neutral-100/75 dark:bg-neutral-800/60"></div>
<script
type="text/javascript"
src="/js/background-blur.min.605b3b942818f0ab5a717ae446135ec46b8ee5a2ad12ae56fb90dc2a76ce30c388f9fec8bcc18db15bd47e3fa8a09d779fa12aa9c184cf614a315bc72c6c163d.js"
integrity="sha512-YFs7lCgY8KtacXrkRhNexGuO5aKtEq5W&#43;5DcKnbOMMOI&#43;f7IvMGNsVvUfj&#43;ooJ13n6EqqcGEz2FKMVvHLGwWPQ=="
data-blur-id="background-blur"
data-image-id="background-image"
data-image-url="/img/background_hu_42f1c83933308119.png"></script>
<header class="mt-5">
<h1 class="mt-5 text-4xl font-extrabold text-neutral-900 dark:text-neutral">Категории</h1>
<div class="mt-1 mb-2 text-base text-neutral-500 dark:text-neutral-400 print:hidden">
<div class="flex flex-row flex-wrap items-center">
</div>
</div>
</header>
<section class="flex flex-wrap max-w-prose -mx-2 overflow-hidden">
<article class="w-full px-2 my-3 overflow-hidden sm:w-1/2 md:w-1/3 lg:w-1/4 xl:w-1/4">
<h2 class="flex items-center">
<a
class="text-xl font-medium decoration-primary-500 hover:underline hover:underline-offset-2"
href="/categories/devops-%D0%BF%D1%80%D0%B0%D0%BA%D1%82%D0%B8%D0%BA%D0%B8/"
>DevOps Практики</a
>
<span class="px-2 text-base text-primary-500">&middot;</span>
<span class="text-base text-neutral-400">
5
</span>
</h2>
</article>
<article class="w-full px-2 my-3 overflow-hidden sm:w-1/2 md:w-1/3 lg:w-1/4 xl:w-1/4">
<h2 class="flex items-center">
<a
class="text-xl font-medium decoration-primary-500 hover:underline hover:underline-offset-2"
href="/categories/homelab/"
>Homelab</a
>
<span class="px-2 text-base text-primary-500">&middot;</span>
<span class="text-base text-neutral-400">
3
</span>
</h2>
</article>
<article class="w-full px-2 my-3 overflow-hidden sm:w-1/2 md:w-1/3 lg:w-1/4 xl:w-1/4">
<h2 class="flex items-center">
<a
class="text-xl font-medium decoration-primary-500 hover:underline hover:underline-offset-2"
href="/categories/kubernetes/"
>Kubernetes</a
>
<span class="px-2 text-base text-primary-500">&middot;</span>
<span class="text-base text-neutral-400">
6
</span>
</h2>
</article>
<article class="w-full px-2 my-3 overflow-hidden sm:w-1/2 md:w-1/3 lg:w-1/4 xl:w-1/4">
<h2 class="flex items-center">
<a
class="text-xl font-medium decoration-primary-500 hover:underline hover:underline-offset-2"
href="/categories/%D0%B2%D0%B5%D0%B1-%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0/"
>Веб-Разработка</a
>
<span class="px-2 text-base text-primary-500">&middot;</span>
<span class="text-base text-neutral-400">
4
</span>
</h2>
</article>
<article class="w-full px-2 my-3 overflow-hidden sm:w-1/2 md:w-1/3 lg:w-1/4 xl:w-1/4">
<h2 class="flex items-center">
<a
class="text-xl font-medium decoration-primary-500 hover:underline hover:underline-offset-2"
href="/categories/%D1%88%D0%BF%D0%B0%D1%80%D0%B3%D0%B0%D0%BB%D0%BA%D0%B8/"
>Шпаргалки</a
>
<span class="px-2 text-base text-primary-500">&middot;</span>
<span class="text-base text-neutral-400">
1
</span>
</h2>
</article>
</section>
<div
id="scroll-to-top"
class="fixed bottom-6 end-6 z-50 transform translate-y-4 opacity-0 duration-200">
<a
href="#the-top"
class="pointer-events-auto flex h-12 w-12 items-center justify-center rounded-full bg-neutral/50 text-xl text-neutral-700 hover:text-primary-600 dark:bg-neutral-800/50 dark:text-neutral dark:hover:text-primary-400"
aria-label="Пролистать наверх"
title="Пролистать наверх">
&uarr;
</a>
</div>
</main><footer id="site-footer" class="py-10 print:hidden">
<nav class="flex flex-row pb-4 text-base font-medium text-neutral-500 dark:text-neutral-400 ">
<ul class="flex list-none flex-col sm:flex-row">
<li class=" flex mb-1 text-end sm:mb-0 sm:me-7 sm:last:me-0 ">
<a
class="decoration-primary-500 hover:underline hover:decoration-2 hover:underline-offset-2 flex items-center"
href="/tags/"
title="Теги">
Теги
</a>
</li>
<li class=" flex mb-1 text-end sm:mb-0 sm:me-7 sm:last:me-0 ">
<a
class="decoration-primary-500 hover:underline hover:decoration-2 hover:underline-offset-2 flex items-center"
href="/categories/"
title="Категории">
Категории
</a>
</li>
</ul>
</nav>
<div class="flex items-center justify-between">
<p class="text-sm text-neutral-500 dark:text-neutral-400">
&copy;
2026
Олег Казанин
</p>
<p class="text-xs text-neutral-500 dark:text-neutral-400">
Работает на <a class="hover:underline hover:decoration-primary-400 hover:text-primary-500"
href="https://gohugo.io/" target="_blank" rel="noopener noreferrer">Hugo</a> &amp; <a class="hover:underline hover:decoration-primary-400 hover:text-primary-500"
href="https://blowfish.page/" target="_blank" rel="noopener noreferrer">Blowfish</a>
</p>
</div>
<script>
mediumZoom(document.querySelectorAll("img:not(.nozoom)"), {
margin: 24,
background: "rgba(0,0,0,0.5)",
scrollOffset: 0,
});
</script>
</footer>
<div
id="search-wrapper"
class="invisible fixed inset-0 flex h-screen w-screen cursor-default flex-col bg-neutral-500/50 p-4 backdrop-blur-sm dark:bg-neutral-900/50 sm:p-6 md:p-[10vh] lg:p-[12vh] z-500"
data-url="http://192.168.11.190:1313/">
<div
id="search-modal"
class="flex flex-col w-full max-w-3xl min-h-0 mx-auto border rounded-md shadow-lg top-20 border-neutral-200 bg-neutral dark:border-neutral-700 dark:bg-neutral-800">
<header class="relative z-10 flex items-center justify-between flex-none px-2">
<form class="flex items-center flex-auto min-w-0">
<div class="flex items-center justify-center w-8 h-8 text-neutral-400">
<span class="relative block icon"><svg aria-hidden="true" focusable="false" data-prefix="fas" data-icon="search" class="svg-inline--fa fa-search fa-w-16" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path fill="currentColor" d="M505 442.7L405.3 343c-4.5-4.5-10.6-7-17-7H372c27.6-35.3 44-79.7 44-128C416 93.1 322.9 0 208 0S0 93.1 0 208s93.1 208 208 208c48.3 0 92.7-16.4 128-44v16.3c0 6.4 2.5 12.5 7 17l99.7 99.7c9.4 9.4 24.6 9.4 33.9 0l28.3-28.3c9.4-9.4 9.4-24.6.1-34zM208 336c-70.7 0-128-57.2-128-128 0-70.7 57.2-128 128-128 70.7 0 128 57.2 128 128 0 70.7-57.2 128-128 128z"/></svg>
</span>
</div>
<input
type="search"
id="search-query"
class="flex flex-auto h-12 mx-1 bg-transparent appearance-none focus:outline-dotted focus:outline-2 focus:outline-transparent"
placeholder="Поиск"
tabindex="0">
</form>
<button
id="close-search-button"
class="flex items-center justify-center w-8 h-8 text-neutral-700 hover:text-primary-600 dark:text-neutral dark:hover:text-primary-400"
title="Закрыть (Esc)">
<span class="relative block icon"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><path fill="currentColor" d="M310.6 361.4c12.5 12.5 12.5 32.75 0 45.25C304.4 412.9 296.2 416 288 416s-16.38-3.125-22.62-9.375L160 301.3L54.63 406.6C48.38 412.9 40.19 416 32 416S15.63 412.9 9.375 406.6c-12.5-12.5-12.5-32.75 0-45.25l105.4-105.4L9.375 150.6c-12.5-12.5-12.5-32.75 0-45.25s32.75-12.5 45.25 0L160 210.8l105.4-105.4c12.5-12.5 32.75-12.5 45.25 0s12.5 32.75 0 45.25l-105.4 105.4L310.6 361.4z"/></svg>
</span>
</button>
</header>
<section class="flex-auto px-2 overflow-auto">
<ul id="search-results">
</ul>
</section>
</div>
</div>
</div>
</body>
</html>

View File

@ -0,0 +1,65 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
<title>Категории on Олег Казанин</title>
<link>http://192.168.11.190:1313/categories/</link>
<description>Recent content in Категории on Олег Казанин</description>
<generator>Hugo -- gohugo.io</generator>
<language>ru</language>
<managingEditor>oakazanin@ya.ru (Олег Казанин)</managingEditor>
<webMaster>oakazanin@ya.ru (Олег Казанин)</webMaster>
<copyright>© 2026 Олег Казанин</copyright>
<lastBuildDate>Mon, 23 Feb 2026 00:00:00 +0000</lastBuildDate><atom:link href="http://192.168.11.190:1313/categories/index.xml" rel="self" type="application/rss+xml" />
<item>
<title>Шпаргалки</title>
<link>http://192.168.11.190:1313/categories/%D1%88%D0%BF%D0%B0%D1%80%D0%B3%D0%B0%D0%BB%D0%BA%D0%B8/</link>
<pubDate>Mon, 23 Feb 2026 00:00:00 +0000</pubDate>
<author>oakazanin@ya.ru (Олег Казанин)</author>
<guid>http://192.168.11.190:1313/categories/%D1%88%D0%BF%D0%B0%D1%80%D0%B3%D0%B0%D0%BB%D0%BA%D0%B8/</guid>
<description></description>
</item>
<item>
<title>DevOps Практики</title>
<link>http://192.168.11.190:1313/categories/devops-%D0%BF%D1%80%D0%B0%D0%BA%D1%82%D0%B8%D0%BA%D0%B8/</link>
<pubDate>Wed, 18 Feb 2026 00:00:00 +0000</pubDate>
<author>oakazanin@ya.ru (Олег Казанин)</author>
<guid>http://192.168.11.190:1313/categories/devops-%D0%BF%D1%80%D0%B0%D0%BA%D1%82%D0%B8%D0%BA%D0%B8/</guid>
<description></description>
</item>
<item>
<title>Kubernetes</title>
<link>http://192.168.11.190:1313/categories/kubernetes/</link>
<pubDate>Wed, 18 Feb 2026 00:00:00 +0000</pubDate>
<author>oakazanin@ya.ru (Олег Казанин)</author>
<guid>http://192.168.11.190:1313/categories/kubernetes/</guid>
<description></description>
</item>
<item>
<title>Веб-Разработка</title>
<link>http://192.168.11.190:1313/categories/%D0%B2%D0%B5%D0%B1-%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0/</link>
<pubDate>Mon, 16 Feb 2026 00:00:00 +0000</pubDate>
<author>oakazanin@ya.ru (Олег Казанин)</author>
<guid>http://192.168.11.190:1313/categories/%D0%B2%D0%B5%D0%B1-%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0/</guid>
<description></description>
</item>
<item>
<title>Homelab</title>
<link>http://192.168.11.190:1313/categories/homelab/</link>
<pubDate>Sun, 02 Nov 2025 00:00:00 +0000</pubDate>
<author>oakazanin@ya.ru (Олег Казанин)</author>
<guid>http://192.168.11.190:1313/categories/homelab/</guid>
<description></description>
</item>
</channel>
</rss>

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,105 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
<title>Infrastructure on Олег Казанин</title>
<link>http://192.168.11.190:1313/categories/infrastructure/</link>
<description>Recent content in Infrastructure on Олег Казанин</description>
<generator>Hugo -- gohugo.io</generator>
<language>ru</language>
<managingEditor>oakazanin@ya.ru (Олег Казанин)</managingEditor>
<webMaster>oakazanin@ya.ru (Олег Казанин)</webMaster>
<copyright>© 2026 Олег Казанин</copyright>
<lastBuildDate>Wed, 18 Feb 2026 00:00:00 +0000</lastBuildDate><atom:link href="http://192.168.11.190:1313/categories/infrastructure/index.xml" rel="self" type="application/rss+xml" />
<item>
<title>Блог на Hugo в K3s: часть 6 - миграция между namespace</title>
<link>http://192.168.11.190:1313/posts/blog-part-6-namespace-migration/</link>
<pubDate>Wed, 18 Feb 2026 00:00:00 +0000</pubDate>
<author>oakazanin@ya.ru (Олег Казанин)</author>
<guid>http://192.168.11.190:1313/posts/blog-part-6-namespace-migration/</guid>
<description></description>
<media:content xmlns:media="http://search.yahoo.com/mrss/" url="http://192.168.11.190:1313/posts/blog-part-6-namespace-migration/featured.png" />
</item>
<item>
<title>Блог на Hugo в K3s: часть 5 - что делать когда всё внезапно сломалось</title>
<link>http://192.168.11.190:1313/posts/blog-part-5-debugging/</link>
<pubDate>Tue, 17 Feb 2026 00:00:00 +0000</pubDate>
<author>oakazanin@ya.ru (Олег Казанин)</author>
<guid>http://192.168.11.190:1313/posts/blog-part-5-debugging/</guid>
<description></description>
<media:content xmlns:media="http://search.yahoo.com/mrss/" url="http://192.168.11.190:1313/posts/blog-part-5-debugging/featured.png" />
</item>
<item>
<title>Блог на Hugo в K3s: часть 4 - выбор Git workflow</title>
<link>http://192.168.11.190:1313/posts/blog-part-4-git-workflow/</link>
<pubDate>Mon, 16 Feb 2026 00:00:00 +0000</pubDate>
<author>oakazanin@ya.ru (Олег Казанин)</author>
<guid>http://192.168.11.190:1313/posts/blog-part-4-git-workflow/</guid>
<description></description>
<media:content xmlns:media="http://search.yahoo.com/mrss/" url="http://192.168.11.190:1313/posts/blog-part-4-git-workflow/featured.png" />
</item>
<item>
<title>Блог на Hugo в K3s: часть 3 - development окружение</title>
<link>http://192.168.11.190:1313/posts/blog-part-3-dev-environment/</link>
<pubDate>Thu, 15 Jan 2026 00:00:00 +0000</pubDate>
<author>oakazanin@ya.ru (Олег Казанин)</author>
<guid>http://192.168.11.190:1313/posts/blog-part-3-dev-environment/</guid>
<description></description>
<media:content xmlns:media="http://search.yahoo.com/mrss/" url="http://192.168.11.190:1313/posts/blog-part-3-dev-environment/featured.png" />
</item>
<item>
<title>Блог на Hugo в K3s: часть 2 - деплой в кластер</title>
<link>http://192.168.11.190:1313/posts/blog-part-2-k8s-deployment/</link>
<pubDate>Thu, 08 Jan 2026 00:00:00 +0000</pubDate>
<author>oakazanin@ya.ru (Олег Казанин)</author>
<guid>http://192.168.11.190:1313/posts/blog-part-2-k8s-deployment/</guid>
<description></description>
<media:content xmlns:media="http://search.yahoo.com/mrss/" url="http://192.168.11.190:1313/posts/blog-part-2-k8s-deployment/featured.png" />
</item>
<item>
<title>Блог на Hugo в K3s: часть 1 - архитектура и первый запуск</title>
<link>http://192.168.11.190:1313/posts/blog-part-1-architecture/</link>
<pubDate>Sat, 03 Jan 2026 00:00:00 +0000</pubDate>
<author>oakazanin@ya.ru (Олег Казанин)</author>
<guid>http://192.168.11.190:1313/posts/blog-part-1-architecture/</guid>
<description></description>
<media:content xmlns:media="http://search.yahoo.com/mrss/" url="http://192.168.11.190:1313/posts/blog-part-1-architecture/featured.png" />
</item>
<item>
<title>K3s HA для homelab: Ставим K3s HA кластер</title>
<link>http://192.168.11.190:1313/posts/k3s-part3-installation/</link>
<pubDate>Sun, 02 Nov 2025 00:00:00 +0000</pubDate>
<author>oakazanin@ya.ru (Олег Казанин)</author>
<guid>http://192.168.11.190:1313/posts/k3s-part3-installation/</guid>
<description></description>
<media:content xmlns:media="http://search.yahoo.com/mrss/" url="http://192.168.11.190:1313/posts/k3s-part3-installation/featured.png" />
</item>
<item>
<title>K3s HA для homelab: Готовим инфраструктуру в Proxmox</title>
<link>http://192.168.11.190:1313/posts/k3s-part2-infrastructure/</link>
<pubDate>Tue, 21 Oct 2025 00:00:00 +0000</pubDate>
<author>oakazanin@ya.ru (Олег Казанин)</author>
<guid>http://192.168.11.190:1313/posts/k3s-part2-infrastructure/</guid>
<description></description>
<media:content xmlns:media="http://search.yahoo.com/mrss/" url="http://192.168.11.190:1313/posts/k3s-part2-infrastructure/featured.png" />
</item>
<item>
<title>K3s HA для homelab: архитектура без боли</title>
<link>http://192.168.11.190:1313/posts/k3s-part1-architecture/</link>
<pubDate>Tue, 14 Oct 2025 00:00:00 +0000</pubDate>
<author>oakazanin@ya.ru (Олег Казанин)</author>
<guid>http://192.168.11.190:1313/posts/k3s-part1-architecture/</guid>
<description></description>
<media:content xmlns:media="http://search.yahoo.com/mrss/" url="http://192.168.11.190:1313/posts/k3s-part1-architecture/featured.png" />
</item>
</channel>
</rss>

View File

@ -0,0 +1,9 @@
<!DOCTYPE html>
<html lang="ru">
<head>
<title>http://192.168.11.190:1313/categories/infrastructure/</title>
<link rel="canonical" href="http://192.168.11.190:1313/categories/infrastructure/">
<meta charset="utf-8">
<meta http-equiv="refresh" content="0; url=http://192.168.11.190:1313/categories/infrastructure/">
</head>
</html>

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,25 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
<title>K3s on Олег Казанин</title>
<link>http://192.168.11.190:1313/categories/k3s/</link>
<description>Recent content in K3s on Олег Казанин</description>
<generator>Hugo -- gohugo.io</generator>
<language>ru</language>
<managingEditor>oakazanin@ya.ru (Олег Казанин)</managingEditor>
<webMaster>oakazanin@ya.ru (Олег Казанин)</webMaster>
<copyright>© 2026 Олег Казанин</copyright>
<lastBuildDate>Sun, 02 Nov 2025 00:00:00 +0000</lastBuildDate><atom:link href="http://192.168.11.190:1313/categories/k3s/index.xml" rel="self" type="application/rss+xml" />
<item>
<title>K3s HA для homelab: Ставим K3s HA кластер</title>
<link>http://192.168.11.190:1313/posts/k3s-part3-installation/</link>
<pubDate>Sun, 02 Nov 2025 00:00:00 +0000</pubDate>
<author>oakazanin@ya.ru (Олег Казанин)</author>
<guid>http://192.168.11.190:1313/posts/k3s-part3-installation/</guid>
<description></description>
<media:content xmlns:media="http://search.yahoo.com/mrss/" url="http://192.168.11.190:1313/posts/k3s-part3-installation/featured.png" />
</item>
</channel>
</rss>

View File

@ -0,0 +1,9 @@
<!DOCTYPE html>
<html lang="ru">
<head>
<title>http://192.168.11.190:1313/categories/k3s/</title>
<link rel="canonical" href="http://192.168.11.190:1313/categories/k3s/">
<meta charset="utf-8">
<meta http-equiv="refresh" content="0; url=http://192.168.11.190:1313/categories/k3s/">
</head>
</html>

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,75 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
<title>Kubernetes on Олег Казанин</title>
<link>http://192.168.11.190:1313/categories/kubernetes/</link>
<description>Recent content in Kubernetes on Олег Казанин</description>
<generator>Hugo -- gohugo.io</generator>
<language>ru</language>
<managingEditor>oakazanin@ya.ru (Олег Казанин)</managingEditor>
<webMaster>oakazanin@ya.ru (Олег Казанин)</webMaster>
<copyright>© 2026 Олег Казанин</copyright>
<lastBuildDate>Wed, 18 Feb 2026 00:00:00 +0000</lastBuildDate><atom:link href="http://192.168.11.190:1313/categories/kubernetes/index.xml" rel="self" type="application/rss+xml" />
<item>
<title>Блог на Hugo в K3s: часть 6 - миграция между namespace</title>
<link>http://192.168.11.190:1313/posts/blog-part-6-namespace-migration/</link>
<pubDate>Wed, 18 Feb 2026 00:00:00 +0000</pubDate>
<author>oakazanin@ya.ru (Олег Казанин)</author>
<guid>http://192.168.11.190:1313/posts/blog-part-6-namespace-migration/</guid>
<description></description>
<media:content xmlns:media="http://search.yahoo.com/mrss/" url="http://192.168.11.190:1313/posts/blog-part-6-namespace-migration/featured.png" />
</item>
<item>
<title>Блог на Hugo в K3s: часть 5 - что делать когда всё внезапно сломалось</title>
<link>http://192.168.11.190:1313/posts/blog-part-5-debugging/</link>
<pubDate>Tue, 17 Feb 2026 00:00:00 +0000</pubDate>
<author>oakazanin@ya.ru (Олег Казанин)</author>
<guid>http://192.168.11.190:1313/posts/blog-part-5-debugging/</guid>
<description></description>
<media:content xmlns:media="http://search.yahoo.com/mrss/" url="http://192.168.11.190:1313/posts/blog-part-5-debugging/featured.png" />
</item>
<item>
<title>Блог на Hugo в K3s: часть 2 - деплой в кластер</title>
<link>http://192.168.11.190:1313/posts/blog-part-2-k8s-deployment/</link>
<pubDate>Thu, 08 Jan 2026 00:00:00 +0000</pubDate>
<author>oakazanin@ya.ru (Олег Казанин)</author>
<guid>http://192.168.11.190:1313/posts/blog-part-2-k8s-deployment/</guid>
<description></description>
<media:content xmlns:media="http://search.yahoo.com/mrss/" url="http://192.168.11.190:1313/posts/blog-part-2-k8s-deployment/featured.png" />
</item>
<item>
<title>K3s HA для homelab: Ставим K3s HA кластер</title>
<link>http://192.168.11.190:1313/posts/k3s-part3-installation/</link>
<pubDate>Sun, 02 Nov 2025 00:00:00 +0000</pubDate>
<author>oakazanin@ya.ru (Олег Казанин)</author>
<guid>http://192.168.11.190:1313/posts/k3s-part3-installation/</guid>
<description></description>
<media:content xmlns:media="http://search.yahoo.com/mrss/" url="http://192.168.11.190:1313/posts/k3s-part3-installation/featured.png" />
</item>
<item>
<title>K3s HA для homelab: Готовим инфраструктуру в Proxmox</title>
<link>http://192.168.11.190:1313/posts/k3s-part2-infrastructure/</link>
<pubDate>Tue, 21 Oct 2025 00:00:00 +0000</pubDate>
<author>oakazanin@ya.ru (Олег Казанин)</author>
<guid>http://192.168.11.190:1313/posts/k3s-part2-infrastructure/</guid>
<description></description>
<media:content xmlns:media="http://search.yahoo.com/mrss/" url="http://192.168.11.190:1313/posts/k3s-part2-infrastructure/featured.png" />
</item>
<item>
<title>K3s HA для homelab: архитектура без боли</title>
<link>http://192.168.11.190:1313/posts/k3s-part1-architecture/</link>
<pubDate>Tue, 14 Oct 2025 00:00:00 +0000</pubDate>
<author>oakazanin@ya.ru (Олег Казанин)</author>
<guid>http://192.168.11.190:1313/posts/k3s-part1-architecture/</guid>
<description></description>
<media:content xmlns:media="http://search.yahoo.com/mrss/" url="http://192.168.11.190:1313/posts/k3s-part1-architecture/featured.png" />
</item>
</channel>
</rss>

View File

@ -0,0 +1,9 @@
<!DOCTYPE html>
<html lang="ru">
<head>
<title>http://192.168.11.190:1313/categories/kubernetes/</title>
<link rel="canonical" href="http://192.168.11.190:1313/categories/kubernetes/">
<meta charset="utf-8">
<meta http-equiv="refresh" content="0; url=http://192.168.11.190:1313/categories/kubernetes/">
</head>
</html>

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,55 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
<title>Веб-Разработка on Олег Казанин</title>
<link>http://192.168.11.190:1313/categories/%D0%B2%D0%B5%D0%B1-%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0/</link>
<description>Recent content in Веб-Разработка on Олег Казанин</description>
<generator>Hugo -- gohugo.io</generator>
<language>ru</language>
<managingEditor>oakazanin@ya.ru (Олег Казанин)</managingEditor>
<webMaster>oakazanin@ya.ru (Олег Казанин)</webMaster>
<copyright>© 2026 Олег Казанин</copyright>
<lastBuildDate>Mon, 16 Feb 2026 00:00:00 +0000</lastBuildDate><atom:link href="http://192.168.11.190:1313/categories/%D0%B2%D0%B5%D0%B1-%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0/index.xml" rel="self" type="application/rss+xml" />
<item>
<title>Блог на Hugo в K3s: часть 4 - выбор Git workflow</title>
<link>http://192.168.11.190:1313/posts/blog-part-4-git-workflow/</link>
<pubDate>Mon, 16 Feb 2026 00:00:00 +0000</pubDate>
<author>oakazanin@ya.ru (Олег Казанин)</author>
<guid>http://192.168.11.190:1313/posts/blog-part-4-git-workflow/</guid>
<description></description>
<media:content xmlns:media="http://search.yahoo.com/mrss/" url="http://192.168.11.190:1313/posts/blog-part-4-git-workflow/featured.png" />
</item>
<item>
<title>Блог на Hugo в K3s: часть 3 - development окружение</title>
<link>http://192.168.11.190:1313/posts/blog-part-3-dev-environment/</link>
<pubDate>Thu, 15 Jan 2026 00:00:00 +0000</pubDate>
<author>oakazanin@ya.ru (Олег Казанин)</author>
<guid>http://192.168.11.190:1313/posts/blog-part-3-dev-environment/</guid>
<description></description>
<media:content xmlns:media="http://search.yahoo.com/mrss/" url="http://192.168.11.190:1313/posts/blog-part-3-dev-environment/featured.png" />
</item>
<item>
<title>Блог на Hugo в K3s: часть 2 - деплой в кластер</title>
<link>http://192.168.11.190:1313/posts/blog-part-2-k8s-deployment/</link>
<pubDate>Thu, 08 Jan 2026 00:00:00 +0000</pubDate>
<author>oakazanin@ya.ru (Олег Казанин)</author>
<guid>http://192.168.11.190:1313/posts/blog-part-2-k8s-deployment/</guid>
<description></description>
<media:content xmlns:media="http://search.yahoo.com/mrss/" url="http://192.168.11.190:1313/posts/blog-part-2-k8s-deployment/featured.png" />
</item>
<item>
<title>Блог на Hugo в K3s: часть 1 - архитектура и первый запуск</title>
<link>http://192.168.11.190:1313/posts/blog-part-1-architecture/</link>
<pubDate>Sat, 03 Jan 2026 00:00:00 +0000</pubDate>
<author>oakazanin@ya.ru (Олег Казанин)</author>
<guid>http://192.168.11.190:1313/posts/blog-part-1-architecture/</guid>
<description></description>
<media:content xmlns:media="http://search.yahoo.com/mrss/" url="http://192.168.11.190:1313/posts/blog-part-1-architecture/featured.png" />
</item>
</channel>
</rss>

View File

@ -0,0 +1,9 @@
<!DOCTYPE html>
<html lang="ru">
<head>
<title>http://192.168.11.190:1313/categories/%D0%B2%D0%B5%D0%B1-%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0/</title>
<link rel="canonical" href="http://192.168.11.190:1313/categories/%D0%B2%D0%B5%D0%B1-%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0/">
<meta charset="utf-8">
<meta http-equiv="refresh" content="0; url=http://192.168.11.190:1313/categories/%D0%B2%D0%B5%D0%B1-%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0/">
</head>
</html>

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,25 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
<title>Шпаргалки on Олег Казанин</title>
<link>http://192.168.11.190:1313/categories/%D1%88%D0%BF%D0%B0%D1%80%D0%B3%D0%B0%D0%BB%D0%BA%D0%B8/</link>
<description>Recent content in Шпаргалки on Олег Казанин</description>
<generator>Hugo -- gohugo.io</generator>
<language>ru</language>
<managingEditor>oakazanin@ya.ru (Олег Казанин)</managingEditor>
<webMaster>oakazanin@ya.ru (Олег Казанин)</webMaster>
<copyright>© 2026 Олег Казанин</copyright>
<lastBuildDate>Mon, 23 Feb 2026 00:00:00 +0000</lastBuildDate><atom:link href="http://192.168.11.190:1313/categories/%D1%88%D0%BF%D0%B0%D1%80%D0%B3%D0%B0%D0%BB%D0%BA%D0%B8/index.xml" rel="self" type="application/rss+xml" />
<item>
<title>Git Workflow для Hugo блога</title>
<link>http://192.168.11.190:1313/cheatsheets/git-workflow/</link>
<pubDate>Mon, 23 Feb 2026 00:00:00 +0000</pubDate>
<author>oakazanin@ya.ru (Олег Казанин)</author>
<guid>http://192.168.11.190:1313/cheatsheets/git-workflow/</guid>
<description></description>
<media:content xmlns:media="http://search.yahoo.com/mrss/" url="http://192.168.11.190:1313/cheatsheets/git-workflow/featured.png" />
</item>
</channel>
</rss>

View File

@ -0,0 +1,9 @@
<!DOCTYPE html>
<html lang="ru">
<head>
<title>http://192.168.11.190:1313/categories/%D1%88%D0%BF%D0%B0%D1%80%D0%B3%D0%B0%D0%BB%D0%BA%D0%B8/</title>
<link rel="canonical" href="http://192.168.11.190:1313/categories/%D1%88%D0%BF%D0%B0%D1%80%D0%B3%D0%B0%D0%BB%D0%BA%D0%B8/">
<meta charset="utf-8">
<meta http-equiv="refresh" content="0; url=http://192.168.11.190:1313/categories/%D1%88%D0%BF%D0%B0%D1%80%D0%B3%D0%B0%D0%BB%D0%BA%D0%B8/">
</head>
</html>

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 212 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 728 KiB

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,35 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
<title>Шпаргалки on Олег Казанин</title>
<link>http://192.168.11.190:1313/cheatsheets/</link>
<description>Recent content in Шпаргалки on Олег Казанин</description>
<generator>Hugo -- gohugo.io</generator>
<language>ru</language>
<managingEditor>oakazanin@ya.ru (Олег Казанин)</managingEditor>
<webMaster>oakazanin@ya.ru (Олег Казанин)</webMaster>
<copyright>© 2026 Олег Казанин</copyright>
<lastBuildDate>Mon, 23 Feb 2026 00:00:00 +0000</lastBuildDate><atom:link href="http://192.168.11.190:1313/cheatsheets/index.xml" rel="self" type="application/rss+xml" />
<item>
<title>Shortcodes</title>
<link>http://192.168.11.190:1313/cheatsheets/shortcodes/</link>
<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
<author>oakazanin@ya.ru (Олег Казанин)</author>
<guid>http://192.168.11.190:1313/cheatsheets/shortcodes/</guid>
<description></description>
</item>
<item>
<title>Git Workflow для Hugo блога</title>
<link>http://192.168.11.190:1313/cheatsheets/git-workflow/</link>
<pubDate>Mon, 23 Feb 2026 00:00:00 +0000</pubDate>
<author>oakazanin@ya.ru (Олег Казанин)</author>
<guid>http://192.168.11.190:1313/cheatsheets/git-workflow/</guid>
<description></description>
<media:content xmlns:media="http://search.yahoo.com/mrss/" url="http://192.168.11.190:1313/cheatsheets/git-workflow/featured.png" />
</item>
</channel>
</rss>

View File

@ -0,0 +1,9 @@
<!DOCTYPE html>
<html lang="ru">
<head>
<title>http://192.168.11.190:1313/cheatsheets/</title>
<link rel="canonical" href="http://192.168.11.190:1313/cheatsheets/">
<meta charset="utf-8">
<meta http-equiv="refresh" content="0; url=http://192.168.11.190:1313/cheatsheets/">
</head>
</html>

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 127 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 59 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 109 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 55 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 71 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 125 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 66 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 88 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 76 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 167 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 56 KiB

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,65 @@
/* Carousel Specific Styles */
.ratio-16-9 {
padding-top: 56.25%;
}
.ratio-21-9 {
padding-top: 42.85%;
}
.ratio-32-9 {
padding-top: 28.125%;
}
@media (width >= 640px) {
.sm\:ratio-16-9 {
padding-top: 56.25%;
}
.sm\:ratio-21-9 {
padding-top: 42.85%;
}
.sm\:ratio-32-9 {
padding-top: 28.125%;
}
}
@media (width >= 853px) {
.md\:ratio-16-9 {
padding-top: 56.25%;
}
.md\:ratio-21-9 {
padding-top: 42.85%;
}
.md\:ratio-32-9 {
padding-top: 28.125%;
}
}
@media (width >= 1024px) {
.lg\:ratio-16-9 {
padding-top: 56.25%;
}
.lg\:ratio-21-9 {
padding-top: 42.85%;
}
.lg\:ratio-32-9 {
padding-top: 28.125%;
}
}
@media (width >= 1280px) {
.xl\:ratio-16-9 {
padding-top: 56.25%;
}
.xl\:ratio-21-9 {
padding-top: 42.85%;
}
.xl\:ratio-32-9 {
padding-top: 28.125%;
}
}
@media (width >= 1536px) {
.\32xl\:ratio-16-9 {
padding-top: 56.25%;
}
.\32xl\:ratio-21-9 {
padding-top: 42.85%;
}
.\32xl\:ratio-32-9 {
padding-top: 28.125%;
}
}

View File

@ -0,0 +1,595 @@
/* Gallery Specific Styles */
.grid-w10 {
width: calc(10% - 5px);
margin: 0px !important;
}
.grid-w15 {
width: calc(15% - 5px);
margin: 0px !important;
}
.grid-w20 {
width: calc(20% - 5px);
margin: 0px !important;
}
.grid-w25 {
width: calc(25% - 5px);
margin: 0px !important;
}
.grid-w30 {
width: calc(30% - 5px);
margin: 0px !important;
}
.grid-w33 {
width: calc(33% - 5px);
margin: 0px !important;
}
.grid-w35 {
width: calc(35% - 5px);
margin: 0px !important;
}
.grid-w40 {
width: calc(40% - 5px);
margin: 0px !important;
}
.grid-w45 {
width: calc(45% - 5px);
margin: 0px !important;
}
.grid-w50 {
width: calc(50% - 5px);
margin: 0px !important;
}
.grid-w55 {
width: calc(55% - 5px);
margin: 0px !important;
}
.grid-w60 {
width: calc(60% - 5px);
margin: 0px !important;
}
.grid-w65 {
width: calc(65% - 5px);
margin: 0px !important;
}
.grid-w66 {
width: calc(66% - 5px);
margin: 0px !important;
}
.grid-w70 {
width: calc(70% - 5px);
margin: 0px !important;
}
.grid-w75 {
width: calc(75% - 5px);
margin: 0px !important;
}
.grid-w80 {
width: calc(80% - 5px);
margin: 0px !important;
}
.grid-w85 {
width: calc(85% - 5px);
margin: 0px !important;
}
.grid-w90 {
width: calc(90% - 5px);
margin: 0px !important;
}
.grid-w95 {
width: calc(95% - 5px);
margin: 0px !important;
}
.grid-w100 {
width: calc(100% - 5px);
margin: 0px !important;
}
.gallery figure {
display: inline-block;
margin: 0;
}
.gallery figcaption {
margin-top: 0.25rem;
font-size: 0.875rem;
line-height: 1.25rem;
color: rgb(var(--color-neutral-600));
}
.dark .gallery figcaption {
color: rgb(var(--color-neutral-400));
}
@media (width >= 640px) {
.sm\:grid-w10 {
width: calc(10% - 5px);
margin: 0px !important;
}
.sm\:grid-w15 {
width: calc(15% - 5px);
margin: 0px !important;
}
.sm\:grid-w20 {
width: calc(20% - 5px);
margin: 0px !important;
}
.sm\:grid-w25 {
width: calc(25% - 5px);
margin: 0px !important;
}
.sm\:grid-w30 {
width: calc(30% - 5px);
margin: 0px !important;
}
.sm\:grid-w33 {
width: calc(33% - 5px);
margin: 0px !important;
}
.sm\:grid-w35 {
width: calc(35% - 5px);
margin: 0px !important;
}
.sm\:grid-w40 {
width: calc(40% - 5px);
margin: 0px !important;
}
.sm\:grid-w45 {
width: calc(45% - 5px);
margin: 0px !important;
}
.sm\:grid-w50 {
width: calc(50% - 5px);
margin: 0px !important;
}
.sm\:grid-w55 {
width: calc(55% - 5px);
margin: 0px !important;
}
.sm\:grid-w60 {
width: calc(60% - 5px);
margin: 0px !important;
}
.sm\:grid-w65 {
width: calc(65% - 5px);
margin: 0px !important;
}
.sm\:grid-w66 {
width: calc(66% - 5px);
margin: 0px !important;
}
.sm\:grid-w70 {
width: calc(70% - 5px);
margin: 0px !important;
}
.sm\:grid-w75 {
width: calc(75% - 5px);
margin: 0px !important;
}
.sm\:grid-w80 {
width: calc(80% - 5px);
margin: 0px !important;
}
.sm\:grid-w85 {
width: calc(85% - 5px);
margin: 0px !important;
}
.sm\:grid-w90 {
width: calc(90% - 5px);
margin: 0px !important;
}
.sm\:grid-w95 {
width: calc(95% - 5px);
margin: 0px !important;
}
.sm\:grid-w100 {
width: calc(100% - 5px);
margin: 0px !important;
}
}
@media (width >= 853px) {
.md\:grid-w10 {
width: calc(10% - 5px);
margin: 0px !important;
}
.md\:grid-w15 {
width: calc(15% - 5px);
margin: 0px !important;
}
.md\:grid-w20 {
width: calc(20% - 5px);
margin: 0px !important;
}
.md\:grid-w25 {
width: calc(25% - 5px);
margin: 0px !important;
}
.md\:grid-w30 {
width: calc(30% - 5px);
margin: 0px !important;
}
.md\:grid-w33 {
width: calc(33% - 5px);
margin: 0px !important;
}
.md\:grid-w35 {
width: calc(35% - 5px);
margin: 0px !important;
}
.md\:grid-w40 {
width: calc(40% - 5px);
margin: 0px !important;
}
.md\:grid-w45 {
width: calc(45% - 5px);
margin: 0px !important;
}
.md\:grid-w50 {
width: calc(50% - 5px);
margin: 0px !important;
}
.md\:grid-w55 {
width: calc(55% - 5px);
margin: 0px !important;
}
.md\:grid-w60 {
width: calc(60% - 5px);
margin: 0px !important;
}
.md\:grid-w65 {
width: calc(65% - 5px);
margin: 0px !important;
}
.md\:grid-w66 {
width: calc(66% - 5px);
margin: 0px !important;
}
.md\:grid-w70 {
width: calc(70% - 5px);
margin: 0px !important;
}
.md\:grid-w75 {
width: calc(75% - 5px);
margin: 0px !important;
}
.md\:grid-w80 {
width: calc(80% - 5px);
margin: 0px !important;
}
.md\:grid-w85 {
width: calc(85% - 5px);
margin: 0px !important;
}
.md\:grid-w90 {
width: calc(90% - 5px);
margin: 0px !important;
}
.md\:grid-w95 {
width: calc(95% - 5px);
margin: 0px !important;
}
.md\:grid-w100 {
width: calc(100% - 5px);
margin: 0px !important;
}
}
@media (width >= 1024px) {
.lg\:grid-w10 {
width: calc(10% - 5px);
margin: 0px !important;
}
.lg\:grid-w15 {
width: calc(15% - 5px);
margin: 0px !important;
}
.lg\:grid-w20 {
width: calc(20% - 5px);
margin: 0px !important;
}
.lg\:grid-w25 {
width: calc(25% - 5px);
margin: 0px !important;
}
.lg\:grid-w30 {
width: calc(30% - 5px);
margin: 0px !important;
}
.lg\:grid-w33 {
width: calc(33% - 5px);
margin: 0px !important;
}
.lg\:grid-w35 {
width: calc(35% - 5px);
margin: 0px !important;
}
.lg\:grid-w40 {
width: calc(40% - 5px);
margin: 0px !important;
}
.lg\:grid-w45 {
width: calc(45% - 5px);
margin: 0px !important;
}
.lg\:grid-w50 {
width: calc(50% - 5px);
margin: 0px !important;
}
.lg\:grid-w55 {
width: calc(55% - 5px);
margin: 0px !important;
}
.lg\:grid-w60 {
width: calc(60% - 5px);
margin: 0px !important;
}
.lg\:grid-w65 {
width: calc(65% - 5px);
margin: 0px !important;
}
.lg\:grid-w66 {
width: calc(66% - 5px);
margin: 0px !important;
}
.lg\:grid-w70 {
width: calc(70% - 5px);
margin: 0px !important;
}
.lg\:grid-w75 {
width: calc(75% - 5px);
margin: 0px !important;
}
.lg\:grid-w80 {
width: calc(80% - 5px);
margin: 0px !important;
}
.lg\:grid-w85 {
width: calc(85% - 5px);
margin: 0px !important;
}
.lg\:grid-w90 {
width: calc(90% - 5px);
margin: 0px !important;
}
.lg\:grid-w95 {
width: calc(95% - 5px);
margin: 0px !important;
}
.lg\:grid-w100 {
width: calc(100% - 5px);
margin: 0px !important;
}
}
@media (width >= 1280px) {
.xl\:grid-w10 {
width: calc(10% - 5px);
margin: 0px !important;
}
.xl\:grid-w15 {
width: calc(15% - 5px);
margin: 0px !important;
}
.xl\:grid-w20 {
width: calc(20% - 5px);
margin: 0px !important;
}
.xl\:grid-w25 {
width: calc(25% - 5px);
margin: 0px !important;
}
.xl\:grid-w30 {
width: calc(30% - 5px);
margin: 0px !important;
}
.xl\:grid-w33 {
width: calc(33% - 5px);
margin: 0px !important;
}
.xl\:grid-w35 {
width: calc(35% - 5px);
margin: 0px !important;
}
.xl\:grid-w40 {
width: calc(40% - 5px);
margin: 0px !important;
}
.xl\:grid-w45 {
width: calc(45% - 5px);
margin: 0px !important;
}
.xl\:grid-w50 {
width: calc(50% - 5px);
margin: 0px !important;
}
.xl\:grid-w55 {
width: calc(55% - 5px);
margin: 0px !important;
}
.xl\:grid-w60 {
width: calc(60% - 5px);
margin: 0px !important;
}
.xl\:grid-w65 {
width: calc(65% - 5px);
margin: 0px !important;
}
.xl\:grid-w66 {
width: calc(66% - 5px);
margin: 0px !important;
}
.xl\:grid-w70 {
width: calc(70% - 5px);
margin: 0px !important;
}
.xl\:grid-w75 {
width: calc(75% - 5px);
margin: 0px !important;
}
.xl\:grid-w80 {
width: calc(80% - 5px);
margin: 0px !important;
}
.xl\:grid-w85 {
width: calc(85% - 5px);
margin: 0px !important;
}
.xl\:grid-w90 {
width: calc(90% - 5px);
margin: 0px !important;
}
.xl\:grid-w95 {
width: calc(95% - 5px);
margin: 0px !important;
}
.xl\:grid-w100 {
width: calc(100% - 5px);
margin: 0px !important;
}
}
@media (width >= 1536px) {
.\32xl\:grid-w10 {
width: calc(10% - 5px);
margin: 0px !important;
}
.\32xl\:grid-w15 {
width: calc(15% - 5px);
margin: 0px !important;
}
.\32xl\:grid-w20 {
width: calc(20% - 5px);
margin: 0px !important;
}
.\32xl\:grid-w25 {
width: calc(25% - 5px);
margin: 0px !important;
}
.\32xl\:grid-w30 {
width: calc(30% - 5px);
margin: 0px !important;
}
.\32xl\:grid-w33 {
width: calc(33% - 5px);
margin: 0px !important;
}
.\32xl\:grid-w35 {
width: calc(35% - 5px);
margin: 0px !important;
}
.\32xl\:grid-w40 {
width: calc(40% - 5px);
margin: 0px !important;
}
.\32xl\:grid-w45 {
width: calc(45% - 5px);
margin: 0px !important;
}
.\32xl\:grid-w50 {
width: calc(50% - 5px);
margin: 0px !important;
}
.\32xl\:grid-w55 {
width: calc(55% - 5px);
margin: 0px !important;
}
.\32xl\:grid-w60 {
width: calc(60% - 5px);
margin: 0px !important;
}
.\32xl\:grid-w65 {
width: calc(65% - 5px);
margin: 0px !important;
}
.\32xl\:grid-w66 {
width: calc(66% - 5px);
margin: 0px !important;
}
.\32xl\:grid-w70 {
width: calc(70% - 5px);
margin: 0px !important;
}
.\32xl\:grid-w75 {
width: calc(75% - 5px);
margin: 0px !important;
}
.\32xl\:grid-w80 {
width: calc(80% - 5px);
margin: 0px !important;
}
.\32xl\:grid-w85 {
width: calc(85% - 5px);
margin: 0px !important;
}
.\32xl\:grid-w90 {
width: calc(90% - 5px);
margin: 0px !important;
}
.\32xl\:grid-w95 {
width: calc(95% - 5px);
margin: 0px !important;
}
.\32xl\:grid-w100 {
width: calc(100% - 5px);
margin: 0px !important;
}
}
.ratio-16-9 {
padding-top: 56.25%;
}
.ratio-21-9 {
padding-top: 42.85%;
}
.ratio-32-9 {
padding-top: 28.125%;
}
@media (width >= 640px) {
.sm\:ratio-16-9 {
padding-top: 56.25%;
}
.sm\:ratio-21-9 {
padding-top: 42.85%;
}
.sm\:ratio-32-9 {
padding-top: 28.125%;
}
}
@media (width >= 853px) {
.md\:ratio-16-9 {
padding-top: 56.25%;
}
.md\:ratio-21-9 {
padding-top: 42.85%;
}
.md\:ratio-32-9 {
padding-top: 28.125%;
}
}
@media (width >= 1024px) {
.lg\:ratio-16-9 {
padding-top: 56.25%;
}
.lg\:ratio-21-9 {
padding-top: 42.85%;
}
.lg\:ratio-32-9 {
padding-top: 28.125%;
}
}
@media (width >= 1280px) {
.xl\:ratio-16-9 {
padding-top: 56.25%;
}
.xl\:ratio-21-9 {
padding-top: 42.85%;
}
.xl\:ratio-32-9 {
padding-top: 28.125%;
}
}
@media (width >= 1536px) {
.\32xl\:ratio-16-9 {
padding-top: 56.25%;
}
.\32xl\:ratio-21-9 {
padding-top: 42.85%;
}
.\32xl\:ratio-32-9 {
padding-top: 28.125%;
}
}

BIN
public/favicon-16x16.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 503 B

BIN
public/favicon-32x32.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

BIN
public/favicon-96x96.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

BIN
public/favicon.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

1
public/favicon.svg Normal file

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 12 KiB

BIN
public/img/background.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.6 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 774 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 655 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 202 KiB

BIN
public/img/logo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 113 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 52 KiB

3446
public/index.html Normal file

File diff suppressed because it is too large Load Diff

2
public/index.json Normal file

File diff suppressed because one or more lines are too long

135
public/index.xml Normal file
View File

@ -0,0 +1,135 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
<title>Олег Казанин</title>
<link>http://192.168.11.190:1313/</link>
<description>Recent content on Олег Казанин</description>
<generator>Hugo -- gohugo.io</generator>
<language>ru</language>
<managingEditor>oakazanin@ya.ru (Олег Казанин)</managingEditor>
<webMaster>oakazanin@ya.ru (Олег Казанин)</webMaster>
<copyright>© 2026 Олег Казанин</copyright>
<lastBuildDate>Mon, 23 Feb 2026 00:00:00 +0000</lastBuildDate><atom:link href="http://192.168.11.190:1313/index.xml" rel="self" type="application/rss+xml" />
<item>
<title>Shortcodes</title>
<link>http://192.168.11.190:1313/cheatsheets/shortcodes/</link>
<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
<author>oakazanin@ya.ru (Олег Казанин)</author>
<guid>http://192.168.11.190:1313/cheatsheets/shortcodes/</guid>
<description></description>
</item>
<item>
<title>Git Workflow для Hugo блога</title>
<link>http://192.168.11.190:1313/cheatsheets/git-workflow/</link>
<pubDate>Mon, 23 Feb 2026 00:00:00 +0000</pubDate>
<author>oakazanin@ya.ru (Олег Казанин)</author>
<guid>http://192.168.11.190:1313/cheatsheets/git-workflow/</guid>
<description></description>
<media:content xmlns:media="http://search.yahoo.com/mrss/" url="http://192.168.11.190:1313/cheatsheets/git-workflow/featured.png" />
</item>
<item>
<title>Блог на Hugo в K3s: часть 6 - миграция между namespace</title>
<link>http://192.168.11.190:1313/posts/blog-part-6-namespace-migration/</link>
<pubDate>Wed, 18 Feb 2026 00:00:00 +0000</pubDate>
<author>oakazanin@ya.ru (Олег Казанин)</author>
<guid>http://192.168.11.190:1313/posts/blog-part-6-namespace-migration/</guid>
<description></description>
<media:content xmlns:media="http://search.yahoo.com/mrss/" url="http://192.168.11.190:1313/posts/blog-part-6-namespace-migration/featured.png" />
</item>
<item>
<title>Блог на Hugo в K3s: часть 5 - что делать когда всё внезапно сломалось</title>
<link>http://192.168.11.190:1313/posts/blog-part-5-debugging/</link>
<pubDate>Tue, 17 Feb 2026 00:00:00 +0000</pubDate>
<author>oakazanin@ya.ru (Олег Казанин)</author>
<guid>http://192.168.11.190:1313/posts/blog-part-5-debugging/</guid>
<description></description>
<media:content xmlns:media="http://search.yahoo.com/mrss/" url="http://192.168.11.190:1313/posts/blog-part-5-debugging/featured.png" />
</item>
<item>
<title>Блог на Hugo в K3s: часть 4 - выбор Git workflow</title>
<link>http://192.168.11.190:1313/posts/blog-part-4-git-workflow/</link>
<pubDate>Mon, 16 Feb 2026 00:00:00 +0000</pubDate>
<author>oakazanin@ya.ru (Олег Казанин)</author>
<guid>http://192.168.11.190:1313/posts/blog-part-4-git-workflow/</guid>
<description></description>
<media:content xmlns:media="http://search.yahoo.com/mrss/" url="http://192.168.11.190:1313/posts/blog-part-4-git-workflow/featured.png" />
</item>
<item>
<title>Блог на Hugo в K3s: часть 3 - development окружение</title>
<link>http://192.168.11.190:1313/posts/blog-part-3-dev-environment/</link>
<pubDate>Thu, 15 Jan 2026 00:00:00 +0000</pubDate>
<author>oakazanin@ya.ru (Олег Казанин)</author>
<guid>http://192.168.11.190:1313/posts/blog-part-3-dev-environment/</guid>
<description></description>
<media:content xmlns:media="http://search.yahoo.com/mrss/" url="http://192.168.11.190:1313/posts/blog-part-3-dev-environment/featured.png" />
</item>
<item>
<title>Блог на Hugo в K3s: часть 2 - деплой в кластер</title>
<link>http://192.168.11.190:1313/posts/blog-part-2-k8s-deployment/</link>
<pubDate>Thu, 08 Jan 2026 00:00:00 +0000</pubDate>
<author>oakazanin@ya.ru (Олег Казанин)</author>
<guid>http://192.168.11.190:1313/posts/blog-part-2-k8s-deployment/</guid>
<description></description>
<media:content xmlns:media="http://search.yahoo.com/mrss/" url="http://192.168.11.190:1313/posts/blog-part-2-k8s-deployment/featured.png" />
</item>
<item>
<title>Блог на Hugo в K3s: часть 1 - архитектура и первый запуск</title>
<link>http://192.168.11.190:1313/posts/blog-part-1-architecture/</link>
<pubDate>Sat, 03 Jan 2026 00:00:00 +0000</pubDate>
<author>oakazanin@ya.ru (Олег Казанин)</author>
<guid>http://192.168.11.190:1313/posts/blog-part-1-architecture/</guid>
<description></description>
<media:content xmlns:media="http://search.yahoo.com/mrss/" url="http://192.168.11.190:1313/posts/blog-part-1-architecture/featured.png" />
</item>
<item>
<title>K3s HA для homelab: Ставим K3s HA кластер</title>
<link>http://192.168.11.190:1313/posts/k3s-part3-installation/</link>
<pubDate>Sun, 02 Nov 2025 00:00:00 +0000</pubDate>
<author>oakazanin@ya.ru (Олег Казанин)</author>
<guid>http://192.168.11.190:1313/posts/k3s-part3-installation/</guid>
<description></description>
<media:content xmlns:media="http://search.yahoo.com/mrss/" url="http://192.168.11.190:1313/posts/k3s-part3-installation/featured.png" />
</item>
<item>
<title>K3s HA для homelab: Готовим инфраструктуру в Proxmox</title>
<link>http://192.168.11.190:1313/posts/k3s-part2-infrastructure/</link>
<pubDate>Tue, 21 Oct 2025 00:00:00 +0000</pubDate>
<author>oakazanin@ya.ru (Олег Казанин)</author>
<guid>http://192.168.11.190:1313/posts/k3s-part2-infrastructure/</guid>
<description></description>
<media:content xmlns:media="http://search.yahoo.com/mrss/" url="http://192.168.11.190:1313/posts/k3s-part2-infrastructure/featured.png" />
</item>
<item>
<title>K3s HA для homelab: архитектура без боли</title>
<link>http://192.168.11.190:1313/posts/k3s-part1-architecture/</link>
<pubDate>Tue, 14 Oct 2025 00:00:00 +0000</pubDate>
<author>oakazanin@ya.ru (Олег Казанин)</author>
<guid>http://192.168.11.190:1313/posts/k3s-part1-architecture/</guid>
<description></description>
<media:content xmlns:media="http://search.yahoo.com/mrss/" url="http://192.168.11.190:1313/posts/k3s-part1-architecture/featured.png" />
</item>
<item>
<title>Кто это пишет и зачем</title>
<link>http://192.168.11.190:1313/about/</link>
<pubDate>Wed, 01 Oct 2025 00:00:00 +0000</pubDate>
<author>oakazanin@ya.ru (Олег Казанин)</author>
<guid>http://192.168.11.190:1313/about/</guid>
<description></description>
</item>
</channel>
</rss>

View File

@ -0,0 +1 @@
const sitePreference=document.documentElement.getAttribute("data-default-appearance"),userPreference=localStorage.getItem("appearance");(sitePreference==="dark"&&userPreference===null||userPreference==="dark")&&document.documentElement.classList.add("dark"),document.documentElement.getAttribute("data-auto-appearance")==="true"&&(window.matchMedia&&window.matchMedia("(prefers-color-scheme: dark)").matches&&userPreference!=="light"&&document.documentElement.classList.add("dark"),window.matchMedia("(prefers-color-scheme: dark)").addEventListener("change",e=>{e.matches?document.documentElement.classList.add("dark"):document.documentElement.classList.remove("dark")}));var updateMeta,getTargetAppearance,updateMermaidTheme=()=>{if(typeof mermaid!="undefined"){const e=document.documentElement.classList.contains("dark"),t=document.querySelectorAll("pre.mermaid");t.forEach(e=>{e.getAttribute("data-processed")?(e.removeAttribute("data-processed"),e.innerHTML=e.getAttribute("data-graph")):e.setAttribute("data-graph",e.textContent)}),e?(initMermaidDark(),mermaid.run()):(initMermaidLight(),mermaid.run())}};window.addEventListener("DOMContentLoaded",e=>{const t=document.getElementById("appearance-switcher"),n=document.getElementById("appearance-switcher-mobile");updateMeta(),this.updateLogo?.(getTargetAppearance()),updateMermaidTheme(),t&&(t.addEventListener("click",()=>{document.documentElement.classList.toggle("dark");var e=getTargetAppearance();localStorage.setItem("appearance",e),updateMeta(),updateMermaidTheme(),this.updateLogo?.(e)}),t.addEventListener("contextmenu",e=>{e.preventDefault(),localStorage.removeItem("appearance")})),n&&(n.addEventListener("click",()=>{document.documentElement.classList.toggle("dark");var e=getTargetAppearance();localStorage.setItem("appearance",e),updateMeta(),updateMermaidTheme(),this.updateLogo?.(e)}),n.addEventListener("contextmenu",e=>{e.preventDefault(),localStorage.removeItem("appearance")}))}),updateMeta=()=>{var e=document.querySelector("body"),t=getComputedStyle(e);document.querySelector('meta[name="theme-color"]').setAttribute("content",t.backgroundColor)},getTargetAppearance=()=>document.documentElement.classList.contains("dark")?"dark":"light",window.addEventListener("DOMContentLoaded",e=>{const t=document.getElementById("top-scroller"),n=document.getElementById("site-footer");t&&n&&t.getBoundingClientRect().top>n.getBoundingClientRect().top&&(t.hidden=!0)})

View File

@ -0,0 +1 @@
const sitePreference=document.documentElement.getAttribute("data-default-appearance"),userPreference=localStorage.getItem("appearance");(sitePreference==="dark"&&userPreference===null||userPreference==="dark")&&document.documentElement.classList.add("dark"),document.documentElement.getAttribute("data-auto-appearance")==="true"&&(window.matchMedia&&window.matchMedia("(prefers-color-scheme: dark)").matches&&userPreference!=="light"&&document.documentElement.classList.add("dark"),window.matchMedia("(prefers-color-scheme: dark)").addEventListener("change",e=>{e.matches?document.documentElement.classList.add("dark"):document.documentElement.classList.remove("dark")}));var updateMeta,updateLogo,getTargetAppearance,updateMermaidTheme=()=>{if(typeof mermaid!="undefined"){const e=document.documentElement.classList.contains("dark"),t=document.querySelectorAll("pre.mermaid");t.forEach(e=>{e.getAttribute("data-processed")?(e.removeAttribute("data-processed"),e.innerHTML=e.getAttribute("data-graph")):e.setAttribute("data-graph",e.textContent)}),e?(initMermaidDark(),mermaid.run()):(initMermaidLight(),mermaid.run())}};window.addEventListener("DOMContentLoaded",e=>{const t=document.getElementById("appearance-switcher"),n=document.getElementById("appearance-switcher-mobile");updateMeta(),this.updateLogo?.(getTargetAppearance()),updateMermaidTheme(),t&&(t.addEventListener("click",()=>{document.documentElement.classList.toggle("dark");var e=getTargetAppearance();localStorage.setItem("appearance",e),updateMeta(),updateMermaidTheme(),this.updateLogo?.(e)}),t.addEventListener("contextmenu",e=>{e.preventDefault(),localStorage.removeItem("appearance")})),n&&(n.addEventListener("click",()=>{document.documentElement.classList.toggle("dark");var e=getTargetAppearance();localStorage.setItem("appearance",e),updateMeta(),updateMermaidTheme(),this.updateLogo?.(e)}),n.addEventListener("contextmenu",e=>{e.preventDefault(),localStorage.removeItem("appearance")}))}),updateMeta=()=>{var e=document.querySelector("body"),t=getComputedStyle(e);document.querySelector('meta[name="theme-color"]').setAttribute("content",t.backgroundColor)},updateLogo=e=>{var t=document.querySelectorAll("img.logo"),n=document.querySelectorAll("span.logo");targetLogoPath=e=="dark"?"/img/logo.png":"/img/logo_inverted.png";for(const e of t)e.setAttribute("src",targetLogoPath)},getTargetAppearance=()=>document.documentElement.classList.contains("dark")?"dark":"light",window.addEventListener("DOMContentLoaded",e=>{const t=document.getElementById("top-scroller"),n=document.getElementById("site-footer");t&&n&&t.getBoundingClientRect().top>n.getBoundingClientRect().top&&(t.hidden=!0)})

View File

@ -0,0 +1 @@
function setBackgroundBlur(e,t=300,n=!1,s=!1){if(!e){console.error("data-blur-id is null");return}const o=document.getElementById(e);if(!o)return;n?(o.setAttribute("aria-hidden","true"),s?o.style.display="":(o.style.display="none",o.style.opacity="0")):(o.style.display="",o.removeAttribute("aria-hidden"));const i=()=>{if(!n||s){const e=window.pageYOffset||document.documentElement.scrollTop||document.body.scrollTop||0;o.style.opacity=e/t}};o.setAttribute("role","presentation"),o.setAttribute("tabindex","-1"),window.addEventListener("scroll",i),i()}document.querySelectorAll("script[data-blur-id]").forEach(e=>{const t=e.getAttribute("data-blur-id"),n=Number(e.getAttribute("data-scroll-divisor")||300),s=t==="menu-blur",o=JSON.parse(localStorage.getItem("a11ySettings")||"{}"),i=o.disableBlur;setBackgroundBlur(t,n,i,s)})

View File

@ -0,0 +1 @@
(async()=>{const n=document.currentScript,s=n?.getAttribute("data-repo-url"),e=n?.getAttribute("data-repo-id");if(!s||!e)return;if(e.startsWith("forgejo")){console.log("fetch-repo.js: Forgejo server blocks cross-origin requests. Live JavaScript updates are not supported.");return}const o={github:{full_name:"full_name",description:"description",stargazers_count:"stargazers",forks:"forks"},gitlab:{name_with_namespace:"name_with_namespace",description:"description",star_count:"star_count",forks_count:"forks_count"},gitea:{full_name:"full_name",description:"description",stars_count:"stars_count",forks_count:"forks_count"},codeberg:{full_name:"full_name",description:"description",stars_count:"stars_count",forks_count:"forks_count"},forgejo:{full_name:"full_name",description:"description",stars_count:"stars_count",forks_count:"forks_count"},huggingface:{description:"description",likes:"likes",downloads:"downloads"}},i={huggingface:{description:e=>e?.replace(/Dataset Card for .+?\s+Dataset Summary\s+/,"").trim()||e}},t=Object.keys(o).find(t=>e.startsWith(t))||"github",a=o[t];try{const n=await fetch(s,{headers:{"User-agent":"Mozilla/4.0 Custom User Agent"}}),o=await n.json();if(!n.ok){console.error(`fetch-repo.js: HTTP Error: ${n.status} ${n.statusText}`);return}if(!o||typeof o!="object"){console.error("fetch-repo.js: Invalid or empty data received from remote");return}Object.entries(a).forEach(([n,s])=>{const a=document.getElementById(`${e}-${s}`);if(a){let e=o[n];i[t]?.[n]&&(e=i[t][n](e)),e!=null&&e!==""&&(a.innerHTML=e)}})}catch(e){console.error(`fetch-repo.js: ${e}`)}})()

View File

@ -0,0 +1 @@
import{initializeApp}from"https://www.gstatic.com/firebasejs/9.23.0/firebase-app.js";import{getFirestore,doc,getDoc,setDoc,updateDoc,increment,onSnapshot,}from"https://www.gstatic.com/firebasejs/9.23.0/firebase-firestore.js";import{getAuth,signInAnonymously}from"https://www.gstatic.com/firebasejs/9.23.0/firebase-auth.js";let app,db,auth,oids;try{const e=document.getElementById("firebase-config");if(!e?.textContent)throw new Error("Firebase config element not found");const t=JSON.parse(e.textContent);app=initializeApp(t.config),oids={views:e.getAttribute("data-views"),likes:e.getAttribute("data-likes")},db=getFirestore(app),auth=getAuth(app)}catch(e){throw console.error("Firebase initialization failed:",e.message),e}const id=oids?.views?.replaceAll("/","-"),id_likes=oids?.likes?.replaceAll("/","-");let liked=!1,authReady=!1;function formatNumber(e){return e.toString().replace(/\B(?=(\d{3})+(?!\d))/g,",")}function toggleLoaders(e){var t,s,n=e.className;if(n=="")return;t=n.split(" ");for(s in t)e.classList.toggle(t[s])}function updateDisplay(e,t){const n=document.getElementById(t);if(!n)return;const s=t.replaceAll("/","-");onSnapshot(doc(db,e,s),t=>{n.innerText=t.exists()?formatNumber(t.data()[e]):0,toggleLoaders(n)},e=>{console.error("Firebase snapshot update failed:",e)})}async function recordView(e){if(!e||localStorage.getItem(e))return;try{const t=doc(db,"views",e),n=await getDoc(t);n.exists()?await updateDoc(t,{views:increment(1)}):await setDoc(t,{views:1}),localStorage.setItem(e,!0)}catch(e){console.error("Record view operation failed:",e.message)}}function updateButton(e){const t=document.querySelectorAll("span[id='button_likes_heart']"),n=document.querySelectorAll("span[id='button_likes_emtpty_heart']"),s=document.querySelectorAll("span[id='button_likes_text']");t.forEach(t=>{t.style.display=e?"":"none"}),n.forEach(t=>{t.style.display=e?"none":""}),s.forEach(t=>{t.innerText=e?"":"\xa0Like"})}async function toggleLike(e){if(!id_likes||!authReady)return;try{const t=doc(db,"likes",id_likes),n=await getDoc(t);liked=e,e?localStorage.setItem(id_likes,!0):localStorage.removeItem(id_likes),updateButton(e),n.exists()?await updateDoc(t,{likes:increment(e?1:-1)}):await setDoc(t,{likes:e?1:0})}catch(t){console.error("Like operation failed:",t.message),liked=!e,e?localStorage.removeItem(id_likes):localStorage.setItem(id_likes,!0),updateButton(!e)}}signInAnonymously(auth).then(()=>{authReady=!0,document.querySelectorAll("span[id^='views_']").forEach(e=>{e.id&&updateDisplay("views",e.id)}),document.querySelectorAll("span[id^='likes_']").forEach(e=>{e.id&&updateDisplay("likes",e.id)}),recordView(id),id_likes&&localStorage.getItem(id_likes)&&(liked=!0,updateButton(!0));const e=document.getElementById("button_likes");e&&e.addEventListener("click",()=>{toggleLike(!liked)})}).catch(e=>{console.error("Firebase anonymous sign-in failed:",e.message),authReady=!1}),window.process_article=()=>toggleLike(!liked)

View File

@ -0,0 +1 @@
function _getDefaultPackeryOptions(){return{percentPosition:!0,gutter:5,resize:!0}}function _getPackeryOptions(e){const t=_getDefaultPackeryOptions(),{packeryGutter:n,packeryPercentPosition:s,packeryResize:o}=e.dataset;return{percentPosition:s!==0[0]?s==="true":t.percentPosition,gutter:n!==0[0]?parseInt(n,10):t.gutter,resize:o!==0[0]?o==="true":t.resize}}(function(){window.addEventListener("load",function(){let e=[],t=document.querySelectorAll(".gallery");t.forEach(t=>{let n=new Packery(t,_getPackeryOptions(t));e.push(n)})})})()

Some files were not shown because too many files have changed in this diff Show More