Как я веду свой блог
Привет, %username%
! Я уже довольно давно веду свой блог в сети интернет. А относительно недавно я пришел к идеальному (для себя) процессу работы со своим блогом и написанию статей.
Исторический экскурс
Я довольно долго жил на Wordpress в качестве CMS, а хостингом у меня был (и остается) хостинг Fozzy и в целом меня все устраивало до определенного момента.
Примерно в 2018 году (точно не помню) вышел Wordpress 5.0 и от этого у многих бомбануло. Wordpress сделал новый странный редактор статей с блоками и это стало последней каплей для меня. А началом раздумий послужило то, что я стал меньше писать как минимум потому, что требовалось слишком много телодвижений.
Утрировано требовалось примерно следующее. Сначала я пытаюсь сделать набросок статьи (черновик) локально в каком-то виде (в любом текстовой редакторе), после чего необходимо было перенести его в блог. А это выглядело следующим образом: открыть админку Wordpress’а, создать черновик, скопировать туда текст из локального черновика. В процессе необходимо было добавить тэги, категории, сформировать URL, а тут еще параллельно прилетает что-то еще в голову по теме статьи и ты вносишь правки уже в админке. После чего тебе надо скопировать из админки Wordpress’а в локальную копию дабы одинаковое содержимое было в обоих местах.
Это по итогу сильно утомляет и ты распыляешься на то, что не особо важно по сравнению с контентом. И именно это привело меня к осознанию того, что Wordpress’ом я больше не хочу пользоваться — он не дает мне писать.
Как я веду блог сейчас
Для начала я в 2019 году переехал на статический генератор сайтов Hugo, о чем я написал. А относительно недавно я описал магию, которой я смог окружить свой блог для упрощения собственной жизни.
На текущий момент я немного переработал/изменил общий процесс или 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. Сами алерты выглядят вот так:
Собственно это вся магия.
Итого
Теперь процесс написания статьи мне доставляет именно удовольствие, а не головную боль как с Wordpress. Мелкие улучшения я описываю в своем канале — SysOps, а если у тебя, %username%
, есть замечания/вопросы/предложения по моей организации работы с блогом, то приходи в чат ЧАТ: SysOps. На этом всё! Profit!