Bash Days | Linux | DevOps
23.6K subscribers
226 photos
27 videos
781 links
Авторский блог от действующего девопса

Самобытно про разработку, devops, linux, скрипты, сисадминство, техдирство и за айтишную жизу.

Автор: Роман Шубин
Реклама: @maxgrue

MAX: https://max.ru/bashdays

Курс: @tormozilla_bot
Блог: https://bashdays.ru
Download Telegram
Поделюсь своим решением, как я организовал бэкапы баз 1С. Основное требование к решению (за исключением работоспособности) - использование штатного ПО, которое уже есть в репозитории/ничего дополнительно не устанавливать. Имитация закрытого контура.

🔤🔤🔥🔤🔤🔤🔤🔤🔤

Итак, условия: windows server на котором работает 1с и на нем же PostgreSQL и некое файловое хранилище, к которому есть доступ исключительно по ftp.
ㅤ
Из утилит, которыми можно решать задачу, под рукой оказалась rsync.

Бэкап базы 1С будем делать штатной программой от 1С. Однозначного мнения нет, чем лучше бэкапить - средствами СУБД или этой программой, есть у каждого варианта свои преимущества и недостатки. В нашем варианте используем именно ПО от 1С.

Чтобы делать это с помощью планировщика, делаем простой .bat для windows сервера, имя файла отражает дату его создания.

