Как я веду свой блог

Mihael Savin
5 min readDec 29, 2020

Привет, %username%! Я уже довольно давно веду свой блог в сети интернет. А относительно недавно я пришел к идеальному (для себя) процессу работы со своим блогом и написанию статей.

Исторический экскурс

Я довольно долго жил на Wordpress в качестве CMS, а хостингом у меня был (и остается) хостинг Fozzy и в целом меня все устраивало до определенного момента.

Примерно в 2018 году (точно не помню) вышел Wordpress 5.0 и от этого у многих бомбануло. Wordpress сделал новый странный редактор статей с блоками и это стало последней каплей для меня. А началом раздумий послужило то, что я стал меньше писать как минимум потому, что требовалось слишком много телодвижений.

Утрировано требовалось примерно следующее. Сначала я пытаюсь сделать набросок статьи (черновик) локально в каком-то виде (в любом текстовой редакторе), после чего необходимо было перенести его в блог. А это выглядело следующим образом: открыть админку Wordpress’а, создать черновик, скопировать туда текст из локального черновика. В процессе необходимо было добавить тэги, категории, сформировать URL, а тут еще параллельно прилетает что-то еще в голову по теме статьи и ты вносишь правки уже в админке. После чего тебе надо скопировать из админки Wordpress’а в локальную копию дабы одинаковое содержимое было в обоих местах.

Это по итогу сильно утомляет и ты распыляешься на то, что не особо важно по сравнению с контентом. И именно это привело меня к осознанию того, что Wordpress’ом я больше не хочу пользоваться — он не дает мне писать.

Как я веду блог сейчас

Для начала я в 2019 году переехал на статический генератор сайтов Hugo, о чем я написал. А относительно недавно я описал магию, которой я смог окружить свой блог для упрощения собственной жизни.

На текущий момент я немного переработал/изменил общий процесс или workflow если хотите работы со своим блогом. Сейчас он выглядит вот так:

Blog workflow
Blog workflow

На моей рабочей станции — MBP — установлен iA Writer, в котором я пишу заметки, включая эту для ресурса Medium. Поправил скрипт:

#!/usr/bin/env bash

set -e

BLOG_PATH="/Users/jtprog/workplace/blog"
POST_NAME=$1

cd "${BLOG_PATH}"

hugo new "${POST_NAME}/index.md"

open -a "iA Writer" ${BLOG_PATH}/content/${POST_NAME}/index.md

exit 0

Вот такую структуру внутри репозитория:

❯ tree -L 1
.
├── Dockerfile
├── LICENSE.md
├── README.md
├── archetypes
├── config.yml
├── content
├── data
├── draft
├── layouts
├── public
├── resources
├── rundev.sh
├── static
└── themes

9 directories, 5 files

Сформировал вот такой шаблон шапки статьи archetypes/default.md:

---
title: "{{ replace .Name "-" " " | title }}"
date: {{ .Date }}
# weight: 1
# aliases: ["/first"]
categories: 'Work'
tags: ["first"]
type: 'post'
author: "JTProg"
description: ""
showToc: false
TocOpen: false
draft: true
hidemeta: false
disableShare: false
# cover:
# image: "<image path/url>"
# alt: "<alt text>"
# caption: "<text>"
# relative: false
comments: false
---

Привет, `%username%`!

Для проверки перед отправкой изменений в репозиторий я обычно запускаю локально всё:

hugo server --config ./config.yml -w --bind 127.0.0.1 -b 'http://127.0.0.1:1313'

Вот так выглядит content/ в которой уже лежат законченные статьи:

