Jekyll2024-03-10T15:22:36-04:00https://blog.tivasyk.info/feed.xmltivasyk@homeпро життя, всесвіт і все таке...tivasykдекілька зручних аліясів для git’а2024-03-03T11:25:00-05:002024-03-03T11:25:00-05:00https://blog.tivasyk.info/blog/2024/03/03/git-alias<p>в кожного свої звички роботи з git, — чув, є люди, котрі використовують графічні інструменти на кшталт втулків для vscode чи навіть окремі застосунки? — я використовую виключно командний рядок і декілька зручненьких аліясів (скорочень) для довгих команд. ось дещо з того, що накопичилося в глобальному конфігу (<code class="highlighter-rouge">~/.gitconfig</code>).</p>
<h2 id="git-alias">git alias</h2>
<p>дозволяє мені швидко пригадати, які скорочення я собі налаштував:</p>
<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code>~> git config <span class="nt">--global</span> alias.alias <span class="s1">'!git config --global --get-regex alias. | sed "s/alias.\([^ ]*\)\s\(.*\)/\1\t\2/"'</span>
</code></pre></div></div>
<p>використання:</p>
<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code>~> git <span class="nb">alias
stat</span> <span class="o">!</span>git status<span class="p">;</span> <span class="nb">echo</span><span class="p">;</span> git show <span class="nt">--oneline</span> <span class="nt">--stat</span><span class="o">=</span>,,10<span class="p">;</span> git log <span class="nt">--oneline</span> <span class="nt">-n5</span> HEAD^
tree <span class="o">!</span>tree <span class="nt">--gitignore</span>
<span class="nb">du</span> <span class="o">!</span><span class="nb">du</span> <span class="nt">-h</span> <span class="nt">-c</span> <span class="nt">-d1</span>
<span class="nb">alias</span> <span class="o">!</span>git config <span class="nt">--global</span> <span class="nt">--get-regex</span> alias. | <span class="nb">sed</span> <span class="s2">"s/alias.</span><span class="se">\(</span><span class="s2">[^ ]*</span><span class="se">\)\s\(</span><span class="s2">.*</span><span class="se">\)</span><span class="s2">/</span><span class="se">\1\t\2</span><span class="s2">/"</span>
...
</code></pre></div></div>
<h2 id="git-stat">git stat</h2>
<p>мені замало інформації стандантного <code class="highlighter-rouge">git status</code>, тому я зібрав собі трохи зручнішу версію, котра додатково показує журнал комітів з короткою статистикою змінених файлів останнього коміту:</p>
<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code>~> git config <span class="nt">--global</span> alias.stat <span class="s1">'!git status; echo; git show --oneline --stat=,,10 2>/dev/null; git log --oneline -n5 HEAD^ 2>/dev/null'</span>
</code></pre></div></div>
<p>використання:</p>
<div class="highlighter-rouge"><div class="highlight"><pre class="highlight"><code>~/projects/python/tutorials/yart> git stat
На гілці part6/refactoring
Ваша гілка не відрізняється від "origin/part6/refactoring".
нічого комітити, робоче дерево чисте
c142943 (HEAD -> part6/refactoring, origin/part6/refactoring) fix: помилка в readme /ti
readme.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
e9d6328 mod: поновлення readme /ti
8c5847b mod: рефакторинг engine.py, виправлення помилок /ti
1e48ed7 mod: рефакторинг procgen.py /ti
07687de mod: рефакторинг entities.py /ti
33c6d51 mod: refactor main.py /ti
</code></pre></div></div>
<h2 id="git-tree">git tree</h2>
<p>дозволяє швидко охопити оком дерево тек проєкту; зручніший за просто <code class="highlighter-rouge">tree</code>, бо аліяси git <strong>завжди запускаються в кореневій теці репозиторію</strong>, а <code class="highlighter-rouge">--gitignore</code> враховує виключення (фінальний пробіл потрібен):</p>
<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code>~> git config <span class="nt">--global</span> alias.tree <span class="s1">'!tree --dirsfirst --gitignore '</span>
</code></pre></div></div>
<p>використання (зрозуміло, що можна додавати інші опції tree):</p>
<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code>~/ownCloud/Щоденник/drafts> git tree <span class="nt">-L</span> 1
<span class="nb">.</span>
├── components
│ ├── actions.py
...
│ └── tiles.py
├── main.py
├── readme.md
├── requirements.txt
├── resources
│ ├── buddy-graphical.png
│ └── dejavu10x10_gs_tc.png
└── screenshots
├── Screenshot_20240121_090900.png
...
└── Screenshot_20240210_175818.png
</code></pre></div></div>
<h2 id="git-du">git du</h2>
<p>дозволяє швидко оцінити розмір репозиторію (рідко, але буває потрібно); знову ж таки — зручно, бо запускається в корені незалежно від поточної теки в дереві проєкту:</p>
<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code>git config <span class="nt">--global</span> alias.du <span class="s1">'!du -h -d1'</span>
</code></pre></div></div>
<p>використання:</p>
<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code>~/ownCloud/Щоденник/drafts> git <span class="nb">du
</span>24K ./resources
2,4M ./screenshots
5,4M ./.git
88K ./components
123M ./venv
130M <span class="nb">.</span>
</code></pre></div></div>
<h2 id="видалення-аліясу">видалення аліясу</h2>
<p>інколи потрібно видалити скорочення; на прикладі <code class="highlighter-rouge">du</code>:</p>
<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code>~> git config <span class="nt">--global</span> <span class="nt">--unset</span> alias.du
</code></pre></div></div>
<p>далі буде?..</p>tivasykв кожного свої звички роботи з git, — чув, є люди, котрі використовують графічні інструменти на кшталт втулків для vscode чи навіть окремі застосунки? — я використовую виключно командний рядок і декілька зручненьких аліясів (скорочень) для довгих команд. ось дещо з того, що накопичилося в глобальному конфігу (~/.gitconfig).відтінок і відтинок2024-02-20T07:01:00-05:002024-02-20T07:01:00-05:00https://blog.tivasyk.info/blog/2024/02/20/shade-shameколись дуже давно, навчаючись на військовій кафедрі київського вишу, завважив оцю дивну особливість росіянської щелепи: викладачі (більшість — «імпортовані» з московщини безкультурні солдафони, які при цьому вважали себе хіба що не центром культури й освіти серед «етіх хахлоф») вже були формально змушені вести курс українською мовою, але були при цім фізично нездатні правильно вимовити наші «и» та «і». тож, читаючи нам вголос лекцію з роздруківки, вони всі «и» промовляли як росіянське «и», «і» — обов'язково як їхнє «ьі», «е» — виключно як «є», а про «ї» навіть на думайте. можете собі уявити, який би стояв регіт в аудиторії… якби 90% студентів не були б повністю зросійщені, а за смішки всій групі не загрожувала би помста у вигляді нездачі курсу.
це я пригадав, відкривши у вікіпедії сторінку з визначенням «відтінок», та й уявив собі, як би ті солдафони відрізнили його від «відтинку»: «вьідтьінак, вьідтінак… вот йо%аньіє хахльі, су%а на%уй бл%дь, нічєво сказать нармальна ні моґут!»tivasykколись дуже давно, навчаючись на військовій кафедрі київського вишу, завважив оцю дивну особливість росіянської щелепи: викладачі (більшість — «імпортовані» з московщини безкультурні солдафони, які при цьому вважали себе хіба що не центром культури й освіти серед «етіх хахлоф») вже були формально змушені вести курс українською мовою, але були при цім фізично нездатні правильно вимовити наші «и» та «і». тож, читаючи нам вголос лекцію з роздруківки, вони всі «и» промовляли як росіянське «и», «і» — обов’язково як їхнє «ьі», «е» — виключно як «є», а про «ї» навіть на думайте. можете собі уявити, який би стояв регіт в аудиторії… якби 90% студентів не були б повністю зросійщені, а за смішки всій групі не загрожувала би помста у вигляді нездачі курсу.власні кольори для vim — це складно?2024-02-19T18:01:00-05:002024-02-19T18:01:00-05:00https://blog.tivasyk.info/blog/2024/02/19/vim-colors<p>я награвся різними колірними темами для vim: котрісь дуже сподобались, більшість — ні; переважно уникав тем «клоуна знудило» і пробував стримані, навіть однотонні. насамкінець спробував знайти мінімалістичну «прозору» тему, котра б просто покладалась на кольори терміналу, і додавала може один колірний акцент. точно такого, як хотів, не знайшлося, і захотілося розібратися, як швиденько змайструвати тему самотужки.</p>
<h2 id="натхнення">натхнення</h2>
<p>найближче до того, що мені сподобалось наприкінці моїх пошуків:</p>
<ul>
<li><a href="https://github.com/vim/colorschemes">quiet</a> (maxence weynans) — одна з нових стандартних тем vim, повністю однотонна з помірним контрастом і одним колірним акцентом; «прозора» — в тому сенсі, що уникає змін тла й покладається на базові 16 кольорів терміналу, а отже добре узгоджується з темою терміналу; недоліки: мені не подобається фуксиновий акцент і невиразність майже повністю одноманітного тексту;</li>
<li><a href="https://github.com/ourway/vim-bruin">bruin</a> (romain lafourcade) — контрастна й більше типографічна, ніж колірна тема: агресивно використовує атрибути тексту (жирний, нахилений, підкреслений) і яскравість, ніж кольори; «прозора»; з недоліків (як на мій смак) — місцями надмірна контрастність і брак консистентності у використанні кольорів;</li>
<li><a href="https://github.com/hardselius/warlock">warlock</a> (martin hardselius) — монохромна тема в тепло-сірих тонах і з помірним контрастом, що повністю уникає кольорів; з недоліків — брак акценту, ані кольором, ані текстовими атрибутами, «непрозорість» (вигляд відрізняється від терміналу під vim’ом), і мені не подобається використання різного тла.</li>
</ul>
<p><img src="/assets/images/2024/2024-02-19-vim-colors_01.png" alt="порівняння: quiet, warlock, bruin" /></p>
<p>можна було би взяти будь-яку з цих трьох тем і трішечки адаптувати для себе. проте мені було цікаво, як влаштовані теми vim і чи складно зробити щось «з нуля».</p>
<h2 id="що-я-хочу">що я хочу?</h2>
<p>хотілося б поєднати найкращі риси трьох перелічених тем:</p>
<ul>
<li>«прозорість» для палітри терміналу під vim’ом;</li>
<li>монохромна основа: відтінки сірого;</li>
<li>синтаксична підсвітка — стримана, за рахунок тонів</li>
<li>один колірний акцент, як у quiet, але з іншим кольором;</li>
<li>не надмірна контрастність (хоча це залежатиме від терміналу);</li>
<li>помітно тьмяніший за основний відтінок для нумерації рядків та недрукованих символів.</li>
</ul>
<p>робоча назва для першої спроби — <em>embers</em>, як у «ashes and embers» (попіл та жар), тому що тема буде переважно темна в тонах від чорного до білого, з червоним акцентом (і, можливо, трохи жовтого для окремих елементів інтерфейсу).</p>
<h2 id="підготовка">підготовка</h2>
<p>підготовка робочої теки:</p>
<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code>~> <span class="nb">mkdir</span> <span class="nt">-p</span> ~/projects/vim/vim-embers/colors
~> <span class="nb">cd</span> ~/projects/vim/vim-embers
<span class="c"># порожній файл майбутньої теми</span>
…vim-embers> <span class="nb">touch </span>colors/embers.vim
<span class="c"># лінк на цей файл там, де vim шукає теми</span>
…vim-embers> <span class="nb">ln</span> <span class="nt">-s</span> <span class="nv">$HOME</span>/projects/vim/vim-embers/colors/embers.vim <span class="nv">$HOME</span>/.vim/colors/embers.vim
<span class="c"># git, тому що без нього неправильно</span>
…vim-embers> git init
</code></pre></div></div>
<p>за взірець варто брати стандартну тему: вони, як правило, дуже якісні, добре структуровані, і дотримуються <a href="https://github.com/vim/colorschemes/wiki/Technical-Guidelines-%5BWIP%5D">вельми суворих обмежень</a>; в мене <em>quiet</em> лежить тут:</p>
<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code>…vim-embers> <span class="nb">ls</span> <span class="nt">-l</span> /usr/share/vim/vim<span class="k">*</span>/colors/quiet.vim
<span class="nt">-rw-r--r--</span> 1 root root 38959 січ 2 13:36 /usr/share/vim/vim91/colors/quiet.vim
…vim-embers> <span class="nb">cp</span> /usr/share/vim/vim91/colors/quiet.vim ~/projects/vim/vim-embers/colors
</code></pre></div></div>
<p>невелика функція (додати до <code class="highlighter-rouge">.vimrc</code>) для визначення колірної групи слова/символа під курсором (<code class="highlighter-rouge">:help highlight</code>):</p>
<div class="highlighter-rouge"><div class="highlight"><pre class="highlight"><code>" функція для визначення групи highlight слова під курсором
" використання: call SynGroup()
" або <Leader>h (зазвичай \h) в нормальному режимі
function! SynGroup()
let l:s = synID(line('.'), col('.'), 1)
echo synIDattr(l:s, 'name') . ' -> ' . synIDattr(synIDtrans(l:s), 'name')
endfun
nnoremap <Leader>h :call SynGroup()<CR>
</code></pre></div></div>
<p>скрипт <code class="highlighter-rouge">colortest.vim</code> для відображення кольорів за назвами:</p>
<div class="highlighter-rouge"><div class="highlight"><pre class="highlight"><code>:source $VIMRUNTIME/syntax/colortest.vim
</code></pre></div></div>
<p>скрипт <code class="highlighter-rouge">hitest.vim</code> для відображення всіх активних груп з використанням відповідних стилів:</p>
<div class="highlighter-rouge"><div class="highlight"><pre class="highlight"><code>:source $VIMRUNTIME/syntax/hitest.vim
</code></pre></div></div>
<h2 id="анатомія-колірної-теми">анатомія колірної теми</h2>
<p>опційний заголовок-коментар:</p>
<div class="highlighter-rouge"><div class="highlight"><pre class="highlight"><code>" Name: quiet
" Description: A mostly monochrome colorscheme, with a few niceties.
" ...
</code></pre></div></div>
<p>далі короткий блок для скидання поточної колірної теми й підсвітки синтаксису, якщо є:</p>
<div class="highlighter-rouge"><div class="highlight"><pre class="highlight"><code>hi clear
if exists("syntax_on")
syntax reset
endif
</code></pre></div></div>
<p>і назва теми:</p>
<div class="highlighter-rouge"><div class="highlight"><pre class="highlight"><code>let g:colors_name = 'quiet'
</code></pre></div></div>
<p><code class="highlighter-rouge">g:</code> в назві змінної визначає контекст (глобальний) змінної. далі в <em>quiet</em> йде блок, котрий зв’язує семантичні групи між собою:</p>
<div class="highlighter-rouge"><div class="highlight"><pre class="highlight"><code>hi! link Terminal Normal
</code></pre></div></div>
<p>загальний сенс рядка: для семантичної групи <code class="highlighter-rouge">terminal</code> встановити такі ж атрибути, як у <code class="highlighter-rouge">normal</code>. <code class="highlighter-rouge">hi</code> — це <code class="highlighter-rouge">highlight</code> (див. <code class="highlighter-rouge">:help highlight</code>); знак оклику в <code class="highlighter-rouge">hi! link...</code> потрібен, бо за замовчуванням зв’язування груп не працює, якщо перша група вже має якісь атрибути (кольори, атрибути тексту, — наприклад, встановлені іншою темою чи в <em>.vimrc</em>), тому треба примусово встановити прив’язку. тобто деінде в файлі теми має бути інший рядок, що фактично задає стиль групі <code class="highlighter-rouge">normal</code>, або декілька:</p>
<div class="highlighter-rouge"><div class="highlight"><pre class="highlight"><code>hi Normal guifg=#dadada guibg=#000000 gui=NONE cterm=NONE
...
hi Normal ctermfg=253 ctermbg=16 cterm=NONE
...
hi Normal term=NONE
</code></pre></div></div>
<ul>
<li><code class="highlighter-rouge">guifg</code>, <code class="highlighter-rouge">guibg</code>, <code class="highlighter-rouge">gui</code> — колір символа, тла, додаткові атрибути в графічному інтерфейсі;</li>
<li><code class="highlighter-rouge">ctermfg</code>, <code class="highlighter-rouge">ctermbg</code>, <code class="highlighter-rouge">cterm</code> — те саме в кольоровому терміналі (<em>cterm</em>)</li>
<li><code class="highlighter-rouge">term</code> — атрибути тексту для базового терміналу.</li>
</ul>
<p>ці три рядки можна було би об’єднати, і деякі теми так і влаштовані:</p>
<div class="highlighter-rouge"><div class="highlight"><pre class="highlight"><code>hi Normal term=NONE ctermfg=253 ctermbg=16 cterm=NONE guifg=#dadada guibg=#000000 gui=NONE
</code></pre></div></div>
<p>…але найчастіше визначення стилів згруповано в умовний блок: окремо для графічного інтерфейсу, для кольорового терміналу і для базового терміналу. ось так у <em>quiet</em> (я не певен, що тут не наплутано трохи):</p>
<div class="highlighter-rouge"><div class="highlight"><pre class="highlight"><code>let s:t_Co = has('gui_running') ? -1 : (&t_Co ?? 0)
if (has('termguicolors') && &termguicolors) || has('gui_running')
... " gui (termguicolor)?
endif
if s:t_Co >= 256 " повноколірний термінал?
...
unlet s:t_Co
finish
endif
if s:t_Co >= 16 " кольоровий термінал 256 кольорів?
...
unlet s:t_Co
finish
endif
if s:t_Co >= 8 " кольоровий термінал 16 кольорів?
...
unlet s:t_Co
finish
if s:t_Co >= 0 " базовий термінал?
...
unlet s:t_Co
finish
endif
</code></pre></div></div>
<ul>
<li><code class="highlighter-rouge">t_Co</code> — глобальна <a href="https://learnvimscriptthehardway.stevelosh.com/chapters/19.html">опція</a>, містить кількість кольорів в терміналі (<code class="highlighter-rouge">:help t_Co</code>, також <code class="highlighter-rouge">:echo &t_Co</code>); наскільки я розумію, не має впливу на vim, якщо той в режимі <code class="highlighter-rouge">termguicolors</code> (тому треба перевіряти окремо);</li>
<li><code class="highlighter-rouge">s:t_Co</code> — локальна <a href="https://vi.stackexchange.com/questions/25938/understanding-local-s-l-and-a-variables">змінна</a> (локальна для скрипта/теми), в яку завантажується доступна кількість кольорів для терміналу (<code class="highlighter-rouge">&t_Co</code>), або <code class="highlighter-rouge">-1</code> для графічного інтерфейсу.</li>
</ul>
<p>всередині кожного такого блоку — різні налаштування для темного і світлого тла; фактично тема <em>quiet</em> наче містить дві: темну й світлу.</p>
<div class="highlighter-rouge"><div class="highlight"><pre class="highlight"><code>if &background ==# 'dark' " темна тема
...
else " світла тема
...
endif
</code></pre></div></div>
<p>нарешті, групи highlight… (<code class="highlighter-rouge">:help highlight-groups</code>) їх багато; частина з них — <a href="https://blog.malynka.duckdns.org/blog/2024/02/20/shade-shame.html">стандартні</a> (документація каже, що повна тема має обов’язково призначати їм стилі); інші — стосуються синтаксичної підсвітки різних мов і є опційними.</p>
<h2 id="попіл-та-жар">попіл та жар</h2>
<p>отже, почнімо. заголовок:</p>
<div class="highlighter-rouge"><div class="highlight"><pre class="highlight"><code>" Name: embers
" Description: монохромна тема в віддінках сірого з типографічним виділенням та єдиним колірним
" акцентом червого кольору (попіл та жар) і прозорим тлом; покладається на основні
" кольори (ansi) задля кращої інтеграції з темою термінального емулятора.
" Author: tivasyk <tivasyk@gmail.com>
" Website: https://blog.malynka.duckdns.org
" Last Updated: 2024-02-20
</code></pre></div></div>
<p>прибирання, і назва теми:</p>
<div class="highlighter-rouge"><div class="highlight"><pre class="highlight"><code>hi clear
if exists("syntax_on")
syntax reset
endif
let g:colors_name = 'embers'
</code></pre></div></div>
<p>далі буде блок з визначенням базових стилів; на відміну від того, як це зроблено в <em>quiet</em> та інших темах, я хочу визначити базові стилі взагалі окремо. отже…</p>
<div class="highlighter-rouge"><div class="highlight"><pre class="highlight"><code>let s:t_Co = has('gui_running') ? -1 : (&t_Co ?? 0)
if (has('termguicolors') && &termguicolors) || has('gui_running')
" графічний інтерфейс або повноколірний емулятор терміналу
unlet s:t_Co
finish
elseif s:t_Co >= 256
" багатоколірний термінал
unlet s:t_Co
finish
elseif s:t_Co >= 16
" термінал 256 кольорів
unlet s:t_Co
finish
elseif s:t_Co >= 8
" термінал 16 кольорів
unlet s:t_Co
finish
else
" ймовірно, простий термінал без підтримки кольороів
unlet s:t_Co
finish
endif
</code></pre></div></div>
<h2 id="додаткові-матеріяли">додаткові матеріяли</h2>
<ul>
<li><a href="https://dev.to/kewbish/making-a-vim-colorscheme-2dm1">making a vim colorscheme</a> (emilie ma) — надихнуло спробувати самому;</li>
<li><a href="https://github.com/vim/colorschemes">vim’s colorscheme incubator</a> — офіційний репозиторій стандартних тем vim (також посилання на wiki проєкту).</li>
</ul>
<p>далі буде…</p>tivasykя награвся різними колірними темами для vim: котрісь дуже сподобались, більшість — ні; переважно уникав тем «клоуна знудило» і пробував стримані, навіть однотонні. насамкінець спробував знайти мінімалістичну «прозору» тему, котра б просто покладалась на кольори терміналу, і додавала може один колірний акцент. точно такого, як хотів, не знайшлося, і захотілося розібратися, як швиденько змайструвати тему самотужки.go (trump yourself) daddy2024-02-19T13:01:00-05:002024-02-19T13:01:00-05:00https://blog.tivasyk.info/blog/2024/02/19/go-trump-yourself-daddy[ця історія]({% post_url 2023/2023-02-06-go-musk-yourself-daddy %}) мала би закінчитися ще [три роки тому]({% post_url 2021/2021-01-13-go-funk-yourself-daddy %}), але краще пізно як ніколи? час настав. короткий переказ «попередніх» серій: щороку взимку надходить граничний термін перереєстрації домену tivasyk.info, і щороку godaddy називає мені грубшу ціну перереєстрації.
уточнена історія оплат (2024 — розрахована сума, я не спрачуватиму цього року):
* 2018: 30,24$ (канадійські долари, з платою icann та податками)
* 2019: 29,24$ (канадійські долари)
* 2020: 32,24$ (+10,3% відносно 2019)
* 2021: 35,24$ (+9,3% відносно 2020, +20,5% відносно 2019)
* 2022: 42,78$ (+21,4% відносно 2021, +46,3% відносно 2019)
* 2023: 49,70$ (+16,2% відносно 2022, +70,0% відносно 2019)
* 2024: 57,75$ (+16,2% відносно 2023, +97,5% відносно 2019)
навіщо? бо статистика показує, що велика кількість людей (і бізнесів) погоджуються на автоматичну оплату, і навіть не одразу звертають увагу на таке агресивне щорічне підвищення ціни, а коли звертають — виявляється, що перенести домен до іншого реєстратора коштує ще дорожче. всі продавці доментів застосовують ту саму тактику, тільки менш чи більш агресивно. при цьому godaddy досі не має зв'язку з підтримкою електронною поштою, — лише телефон або онлайновий чат, але цього разу навіть чат не працює, що додатково зменшує кількість клієнтів, котрі вчасно доб'ються знижки.
для особливо неуважних клієнтів godaddy має ще одну «фішку»: на головній сторінці банер в кращих традиціях fud-підходу лякає можливістю втратити домен, і пропонує поновлення за 69,98 доларів сша (це **99,98 канадійських**); якщо клацнути «renew now» — ніхто не нагадує, що це за два роки (а може комусь треба лише один?), аби сплатили.
повторю фразу одного мого шкільного вчителя: найбільше в житті не люблю непорядність. я вважаю, що згадка godaddy має бути в словниковому визначенні непорядності. я більше ніколи не хочу мати справу з godaddy.
що робити? особисто я не поновлюватиму tivasyk.info, і відтепер користуватимусь лише [динамічним доменним іменем від duckdns]({% post_url 2016/2016-12-03-duckdns-ip %}), — не так гарно, але безкоштовно і за 8 років жодного разу не підводило; доведеться, щоправда, доналаштувати сертифікат tls/ssl. щоденник буде доступний за адресою [blog.malynka.duckdns.org](https://blog.malynka.duckdns.org/), як раніше.
моя порада іншим: не майте справи з godaddy; але навіть купуючи домен деінде — платіть за 5 років наперед і майте «план бе», тобто будьте готові платити за перенесення, якщо інший реєстратор застосовуватиме подібну тактику.
![мені не подобається підхід godaddy](/assets/images/2024/2024-02-19-go-trump-yourself-daddy_01.jpg)tivasykця історія мала би закінчитися ще три роки тому, але краще пізно як ніколи? час настав. короткий переказ «попередніх» серій: щороку взимку надходить граничний термін перереєстрації домену tivasyk.info, і щороку godaddy називає мені грубшу ціну перереєстрації.життєве2024-01-31T05:15:00-05:002024-01-31T05:15:00-05:00https://blog.tivasyk.info/blog/2024/01/31/lifeпрокинувся о п'ятій ранку з неприємними відчуттями від сновидіння. останнім часом таке трапляється… ну, не надто часто, але минулого тижня прокидався о третій ночі та йшов працювати, щоби не перекидатися з боку на бік, намагаючись заснути.
цього разу так само не намагався заснути, але відкрив не робочий ноутбук, а свої [нотатки з вивчення підказки до програмування roguelike на python'і](https://codeberg.org/tivasyk/tutorial.yart/src/branch/master); може, колись вийде написати якусь забавку. але якщо хтось раніше за мене накидає roguelike, подібний до [cataclysm](https://uk.wikipedia.org/wiki/Cataclysm:_Dark_Days_Ahead) та [doomrl](https://en.wikipedia.org/wiki/DRL_(video_game)), але з сюжетом як в [system shock 2](https://uk.wikipedia.org/wiki/System_Shock_2) — я покину цю підказку й піду грати, wink-wink.
інколи розмовляємо з миленькою якось так:
вона: в мене не заправлена автівка.
я: а куди пальне поділа?
вона: в їзду!
і регочемо.
минулих вихідних прибирав у акваріумі – вперше за півроку, мабуть. до придбання тих десяти равликів доводилося чистити щотижня. з недоліків — е… їх вже не десять, м'яко кажучи. зате вода і скло прозорі.
![спробуй полічити равликів у акваріумі](/assets/images/2024/2024-01-31-life_01.jpg)tivasykпрокинувся о п’ятій ранку з неприємними відчуттями від сновидіння. останнім часом таке трапляється… ну, не надто часто, але минулого тижня прокидався о третій ночі та йшов працювати, щоби не перекидатися з боку на бік, намагаючись заснути.новий початок: dwarf fortress2024-01-01T09:01:00-05:002024-01-01T09:01:00-05:00https://blog.tivasyk.info/blog/2024/01/01/new-beginning-dfздається, моєму захопленню [dwarf fortress](https://blog.tivasyk.info/tags/#dwarf-fortress) більше десяти років. це… специфічна гра: я починав безліч разів, і часом швидко втрачав інтерес, а часом вибудовував доволі складні, величезні фортеці й уже потім втрачав інтерес — а тоді через півроку чи рік знову відкривав, дивувався набудованому але починав щось нове, бо не міг пригадати, куди я хотів то вивести… тоді жалкував, що не продовжив, і так по колу. цього разу хочу спробувати інакше: зараз я створю новий світ, розпочну побудову фортеці, і не покину, аж поки не загине останній гном; а щоби не втрачати інтерес, а головне — зберігати якусь зв'язну інформацію про проєкти під час довгих пауз, — тут буде літопис цього нового світу: shagthoxah, the everseeing dimentions.
![світ shagthoxah, the everseeing dimentions](/assets/images/2024/2024-01-01-new-beginning-df_00.png)
## зміст
* [фортеця evostdomas, sectguilds](#фортеця-evostdomas-sectguilds)
* [evostdomas: початок](#evostdomas-початок)
* [фортеця ushilustuth (icyfenced)](#фортеця-ushilustuth-icyfenced)
* [icyfenced: початок](#icyfenced-початок)
* [icyfenced: розквіт](#icyfenced-розквіт)
## фортеця evostdomas (sectguilds)
### evostdomas: початок
#### рік п'ятий
на п'ятий рік (sic) від початку літочислення у світі shagthoxah, семеро чи то сміливців, чи може знедолених безумців, прийшли з таким-сяким скарбом до паруючого жерла сплячого вулкану, щоби заснувати тут нове поселення.
![розташування майбутньої фортеці evostdomas](/assets/images/2024/2024-01-01-new-beginning-df_01_001.png)
![караван неподалів жерла вулкану](/assets/images/2024/2024-01-01-new-beginning-df_01_002.png)
перший рік поселення проходив переважно без визначних подій — дві невеликих групи мігрантів поповнили населення, приїхав та поїхав, нічого не продавши, караван… аж доки необережні підкопні роботи при будівництві основної вежі мало не коштували життя кільком гномам. ввесь рік поселенню конче бракувало харчів, особливо питва, але найбільше — каменю для будівництва. наприкінці року гноми трьома шахтами почали проштрикувати легкий водоносний шар в пошуках каменю й металів.
![фундамент основної вежі на початку шостого року](/assets/images/2024/2024-01-01-new-beginning-df_01_003.png)
[(до змісту)](#зміст)
#### рік шостий
на початку року ремісники подали петицію з облаштування зали гільдії… не мала баба клопоту.
![петиція щодо зали для гільдії ремісників](/assets/images/2024/2024-01-01-new-beginning-df_01_004.png)
якоїсь миті стало зрозуміло, що гноми не встигають будувати стіни для гідроізоляції достатньо швидко, роботи довелося зупинити, щоби виробити план дій, — можливо, доведеться будувати помпи для відкачування, перш ніж можна буде продовжити.
![напівзатоплений рівень під водоносним шаром](/assets/images/2024/2024-01-01-new-beginning-df_01_005.png)
влітку один з переселенців, позбавлений можливості створити артефект, не витримав і повністю втратив глузд; гноми поховали нещасного в камінному сегменті галереї незакінченого другого поверху головної вежі.
![перша драма у фортеці](/assets/images/2024/2024-01-01-new-beginning-df_01_006.png)
поки роботи в підземній частині головної вежі неможливі через затоплення, на південь гноми успішно проштрикнули водоносний шар невеликою шахтою і отримали доступ до будівельного каменю; тим часом на неглибокому «червоному» підземному рівні буде облаштовано тимчасові майстерні, тому що для убезпечення великої брами потрібні механізми, а ще безліч усього іншого… потрібне місце для роботи ремісників та складування припасів.
![підземний рівень для тимчасових майстерень](/assets/images/2024/2024-01-01-new-beginning-df_01_007.png)
перший артефакт, створений майстрами evostdomas — шкіряна спідниця?! досі не маючи комірника, гноми не можуть назвати навіть приблизну вартість цього виробу.
![перший власний артефакт фортеці evostdomas](/assets/images/2024/2024-01-01-new-beginning-df_01_008.png)
історична подія: у сторожовій вежі над головною брамою встановлено важіль, що зачинає головну браму; можна сказати, що від цього дня фортеця evostdomas стала справжнім захищеним поселенням. насправді це лише умовність: конфігурація вибраного для будівництва фортеці схилу гори така, що поки не буде виведено всі сім надземних рівнів вежі й дах, жоден гном всередині не почуватиметься в безпеці: ворог може зайти згори!
![головні ворота тепер можна закривати](/assets/images/2024/2024-01-01-new-beginning-df_01_009.png)
другий артефакт, а гноми досі надто зайняті роботою, щоби лічити гроші. надалі артефактів стане надто багато, звітувати про кожен окрема немає сенсу.
![головні ворота тепер можна закривати](/assets/images/2024/2024-01-01-new-beginning-df_01_010.png)
[(до змісту)](#зміст)
#### рік сьомий
фортеця зростає, населення 59 гномів.
![стан фортеці на початок 7-го року](/assets/images/2024/2024-01-01-new-beginning-df_01_011.png)
проєкт року — спроба осушення нижнього затопленого рівня головної вежі; якщо вдасться, не лише буде змога продовжити розвиток фортеці долу, але й можна буде утворити природні водоспади всередині фортеці, для прикрашання та покращення моралі. але проєкт… непростий, потребує кропіткої підготовки на кількох рівнях, і вельми небезпечний.
![проєкт водовідведення з долішнього затопленого рівня](/assets/images/2024/2024-01-01-new-beginning-df_01_012.png)
черговi петиції, від фермерів, теслів, ковалів — а тим часом, навіть попередню ще не задоволено…
![петиція щодо зали для гільдії фермерів](/assets/images/2024/2024-01-01-new-beginning-df_01_013.png)
найвирішальніша мить цієї інженерної афери з водовідведення: потрібно пробити стіну, за якою накопичено тисячі кубометрів води, щоби злити її до підготовленої каналізації. тиск за стіною такий, що шахтарів може вбити, відкинувши струменем до протилежної води, або втопити, якщо невелике приміщення каналізаційного колодязя заповниться надто швидко… але шляху назад намає.
![небезпечна мить: за стіною великий тиск води](/assets/images/2024/2024-01-01-new-beginning-df_01_014.png)
[(до змісту)](#зміст)
#### рік восьмий
населення: 100 гномів.
![стан фортеці на початок 8-го року](/assets/images/2024/2024-01-01-new-beginning-df_01_015.png)
один з ремісників втратив глузд через невдоволення умовами праці й влаштував криваву бійню в залі гільдії фермерів, позбавивши життя тридцятеро невинних гномів. схоже, упродовж цього року вцілілі переважно займатимуться виготовленням трун і похованням.
![жахлива драма в залі гільдії](/assets/images/2024/2024-01-01-new-beginning-df_01_016.png)
![жахлива драма в залі гільдії](/assets/images/2024/2024-01-01-new-beginning-df_01_017.png)
півроку пішло на те, щоби поховати нещасних жертв у новому храмі. тим часом знову прибув караван — і цього разу гноми змогли вторгувати найнеобхідніше з краму: їстівні припаси та багато сувоїв з матерією і шкірами.
![храм і цвинтар на північ від головної вежі](/assets/images/2024/2024-01-01-new-beginning-df_01_018.png)
попередня спроба дренажу затопленого підземного рівня під водоносним шаром була успішна наполовину, — давши доступ до цього рівня, гноми не змогли втім осушити його повністю; це стало мотиватором до додаткових інженерних робіт: за допомогою додаткової вертикальної шахти, вони розчистили п'ятнадцять нижчих рівнів, підготували кругові зали й необхідні канали для запуску чотирьох «водяних стовпів» крізь всю висоту підземної частини вежі… надійшов час проштрикнути залитий поверх і випробувати водоспадну конструкцію…
![підготовка до запуску водяних стовпів](/assets/images/2024/2024-01-01-new-beginning-df_01_019.png)
[(до змісту)](#зміст)
#### рік дев'ятий
населення: 86 гномів.
![стан фортеці на початок 9-го року](/assets/images/2024/2024-01-01-new-beginning-df_01_020.png)
влітку 9-го року, коли справи наче налагодилися і все йшло непогано, зненацька… велетенська драконоподібна тварюка з сімома головами. всі до сховку, на сполох! до зброї, до зброї!
![смертельна небезпека для фортеці](/assets/images/2024/2024-01-01-new-beginning-df_01_021.png)
![до зброї](/assets/images/2024/2024-01-01-new-beginning-df_01_022.png)
не встигли закрити ворота. десятеро сміливців із короткими обсидіановими мечами — це все, що стоїть між семиголовою гідрою та мешканцями фортеці.
![десятеро сміливців проти гідри](/assets/images/2024/2024-01-01-new-beginning-df_01_023.png)
далі все відбулося дуже швидко. нові й нові гноми піднімали зброю, яку могли знайти, і безстрашно ставали проти тварюки, щоби не пропустити її крізь браму до фортеці… коли, нарешті, браму було закрито — за муром лишилося хіба п'ятнадцятеро вцілілих, із більш як столюдного міста. гідра, хоч і поранена, але ще жива й небезпечна, відступила на південь. чи надовго?
![криваве місиво перед брамою](/assets/images/2024/2024-01-01-new-beginning-df_01_024.png)
декілька днів гідра чатувала на необережних гномів за воротами, час від часу віддаляючись до лісу, чи піднімаючись на гору, щоби вполювати і зжерти якусь тварину… аж тут з півночі надійшов караван, не підозрюючи про смертельну небезпеку. гідра знищила всіх — охоронців, торговців, і в'ючних тварин…
![караван](/assets/images/2024/2024-01-01-new-beginning-df_01_025.png)
нарешті тварюка знайшла вхід до самої фортеці, скориставшись верхніми, недобудованими поверхами вежі в горі. останні вцілілі недовго змогли переховуватися на нижніх поверхах — гідра їх винюшила і пожерла всіх. так закінчилася коротка історія фортеці evostdomas, мешканці котрої цінували ремесла, вишукану архітектуру, інженерію, але не зуміли передбачити небезпеку й захистити себе.
![гідра всередині фортеці](/assets/images/2024/2024-01-01-new-beginning-df_01_026.png)
[(до змісту)](#зміст)
## фортеця ushilustuth (icyfenced)
### icyfenced, початок
#### рік дев'ятий
на дев'ятий рік від початку літочислення, на південь від жертовної гори і батьківщини гномів, на узбережжі моря виникло гномське поселення ushilustuth, тобто icyfenced мовою людей. невеликий гурт поселенців звабився розповідями про багаті поглади металів неглибоко під узбережними лісами.
![мапа: розташування поселення icyfenced](/assets/images/2024/2024-01-01-new-beginning-df_02_001.png)
[(до змісту)](#зміст)
#### рік десятий
![фортеця icyfenced, десятий рік](/assets/images/2024/2024-01-01-new-beginning-df_02_002.png)
найперший артефект фортеці icyfenced — спіднє зі свинячої шкіри?!
![перший артефакт фортеці icyfenced](/assets/images/2024/2024-01-01-new-beginning-df_02_003.png)
[(до змісту)](#зміст)
#### рік одинадцятий
рік минув спокійно. фортеця прийняла дві чи три хвилі переселенців. зведено три рівні головної вежі, її обкопано захисним ровом, який заповнено морською водою через підземний канал. на нижніх рівнях облаштовано великі коморои, декілька найважливіших майстерень, ферми та бараки для майбутньої охорони вежі. окремо від головної вежі, далі в море, в обіймах пінистого прибою, зведено два надземних рівні для майбутньої глибокої шахти, — задля безпеки (хто зна, які забуті демони чекають під землею?) її з'єднано з головною лише вузьким місточком над водою і берегом.
![фортеця icyfenced, рік 11](/assets/images/2024/2024-01-01-new-beginning-df_02_004.png)
![шахта в морі, місточок до головної вежі](/assets/images/2024/2024-01-01-new-beginning-df_02_006.png)
[(до змісту)](#зміст)
#### рік дванадцятий
цей рік гноми icyfenced присвятили невпинному облаштуванню внутрішніх зал і налагодженню роботи з металом: плавиться тетрагідрит, виплавляється мідь та трохи срібла. шахту поглиблено до 18 підземного рівня — знайшли мармур. облаштовано чотири ремісницьких гільдії, гуртожиток і декілька індивідуальних келій для наймайстерніших ремісників.
![фортеця icyfenced, рік 12](/assets/images/2024/2024-01-01-new-beginning-df_02_005.png)
![облаштування підземних покоїв](/assets/images/2024/2024-01-01-new-beginning-df_02_008.png)
[(до змісту)](#зміст)
#### рік тринадцятий
цього року гноми продовжили облаштовувати підземне помешкання; зокрема, запущено в дію простий внутрішній водоспад, що використовує водоносний шар, під яким розташовані основні поверхи, для створення чотирьох водяних стовпів; лікувальний ефект на психіку гномів неймовірний. з іншого — продовження налаштування індустрії: плавиться мідь та срібло; з міді наразі виготовляються лише болти для мисливців, а зі срібла — статуї для прикрашання гільдій і покоїв знаті та ґрати для водоспаду.
![фортеця icyfenced, рік 13](/assets/images/2024/2024-01-01-new-beginning-df_02_007.png)
восени прибув величезний торговий караван з гномської батьківщини. цього разу фортеця має багато чого на продаж… це означає, втім, що щойно слава про багатство фортеці пошириться світом — чекай на навалу гоблінів, або ще щось гірше; знадобиться треноване військо.
![торгівля з караваном восени 13-го року](/assets/images/2024/2024-01-01-new-beginning-df_02_009.png)
наприкінці року гноми вирішили викопати ввесь 20 підземний рівень шахти в пошуках самоцвітів і, якщо пощастить, металів… схоже, втім, що металів тут катма, і треба рити глибше, значно глибше.
![викопування двадцятого рівня](/assets/images/2024/2024-01-01-new-beginning-df_02_010.png)
[(до змісту)](#зміст)
#### рік чотирнадцятий
рік минув спокійно; прийшов караван, гноми дісталися підземних печер, і завершили складний інженерний проєкт.
![фортеця icyfenced, рік 14](/assets/images/2024/2024-01-01-new-beginning-df_02_011.png)
копаючи так глибоко, як ніколи до того, на п'ятий рік від заснування поселення, гноми фортеці icyfenced дісталися підземних печер.
![підземні печери](/assets/images/2024/2024-01-01-new-beginning-df_02_012.png)
цього року гноми розпочали й довели до щасливого завершення новий інженерний проєкт: вода, що падає чотирма водоспадами всередині фортеці рухає два водяних колеса, котрі через систему передач рухають помпи, котрі піднімають частину тої води знову догори на водоспади. це збільшило потік води і додатково оживило внутрішню атмосферу фортеці. додатково, на тому ж рівні чотири колодязі дали доступ до води на випадок, якщо закінчиться питво (а також для шпиталю).
![механічна зала](/assets/images/2024/2024-01-01-new-beginning-df_02_013.png)
[(до змісту)](#зміст)
### icyfenced: розквіт
#### рік п'ятнадцятий
рік почався спокійно; гноми у фортеці звикли до розміреного життя і достатку, і присвятили цей рік переважно облаштуванню головної вежі та захисним спорудам і механізмам навколо неї.́
![фортеця icyfenced, рік 15](/assets/images/2024/2024-01-01-new-beginning-df_02_014.png)
глибоко під землею, нижче сотого рівня шахти, гноми натрапили на ще глибше провалля… хто зна, що може звідти вилізти.
![підземне провалля](/assets/images/2024/2024-01-01-new-beginning-df_02_015.png)
сите життя й великі статки гномів фортеці icyfenced не могли минути непоміченими — аж ось, п'ятнадцятого року від початку літочислення, з підземних глибин іде забута тварюка номар. гноми негайно покинули підземелля й шахту і поховалися за стінами фортеці, сподіваючись на міць розставлених у підземних проходах пасток з мідними циркулярними пилами… але все закінчилося антиклімаксом: номар спокусилася м'ясом печерних троглодитів і зуміла вбити кількох, але решта напали гуртом і вбили тварюку ще до того, як вона зацікавилася входом до фортеці.
![забута тварюка прийшла!](/assets/images/2024/2024-01-01-new-beginning-df_02_016.png)
решта року минала без пригод: розніжені гноми замостили дві дороги, облаштували кімнати для медперсоналу неподалік шпиталю, і продовжили наполегливо викопувати двадцятий підземний рівень шахти, — просто з упертості, бо вже давно зрозуміло, що металів там немає… аж поки з підземних глибин не з'явилася ще одна тварюка — велетенський одноокий рогатий верп з отруйним диханням. на щастя, здається, гноми ще не встигли прокопати прохід до тієї частини підземелля, звідки воно вилізло.
![друга забута тварюка за рік](/assets/images/2024/2024-01-01-new-beginning-df_02_017.png)
[(до змісту)](#зміст)
#### рік шістнадцятий
тим часом настала весна, і новий рік. населення фортеці досягло 200 гномів — це, здається, максимум за поточних налаштувань, тож більше мігрантів поки що не буде.
![фортеця icyfenced, рік 16](/assets/images/2024/2024-01-01-new-beginning-df_02_018.png)
наприкінці весни двадцятеро вояків, навчених і озброєних, вирушили в експедицію для дослідження руїн фортеці evostdomas за день ходу на північний захід; хто зна, чи всі повернуться й коли.
![дослідницька експедиція до руїн evostdomas](/assets/images/2024/2024-01-01-new-beginning-df_02_019.png)
за декілька днів експедиція успішно повернулася, принісши декілька артефактів.
![звіт про експедицію](/assets/images/2024/2024-01-01-new-beginning-df_02_020.png)
тим часом страшний отруйний вепр переховувався в підземеллях, полюючи на мешканців печер, аж поки гноми необережно не відкрили доступ до нижніх печер з фортеці… тварюка лише цього й чекала, і рушила до фортеці, дорогою вбивши декількох беспечних розвідників, — аж доки її не перестрів на нижньому рівні шахти ід накасровод, арбалетник і борець. він практично самотужки затримував монстра, чекаючи на підмогу, і врешті-решт подужав його вбити!
![перемога над забутим чудовиськом](/assets/images/2024/2024-01-01-new-beginning-df_02_021.png)
далі буде…tivasykздається, моєму захопленню dwarf fortress більше десяти років. це… специфічна гра: я починав безліч разів, і часом швидко втрачав інтерес, а часом вибудовував доволі складні, величезні фортеці й уже потім втрачав інтерес — а тоді через півроку чи рік знову відкривав, дивувався набудованому але починав щось нове, бо не міг пригадати, куди я хотів то вивести… тоді жалкував, що не продовжив, і так по колу. цього разу хочу спробувати інакше: зараз я створю новий світ, розпочну побудову фортеці, і не покину, аж поки не загине останній гном; а щоби не втрачати інтерес, а головне — зберігати якусь зв’язну інформацію про проєкти під час довгих пауз, — тут буде літопис цього нового світу: shagthoxah, the everseeing dimentions.з новим 2024-м роком!2023-12-31T14:10:00-05:002023-12-31T14:10:00-05:00https://blog.tivasyk.info/blog/2023/12/31/new-year-2024добігає кінця ще один непростий рік; триває війна, розв'язана такими варварами, яких, здавалося, і не може існувати в 21-му столітті на цій планеті. я вірю, переконаний, що кожен рік наближає смерть хуйла, поразку московського фашизму, суд над його агентами і десятиліття сорому для всього населення ерефії. хто зна, можливо це трапиться вже в наступному році? як би не склалося, будьмо сильні, терплячі, тримаймося купки й розмовляймо рідною мовою! вітаю нас усіх із прийдешнім новим 2024-м роком! слава україні!tivasykдобігає кінця ще один непростий рік; триває війна, розв’язана такими варварами, яких, здавалося, і не може існувати в 21-му столітті на цій планеті. я вірю, переконаний, що кожен рік наближає смерть хуйла, поразку московського фашизму, суд над його агентами і десятиліття сорому для всього населення ерефії. хто зна, можливо це трапиться вже в наступному році? як би не склалося, будьмо сильні, терплячі, тримаймося купки й розмовляймо рідною мовою! вітаю нас усіх із прийдешнім новим 2024-м роком! слава україні!резервне копіювання: щось готове чи diy?2023-12-24T17:01:00-05:002023-12-24T17:01:00-05:00https://blog.tivasyk.info/blog/2023/12/24/backupsперш як продовжувать [міграцію контейнерів на сервер v2]({% post_url 2023/2023-12-10-docker-migration %}), треба врешті-решт вирішити задачу збереження резервної копії сховища owncloud, — за чотири роки «тестового» використання там накопичилося чимало справді важливих документів; як не соромно визнавати, але досі всі ці дані лежать на одному hdd без резервування (щоправда, це не зовсім так: owncloud тримає синхронізовану копію найважливішої частини даних на моєму лептопі). треба терміново знайти open source варіант, котрий був би достатньо простий (бо простота — передумова надійності), безкоштовний і використовував би вже наявні ресурси, дозволяв би просте масштабування на декілька машин (nextcloud на сервері v2 також треба буде бекапити) і, в перспективі, на віддалене зберігання (холодне сховище amazon, чи обмін вільним місцем з товаришем тощо).
наразі я не маю готового «найкращого» рішення, схиляюсь до думки написати собі з нуля більш чи менш розумний скрипт, котрий би рекурсивно архівував задану теку повністю чи інкрементально, і вмів би шукати й відновлювати з архівів версії файлів на певну дату. але перш ніж робити щось самому — варто поглянути, чи нема готового рішення.
## зміст
* [огляд готових рішень](#огляд-готових-рішень)
* [backuppc](#backuppc)
* [rsnapshot](#rsnapshot)
* [amanda](#amanda)
* [налаштування](#налаштування)
* [резервне архівування](#резервне-архівування)
* [відновлення з архіву](#відновлення-з-архіву)
* [відновлення без конфігурації](#відновлення-без-конфігурації)
* [стиснення](#стиснення)
* [шифрування](#шифрування)
* [віддалене архівування](#віддалене-архівування)
* [інші опції](#інші-опції)
## огляд готових рішень
резервне копіювання (і відновлення!) — одна з найпоширеніших, найважливіших задач будь-якого сисадміна, тому програм для цього існує достобіса; але в мене трохи специфічні вимоги (див. вище), тож далеко не все підходить.
### backuppc
колись по роботі мені довелося використовувати [backuppc](https://backuppc.github.io/backuppc/) ([документація](https://backuppc.github.io/backuppc/BackupPC.html)) як основний засіб резервування даних в мережі: написано на perl'і, має трохи заплутаний, але придатний для використання веб-інтерфейс, підтримує затягування даних з віддалених машин по smb, rsync та ftp, дозволяє вельми гнучко налаштовувати розклад збереження й утримування копій, і гранульовано відновлювати потрібну версію конкретного файлу чи групи…
але все це потребує кропіткого налаштування і підтримки; зокрема, аж ніяк не хочеться залежати від веб-сервера для копіювання-відновлення. це приблизна верхня межа складності, яку я готовий розглядати для домашньої мережі… але в ідеалі хочеться щось простіше.
[(до змісту)](#зміст)
### rsnapshot
ніколи не користувався [rsnapshot](https://rsnapshot.org/) ([документація](https://rsnapshot.org/rsnapshot/docs/docbook/rest.html)), але це дуже близько за ідеологією до того, що мені треба: написано на perl'і, використовує rsync, hard links, і ssh для віддаленого копіювання, вельми просте у використанні, простий доступ до окремих файлів. але, на жаль, не стискає — це інструмент для зберігання знятків (snapshots), а не архівування.
я трохи погрався з ним. встановлення (arch та похідні), і основні налаштування в `/etc/rsnapshot.conf` (важлива заувага: значення налаштувань від назв відділяються tab'ами, не пробілами):
```
> sudo pacman -Ss rsnapshot
> sudo vim /etc/rsnapshot.conf
# ----- >8 -----
snapshot_root /home/tivasyk/temp/backup/
...
retain hourly 3
retain daily 7
retain weekly 4
retain monthly 3
...
backup /home/tivasyk/temp/data/ katana.lan/
# ----- 8< -----
> rsnapshot configtest
```
майданчик для випробувань:
```
> mkdir -p ~/temp/data
> mkdir -p ~/temp/backup
> cd ~/temp
# генерація кількох файлів для випроби
> for i in tar gzip; do man ${i} > data/${i}.txt; done
# структура до знятка №1
> tree ~/temp
/home/tivasyk/temp
├── backup
└── data
├── gzip.txt
└── tar.txt
```
назви знятків *hourly*, *daily* тощо — довільні, але порядок важливий, і зробити *daily* не вийде, поки не набереться достатня кількість знятків першого рівня. перший прогін rsnapshot:
```
> [sudo] rsnapshot hourly
# структура після знятка №1
/home/tivasyk/temp
├── backup
│ └── hourly.0
│ └── katana.lan
│ └── home
│ └── tivasyk
│ └── temp
│ └── data
│ ├── gzip.txt
│ └── tar.txt
└── data
├── gzip.txt
└── tar.txt
```
кожен наступний зняток *hourly* додаватиме нову теку (`backup/hourly.1` тощо), і rsnapshot сам робить ротацію всередині кожного рівня (*hourly*, *daily* тощо):
```
> man bzip2 > data/bzip2.txt
> [sudo] rsnapshot hourly
> tree ~/temp
/home/tivasyk/temp
├── backup
│ ├── hourly.0
│ │ └── katana.lan
│ │ └── home
│ │ └── tivasyk
│ │ └── temp
│ │ └── data
│ │ ├── bzip2.txt
│ │ ├── gzip.txt
│ │ └── tar.txt
│ └── hourly.1
│ └── katana.lan
│ └── home
│ └── tivasyk
│ └── temp
│ └── data
│ ├── gzip.txt
│ └── tar.txt
└── data
├── bzip2.txt
├── gzip.txt
└── tar.txt
```
видно, як відбулася ротація: `hourly.0` став `hourly.1`; час створення тек підказує:
```
> ls -l backup/
drwxr-xr-x 3 root root 4096 гру 24 17:04 hourly.0
drwxr-xr-x 3 root root 4096 гру 24 16:57 hourly.1
```
окрема команда (потребує `du`) показує, скільки зайнято місця під кожен зняток, і загалом, — тут видно, що за рахунок hard links знятки потребують місця лише під змінені/додані файли:
```
> rsnapshot du
108K /home/tivasyk/temp/backup/hourly.0/
24K /home/tivasyk/temp/backup/hourly.1/
132K загалом
```
як відновлювати втрачені файли? просто скопіювати, що куди треба, та й по тому. для архівування доведеться tar'ити теку останнього знятка (додаткова дія, додатковий простір на диску), стискати, шифрувати, — і можна синхронізувати кудись.
загалом, rsnapshot мені дуже сподобався простотою і надійністю. але це не зовсім те, що мені треба: для резервування майже 500 гб даних мені потрібне архівування, а для віддаленого зберігання — ще й шифрування.
[(до змісту)](#зміст)
### amanda
спершу хотів «скинути» цей інструмент до розділу «інші опції» як потенційно цікавий, але заскладний для домашнього використання… але щось у описі підштовхнуло одразу спробувати, тож: [amanda](https://amanda.org/) ([документація](https://docs.zmanda.com/v/amanda-community/)).
#### налаштування
встановлення (на arch і похідних, з aur)…
```
> pamac install amanda
```
…завершується аварійно на моїй системі, довелося скористатися [детальною підказкою](https://linux-packages.com/aur/package/amanda):
```
> [sudo] pacman -S --needed base-devel git
> pamac install amanda
```
після цього на позір встановилося: в `/usr/bin/` з'явилося багато утиліт `am*`, що належать групі `amandabackup`:
```sh
> [sudo] find /usr/bin -group amandabackup
...
/usr/bin/amadmin
...
/usr/bin/amstatus
...
> [sudo] amadmin --version
amadmin-3.5.2
> man amadmin
DUMMY
```
тиць, а маєш… на жаль, пакувальник до aur «забув» додати сторінки man до всього цього; [man'и є у wiki на zmanda.com](https://wiki.zmanda.com/man/3.5.0/amanda.8.html). щоби не блукати навпомацки надто довго, мені знадобиться підказка з прикладами… але поки що досліджую:
```
> [sudo] tree /etc/amanda/
/etc/amanda/
├── example -> /usr/share/amanda/example/
├── MyConfig
│ ├── amanda.conf
│ ├── curinfo
│ ├── disklist
│ └── index
└── template.d -> /usr/share/amanda/template.d/
> [sudo] less /etc/amanda/MyConfig/amanda.conf
...
```
гаразд, починається цікаве: користуючись [man](https://wiki.zmanda.com/man/3.5.0/amanda.8.html)'ами, [підказкою](https://docs.zmanda.com/v/amanda-community/getting-started-with-amanda/build-a-basic-configuration) та наявним конфігом як взірцем, спробую щось забекапити. найперше видаляю результати випроби rsnapshot і готую майданчик для експериментів:
```
> cd ~/temp
> [sudo] rm -rf backup/*
> tree ~/temp/
/home/tivasyk/temp/
├── backup
└── data
├── bzip2.txt
├── gzip.txt
└── tar.txt
```
я не хочу зберігати службову інформацію разом з конфігом в `/etc/amanda/`, принаймні не для тестів, тому…
```
> mkdir -p ~/temp/amanda/state/{curinfo,log,index}
```
там же буде кеш для тимчасового пакування архіву перед скиданням в бекап (віртуальна «магнітна плівка», відчуй себе сисадміном середини восьмидесятих!):
```
> mkdir ~/temp/amanda/holding
```
…і теки, які емулюватимуть ті «плівки» — власне, архівовані резервні копії, три штуки для випроби ротації:
```
> mkdir -p ~/temp/backup/vtapes/slot{1,2,3}
> tree ~/temp/
/home/tivasyk/temp/
├── amanda
│ ├── holding
│ └── state
│ ├── curinfo
│ ├── index
│ └── log
├── backup
│ └── vtapes
│ ├── slot1
│ ├── slot2
│ └── slot3
└── data
├── bzip2.txt
├── gzip.txt
└── tar.txt
```
черга конфігурації; на хочу використовувати наявним `MyConfig` — створю собі копію `tivasyk.test`:
```
> su root
> su amandabackup
> mkdir /etc/amanda/tivasyk.test
> cp /etc/amanda/MyConfig/{amanda.conf,disklist} /etc/amanda/tivasyk.test
> tree /etc/amanda/
/etc/amanda/
├── example -> /usr/share/amanda/example/
├── MyConfig
│ ├── amanda.conf
│ ├── curinfo
│ ├── disklist
│ └── index
├── template.d -> /usr/share/amanda/template.d/
└── tivasyk.test
├── amanda.conf
└── disklist
```
зараз уважний читач запитає, навіщо була ось ця дивна конструкція:
```
> su root
> su amandabackup
```
все просто: користувач amandabackup не призначений для того, щоби ним логінилися в консоль, тому він не має пароля (див. `:!:` в `/etc/shadow`):
```
> sudo grep amandabackup /etc/passwd
mandabackup:x:112:112:Amanda Backup Daemon:/var/lib/amanda:/bin/bash
> sudo grep amandabackup /etc/shadow
amandabackup:!:19716:0:99999:7:::
```
тому, якщо треба запустити одну команду як amandabackup, достатньо `sudo -u amandabackup <команда>`, але щоби відкрити консоль як amandabackup, можна спершу стати root'ом, якому не потрібен дозвіл чи пароль іншого користувача, щоби переключитися на його профіль. отже, лізу руцями до конфігурації:
```
> vim /etc/amanda/tivasyk.test/amanda.conf
# ----- >8 -----
org "tivasyk.lan"
infofile "/home/tivasyk/temp/amanda/state/curinfo"
logdir "/home/tivasyk/temp/amanda/state/log"
indexdir "/home/tivasyk/temp/amanda/state/index"
dumpuser "amandabackup"
tpchanger "chg-disk:/home/tivasyk/temp/backup/vtapes"
labelstr "MyData[0-9][0-9]"
autolabel "MyData%%" EMPTY VOLUME_ERROR
tapecycle 3
dumpcycle 1 days
amrecover_changer "changer"
tapetype "TEST-TAPE"
define tapetype TEST-TAPE {
length 100 mbytes
filemark 4 kbytes
}
define dumptype simple-gnutar-local {
auth "local"
compress none
program "GNUTAR"
}
holdingdisk test {
comment "for local test only"
directory "/home/tivasyk/temp/amanda/holding"
use 100 mbytes
chunksize 1 mbyte
}
# ----- 8< -----
```
окремо, в `/etc/amanda/tivasyk.test/disklist` формується перелік дисків, розділів чи тек для резервного архівування:
```
> vim /etc/amanda/tivasyk.test/disklist
# ----- >8 -----
localhost /home/tivasyk/temp/data simple-gnutar-local
# ----- 8< -----
```
можна спробувати перевірити конфігурацію на помилки:
```
> amcheck tivasyk.test
ERROR: must be executed as the 'amandabackup' user instead of the 'root' user
Change user to 'amandabackup' or change dumpuser to 'root' in amanda.conf
```
зрозуміло: amanda вимагає запуску від користувача, вказаного як `umpuser "amandabackup"` в `amanda.conf`. друга спроба:
```
> sudo -u amandabackup amcheck tivasyk.test
ERROR: tapelist dir '/etc/amanda/tivasyk.test': not writable: Permission denied
check permissions
ERROR: holding disk '/home/tivasyk/temp/amanda/holding': not writable: Permission denied
check permissions
ERROR: log dir '/home/tivasyk/temp/amanda/state/log' (Permission denied): not writable
```
очікувано: я не налаштовував права доступу до тестових тек `~/temp/amanda` та `~/temp/backup`; права доступу треба буде продумати, але для випроби буде достатньо такого:
```
> sudo chown -R tivasyk:amandabackup /home/tivasyk/temp/{amanda,backup}
> sudo chmod -R ug+w /home/tivasyk/temp/{amanda,backup}
```
третя спроба:
```
> sudo -u amandabackup tivasyk.test
Amanda Tape Server Host Check
-----------------------------
NOTE: tapelist file does not exists
it will be created on the next run
NOTE: Holding disk '/home/tivasyk/temp/amanda/holding': 34856960 KB disk space available, using 102400 KB as requested
slot 1: contains an empty volume
Will write label 'MyData01' to new volume in slot 1.
NOTE: skipping tape-writable test
NOTE: host info dir '/home/tivasyk/temp/amanda/state/curinfo/localhost' does not exist
It will be created on the next run
NOTE: index dir '/home/tivasyk/temp/amanda/state/index/localhost' does not exist
it will be created on the next run
Server check took 0.177 seconds
Amanda Backup Client Hosts Check
--------------------------------
Client check: 1 host checked in 2.135 seconds. 0 problems found.
(brought to you by Amanda 3.5.2)
```
#### резервне архівування
чи є якісь зміни/доповнення в теках `~/temp/`? в теці `~/temp/backup/vtapes/` з'явилося посилання (soft link) `data -> slot1` — ймовірно, позначає поточну «плівку», яка (див. конфігурацію) має розмір 100 мб? час експерименту методом «народного тику»:
```
> sudo -u amandabackup amdump tivasyk.test
> sudo -u amandabackup tree ~/temp/
/home/tivasyk/temp/
├── amanda
│ ├── holding
│ └── state
│ ├── curinfo
│ │ └── localhost
│ │ └── _home_tivasyk_temp_data
│ │ └── info
│ ├── index
│ │ ├── localhost
│ │ │ └── _home_tivasyk_temp_data
│ │ │ ├── 20231225133659_0.header
│ │ │ └── 20231225133659_0-unsorted.gz
│ │ └── lock
│ └── log
│ ├── amdump.1 -> amdump.20231225133659
│ ├── amdump.20231225133659
│ ├── log -> log.20231225133659.0
│ ├── log.20231225133659.0
│ └── oldlog
├── backup
│ └── vtapes
│ ├── data -> slot1
│ ├── slot1
│ │ ├── 00000.MyData01
│ │ └── 00001.localhost._home_tivasyk_temp_data.0
│ ├── slot2
│ ├── slot3
│ └── state
└── data
├── bzip2.txt
├── gzip.txt
└── tar.txt
```
щось відбулося. якийсь звіт про попередній прогін архівування можна переглянути за допомогою `amreport tivasyk.test`, журнал в читабельному (але не syslog) форматі лежить в `…/amanda/state/log/log`. судячи з розміру (122 кбайт), власне архів лежить ось тут:
```
> sudo -u amandabackup ls -lh /home/tivasyk/temp/backup/vtapes/data/
-rw------- 1 amandabackup amandabackup 32K гру 25 13:37 00000.MyData01
-rw------- 1 amandabackup amandabackup 122K гру 25 13:37 00001.localhost._home_tivasyk_temp_data.0
> sudo -u amandabackup file /home/tivasyk/temp/backup/vtapes/data/00001.localhost._home_tivasyk_temp_data.0
/home/tivasyk/temp/backup/vtapes/data/00001.localhost._home_tivasyk_temp_data.0: AMANDA
```
задля есперименту додам ще один файл до `data/` і прожену архівування ще раз:
```
> man zip > /home/tivasyk/temp/data/zip.txt
> tree --du -h /home/tivasyk/temp/data/
[165K] /home/tivasyk/temp/data
├── [ 17K] bzip2.txt
├── [ 17K] gzip.txt
├── [ 42K] tar.txt
└── [ 86K] zip.txt
> sudo -u amandabackup amdump tivasyk.test
```
що в теці `…/bakup`? посилання `…backup/vtapes/data` тепер вказує на `slot2`, найсвіжіший архів; розміри архівів ідентичні (підозріло, але може бути особливістю роботи віртуальних «плівок»).
```
[329K] /home/tivasyk/temp/backup/
└── [325K] vtapes
├── [ 5] data -> slot2
├── [158K] slot1
│ ├── [ 32K] 00000.MyData01
│ └── [122K] 00001.localhost._home_tivasyk_temp_data.0
├── [158K] slot2
│ ├── [ 32K] 00000.MyData02
│ └── [122K] 00001.localhost._home_tivasyk_temp_data.1
├── [4.0K] slot3
└── [1.1K] state
```
є ще один вільний слот, не дам добру пропасти. цього разу додам до `…/data/` щось масивніше — наприклад, pdf підказки «linux complete backup and recovery howto» від tldp.org (509 кб), і прожену архівування знову:
```
> wget https://tldp.org/HOWTO/pdf/Linux-Complete-Backup-and-Recovery-HOWTO.pdf -P /home/tivasyk/temp/data/ --
> tree --du -h /home/tivasyk/temp/data/
[674K] data/
├── [ 17K] bzip2.txt
├── [ 17K] gzip.txt
├── [509K] Linux-Complete-Backup-and-Recovery-HOWTO.pdf
├── [ 42K] tar.txt
└── [ 86K] zip.txt
> sudo -u amandabackup amdump tivasyk.test
...
> sudo -u amandabackup tree --du -h /home/tivasyk/temp/backup/
[993K] /home/tivasyk/temp/backup
└── [989K] vtapes
├── [ 5] data -> slot3
├── [158K] slot1
│ ├── [ 32K] 00000.MyData01
│ └── [122K] 00001.localhost._home_tivasyk_temp_data.0
├── [158K] slot2
│ ├── [ 32K] 00000.MyData02
│ └── [122K] 00001.localhost._home_tivasyk_temp_data.1
├── [668K] slot3
│ ├── [ 32K] 00000.MyData03
│ └── [632K] 00001.localhost._home_tivasyk_temp_data.1
└── [1.1K] state
```
#### відновлення з архіву
цікаво, чому нумерування архівів поводиться так дивно: 0 -> 1 -> 1? відповідь, мабуть, є у звіті `amreport`, але для цього буде час пізніше. зараз цікаво, як відновлювати дані з архівів; імітую втрату даних:
```
> mkdir -p /home/tivasyk/temp/data.lost
> mv /home/tivasyk/temp/data/* /home/tivasyk/temp/data.lost/
> tree /home/tivasyk/temp/data*
/home/tivasyk/temp/data
/home/tivasyk/temp/data.lost
├── bzip2.txt
├── gzip.txt
├── Linux-Complete-Backup-and-Recovery-HOWTO.pdf
├── tar.txt
└── zip.txt
```
для відновлення за допомогою `amrcover` треба створити/виправити файл конфігурації `/etc/amanda/amanda-client.conf` ([підказка](https://docs.zmanda.com/v/amanda-community/getting-started-with-amanda/recovering-files)):
```
> sudo -u amandabackup vim /etc/amanda/amanda-client.conf
# ----- >8 -----
index_server "localhost"
tapedev "changer"
auth "local"
# ----- 8< -----
```
пробую:
```
> sudo -u amandabackup amrecover tivasyk.test
amrecover: must be executed as the "root" user instead of the "amandabackup" user
```
а маєш. але логічно. друга спроба:
```
> sudo amrecover tivasyk.test
MRECOVER Version 3.5.2. Contacting server on localhost ...
220 katana AMANDA index server (3.5.2) ready.
Setting restore date to today (2023-12-25)
200 Working date set to 2023-12-25.
200 Config set to tivasyk.test.
501 Host katana is not in your disklist.
Trying host katana ...
501 Host katana is not in your disklist.
Trying host katana ...
501 Host katana is not in your disklist.
Use the sethost command to choose a host to recover
```
нас попереджали в підказці; але принаймні я в інтерактивній консолі `amrecover`, і є підказка, як діяти (але треба згодом поміняти `amanda.conf`).
```
amrecover> sethost localhost
200 Dump host set to localhost.
amrecover> help
...
amrecover> listdisk
200- List of disk for host localhost
201- /home/tivasyk/temp/data
200 List of disk for host localhost
amrecover> setdisk /home/tivasyk/temp/data
200 Disk set to /home/tivasyk/temp/data.
amrecover> ls
2023-12-25-15-27-53 zip.txt
2023-12-25-15-27-53 Linux-Complete-Backup-and-Recovery-HOWTO.pdf
2023-12-25-15-27-53 .
2023-12-25-13-36-59 tar.txt
2023-12-25-13-36-59 gzip.txt
2023-12-25-13-36-59 bzip2.txt
amrecover> add *
Added file /zip.txt
Added file /Linux-Complete-Backup-and-Recovery-HOWTO.pdf
Added file /tar.txt
Added file /gzip.txt
Added file /bzip2.txt
amrecover extract
Extracting files using tape drive changer on host katana.
The following tapes are needed: MyData01
MyData03
Extracting files using tape drive changer on host katana.
Load tape MyData01 now
Continue [?/Y/n/s/d]?] y
Restoring files into directory /home/tivasyk/temp/data
All existing files in /home/tivasyk/temp/data can be deleted
Continue [?/Y/n]? y
./bzip2.txt
./gzip.txt
./tar.txt
90 kb
Extracting files using tape drive changer on host katana.
Load tape MyData03 now
Continue [?/Y/n/s/d]? y
./Linux-Complete-Backup-and-Recovery-HOWTO.pdf
./zip.txt
600 kb
amrecover> quit
200 Good bye.
```
що відбулось? знадобилося:
* встановити ім'я хоста, як воно вказане в `/etc/amanda/tivasyk.test/amanda.conf` (`sethost`);
* вибрати джерело архівування, як воно вказане в `/etc/amanda/tivasyk.test/disklist` (`setdisk`);
* вибрати теки/файли для відновлення — в моєму випадку всі (`add *`);
* почати відновлення, і підтвердити:
* завантаження віртуальної «плівки» mydata01;
* перезапис файлів на диску;
* завантаження віртуальної «плівки» mydata02.
перевірка списку файлів, відмінностей між відновленим і «втраченою» копією (`data.lost`), часу створення й прав доступу:
```
> tree --du -h /home/tivasyk/temp/data/
[674K] /home/tivasyk/temp/data/
├── [ 17K] bzip2.txt
├── [ 17K] gzip.txt
├── [509K] Linux-Complete-Backup-and-Recovery-HOWTO.pdf
├── [ 42K] tar.txt
└── [ 86K] zip.txt
> diff -qrN /home/tivasyk/temp/data /home/tivasyk/temp/data.lost && echo "ok"
ok
> ls -l /home/tivasyk/temp/data/
-rw-r--r-- 1 tivasyk tivasyk 18K гру 24 17:03 bzip2.txt
-rw-r--r-- 1 tivasyk tivasyk 18K гру 24 16:48 gzip.txt
-rw-r--r-- 1 tivasyk tivasyk 510K гру 14 2008 Linux-Complete-Backup-and-Recovery-HOWTO.pdf
-rw-r--r-- 1 tivasyk tivasyk 42K гру 24 16:48 tar.txt
-rw-r--r-- 1 tivasyk tivasyk 86K гру 25 15:06 zip.txt
```
все на місці!
[(до змісту)](#зміст)
#### відновлення без конфігурації
все це чудово, але аманда має родзинку, яка й змусила мене зацікавитися цим додатком, на відміну від restic та borg: «прозорі» архіви, які можна використати для відновлення даних, навіть втрачено конфігурацію, всі файли стану (`curinfo/`, `index/`, `log/`), і навіть немає під рукою самої `amanda`. увага, смертельний номер: видалю знову теку даних, «випадково видалю» конфігурацію і стан amanda, і проведу ще один дослід:
```
> rm -rf /home/tivasyk/temp/data/*
> sudo mv /home/tivasyk/temp/amanda /home/tivasyk/temp/amanda.lost
> sudo mv /etc/amanda/tivasyk.test /etc/amanda/tivasyk.test.lost
```
задля інтересу спробую ще раз `amrecover`:
```
> sudo amrecover tivasyk.test
AMRECOVER Version 3.5.2. Contacting server on localhost ...
220 katana AMANDA index server (3.5.2) ready.
Setting restore date to today (2023-12-25)
200 Working date set to 2023-12-25.
501 Could not read config file for tivasyk.test!
```
катастрофа, все зламалось; але я ще маю доступ до самих файлів з архівами; що можна з них витягти? лінк `data` вказує на свіжу «плівку»; amanda починає кожну «плівку» блоком 32 кб зі службовою інформацією і підказкою для системного адміністратора в читабельному текстовому вигляді:
```
> sudo dd if=/home/tivasyk/temp/backup/vtapes/data/00001.localhost._home_tivasyk_temp_data.1 bs=32k count=1
AMANDA: SPLIT_FILE 20231225152753 localhost /home/tivasyk/temp/data part 1/-1 lev 1 comp N program /usr/bin/tar
ORIGSIZE=600
NATIVE-CRC=9b5ae647:614400
CLIENT-CRC=9b5ae647:614400
SERVER-CRC=9b5ae647:614400
DLE=<<ENDDLE
<dle>
<program>GNUTAR</program>
<disk>/home/tivasyk/temp/data</disk>
<level>1</level>
<auth>local</auth>
<record>YES</record>
<index>YES</index>
<datapath>AMANDA</datapath>
</dle>
ENDDLE
To restore, position tape at start of file and run:
dd if=<tape> bs=32k skip=1 | /usr/bin/tar -xpGf - ...
```
це складніша операція, ніж штатне відновлення, тож варто використати тимчасову теку:
```
> tree /home/tivasyk/temp/backup/
/home/tivasyk/temp/backup/
└── vtapes
├── data -> slot3
├── slot1
│ ├── 00000.MyData01
│ └── 00001.localhost._home_tivasyk_temp_data.0
├── slot2
│ ├── 00000.MyData02
│ └── 00001.localhost._home_tivasyk_temp_data.1
├── slot3
│ ├── 00000.MyData03
│ └── 00001.localhost._home_tivasyk_temp_data.1
└── state
> mkdir -p /home/tivasyk/temp/restore
> cd /home/tivasyk/temp/restore
> sudo dd if=/home/tivasyk/temp/backup/vtapes/data/00001.localhost._home_tivasyk_temp_data.1 bs=32k skip=1 | tar -tvf -
drwxr-xr-x tivasyk/tivasyk 86 2023-12-25 15:25 ./
-rw-r--r-- tivasyk/tivasyk 521383 2008-12-14 11:52 ./Linux-Complete-Backup-and-Recovery-HOWTO.pdf
-rw-r--r-- tivasyk/tivasyk 87580 2023-12-25 15:06 ./zip.txt
```
`tar -tvf` показує вміст архіву. решта файлів, очевидно, повинні бути в попердній «плівці». видобування потребуватиме уваги, бо amanda автоматично планує повні і інкрементні архіви, і далеко не завжди останній архів міститиме все, що треба; `amrecover` приховує ці складнощі, та якщо працювати безпосередньо з архівами — доведеться знайти потрібний повний архів і видобути решту по порядку, — але принаймні це можливо.
[(до змісту)](#зміст)
#### стиснення
стиснення можна відносно легко налаштувати в файлі конфігурації. новий експеримент: спробую архівувати теку `~/Ігри` (5,5 гб) зі стисненням. не забути відновити «втрачену» конфігурацію і теки стану:
```
> sudo mv /etc/amanda/tivasyk.test.lost /etc/amanda/tivasyk.test
> sudo mv /home/tivasyk/temp/amanda.lost /home/tivasyk/amanda
```
мені знадобиться значно [більше «плівок», і більшого розміру](https://wiki.zmanda.com/index.php/How_To:Set_Up_Virtual_Tapes):
```
> sudo -u amandabackup vim /etc/amanda/tivasyk.test/amanda.conf
# ----- >8 -----
define tapetype TEST-TAPE {
length 1024 mbytes
}
# ----- 8< -----
```
для стиснення на стороні клієнта (гратиме роль для віддаленого архівування) додаю ще одну секцію *dumptype*:
```
# ----- >8 -----
define dumptype compressed-gnutar-local {
auth "local"
compress client best
program "GNUTAR"
}
# ----- 8< -----
```
«розумніше» налаштування чейнжера: кількість «плівок» (10) і автоматичне створення тек для них:
```
# ----- >8 -----
define changer "archive" {
tpchanger "chg-disk:/home/tivasyk/temp/backup/vtapes"
property "num-slot" "10"
property "auto-create-slot" "yes"
}
# ----- 8< -----
```
основна частина конфігурації `amanda.conf` ([документація](https://wiki.zmanda.com/man/3.5/amanda.conf.5.html), особливо зважити на `tapecycle`, `dumpcycle`):
```
tpchanger "archive"
tapetype "TEST-TAPE"
labelstr "Games-[0-9][0-9]"
autolabel "Games-%%" EMPTY VOLUME_ERROR
tapecycle 8
dumpcycle 7 days
amrecover_changer "archive"
```
в `disklist` додаю теку для стиснення:
```
> sudo vim /etc/amanda/tivasyk.test/disklist
# ----- >8 -----
localhost /home/tivasyk/temp/data simple-gnutar-local
localhost /home/tivasyk/Ігри compressed-gnutar-local
# ----- 8< -----
```
перевірка конфігурації:
```
> sudo -u amandabackup amcheck tivasyk.test
Amanda Tape Server Host Check
-----------------------------
NOTE: Holding disk '/home/tivasyk/temp/amanda/holding': 34680832 KB disk space available, using 102400 KB as requested
slot 4: contains an empty volume
Will write label 'Games-01' to new volume in slot 4.
NOTE: skipping tape-writable test
NOTE: info dir '/home/tivasyk/temp/amanda/state/curinfo/localhost/_home_tivasyk_Ігри' does not exist
it will be created on the next run
NOTE: index dir '/home/tivasyk/temp/amanda/state/index/localhost/_home_tivasyk_Ігри' does not exist
it will be created on the next run
Server check took 0.180 seconds
Amanda Backup Client Hosts Check
--------------------------------
Client check: 1 host checked in 2.150 seconds. 0 problems found.
(brought to you by Amanda 3.5.2)
```
цікаво зауважити на майбутнє, що така зміна конфігурації «на льоту», між двома прогонами, не бентежить аманду. час запускати архівування — з рівнем стиснення `best` це може зайняти чимало часу навіть для 5 гб (а мені треба архівувати під 500 гб на owncloud'і…):
```
> sudo -u amandabackup amdump tivasyk.test ; echo $?
4
```
овва, впіймав помилку: 4 (*a dle failed*, [документація](https://wiki.zmanda.com/man/3.5.1/amdump.8.html)); що трапилось? дивлюся журнали в `/home/tivasyk/temp/amanda/state/log/…` і в `amdump.1` бачу таке:
```
planner: FAILED localhost "/home/tivasyk/Ігри" 20231226172806 0 ["dump estimate ( 2831940 KB ) is larger than available tape space ( 1048576 KB ), but cannot incremental dump new disk"]
```
amanda каже, що доступний для архівування простір — 1 гб (available tape space), а оцінка необхідного простору — 3 гб. але 1 гб — це розмір *однієї* «плівки»… я ж очікував, що програма, заповнивши одну, автоматично писатиме на наступну? здається, час знову читати [документацію](https://wiki.zmanda.com/index.php/Dump_larger_than_available_tape_space)… і відповідь: [tape spanning](https://wiki.zmanda.com/index.php/How_To:Split_Dumps_Across_Tapes), але для віртуальних «плівок» ця функція має бути включена по замовчуванню; чому ж не працює? халепа, тут навіть я мушу визнати, що конфігурація вельми заплутана… в підсумку опція `runtapes` (вказує кількість плівок, які amanda може заповнити за прогін, довільно вибрав 5) допомогла:
```
# ----- >8 -----
...
amrecover_changer "archive"
runtapes 5
# ----- 8< -----
```
тепер наче працює:
```
> sudo -u amandabackup amdump tivasyk.test || echo "error"
> sudo -u amandabackup amreport tivasyk.test
```
зі звіту `amreport` ([підказка з читання](https://wiki.zmanda.com/man/3.3/amreport.8.html)) видно, що:
* архів зайняв 4,4 гб на п'яти «плівках»;
* час прогону — 9 хв;
* середній розмір після стиснення — 80%.
[(до змісту)](#зміст)
#### шифрування
amanda пропонує три варіанти шифрування; найнадійнішим видається асиметричне openssl ([документація](https://wiki.zmanda.com/man/3.5.1/amcrypt-ossl-asym.8.html)); його головний недолік, нмсд, випливає з його ж головної переваги: приватний ключ треба якось зберігати так, щоби ніхто не отримав до нього доступу, але водночас він має бути під рукою, коли знадобиться відновити щось із архівів. якщо це комусь здається простим — рано чи пізно на вас чекатиме сюрприз…
але менше з тим, генеруємо ключі openssl для шифрування; для випроби я все роблю на локальній машині — але в реальному житті **ніколи** так не варто робити! всі ключі шифрування (vpn тощо) бажано генерувати на окремій машині (не тій, де використовуватиметься публічний ключ!), доступ до котрої обмежений (наприклад, вона завжди вимкнена):
```
# ключ rsa1024 без пароля!
> sudo -u amandabackup openssl genrsa -out ~amandabackup/backup-privkey.pem 2048
> sudo -u amandabackup openssl rsa -in ~amandabackup/backup-privkey.pem -pubout -out ~amandabackup/backup-pubkey.pem
> sudo -u amandabackup ls -l ~amandabackup/
...
-rw------- 1 amandabackup amandabackup 1704 гру 26 20:05 backup-privkey.pem
-rw-r--r-- 1 amandabackup amandabackup 451 гру 26 20:06 backup-pubkey.pem
...
```
тут `~amandabackup` вказує на домашню теку користувача *amandabackup*; за замовчуванням це `/var/lib/amanda/`. конфігурація шифрування в `amanda.conf`:
```
> sudo vim /etc/amanda/tivasyk.test/amanda.conf
# ----- >8 -----
define dumptype compressed-encrypted-gnutar-local {
allow-split true
auth "local"
program "GNUTAR"
compress client fast
encrypt server
server_encrypt "/usr/bin/amcrypt-ossl-asym"
server_decrypt_option "-d"
}
# ----- 8< -----
```
не хочу більше архівувати 5 гб, тому видалю один рядок з `disklist`, і вкажу новий dumptype для тестової теки `data` (заодно випробую, чи можна просто тут замінити `localhost` на назву машини, `/etc/hosts` має бути в порядку):
```
> sudo vim /etc/amanda/tivasyk.test/disklist
# ----- >8 -----
katana /home/tivasyk/temp/data compressed-encrypted-gnutar-local
# ----- 8< -----
```
перевірка конфігурації, прогін архівування, перегляд звіту:
```
> sudo -u amandabackup amcheck tivasyk.test
> sudo -u amandabackup amdump tivasyk.test
> sudo -u amandabackup amreport tivasyk.test
```
архів скинуто на «плівку» Games-06 (на теку вказує посилання `backup/vtapes/data`):
```
> sudo dd if=/home/tivasyk/temp/backup/vtapes/data/00001.katana._home_tivasyk_temp_data.0 bs=32k count=1
...
To restore, position tape at start of file and run:
dd if=<tape> bs=32k skip=1 | /usr/bin/amcrypt-ossl-asym -d | /usr/bin/gzip -dc | /usr/bin/tar -xpGf - ...
```
спробуємо (конструкція з `sh -c` дозволяє запускати ввесь ланцюжок від root'а):
```
> sudo sh -c 'dd if=/home/tivasyk/temp/backup/vtapes/data//00001.katana._home_tivasyk_temp_data.0 bs=32k skip=1 | /usr/bin/amcrypt-ossl-asym -d | /usr/bin/gzip -dc | /usr/bin/tar -tvf -'
...
drwxr-xr-x tivasyk/tivasyk 86 2023-12-25 15:59 ./
-rw-r--r-- tivasyk/tivasyk 521383 2008-12-14 11:52 ./Linux-Complete-Backup-and-Recovery-HOWTO.pdf
15+1 записів прочитано
15+1 записів записано
скопійовано 515896 байтів (516 kB, 504 KiB), 0,0319564 s, 16,1 MB/s
-rw-r--r-- tivasyk/tivasyk 17474 2023-12-24 17:03 ./bzip2.txt
-rw-r--r-- tivasyk/tivasyk 17473 2023-12-24 16:48 ./gzip.txt
-rw-r--r-- tivasyk/tivasyk 42645 2023-12-24 16:48 ./tar.txt
-rw-r--r-- tivasyk/tivasyk 87580 2023-12-25 15:06 ./zip.txt
gzip: stdin: decompression OK, trailing garbage ignored
```
чудово, все розшифрувалося, видно перелік файлів у архіві.
[(до змісту)](#зміст)
#### віддалене архівування
останній есперимент із amanda — архівування даних на сервер з віддалених машин в локальний мережі; для цього amanda використовує ssh (з ключами ssh для amandabackup). для тесту сервером буде лептоп (katana.lan), а клієнтом — файловий сервер на [hp microserver]({% post_url 2021/2021-08-03-microserver-toy %}) (micro.lan), хоча згодом саме micro буде сервером бекапів (багато дешевого місця) і staging'ом для вивантаження шифрованих архівів offsite.
найперше — встановити amanda на клієнті (micro.lan, debian 10 (buster), адреси ip приховую):
```
> grep micro.lan /etc/hosts
192.168.x.x micro micro.lan
> ssh tivasyk@micro.lan
...
micro.lan> sudo apt update && sudo apt upgrade
micro.lan> apt search amanda
...
amanda-client/oldoldstable 1:3.5.1-2+deb10u2 amd64
Advanced Maryland Automatic Network Disk Archiver (Client)
amanda-common/oldoldstable 1:3.5.1-2+deb10u2 amd64
Advanced Maryland Automatic Network Disk Archiver (Libs)
amanda-server/oldoldstable 1:3.5.1-2+deb10u2 amd64
Advanced Maryland Automatic Network Disk Archiver (Server)
```
зараз для тесту мені потрібен лише клієнтський додаток:
```
micro.lan> sudo apt install amanda-client
```
документація на офсайті… вельми стара, плутана, і не завжди відповідає сучасній дісності. зокрема, налаштування демона (amandad) на стороні клієнта в документації… покладається на зміни в xinetd, а комунікація з сервером використовує bsdtcp — це минуле століття, сьогодні цього не треба (а якщо чомусь треба — [див. підказку](https://www.oops.co.at/en/amanda-backup-use-systemd-units/) з налаштування сервісу systemd замість редагування xinetd); для комунікації по ssh це, здається, не потрібно, але налаштування amanda-server ([документація](https://salsa.debian.org/debian/amanda/-/blob/master/debian/amanda-server.README.Debian)) та amanda-client ([документація](https://salsa.debian.org/debian/amanda/-/blob/master/debian/amanda-client.README.Debian)) на debian має свої особливості: використано службовий профіль *backup* (а не *amandabackup*) з домашньою текою `/var/backups/` (а не `/var/lib/amandabackup/`):
```
micro.lan> sudo grep backup /etc/passwd
backup:x:34:34:backup:/var/backups:/usr/sbin/nologin
```
встановлюю bash як оболонку, а також тимчасово активую/змінюю пароль профілю backup:
```
micro.lan> sudo chsh -s /usr/bin/bash backup
micro.lan> sudo passwd backup
```
на жаль, вибір `/var/backups/` як домашньої теки для сервісного профілю і місця зберігання копій важливих файлів у debian — вельми немудре, але доведеться давати собі раду, бо туди треба буде закинути ключ ssh з сервера:
```
micro.lan> sudo mkdir /var/backups/.ssh
micro.lan> sudo chown backup:root /var/backups/.ssh
```
створюю ключ ssh для amanda на сервері (katana.lan), і перекидую на micro.lan:
```
> sudo -u amandabackup ssh-keygen -t rsa -C "SSH key for Amanda backup of clients"
> sudo -u amandabackup ls -la ~amandabackup/.ssh/
-rw------- 1 amandabackup amandabackup 2635 гру 27 10:37 id_rsa
-rw-r--r-- 1 amandabackup amandabackup 596 гру 27 10:37 id_rsa.pub
> sudo -u amandabackup ssh-copy-id -i ~amandabackup/.ssh/id_rsa backup@micro.lan
```
перевірка: чи можна з профілю *amanda* залогінитися як backup на micro.lan?
```
> sudo -u amandabackup ssh backup@micro.lan 'hostname; id'
micro
uid=34(backup) gid=34(backup) groups=34(backup),6(disk),26(tape)
```
що працює. тепер можна (опційно) видалити пароль для профілю *backup* — логін через ssh працюватиме. черга конфігурації amanda на «сервері» (katana), додаю новий dumptype, ключові опції — `auth`, `ssh-keys` (файл ключа ssh), `client-username` (профіль на стороні клієнта):
```
> sudo vim /etc/amanda/tivasyk.test/amanda.conf
# ----- >8 -----
define dumptype compressed-encrypted-gnutar-ssh {
auth "ssh"
ssh-keys "/var/lib/amanda/.ssh/id_rsa"
client-username "backup"
program "GNUTAR"
compress client fast
encrypt server
server_encrypt "/usr/bin/amcrypt-ossl-asym"
server_decrypt_option "-d"
}
# ----- 8< -----
```
додаю рядок до `tivasyk.test/disklist` — спробую архівувати `/etc` на клієнті:
```
> sudo vim /etc/amanda/tivasyk.test/disklist
# ----- >8 -----
micro.lan /etc compressed-encrypted-gnutar-ssh
# ----- 8< -----
```
перевірка конфігурації для клієнта:
```
> sudo -u amandabackup amcheck tivasyk.test -c micro.lan
Amanda Backup Client Hosts Check
--------------------------------
HOST micro.lan ERROR: security file '/etc/amanda-security.conf' do not allow to run '/usr/bin/tar' as root for 'runtar:gnutar_path'
Client check: 1 host checked in 2.391 seconds. 1 problem found.
(brought to you by Amanda 3.5.2)
```
люблю зрозумілі повідомлення про помилки. перевірка на micro.lan:
```
micro.lan> sudo less /etc/amanda-security.conf
# Uncomment and edit the following lines to let Amanda to #
# use customized system commands. If multiple PATH is #
# necessary, please put them in different lines. #
...
#runtar:gnutar_path=/bin/tar
```
гаразд, треба розкоментувати один рядок. зроблено, друга спроба теж не вдалась — поремонтувалося, коли замінив `/bin/tar` на `/usr/bin/tar` (попри те, що лінк `/bin/tar` присутній; дивно):
```
> sudo -u amandabackup amcheck tivasyk.test -c micro.lan
Amanda Backup Client Hosts Check
--------------------------------
Client check: 1 host checked in 2.308 seconds. 0 problems found.
(brought to you by Amanda 3.5.2)
```
спроба архівування:
```
> sudo -u amandabackup amdump tivasyk.test; echo "$?"
2
```
код завершення 2: «a dle give strange message». наскільки я зрозумів, трохи поколупавши журнали, це спричинено попередженням від openssl про те, що openssl-rsautl застарів і треба використовувати pkeyutl, але amanda про це не знає. треба шукати, як це виправити (бо ненульовий код виходу завадить мені моніторити бекапи через healthchecks.io), але попри це — amanda запакувала:
```
> sudo tree /home/tivasyk/temp/backup/vtapes/data/
/home/tivasyk/temp/backup/vtapes/data/
├── 00000.Games-07
├── 00001.katana._home_tivasyk_temp_data.1
└── 00002.micro.lan._etc.0
> sudo sh -c 'dd if=/home/tivasyk/temp/backup/vtapes/data/00002.micro.lan._etc.0 bs=32k skip=1 | /usr/bin/amcrypt-ossl-asym -d | /usr/bin/gzip -dc | /usr/bin/tar -tvf -'
...
-rw-r--r-- root/root 212 2019-11-02 14:16 ./terminfo/README
...
-rw-r--r-- root/root 2389 2019-06-15 12:41 ./vim/vimrc
-rw-r--r-- root/root 662 2019-06-15 12:41 ./vim/vimrc.tiny
...
```
на цьому поки що досить розваг із амандою; попередній висновок: інструмент сподобався відносною (як на мій адмінський розум) простотою і надійністю, але є нюанси, які треба вивчати й враховувати.
[(до змісту)](#зміст)
### інші опції
ось декілька інших програм, які я побачив, але з різних причин не пробував (найчастіше — «непрозоре» сховище бекапів); можливо, випробую колись за іншим разом:
* [restic](https://github.com/restic/restic) ([документація](https://restic.readthedocs.io/en/latest/manual_rest.html)) — цікавий інструмент, простий у використанні, але ховає «під капотом» багато складнощів: підтримує різні сховища — від локального зберігання до хмар amazon, microsoft і google, має обов'язкове інтегроване шифрування. але не має стиснення (хоча в новіших версіях, здається, [додали zstd?](https://github.com/restic/restic/issues/3821)), і має «непрозоре» сховище — бекапи доступні лише через інтерфейс (cli) restic, це (не) трохи напружує.
* [borgbackup](https://www.borgbackup.org/) ([документація](https://borgbackup.readthedocs.io/en/stable/)) — ще один дуже цікавий варіант, подібний до restic; підтримує дедуплікацію на рівні блоків (менші розміри ), стиснення; шифрування, здається, необов'язкове; зручний розвинений інтерфейс cli; з недоліків: блокова дедуплікація потребує встановленого клієнта на обох кінцях, складність «під капотом», «непрозоре» сховище бекапів (доступ до змісту й файлів лише через інтерфейс `borg`).
[(до змісту)](#зміст)
далі буде…tivasykперш як продовжувать міграцію контейнерів на сервер v2, треба врешті-решт вирішити задачу збереження резервної копії сховища owncloud, — за чотири роки «тестового» використання там накопичилося чимало справді важливих документів; як не соромно визнавати, але досі всі ці дані лежать на одному hdd без резервування (щоправда, це не зовсім так: owncloud тримає синхронізовану копію найважливішої частини даних на моєму лептопі). треба терміново знайти open source варіант, котрий був би достатньо простий (бо простота — передумова надійності), безкоштовний і використовував би вже наявні ресурси, дозволяв би просте масштабування на декілька машин (nextcloud на сервері v2 також треба буде бекапити) і, в перспективі, на віддалене зберігання (холодне сховище amazon, чи обмін вільним місцем з товаришем тощо).невелике налаштування оформлення блогу на базі jekyll2023-12-23T13:01:00-05:002023-12-23T13:01:00-05:00https://blog.tivasyk.info/blog/2023/12/23/jekyll-tweaksвостаннє зміни до оформлення щоденника я робив, здається, два з половиною роки тому, [коли «прикручував» пошук]({% post_url 2021/2021-04-03-blog-search %}), тож зовсім забув, де що і як це робиться. jekyll наче на позір простий у використанні, — але насправді зовсім ні. колись я таки знайду час і натхнення, клоную собі [barf](https://git.sr.ht/~bt/barf) і перероблю для… максимального мінімалізму? але поки що потицяю знову наосліп, пригадаю і занотую на згадку.
що треба/хочеться нашвидкуруч поміняти:
* списки (`ul`) мають бути вирівнені вліво без виключення;
* зменшити розмір шрифту блоків коду до 80-90%;
* змінити посилання на соціальні мережі: прибрати facebook, twitter i github, додати codeberg та pleroma;
* вибрати альтернативний шрифт для щоденника.
## виключення списків
поточна версія щоденника використовує тему [minima-reboot](https://github.com/aterenin/minima-reboot) (дуже стару версію) для jekyll з дуже невеликими змінами; тема виключає весь текст (казати «вирівнює по ширині» [неправильно](https://elibrary.kubg.edu.ua/id/eprint/29248/1/V_SHPAK_SSPTKR_19_IZH.pdf) — але це часто надміру розріджує текст в коротких рядках, дуже негарно; потрібна невеличка зміна в css. стилі css знаходяться в `/_sass/minima-reboot/_layout.scss`; стилю для `ul` немає (чому?), додаю:
```
#content {
...
ul {
text-align: left;
}
...
```
## розмір шрифту блоків коду
додаю один рядок до існуючого стилю `pre`:
```
.highlight pre {
...
font-size: 80%;
}
```
## посилання на соціальні мережі
ці посилання (в підвалі сторінки) не є частиною теми, — їх визначено в налаштуваннях jekyll/сайту, `/_config.yml`:
```
footer_icons:
- username: mastodon.social/@tivasyk
url: https://mastodon.social/@tivasyk
icon: mastodon.svg
- username: facebook.com/tivasyk
url: https://facebook.com/tivasyk
icon: facebook.svg
- username: twitter.com/tivasyk
url: https://twitter.com/tivasyk
icon: twitter.svg
- username: github.com/tivasyk
url: https://github.com/tivasyk
icon: github.svg
```
структура очевидна, треба видалити непотрібні блоки, замість них додати потрібні:
```
footer_icons:
- username: mastodon.social/@tivasyk
url: https://mastodon.social/@tivasyk
icon: mastodon.svg
- username: social.net.ua/users/tivasyk
url: https://social.net.ua/users/tivasyk
icon: pleroma.svg
- username: codeberg.org/tivasyk
url: https://codeberg.org/tivasyk
icon: codeberg.svg
```
залишилось знайти підходящі однотонні логотипи у форматі svg для [pleroma](https://www.svgrepo.com/svg/306577/pleroma) й [codeberg](https://www.svgrepo.com/svg/330179/codeberg), і закинути їх до `/_includes/`. щоправда, є одне «але»: я не пам'ятаю, чи jekyll перегенерує увесь сайт, якщо змінено `_config.yml` — поки що продовжу, а тоді буде видно (або доведеться лізти в журнали контейнера); принаймні, нові сторінки мають підхоплювати ці налаштування.
## альтернативний шрифт
нещодавно випробовував brother majestic 800, і вподобав собі шрифт цієї друкарки; на жаль, не можу нічого схожого знайти з підтримкою кирилиці. поточна версія щоденника використовує інший улюблений шрифт, [ibm plex](https://www.ibm.com/plex/), за посиланням з google fonts — проте я не певен, чи це працює до пуття, бо всі мої веб-оглядачі теж налаштовані використовувати plex локально як основний шрифт… на додачу, добрі люди пропонують не використовувати google fonts, тому що [це неетично](https://stackoverflow.com/a/54142205) і навіть може призвести [до юридичних наслідків](https://insights.project-a.com/the-court-says-dont-use-google-fonts/).
отже, приберу `<link rel=...>` з посиланням на googleapis з файлу `/_includes/head.html` та скористаюсь [підказками й помічником google-webfont-helper](https://gwfh.mranftl.com/fonts/ibm-plex-sans?subsets=cyrillic,latin), щоби роздавати ibm plex зі свого сервера, разом із самим щоденником: файли шрифта (normal, italic, bold та bold-italic у форматі woff2) йдуть до `/assets/fonts/`, а визнечення шрифтів з невеликими змінами — до `/_sass/minima-reboot/_layout.scss`:
```
/* ibm-plex-sans-regular - cyrillic_latin */
@font-face {
font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */
font-family: 'IBM Plex Sans';
font-style: normal;
font-weight: normal;
src: url('../fonts/ibm-plex-sans-v19-cyrillic_latin-regular.woff2') format('woff2'); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */
}
/* ibm-plex-sans-italic - cyrillic_latin */
@font-face {
font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */
font-family: 'IBM Plex Sans';
font-style: italic;
font-weight: normal;
src: url('../fonts/ibm-plex-sans-v19-cyrillic_latin-italic.woff2') format('woff2'); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */
}
/* ibm-plex-sans-600 - cyrillic_latin */
@font-face {
font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */
font-family: 'IBM Plex Sans';
font-style: normal;
font-weight: bold;
src: url('../fonts/ibm-plex-sans-v19-cyrillic_latin-600.woff2') format('woff2'); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */
}
/* ibm-plex-sans-600italic - cyrillic_latin */
@font-face {
font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */
font-family: 'IBM Plex Sans';
font-style: italic;
font-weight: bold;
src: url('../fonts/ibm-plex-sans-v19-cyrillic_latin-600italic.woff2') format('woff2'); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */
}
```
поки що все.tivasykвостаннє зміни до оформлення щоденника я робив, здається, два з половиною роки тому, коли «прикручував» пошук, тож зовсім забув, де що і як це робиться. jekyll наче на позір простий у використанні, — але насправді зовсім ні. колись я таки знайду час і натхнення, клоную собі barf і перероблю для… максимального мінімалізму? але поки що потицяю знову наосліп, пригадаю і занотую на згадку.чому я раніше не користувався sshfs?2023-12-23T07:01:00-05:002023-12-23T07:01:00-05:00https://blog.tivasyk.info/blog/2023/12/23/why-not-sshfsпоки продовжую дописувати [про міграцію контейнерів docker]({% post_url 2023/2023-12-10-docker-migration %}) з одного сервера на інший, частіше сам зазираю до щоденника, і зрозумів (чи то пак пригадав), що давно хотів зробити деякі невеличкі покращення: прибрати виключення по ширині для списків, поміняти основний шрифт, прибрати згадки facebook, twitter та github і додати codeberg тощо. все відносно легко робиться, але треба підключатися до домашнього серверочка… а отже — тимчасово покидати теплі, затишні обійми [зручно налаштованого vim]({% post_url 2022/2022-12-05-vim-cookbook %})… але навіщо, коли є sshfs? звідси — питання, винесене в заголовок.
адже [користуватися sshfs](https://github.com/libfuse/sshfs) — принаймні в локальній мережі, — дуже просто, особливо, якщо вже використовуєш безпарольну автентифікацію з ключиками:
```
# готую точку монтування
mkdir -p ~/mount/server.ssh
# монтую туди домашню теку на віддаленому сервері
sshfs tivasyk@server.lan:/home/tivasyk ~/mount/server.ssh
# перевірка
ls -l ~/mount/server.ssh
```
…і все, можна редагувати, що треба. тож хорошої відповіді на оте «чому?» немає, насправді.tivasykпоки продовжую дописувати про міграцію контейнерів docker з одного сервера на інший, частіше сам зазираю до щоденника, і зрозумів (чи то пак пригадав), що давно хотів зробити деякі невеличкі покращення: прибрати виключення по ширині для списків, поміняти основний шрифт, прибрати згадки facebook, twitter та github і додати codeberg тощо. все відносно легко робиться, але треба підключатися до домашнього серверочка… а отже — тимчасово покидати теплі, затишні обійми зручно налаштованого vim… але навіщо, коли є sshfs? звідси — питання, винесене в заголовок.