set datetemp=%date:~-10%`

"C:\Program Files\1cv8\8.3.24.1819\bin\ibcmd.exe" infobase dump --db-server=localhost --dbms=PostgreSQL --db-name=название_бд --db-user=имя_пользователя_бд --db-pwd=пароль_пользователя_бд --user=имя_пользователя_в_1С --password=пароль_пользователя_1С "C:\путь_для_бэкапа\имя_файла_"%datetemp%".dt"


Бэкапы базы сохраняются локально. Теперь надо их оттуда забрать и бережно перенести на файловое хранилище.

Для этих целей хорошо подойдет rsync. Поднимать сервер rsync не хотелось, поэтому пошел по пути набора команд.

Формат будущей команды выглядит так:

rsync -av ~/bases_1s/bgu ~/backup/


Rsync (ключа а = в архивном режиме, его обычно достаточно для целей бэкапа, ключ v добавит подробностей) скопирует папку bgu из ~/bases_1s и положит их в ~/backup/.

Обращайте внимание на слэши в конце пути - играют роль в вопросе перенести папку целиком или же ее содержимое, без создания одноименной папки в точке назначения.

Все хорошо, но rsync работает, если хотя бы один путь локальный, а у нас два удаленных хоста. Выход есть. Примонтируем папку с бэкапами по SMB.

Строка в /etc/fstab выглядит у меня так:

//192.168.0.2/название_папки_на_сервере_win /home/user/bases_1s cifs credentials=/home/user/.smbcreds,noauto,users,iocharset=utf8,uid=500,gid=500 0 0


В .smbcreds лежит логин с паролем пользователя windows сервера, noauto=не монтировать при запуске.

Далее, возникла засада в виде того, что если доступ есть по ftp, то rsync бессилен, ftp - протокол и rsync тоже протокол и надо выбрать.

В этой ситуации поможет замечательная curlftpfs. Утилита позволяет монтировать удаленные ftp папки в локальную файловую систему.

Установим ее и добавим своего пользователя в группу fuse (чтобы работать без повышения привилегий):

apt-get install curlftpfs
usermod -aG fuse имя_пользователя.


Создаем файлик с кредами, создаем папку куда будем монтировать и подключаемся (все от своего пользователя):

echo 'machine 192.168.0.18
login фтп_юзер
password пароль' > .netrc


Кроме работы rsync есть еще реализация резервного копирования посредством cp. Оставил пока как есть, в планах единообразить и прикрутить отчет о выполнении.

На данном этапе скрипт выглядит примерно так, смотри в первом комментарии к этому посту, одним кадром не влез.


Стоит еще пояснить о ключе --temp-dir=/tmp/rs в команде rsync. Он нужен чтобы обойти ограничение "ftp файловой системы", которая не поддерживает создание временных файлов.

🛠 #балансбатл #людипишут
—
✅ @bashdays ✅ @linuxfactory ✅ @blog
Please open Telegram to view this post
VIEW IN TELEGRAM
35
Рубрика "упоротые однострочники".

🔤🔤🔥🔤🔤🔤🔤🔤🔤

Как послать PING всем серверам кластера редиса и не умереть от скуки
ㅤ
for nodeport in $(echo "CLUSTER NODES" | nc redis.example 6900 | awk '$1~/^[0-9a-z].*$/ {sub("@"," "); print $2}'); do IFS=":" read -r node port <<< $nodeport; echo -n "$nodeport: "; echo "PING" | nc $node $port; done


Первым делом мы шлём в известный нам сервер кластера redis команду CLUSTER NODES.

echo "CLUSTER NODES" | nc redis.example 6900


Референс команды cluster nodes.

Пример выхлопа

shell$5256
07c37dfeb235213a872192d90877d0cd55635b91 127.0.0.1:30004@31004,hostname4 slave e7d1eecce10fd6bb5eb35b9f99a514335d9ba9ca 0 1426238317239 4 connected
67ed2db8d677e59ec4a4cefb06858cf2a1a89fa1 127.0.0.1:30002@31002,hostname2 master - 0 1426238316232 2 connected 5461-10922
292f8b365bb7edb5e285caf0b7e6ddc7265d2f4f 127.0.0.1:30003@31003,hostname3 master - 0 1426238318243 3 connected 10923-16383
6ec23923021cf3ffec47632106199cb7f496ce01 127.0.0.1:30005@31005,hostname5 slave 67ed2db8d677e59ec4a4cefb06858cf2a1a89fa1 0 1426238316232 5 connected
824fe116063bc5fcf9f4ffd895bc17aee7731ac3 127.0.0.1:30006@31006,hostname6 slave 292f8b365bb7edb5e285caf0b7e6ddc7265d2f4f 0 1426238317741 6 connected
e7d1eecce10fd6bb5eb35b9f99a514335d9ba9ca 127.0.0.1:30001@31001,hostname1 myself,master - 0 0 1 connected 0-5460


Дальше мы парсим выхлоп awk-шкой, так как нам нужны чисто IP и порт

awk '$1~/^[0-9a-z].*$/ {sub("@"," "); print $2}')


$1~/^[0-9a-z].*$/ - берём строчки, которые начинаются с циферкобуковок

{sub("@"," "); print $2} - режем дополнительно по символу собаки, выводим 2ю колонку. Получаем:

127.0.0.1:30004
127.0.0.1:30002
127.0.0.1:30003
127.0.0.1:30005
127.0.0.1:30006
127.0.0.1:30001


Ура, у нас есть список редисок с портами. Всё это заворачиваем в for:

for nodeport in $(echo "CLUSTER NODES" | nc redis.example 6900 | awk '$1~/^[0-9a-z].*$/ {sub("@"," "); print $2}'); do ...; done


И кайф, осталось порезать по двоеточию в разные переменные хост и порт, и, вооружившись netcat-ом, сделать PING.

Режем строку по двоеточию на 2 переменных

IFS=":" read -r node port <<< $nodeport;


Итого у нас получается следующее:

nodeport=127.0.0.1:30004
node=127.0.0.1
port=30004


Выводим себе для удобства чтения результата хост редиса и порт куда стучимся:

echo -n "$nodeport: "


И netcat-ом шлём команду PING уже на ноду.

echo "PING" | nc $node $port


Получаем на выходе:

127.0.0.1:30004: +PONG
127.0.0.1:30002: +PONG
127.0.0.1:30003: +PONG
127.0.0.1:30005: +PONG
127.0.0.1:30006: +PONG
127.0.0.1:30001: +PONG


🛠 #балансбатл #людипишут
—
✅ @bashdays ✅ @linuxfactory ✅ @blog
Please open Telegram to view this post
VIEW IN TELEGRAM
57
Закончилось место на диске? Или же закончились inode?

🔤🔤🔥🔤🔤🔤🔤🔤🔤

Ситуация неприятная и чаще всего выходом служит удаление "ненужных" файлов. Рассмотрим ситуацию, когда все файлы нужны, то есть удалять ничего не будем.
ㅤ
В качестве примера, смоделируем ситуацию, когда в файловой системе закончились inode.

Создадим файловую систему с небольшим количеством inode на виртуальном блочном устройстве, позаимствовав немного места с реальной файловой системы:

dd if=/dev/zero of=/home/user/fs.img count=1000 bs=4096K
mkfs.ext4 -N 512 /home/user/fs.img


Монтируем файловую систему:

mkdir newfs
mount /home/user/fs.img newfs/


Забиваем ее до отказа файлами:

touch file{1..501}


Проверяем:

df -i newfs


Вывод:

[root@14 ~] df -i newfs/

/dev/loop6 512 512 0 100% /root/newfs


Все, создавать новые файлы нельзя. Если сильно надо, выход есть. Понадобится свободное место, с файловой системой ext4.

Сделаем еще одно виртуальное блочное устройство, на нем файловую систему и пару папок для наших нужд.

dd if=/dev/zero of=/home/user/newfs.img count=1500 bs=4096K
mkfs.ext4 /home/user/newfs.img
mount /home/user/newfs.img freespacefs
mkdir -p freespacefs/{up,service}


Теперь главное:

mount -t overlay overlay -olowerdir=newfs,upperdir=freespacefs/up,workdir=freespacefs/service newfs


Здесь монтируется специальная файловая система overlayfs.

Аргументы:

lowerdir - директория, которую расширяем. Может быть любой файловой системой, может быть смонтирована только на чтение. В терминологии overlayfs - нижний слой.

upperdir - директория на файловой системе с поддержкой d-type (например, ext4).

В терминологии overlayfs верхний слой. В эту папку реально будут попадать результаты деятельности (новые файлы например) workdir- служебная директория, нужна для работы overlayfs. Должна находится на той же файловой системе, что и upperdir.

Проверяем:

[root@14 ~] df -i newfs

overlay 376K 16 376K1% /root/newfs

занято 1 % inode.

[root@14 ~] df -i newfs
[root@14 ~] touch newfs/extrafile
[root@14 ~] ls newfs/
extrafile  file125  file152  file1.....

(вывод обрезан, здесь 501 файл)


Теперь посмотрим в up:

[root@14 ~] ls freespacefs/up
extrafile


Вариант для экстремалов (можно задействовать оперативную память, если свободного места нет совсем):

[root@14 ~] mkdir ramfs
[root@14 ~] mount -t tmpfs tmpfs -osize=4G ramfs
[root@14 ~] mkdir ramfs/{up,work}
[root@14 ~] mount -t overlay overlay -\ olowerdir=newfs,upperdir=ramfs/up,workdir=ramfs/work  newfs
[root@14 ~] df -h newfs/

overlay 7,8G 8,7M 7,8G 1% /root/newfs


Фактически, это tmpfs, которая располагается в оперативной памяти, и стоит об этом помнить.

Теперь пара слов про overlayfs.

Функционал реализован модулем ядра, который, возможно, нужно включить:

[root@14 tmp] lsmod | grep overlay


Если вывод пустой, то:

[root@14 tmp] modprobe overlay


Как видно из вышесказанного, особенность этой файловой системы - она работает с директориями а не с устройствами.

На этом все. Выражаю благодарность за идею статьи @AlexeyVictorovi4

🛠 #балансбатл #людипишут
—
✅ @bashdays ✅ @linuxfactory ✅ @blog
Please open Telegram to view this post
VIEW IN TELEGRAM
10109
Вечный вопрос — как сохранить правила iptables?
ㅤ
Вот навтыкал ты всяких безумных правил и цепочек через командную строку, радуешься. А после ребута все твои поделки к хуям улетучиваются.

И каждый раз ты идешь гуглить, как это решить. Жиза. Каждый раз, как в первый раз.

А делается всё просто, двумя командами:

sudo iptables-save > /etc/iptables/rules.v4
sudo ip6tables-save > /etc/iptables/rules.v6


Ладно, спиздел, нужно еще доставить:

sudo apt install iptables-persistent


Эта хуёвина автоматом создает файлы /etc/iptables/rules.v4, /etc/iptables/rules.v6 и будет применять их при загрузке.

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

😀😃😄😁😅😂🤣😊
😇🙂🙃😉😌😍🥰😘
😗😙😚😋😛😝😜🤪
🤨🧐🤓😎🤩🥳😏😒

Просто открываешь напрямую файл rules.v4/rules.v6 и прописываешь туда все свои хотелки.

После этого не забываем дёрнуть слона за хобот:

systemctl restart netfilter-persistent


Либо по старинке, добавляешь правила через терминал и затем делаешь:

sudo netfilter-persistent save


Но в этом случае файлы rules.v4/rules.v6 будут перезатерты, имей это ввиду если лез в них своими руками.

Саммари

1. Ставим iptables-persistent
2. Пиздярим правила в терминале
3. Применяем netfilter-persistent save

Как делаю я? У меня писюн длинный, поэтому сразу вношу все необходимое руками в rules.v4/rules.v6, хотя это не есть бест-практика, не делай так.

Такие дела, изучай.

🛠 #linux #security #iptables
—
✅ @bashdays ✅ @linuxfactory ✅ @blog
Please open Telegram to view this post
VIEW IN TELEGRAM
166
Вчера в посте я упомянул конфиги iptables лишь для части дистрибутивов, Alex эту ситуацию в комментариях подметил верно.
ㅤ
Давай посмотрим что в других дистрибутивах происходит.

Debian / Ubuntu

Основной пакет → iptables-persistent / netfilter-persistent

/etc/iptables/rules.v4
/etc/iptables/rules.v6


RHEL / CentOS / Rocky / Alma (iptables-services)

/etc/sysconfig/iptables
/etc/sysconfig/ip6tables


Fedora (новые версии)

По умолчанию использует firewalld (поверх nftables). Если ставишь iptables-services:

/etc/sysconfig/iptables
/etc/sysconfig/ip6tables


Arch Linux / Manjaro

Из коробки iptables не сохраняет правила, обычно юзеры делают сами:

/etc/iptables/iptables.rules
/etc/iptables/ip6tables.rules


OpenSUSE / SLES

По умолчанию тоже firewalld, если ставить пакет iptables, правила обычно хранят в:

/etc/sysconfig/iptables


Astra Linux (Смоленск, Орёл и др. редакции)

Астра базируется на Debian, поэтому у неё схема как у Debian/Ubuntu:

/etc/iptables/rules.v4
/etc/iptables/rules.v6


РЕД ОС (RedOS)

RedOS базируется на RHEL/CentOS, поэтому там всё по «редхэту»:

/etc/sysconfig/iptables
/etc/sysconfig/ip6tables


Вроде основное осветил, если что-то проебал, забыл, затроил — пиши в комменты, поправим.

А вообще при возможности пользуйся облачным фаерволом, если страшно конфигурять iptables или руки растут из жопы.

🛠 #linux #security #iptables
—
✅ @bashdays ✅ @linuxfactory ✅ @blog
Please open Telegram to view this post
VIEW IN TELEGRAM
35
Настройка и работа с Taskwarrior

Как бы я не шлялся словно «портовая шлюха» по разным таск-трекерам, так и вернулся к истокам Taskwarrior (далее TW).
ㅤ
Почему? Потому что в других таск-трекерах у меня спустя пару недель начинает образовываться какая-то лапша ебаная, прям как с ансиблом. Ну и по итогу на все это кладется болт.

Из коробки TW выглядит достаточно хуёва, как и все остальное в Linux. Но я его допилил с помощью конфигов, избавился от лишнего и оставил только, то что действительно нужно мне.

Пост получился длинным, поэтому идем дочитывать в блог 👇

🅰️🅰️🅰️🅰️🅰️🅰️🅰️
https://two.su/684om
🅰️🅰️🅰️🅰️🅰️🅰️🅰️

🛠 #рабочиебудни #gtd
—
✅ @bashdays ✅ @linuxfactory ✅ @blog
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
532
Друзья и коллеги — С Днём Знаний!

Грех под это событие не напомнить про — Linux Factory.
ㅤ
За 1 месяц ты впитаешь необходимую базу, которая требуется, чтобы уйти с «завода» и вкатиться в айти на роль «девопс-инженера».

За год существования LF, через него прошло > 1000 человек. Больше половины учащихся успешно закончили курс и нашли свою первую хорошо оплачиваемую работу, которая им действительно нравится. LF это отличная инвестиция в своё будущее.


Короче. У меня появились свободные слоты и я готов взять на обучение еще 20-30 человек.

Цена временно снижена в 2 раза с 5000р до 3500р.

Ты можешь пропить эти деньги, а можешь вложиться с умом и уже через месяц получать вкусную ЗП. Всё зависит от тебя, готов ли ты сделать шаг и что-то изменить.


Что внутри

— Никакой воды, только нужная информация
— Исключительно бест-практики
— Более 40ка уроков и домашних заданий
— Познаешь силу «Инфраструктура как код»
— Разберешь с docker и git
— Научишься писать пайплайны
— Настроишь мониторинг и алерты
— И многое другое…

Киллер-фичи

— Я твой личный ментор 1x1 (никаких групповых чатов)
— Вдумчивое кодревью ДЗ (обоснованные замечания)
— Нет дедлайнов (учишься когда захочешь)
— Можешь не сдавать домашки (двойки не ставлю)
— Задачи со звездочкой (для любителей посложнее)
— Можно пропускать темы и брать только нужные
— Избавишься от синдрома самозванца

⚪ Содержание курса и всех сезонов описал тут.
⚪ Подробнее о курсе можешь почитать тут.
⚪ А для сомневающихся добавил страницу с отзывами.

Кстати можешь глянуть пару (1 и 2) открытых уроков и сделать выводы, подойдет тебе все это или нет.

Вписаться в курс: @tormozilla_bot

если бот не отвечает, отправь ему повторно /start

По всем вопросам можешь писать сюда: @linuxfactorybot
Please open Telegram to view this post
VIEW IN TELEGRAM
1350
Здрасти. Так, у нас тут баланс-батл проходил, давай посмотрим еще раз на посты, которые ребята прислали.

😀😃😄😁😅😂🤣😊
😇🙂🙃😉😌😍🥰😘
😗😙😚😋😛😝😜🤪
🤨🧐🤓😎🤩🥳😏😒
ㅤ
Ну и кто пропустил или забыл поставить «лайк» — самое время.

- Про дампы и postgres (98)
- Астра линукс и неочевидные нюансы (89)
- Про бомжей и authentication key (53)
- Живое вмешательство. File descriptors и GDB (103)
- Сетевой квест и 22 дырка (92)
- Учим Docker в SNAT (69)
- Парсинг сетевого оборудования (16)
- Про логи и systemd-cat (94)
- Деградация батареи в Linux (37)
- Организация бекапов 1С (34)
- Рубрика «упоротые однострочники» (53)
- Хакаем inode и добываем свободное место (100)

В скобках общее количество лайков на текущий момент. Завтра подведем итоги и выдадим донаты.

Всем огромное спасибо за участие, вы все большие молодцы!

Если я проебался и что-то упустил, маякните, пожалуйста Максу, добавим в список.


🛠 #балансбатл #людипишут
—
✅ @bashdays ✅ @linuxfactory ✅ @blog
Please open Telegram to view this post
VIEW IN TELEGRAM
1034
Подводим итоги #балансбатл:
ㅤ
Все «лайки» пересчитаны, получилось так:

Первое место: Живое вмешательство. File descriptors и GDB (124 реакции) от @AlbDVPs. (Донат — баланс-борд)

Второе место: Хакаем inode и добываем свободное место (116 реакций), автор @clovus. (Донат — 5000р)

Третье место: Про логи и systemd-cat (110 реакция), автор @a_glumov (Донат — 3000р)

🍻 Принимайте наши поздравления! 🍻

😀😃😄😁😅😂🤣😊
😇🙂🙃😉😌😍🥰😘
😗😙😚😋😛😝😜🤪
🤨🧐🤓😎🤩🥳😏😒

И дополнительное призовое место от нашего коллеги DevUps, обещает задонатить кругленькую сумму за пост, который произведет впечатление на него лично.


DevUps выбрал 2 поста, которые произвели на него впечатления.

Цитирую:

Кароче, я выбрал 2 статьи ... Закончилось место на диске? Или же закончились inode? и Живое вмешательство. File descriptors и GDB. Надо будет как-то решить как им бабок заслать, по 5к получается.


Как получить призы:

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

Всем кто принимал участие — огромнейшая благодарность, всем авторам постов лично жму руку, вы молодцы, что делитесь знаниями с другими. Это очень ценно! Спасибо вам ребята!

🛠 #балансбатл #людипишут
—
✅ @bashdays ✅ @linuxfactory ✅ @blog
Please open Telegram to view this post
VIEW IN TELEGRAM
363
Мне прилетела интересная задача.

🔤🔤🔥🔤🔤🔤🔤

ТЗ: Сервер без GUI, к нему подключают usb-диск с NTFS и начинается автоматическое архивирование. Логин не требуется, сообщения выдаются на tty1.

sudo apt install ntfs-3g # для монтирования ntfs


Использовать будем штатные средства udev + systemd .

1. Подключаем диск, и запоминаем UUID.

lsblk -f


sdc                                                                         
└─sdc1
ntfs FLASH
1234567890ABCDEF

здесь FLASH - метка диска 1234567890ABCDEF - UUID
ㅤ
создадим каталог для монтирования:

mkdir -p /media/usb_ntfs; chmod 777 /media/usb_ntfs


Дальше создаем 4 файла. Чтобы было проще, в каждом файле в начале коммент с названием файла.

После создания:

sudo systemctl daemon-reload


Как это работает:

При подключении диска usb-диска срабатывает UDEV правило 99-usb-mount.rules и пытается запустить службу autousbbackup.service

autousbbackup.service пытается запустить media-usb_ntfs.mount, поскольку жестко он нее зависит.

Сама media-usb_ntfs.mount запустится только в том случае, если UUID диска будет 1234567890ABCDEF.

Если все условия совпадают, autousbbackup.service запустит скрипт autousbbackup.sh, внутри которого Вы напишите копирование или синхронизацию данных в каталог /media/usb_ntfs.

Если используется архивирование с чередованием дисков - просто сделайте у дисков одинаковые метки:

sudo umount /dev/sdXN # где /dev/sdXN  имя вашего NTFS-раздела.
sudo ntfslabel --new-serial=1234567890ABCDEF /dev/sdXN #задайте UUID


👆 Если в mount не указать опцию nofail система будет тормозить при загрузке.
👆 Запустить скрипт через UDEV даже в фоне не получится, поскольку система вырубит его через 5 сек.

#/etc/udev/rules.d/99-usb-mount.rules

SUBSYSTEM=="block", KERNEL=="sd*", ACTION=="add", TAG+="systemd", ENV{SYSTEMD_WANTS}="autousbbackup.service"


#/etc/systemd/system/media-usb_ntfs.mount

[Unit]
Description=Mount USB NTFS by UUID

[Mount]
What=/dev/disk/by-uuid/1234567890ABCDEF
Where=/media/usb_ntfs
Type=ntfs-3g
Options=defaults,big_writes,nofail,uid=1000,gid=1000

[Install]
WantedBy=multi-user.target


#/etc/systemd/system/autousbbackup.service

[Unit]
Description=Simple service autousbbackup
Requires=media-usb_ntfs.mount
After=media-usb_ntfs.mount

[Service]
Type=simple
ExecStart=/root/work/autousbbackup/autousbbackup.sh

[Install]
WantedBy=multi-user.target


#!/bin/bash
#/root/work/autousbbackup/autousbbackup.sh

declare -x PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
declare MOUNT_POINT=/media/usb_ntfs
declare TTY=/dev/tty1
declare DF='%(%Y%m%d-%H%M%S)T' #date format
declare LOG="$0.log"
exec &>"$LOG" # only one backup log
#exec &>>"$LOG" # all backups log
printf "$DF %s\n" -1 "START BACKUP"|tee "$TTY"
##############################################

sleep 3 # backup emulation

##############################################linux
printf "$DF %s\n" -1 "END BACKUP"|tee "$TTY"

#suicide, because service require mount point
systemd-mount --umount "$MOUNT_POINT"


🛠 #linux #bash
—
✅ @bashdays ✅ @linuxfactory ✅ @blog
Please open Telegram to view this post
VIEW IN TELEGRAM
682
Не уметь — не стыдно!

Вопрос из зала — есть ли какой-то тренажер или подобное, чтобы потыкать и понять как работает Kafka?

Конечно есть, у нас этого говна навалом!

Называется эта штука Kafka Visualisation.

Открываешь
и тыкаешь хоть до усрачки. С ходу нихуя не понятно, но если вникнуть, то легко поймешь принцип работы.

А еще есть подобная штука для RabbitMQ, потыкать тут.
ㅤ
Изучай! Всех с пятницей и береги себя!

🛠 #services
—
✅ @bashdays ✅ @linuxfactory ✅ @blog
Please open Telegram to view this post
VIEW IN TELEGRAM
1291
Если ты выполняешь план, то тебе повысят план, а не зарплату!

Пытался вчера подружить taskwarrior и s3 для синхронизации, из коробки оно вроде как только с AWS работает.

Подкинул в конфиг параметры подключение к кастомному хранилищу. Ну думаю, какая в хуй разница.

sync.backend=s3
sync.aws.region=ru-7
sync.aws.bucket=taskwarrior
sync.aws.access_key_id=aed38518013b4ab
sync.aws.secret_access_key=992570bad57
sync.aws.endpoint=s3.ru-7.storage.selcloud.ru


Проверяю task sync init, хуй там плавал, ошибка:

unhandled error: dispatch failure: io error: error trying to connect: dns error: failed to lookup address information: Name or service not known: dns error: failed to lookup address information: Name or service not known: failed to lookup address information: Name or service not known


Мде… Всёж правильно, эндпоинт пингуется, курлится, телнетится. Описывать весь момент дебага не буду, но там конкретный такой - метод тыка был.

Ну раз обычный «метод тыка» не помогает, расчехляем strace!

strace -s 200 -f -e trace=network,connect,sendto,recvfrom task sync


Что делает команда:

-s 200 — печатать до 200 байт строковых аргументов (по умолчанию strace режет строки до 32 байт). Это важно, чтобы увидеть полный URL/hostname, который передаётся в syscalls.

-f — следить не только за основным процессом, но и за всеми дочерними (fork/clone)

-e trace=network, connect, sendto, recvfrom — ограничиваем вывод только сетевыми вызовами: socket, connect → создание сокетов и подключения (TCP/UDP). sendto / recvfrom → передача данных (обычно видно DNS-запросы, HTTP-заголовки и т.д.).

И в выхлопе находим строчку: taskwarrior.s3.ru-7.amazonaws.com.

😀😃😄😁😅😂🤣😊
😇🙂🙃😉😌😍🥰😘
😗😙😚😋😛😝😜🤪
🤨🧐🤓😎🤩🥳😏😒
😞😔😟😕🙁☹️😣😖
😫😩🥺😢😭😤😠😡

Ну ёб твою мать! А нахуй я тогда все эти приседания с конфигом устраивал, если эта падла хуй положила и по task diagnostic никаких ошибок не вывело.

То есть настройка sync.aws.endpoint=… вообще не учитывается — клиент жёстко строит URL по схеме AWS.

Ну хоть проблему нашли. Strace все же достаточно пиздатый инструмент.

Отсюда вывод: с кастомным S3 напрямую taskwarrior работать не сможет. Даже если устроить подмену хостов или сделать хак через CNAME.

А как синхронизировать-то задачи? Ооо брат, я уже написал про это отдельный пост, чуть позже закину.

Хороших тебе выходных!

🛠 #strace #debug #taskwarrior
—
✅ @bashdays ✅ @linuxfactory ✅ @blog
Please open Telegram to view this post
VIEW IN TELEGRAM
1358
Дегенеративные модели

Получил на выходные от одного провайдера отличнейшее предложение, от которого трудно отказаться.

ВЕЧНЫЕ СЕРВЕРА!
ㅤ
Как работает эта модель — ты один раз оплачиваешь условные 10-30-50-100к рублей и получаешь VPS навсегда, до конца мать его жизни.

Звучит достаточно вкусно, но в каждой бочке меда есть ложка дегтя.

Вечного ничего не бывает.

Ну так, вот:

Покупая такой сервер, сервер не становится твоей собственностью. Ты по-прежнему выполняешь условия оферты, которую ты конечно же НЕ прочитал и просто протыкал далее → далее.

Открываем оферту и читаем:

Исполнитель вправе изменять условия договора, в одностороннем порядке. Изменения вступают в силу с даты публикации на сайте. Если клиент не согласен, он может идти на хуй и сосать жопу.


Первый звоночек.

Я сталкивался с такой ситуацией в молодости и по глупости купил такой «вечный сервер» за 10к рублей. А через полгода с меня начали требовать абонентскую плату, а на мой ахуй мне было сказано — а вы оферту читали? Какие вопросы?

Пошел, почитал, а там черным по белому — извините, теперь ваш «вечный сервер» требует ежемесячной оплаты, потому что мы охуели и хотим больше денег.

Ладно, опыт получен. Прежде чем что-то бездумно покупать, вопрос нужно хотя бы немного заресерчить. И в 99% ты найдешь очень много подводных камней, о которых ты и не подозревал.

Второй звоночек.

Ладно, ты купил «вечный сервер» и потом хуяк! Скорость стала никакой. Идем в саппорт и требуем объяснений, в ответ получаем — ну дак в оферте же прописано.

При превышении 3ТБ трафика в месяц, для «вечных серверов», скорость пропускной полосы будет снижена до dialup’а. Вы превысили допустимы трафик, поэтому идете — нахуй и сосите жопу!

ВОТ ЭТО ПОВОРОТ!

😀😃😄😁😅😂🤣😊
😇🙂🙃😉😌😍🥰😘
😗😙😚😋😛😝😜🤪
🤨🧐🤓😎🤩🥳😏😒
😞😔😟😕🙁☹️😣😖
😫😩🥺😢😭😤😠😡

Третий звоночек.

Компания просто перестает существовать, либо ее банят за махинации и черные схемы. Всякое бывает. В этом случае ты просто теряешь доступ к своему «вечному серверу». Истории такие были, по крайней мере знаю две и оба раза я лишался доступа к серверам, благо были бэкапы.

Четвертый звоночек.

Для саппорта ты не приоритетный клиент, ты лох ебаный, которого уже облапошили, хуль на тебя время тратить, сам ебись со своими проблемами и «вечным сервером».

Выводы:

Да, компаниям это выгодно, в моменте заработать миллионы денег. Но для клиента это полная залупа, особенно если в одностороннем порядке меняется оферта и все делается, чтобы клиент сам отказался от услуг.

Деньги ведь с клиента уже получены, нахуй он нужен, еще и инфраструктурные ресурсы занимает. Вкорячим его в рамки и будем в уши ссать.

Всех под одну гребенку не ровняю, возможно на рынке и есть добросовестные поставщики услуг, респект им и уважуха! Но в любом случае «третий звоночек» никто не отменяет. Фактически «вечность» держится только на репутации и доброй воле провайдера.

Предложение о «вечных серверах» живёт только в маркетинговых материалах, но юридической фиксации в оферте нет. Получается, что «вечность» основана исключительно на доверии к провайдеру.

Если сервер нужен надолго, то «окупается» он через 12-36 месяцев. Ресурсы у сервера фиксированные, например 1Гб RAM сегодня ещё куда-нибудь сгодится, но через 3–5 лет такой сервер может быть слишком слабым. А апгрейд невозможен.


Гарантий нет, это инвестиция в надежность чужого бизнеса.

Так что если тебе кто-то предлагает «вечный сервер» — шли его нахуй!

🛠 #рабочиебудни #hosting #server
—
✅ @bashdays ✅ @linuxfactory ✅ @blog
Please open Telegram to view this post
VIEW IN TELEGRAM
1097
Я тут порой пишу для одного интернет журнала (не для хабра, в пизду его). Ну и встал вопрос, как передавать материалы заказчику, чтобы не в голом markdown, а уже сверстано, стили, картинки и т.п.
ㅤ
Вариантов было много, hugo, mkdocs и т.п. По итогу выбрал Writefreely, оно отлично подошло. Оупенсорц, написан на GO, ставится на свои сервера, работает шустро.

Аналог Телеграфа и Телетайпа, но на стероидах. Можно делать разные блоги под разные задачи. Есть черновики, доступ по паролю и т.п.

Короче доволен, базовые потребности закрыты, поднимается так:

services:
write-freely:
image: nephatrine/write-freely:latest
container_name: write-freely
environment:
TZ: America/New_York
PUID: 1000
PGID: 1000
ports:
- "127.0.0.1:8085:8080/tcp"
volumes:
- ./write-freely:/mnt/config


Способ не официальный. Потому что если делать, как в официальной документации, то как обычно — нихуя не работает из коробки. Классика!

Следующая проблема — картинки по ctrl+c/ctrl+v в writefreely не вставляются. Их нужно предварительно закончать и потом через ссылку вставлять. Дела…

По FTP я ебал это делать, поэтому был поднят Picsur.

Отличнейшее решение для любителей self-hosting. Аналог Imgur, но свой!

Запускается так:

services:
picsur:
image: ghcr.io/caramelfur/picsur:latest
container_name: picsur
ports:
- '127.0.0.1:8080:8080'
environment:
PICSUR_DB_HOST: picsur_postgres
volumes:
- ./storage:/picsur/storage
restart: unless-stopped
picsur_postgres:
image: postgres:17-alpine
container_name: picsur_postgres
environment:
POSTGRES_DB: picsur
POSTGRES_PASSWORD: picsur
POSTGRES_USER: picsur
restart: unless-stopped
volumes:
- picsur-data:/var/lib/postgresql/data
volumes:
picsur-data:


Тем более эта хератень отлично дружит со скриншотилкой ShareX которую я совсем недавно начал использовать.

Рекомендую, там ебать комбайн под все задачи, хранилища и хотелки.

В настройках Picsur генеришь json и двойным кликом интегрируешь с ShareX, ничего руками прописывать не нужно.


Как работает связка:


Делаешь скриншот, оно автоматически заливается в Picsur и в буфере обмена у тебя уже готовая ссылка для вставки в markdown. Удобно просто пиздец!

Такие дела. Вот и еще один полезный сервис в моей домашней лаборатории.

Потыкай, глядишь найдешь применение в своих задачках.

Кстати нашел ShareX под Linux, если кому надо.


🛠 #services #selfhosting #workflow
—
✅ @bashdays ✅ @linuxfactory ✅ @blog
Please open Telegram to view this post
VIEW IN TELEGRAM
672
⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️

У девопса нет стейджа, только прод!


Продолжаем тему с taskwarrior, сегодня настраиваем единый сервер синхронизации на движке Taskchampion.
ㅤ
Будем компилировать бинарники, прикручивать nginx, хуячить напильником авторизацию, испытаем полный спектр эмоций и постараемся избежать сгоревших жоп.

Сюда не поместилось, поэтому по классике публикую в блоге 👇

➡️https://two.su/b9wmx


🛠 #рабочиебудни #gtd
—
✅ @bashdays ✅ @linuxfactory ✅ @blog
Please open Telegram to view this post
VIEW IN TELEGRAM
230
Всех с пятницей!

Меня частенько и «косвенно» связывали с компанией Selectel, я молча читал, слушал... И однажды подумал — а хули нет? Мало мне 3х работ, возьму еще одну.

И теперь я их официальный амбассадор.

Неспешно пишу статейки и интеграции. Предыдущий пост, как раз моих рук дело, пиздато же получилось!

Наверное эта информация для тебя будет бесполезной, просто держу в курсе, чтобы вопросов меньше возникало.

Еще раз всех с пятницей, береги себя и своих близких. Ну и хороших тебе предстоящих выходных! Ура блядь, дождались!

🍻🍻🍻🍻🍻
1594
Вчера пишу сотруднику — Алёша, у нас прод какого-то хера 500ку каждые 3 минуты выплёвывает, чё у вас там происходит?

В ответ я получаю — даже не «нихуя», а реакцию (эмоджи) на мой вопрос, тупо ебать большой палец вверх. Типа — заебись!
ㅤ
А че заебись? Вы взяли это в работу, или заебись и вы очень рады, или что нахуй вообще происходит? Как это блядь интерпретировать?
ㅤ
Немного охуев от такого, я понимаю что я делаю так же, даже не задумываясь.

А делаю я по причине — нахуя ты мне 40 сообщений написал подряд? Ты думаешь я это читать буду? Нет! Я просто поставлю тебе сука лайк и дальше пойду делами своими заниматься.

😀😃😄😁😅😂🤣😊
😇🙂🙃😉😌😍🥰😘
😗😙😚😋😛😝😜🤪
🤨🧐🤓😎🤩🥳😏😒
😞😔😟😕🙁☹️😣😖
😫😩🥺😢😭😤😠😡

Ну и еще ставлю «лайки», когда не хочу продолжать диалог, потому, что если напишешь текстом, то там ебанина начинается, про погоду, про проблемы в семье и т.п.


⚪ Выдели главное и напиши в 140 символов.

Про «приветы» уже много раз обсуждалось, для них отдельный котел.


Давай разберемся когда «лайк» уместен.

Короткий ответ без флуда. Если человек пишет: «Встреча завтра в 11», и ты ставишь 👍 — это знак, что ты прочитал и согласен.

Эмоциональный отклик. «Спасибо, что помог!» — сердечко или смайлик даёт обратную связь, но не перегружает чат.

Командная культура. В некоторых компаниях реакциями заменяют лишние «ок», «понял», «согласен», и это экономит время.

Когда не уместен:

Личное обращение. Если коллега задаёт вопрос «Можешь помочь с этим?» и получает только реакцию, это может восприниматься как уход от диалога (послали нахуй).

Неясный контекст. Если сообщение неоднозначное («Нужно срочно переделать отчёт»), то реакция в виде 👍 может вызвать вопросы: «Это согласие? Или сарказм?»

Разные ожидания. Для кого-то реакция = полноценный ответ, а для кого-то — «отписался, лишь бы ничего не сказать» (это мой случай).

Ну так вот:

Если реакция однозначно отвечает на запрос (например, подтверждение), то это вполне корректно.

Если у собеседника может остаться неопределённость, то реакция без слов выглядит как недоответ.

Важно учитывать корпоративные нормы: где-то реакциями активно пользуются и это часть культуры, а где-то люди ждут хотя бы короткого текста.

Можно сформулировать простое правило:

- Если сообщение требует только «понял/согласен/спасибо» — реакция окей;

- Если есть риск недопонимания или человек вложил усилие — лучше ответить словами.

Ну и повторюсь — не пиши 10-20-30 сообщений подряд, никто их читать не будет, сформулируй мысль одним коротким предложением и напиши.

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


Ладно, теперь твои мысли давай в комменты.

Как ты относишься к таким лайкам?

🛠 #рабочиебудни
—
✅ @bashdays ✅ @linuxfactory ✅ @blog
Please open Telegram to view this post
VIEW IN TELEGRAM
579
Смотри какая лялька: ExplainShell
ㅤ
Сервис помогает понять, что делает shell команда и все её параметры и ключи. Вставляешь например команду из прошлого поста:

strace -s 200 -f -e trace=network,recvfrom task sync


И получаешь по ней полный разбор.

Работает достаточно просто, под капотом овер-дохуя ≈30к-man страниц. Штука оупенсорцная и лежит тут.

Логика работы:

1. Ман-страницы (разделы 1 и 8) загружаются и преобразуются в HTML.

2. Параграфы классифицируются – разделяются те, где описаны опции/флаги, и те, где нет.

3. Из отобранных параграфов извлекаются конкретные параметры и их описания.

4. Когда ты вводишь команду, она разбирается на синтаксическое дерево (AST) с помощью библиотеки bashlex.

5. Компоненты команды («узлы» AST) сопоставляются с параметрами, найденными в ман-страницах.

6. Отображаем на фронте.

Вообще штука довольно бесполезная, но в образовательных целях очень даже вменяемая. Как раз для персонажей которые нихуя не понимают как ориентироваться в man страницах.

Хотя, кого я обманываю, сейчас каждый первый загоняет непонятную команду в GPT и оно тебе всё по полочкам раскладывает. Да еще и на русском языке.


Ладно, глядишь сгодиться в хозяйстве.

🛠 #services #bash
—
✅ @bashdays ✅ @linuxfactory ✅ @blog
Please open Telegram to view this post
VIEW IN TELEGRAM
272
Всегда делай хорошо, плохо само получится!

Сегодня я припёр тебе Vim Master. Херабора для тех, кто хочет приручить Vim. Это не скучный тутор, а что-то вроде игрульки.

16 уровней, челледжи на скорость, бейджики, всё по красоте. Устанавливать ничего не нужно, работает прям в браузере. Но если очень хочется, то оно с открытым исходным кодом, можно и себе воткнуть при желании…
ㅤ
Есть два режима: Cheat Mode для новичков и Challenge Mode для тех, у кого писька уже подросла.

Потыкай на досуге, освежи мышечную память.

🛠 #games #vim
—
✅ @bashdays ✅ @linuxfactory ✅ @blog
Please open Telegram to view this post
VIEW IN TELEGRAM
160