❯ ll content | head -25
total 208
drwxr-xr-x 111 jtprog staff 3.5K Dec 29 22:58 ./
drwxr-xr-x 22 jtprog staff 704B Dec 30 00:00 ../
-rw-r--r-- 1 jtprog staff 106B Jan 14 2020 .htaccess
-rw-r--r-- 1 jtprog staff 2.8K Sep 18 2019 about-me.md
drwxr-xr-x 3 jtprog staff 96B Nov 4 15:20 add-disk-lvm/
drwxr-xr-x 3 jtprog staff 96B Nov 4 15:00 amarok-on-mysql/
drwxr-xr-x 3 jtprog staff 96B Nov 4 14:47 android-and-ubuntu/
drwxr-xr-x 5 jtprog staff 160B Nov 4 17:47 android-to-windows-7/
drwxr-xr-x 3 jtprog staff 96B Dec 29 00:34 ansible-basic/
drwxr-xr-x 3 jtprog staff 96B Nov 4 14:54 asus-zenfone-2/
drwxr-xr-x 3 jtprog staff 96B Nov 4 15:27 bad-isp-twbot/
drwxr-xr-x 3 jtprog staff 96B Nov 4 14:44 bad-story/
drwxr-xr-x 3 jtprog staff 96B Nov 4 01:07 be-or-not-to-be/
drwxr-xr-x 3 jtprog staff 96B Nov 4 15:23 btrfs-dev/
drwxr-xr-x 3 jtprog staff 96B Nov 4 15:22 btrfs-man/
drwxr-xr-x 3 jtprog staff 96B Nov 4 15:22 centos-after-convert/
drwxr-xr-x 3 jtprog staff 96B Nov 4 15:25 centos-nfs/
drwxr-xr-x 3 jtprog staff 96B Nov 4 14:42 change-linux/
-rw-rw-rw-@ 1 jtprog staff 4.5K Nov 5 21:11 chat-rules.md
drwxr-xr-x 3 jtprog staff 96B Nov 4 15:31 cli-gen-pass/
drwxr-xr-x 3 jtprog staff 96B Nov 4 14:49 delay-ubuntu-iredmail/
drwxr-xr-x 3 jtprog staff 96B Nov 4 15:13 disable-safari-pdf-view/
drwxr-xr-x 3 jtprog staff 96B Nov 4 15:35 docker-base/

В рамках улучшения автоматизации я подключил лежавшую без дела Raspberry Pi 3 Model B в качестве ранера для репозитория (репозиторий у меня закрытый, но возможно когда-то открою). Запускать на “малинке” с одним гигабайтом ОЗУ слишком сложно, поэтому тип ранера я выбрал shell и доработал .gitlab-ci.yml. Теперь он выглядит вот так:

---
stages:
- deploy
- notify

variables:
CI_DEBUG_TRACE: "false"
GIT_SUBMODULE_STRATEGY: recursive

auto deploy:
stage: deploy
script:
- echo "${SSH_PRIVATE_KEY}"
- echo "${SSH_USER}"
- echo "${SSH_HOST}"
- echo "${REMOTE_PATH}"
- mkdir -p ~/.ssh
- echo "Host *\n\tStrictHostKeyChecking no\n\n" > ~/.ssh/config
- chmod 700 ~/.ssh
- ssh-keyscan -p 22 ${SSH_HOST} > ~/.ssh/known_hosts
- echo "Генерирование страниц началось"
- hugo
- echo "${SSH_PRIVATE_KEY}" | tr -d ' ' | base64 --decode > ~/.ssh/id_rsa
- chmod 600 ~/.ssh/id_rsa
- cp ./content/.htaccess ./public/.htaccess
- cp ./content/robots.txt ./public/robots.txt
- echo "Запуск rsync"
- rsync -avz -e "ssh -i ~/.ssh/id_rsa" --progress --delete public/ ${SSH_USER}@${SSH_HOST}:${REMOTE_PATH}
- echo "Завершён деплой"
- sh .cicd/notify-tg.sh ✅
only:
- master
tags:
- raspberry
- ansible
- raspberrypi
- shell
- ops

notify_error:
stage: notify
script:
- sh .cicd/notify-tg.sh ❌
when: on_failure
only:
- master
tags:
- raspberry
- ansible
- raspberrypi
- shell
- ops

Докинул алерты в Telegram через простой скрипт .cicd/notify-tg.sh:

#!/bin/bash

set -e

TIME="10"
URL="https://api.telegram.org/bot$TELEGRAM_BOT_TOKEN/sendMessage"
TEXT="Deploy status: $1%0A%0AProject:+$CI_PROJECT_NAME%0AURL:+$CI_PROJECT_URL/pipelines/$CI_PIPELINE_ID/%0ABranch:+$CI_COMMIT_REF_SLUG"

curl -s --max-time $TIME -d "chat_id=$TELEGRAM_USER_ID&disable_web_page_preview=1&text=$TEXT" $URL

echo "The notification is sent"

exit 0

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

SysOps Alerter
SysOps Alerter

Собственно это вся магия.

Итого

Теперь процесс написания статьи мне доставляет именно удовольствие, а не головную боль как с Wordpress. Мелкие улучшения я описываю в своем канале — SysOps, а если у тебя, %username%, есть замечания/вопросы/предложения по моей организации работы с блогом, то приходи в чат ЧАТ: SysOps. На этом всё! Profit!

--

--