MVP for hosting

This commit is contained in:
Maxim Khomutov 2023-12-15 16:21:59 +03:00
parent fec5db6efd
commit 9f26a11327
173 changed files with 93 additions and 3626 deletions

View File

@ -1,10 +1,10 @@
{
"index_name": "prod_akmalov",
"index_name": "prod_santaspeen",
"start_urls": [
"https://akmalov.com/"
"https://santaspeen.ru/"
],
"sitemap_urls": [
"https://akmalov.com/sitemap.xml"
"https://santaspeen.ru/sitemap.xml"
],
"sitemap_alternate_links": true,
"stop_urls": [],

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 85 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 242 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 127 KiB

View File

@ -1,56 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 19.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 374 93.5" style="enable-background:new 0 0 374 93.5;" xml:space="preserve">
<style type="text/css">
.st0{fill:#D8D8D8;}
.st1{fill:#68BC71;}
.st2{fill:#67B279;}
.st3{fill:#FFFFFF;}
</style>
<g>
<path class="st0" d="M296.4,50.1l-2.7-6.7h-13.2l-2.5,6.7h-9l14.3-34.2h8l14.2,34.2H296.4z M287.3,25l-4.3,11.7h8.6L287.3,25z
M266.8,36.6c0,2-0.3,3.8-1,5.5c-0.7,1.6-1.7,3.1-3,4.2c-1.3,1.2-2.9,2.1-4.7,2.8c-1.8,0.7-3.9,1-6.1,1c-2.3,0-4.3-0.3-6.2-1
c-1.8-0.7-3.4-1.6-4.6-2.8c-1.3-1.2-2.3-2.6-2.9-4.2c-0.7-1.6-1-3.5-1-5.5V15.9h8.3V36c0,0.9,0.1,1.8,0.4,2.6
c0.2,0.8,0.6,1.5,1.1,2.2c0.5,0.6,1.2,1.2,2,1.5c0.8,0.4,1.8,0.6,3,0.6s2.2-0.2,3-0.6c0.8-0.4,1.5-0.9,2-1.5
c0.5-0.6,0.9-1.4,1.1-2.2c0.2-0.8,0.3-1.7,0.3-2.6V15.9h8.4V36.6L266.8,36.6z M230.3,47.3c-1.7,0.8-3.6,1.5-5.9,2
c-2.2,0.5-4.7,0.8-7.3,0.8c-2.7,0-5.3-0.4-7.6-1.2c-2.3-0.8-4.3-2-5.9-3.5c-1.7-1.5-3-3.3-3.9-5.4c-0.9-2.1-1.4-4.4-1.4-7
c0-2.6,0.5-5,1.4-7.1c0.9-2.1,2.2-3.9,3.9-5.4c1.7-1.5,3.7-2.7,5.9-3.4c2.3-0.8,4.7-1.2,7.3-1.2c2.7,0,5.2,0.4,7.5,1.2
c2.3,0.8,4.2,1.8,5.6,3.1l-5.2,5.6c-0.8-0.9-1.9-1.6-3.2-2.2c-1.3-0.6-2.8-0.9-4.5-0.9c-1.4,0-2.8,0.3-4,0.8
c-1.2,0.5-2.3,1.2-3.2,2.1c-0.9,0.9-1.6,2-2.1,3.2c-0.5,1.3-0.8,2.7-0.7,4.1c0,1.5,0.2,2.9,0.7,4.1c0.4,1.3,1.1,2.3,2,3.2
c0.9,0.9,2,1.6,3.3,2.1c1.3,0.5,2.8,0.8,4.5,0.8c1,0,1.9-0.1,2.7-0.2c0.9-0.1,1.7-0.4,2.4-0.7v-5.9h-6.5v-6.3h14.1V47.3L230.3,47.3
z M374,32.9c0,3-0.6,5.6-1.7,7.8c-1,2.1-2.5,3.9-4.4,5.4c-1.8,1.4-3.9,2.5-6.2,3.1c-2.3,0.7-4.6,1-7,1h-12.8V15.9h12.4
c2.4,0,4.8,0.3,7.2,0.8c2.3,0.5,4.4,1.5,6.3,2.8c1.8,1.3,3.3,3.1,4.4,5.2C373.5,27,374,29.7,374,32.9L374,32.9z M365.4,32.9
c0-1.9-0.3-3.5-0.9-4.8c-0.6-1.2-1.4-2.3-2.5-3c-1.1-0.8-2.3-1.3-3.6-1.6c-1.4-0.3-2.7-0.5-4.1-0.5h-4.1v20h3.9
c1.5,0,2.9-0.2,4.3-0.5c1.3-0.3,2.5-0.9,3.6-1.7c1.1-0.8,1.9-1.9,2.5-3.1C365.1,36.4,365.4,34.8,365.4,32.9L365.4,32.9z
M193.8,32.9c0,3-0.6,5.6-1.7,7.8c-1,2.1-2.5,3.9-4.4,5.4c-1.8,1.4-3.9,2.5-6.2,3.1c-2.3,0.7-4.6,1-7,1h-12.8V15.9h12.4
c2.4,0,4.8,0.3,7.2,0.8c2.3,0.5,4.4,1.5,6.3,2.8c1.8,1.3,3.3,3.1,4.4,5.2C193.2,27,193.8,29.7,193.8,32.9L193.8,32.9z M185.2,32.9
c0-1.9-0.3-3.5-0.9-4.8c-0.6-1.2-1.4-2.3-2.5-3c-1.1-0.8-2.3-1.3-3.6-1.6c-1.4-0.3-2.7-0.5-4.1-0.5h-4.1v20h3.9
c1.5,0,2.9-0.2,4.3-0.5c1.3-0.3,2.5-0.9,3.6-1.7c1.1-0.8,1.9-1.9,2.5-3.1C184.9,36.4,185.2,34.8,185.2,32.9z M150.4,50.1l-2.7-6.7
h-13.2l-2.5,6.7h-9l14.3-34.2h8l14.2,34.2H150.4z M141.2,25l-4.3,11.7h8.6L141.2,25z M328.1,50.1l-7.2-13.6h-2.7v13.6h-7.9V15.9
h12.8c1.6,0,3.2,0.2,4.7,0.5c1.5,0.3,2.9,0.9,4.1,1.7c1.2,0.8,2.2,1.9,2.9,3.2c0.7,1.3,1.1,3,1.1,4.9c0,2.3-0.6,4.3-1.8,5.9
c-1.2,1.6-2.9,2.7-5.1,3.4l8.7,14.6H328.1z M327.7,26.4c0-0.8-0.2-1.5-0.5-2c-0.3-0.5-0.8-0.9-1.3-1.2c-0.5-0.3-1.1-0.5-1.7-0.6
c-0.6-0.1-1.2-0.1-1.9-0.1h-4.3v8h3.8c0.7,0,1.3-0.1,2-0.2c0.7-0.1,1.3-0.3,1.9-0.6c0.6-0.3,1-0.7,1.4-1.3
C327.6,27.9,327.7,27.2,327.7,26.4z M125.3,86.3V66.4h2.2v8.8h11.1v-8.8h2.2v19.9h-2.2v-8.9h-11.1v8.9L125.3,86.3L125.3,86.3z
M155.2,86.6c-5.9,0-9.8-4.7-9.8-10.3c0-5.5,4-10.3,9.8-10.3c5.9,0,9.8,4.7,9.8,10.3C165,81.8,161,86.6,155.2,86.6z M155.2,84.5
c4.4,0,7.5-3.6,7.5-8.2c0-4.5-3.2-8.2-7.6-8.2s-7.5,3.6-7.5,8.2C147.6,80.9,150.8,84.5,155.2,84.5z M169.6,86.3V66.4h2.2l7,10.8
l7-10.8h2.2v19.9h-2.2V70.2l-7,10.6h-0.1l-7-10.6v16.1H169.6L169.6,86.3z M193.4,86.3V66.4h13.9v2h-11.7v6.8h10.5v2h-10.5v6.9h11.9
v2C207.5,86.3,193.4,86.3,193.4,86.3z"/>
<g id="logo">
<g id="Group-10" transform="translate(12.000000, 12.000000)">
<g id="Group-9">
<g id="Group-8">
<g id="Group-7">
<path id="Path" class="st1" d="M33.6-12C19.4-12,2.2-8.6-12-1.3c0,15.9-0.2,55.7,45.6,82.8C79.5,54.4,79.3,14.7,79.3-1.3
C65.1-8.6,47.9-12,33.6-12L33.6-12z"/>
<path id="Combined-Shape" class="st2" d="M33.6,81.5C-12.2,54.4-12,14.7-12-1.3C2.1-8.6,19.3-12,33.6-12
C33.6-12,33.6,81.5,33.6,81.5z"/>
</g>
<path id="Fill-11" class="st3" d="M32,50.4l27.6-37.2c-2-1.6-3.8-0.5-4.8,0.4l0,0l-23,23.9l-8.7-10.4C18.9,22.4,13.3,26,12,27
L32,50.4"/>
</g>
</g>
</g>
</g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 38 KiB

View File

@ -1,198 +0,0 @@
---
slug: adguard-home
title: Adguard Home
description: Adguard Home DNS server guide
image: ./adguard_home_darkmode.svg
tags: [docker, homelab, networks]
keywords: [adguard, dns, homelab, docker, docker-compose, network, doh]
date: 2021-10-13T10:00
---
Простая установка и настройка домашнего DNS сервера с блокировкой рекламы и DOH (DNS over HTTPS)
[![Adguard logo](./adguard_home_darkmode.svg)](/blog/adguard-home)
<!--truncate-->
## Adguard Home DNS сервер
**Adguard Home DNS** - [Github](https://github.com/AdguardTeam/AdGuardHome) Open Source проект с открытым исходным кодом, возможность использовать как DNS сервер, DHCP, блокировать часть рекламного контента, устанавливать и настраивать различные фильтры.
В этой статье покажу установку с использованием docker-compose и настройку домашнего DNS сервера с блокировкой рекламы с использованием DoH (DNS-over-HTTPS). Можно использовать на виртуальной машине, отдельном сервере или на мини ПК например: Rasberry Pi
![Adguard home](https://cdn.adtidy.org/public/Adguard/Common/adguard_home.gif)
## 1. Подготовка среды
Буду устанавливать на LXC Proxmox
- OS: Ubuntu 22.02
- CPU: 2
- RAM: 1 Gb
- Disk: 10 Gb
Обновление пакетов и установка docker
```
apt update && apt upgrade -y
apt install -y curl
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
```
## 2. Настройка docker-compose.yaml
На официальной странице adguard home dns docker-hub приведен пример кода с docker run, но мне удобнее использовать docker compose
Команда для запуска docker
```
docker run --name adguardhome\
--restart unless-stopped\
-v /my/own/workdir:/opt/adguardhome/work\
-v /my/own/confdir:/opt/adguardhome/conf\
-p 53:53/tcp -p 53:53/udp\
-p 67:67/udp -p 68:68/udp\
-p 80:80/tcp -p 443:443/tcp -p 443:443/udp -p 3000:3000/tcp\
-p 853:853/tcp\
-p 784:784/udp -p 853:853/udp -p 8853:8853/udp\
-p 5443:5443/tcp -p 5443:5443/udp\
-d adguard/adguardhome
```
Описание используемых портов:
- `-p 53:53/tcp -p 53:53/udp` - для работы DNS сервера.
- `-p 67:67/udp -p 68:68/tcp -p 68:68/udp` - для работы DHCP сервера
- `-p 80:80/tcp -p 443:443/tcp -p 443:443/udp -p 3000:3000/tcp` - для доступа к Web панели и работы в режиме HTTPS/DNS-over-HTTPS
- `-p 853:853/tcp `- для работы в режиме DNS-over-TLS
- `-p 784:784/udp -p 853:853/udp -p 8853:8853/udp` - для DNS-over-QUIC
- `-p 5443:5443/tcp -p 5443:5443/udp` - для DNSCrypt
Описание docker-compose.yml
```docker
version: "3.8"
services:
adguardhome:
image: adguard/adguardhome:latest
hostname: adguard
volumes:
- ./adguard/work:/opt/adguardhome/work
- ./adguard/conf:/opt/adguardhome/conf
ports:
- 53:53/tcp
- 53:53/udp
- 80:80/tcp
- 443:443/tcp
- 443:443/udp
- 3000:3000/tcp
restart: unless-stopped
```
т.к. не планируется использовать в качестве DHCP сервера, DNSoQUIC, DNSCrypt отключил проброс не нужных портов
Но при попытке поднять данный контейнер, возникает ошибка
> Error starting userland proxy: listen tcp4 0.0.0.0:53: bind: address already in use
Говорит о том что 53 порт уже используется системой, посмотрим кто его занял
```bash
lsof -i :53
```
![53 port lissten](./53-port-listen.png "systemd-resolved занял 53 порт")
*systemd-resolved занял 53 порт*
Редактирую файл, где установлю DNSStubListener = no
```
nano /etc/systemd/resolved.conf
```
![system-resolve](./system-resolve.png "systemd-resolved")
```
[Resolve]
DNS=127.0.0.1
DNSStubListener=no
```
Сохраняю файл и перезапускаю службу
```bash
systemctl restart systemd-resolved.service
```
И можно запускать docker-compose
```bash
docker compose up -d
```
## 3. Настройка AdGuard Home
После успешного запуска контейнера, открываю Web интерфейс и продолжаю настройку
`http://YOUR-IP:3000/`
![adguard-home-docker](./adguard-home-docker.png "adguard-home-docker")
![adguard-dns](./adguard-dns.png "adguard-dns")
Далее установить логин и пароль, далее идет инструкция, жму готово. И перекидывает на основную панель.
На основном маршрутизаторе указываю IP этого хоста как основной DNS сервер
В целом можно уже в основных настройках DNS установить необходимый сервер, и начать пользоваться, далее необязательные настройки и дополнительные фичи.
### Черные списки DNS
Первым делом настраиваю черные списки DNS
![dns-black-list](./dns-black-list.png "dns-black-list")
Cсылки на URL DNS black-list, которые я использую:
- AdGuard DNS - `https://adguardteam.github.io/AdGuardSDNSFilter/Filters/filter.txt`
- AdAway Default Blocklist - `https://adaway.org/hosts.txt`
- MalwareDomainList.com - `https://www.malwaredomainlist.com/hostslist/hosts.txt`
В интернете так же можно найти более расширенные списки или добавить свои
### SSL сертификат
Настройки -> Настройки шифрования
![adguard-ssl](./adguard-ssl.png "adguard-sslt")
### DNS-Over-HTTPS (DoH)
![adguard-dns-over-https](./adguard-dns-over-https.png "Adguard DNS over HTTPS DoH")
Настройки - Настройки DNS
DNS Upstream необходимо указать тип DNS over HTTPS, установил такие:
- `https://dns.cloudflare.com/dns-query`
- `https://dns-unfiltered.adguard.com/dns-query`
Если при нажатии **TEST Upstream** нет ошибок, значит все установлено правильно и можно проверять.
**Проверка DNS over HTTPS**
для этого использую сервис Cloudflare [1.1.1.1/help](https://1.1.1.1/help)
![doh-test](./doh-test.png "Chech DNS over HTTPS")
**Проверка DNS блокировка рекламы**
Для тестирования использую сервис [checkadblock.ru](https://checkadblock.ru/)
![dns-block-adds](./dns-block-adds.png "dns-block-adds")
результаты блокировки рекламы
Но больше радует что в черные списки попадают сервисы сбора метрик и блокируется это наглядно можно увидеть в статистике главной панели
![adguard-dns-web-gui](./adguard-dns-web-gui.png "adguard-dns-web-gui")
где видно как Яндекс Станция активно пытается отправлять метрики, но их блокирует DNS Server.
**Дополнительные настройки**
Так же можно тонко настраивать клиентов и распределять их по группам с разными правилами, ручные записи DNS, белые списки, блокировать контент 18+ и т.д.
**Блокировка сервисов**
![dns-block-service](./dns-block-service.png "dns-block-service")
Позволяет быстро заблокировать популярные сайты и сервисы.
## Итоги
Очень интересный проект, мне кажется на данный момент самый лучший DNS сервер для дома, так же лицензия позволяет устанавливать в школах и образовательных учреждениях (для блокировки доступа к запрещенному контенту) и коммерческих организациях (возможно актуально для малого офиса для блокировки рекламы и отвлекающих сервисов)
Простота установки и настройки, удобный интерфейс управления.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

30
blog/blog-setup/index.md Normal file
View File

@ -0,0 +1,30 @@
---
slug: blog-setup
title: Установка этого блога к себе на сервер
description: Описание
image: ./logo.png
tags: [blog, javascript, nginx]
keywords: [docker, linux]
date: 2023-11-29
---
Описание для предварительного просмотра на главной странице
[![lan cache server](./logo.png)](/blog/blog-setup)
<!--truncate-->
### Введение
Blog posts support [Docusaurus Markdown features](https://docusaurus.io/docs/markdown-features), such as [MDX](https://mdxjs.com/).
:::tip
Use the power of React to create interactive blog posts.
```js
<button onClick={() => alert('button clicked!')}>Click me!</button>
```
<button onClick={() => alert('button clicked!')}>Click me!</button>
:::

Binary file not shown.

BIN
blog/blog-setup/logo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 180 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 232 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 51 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 130 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 315 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 526 KiB

View File

@ -1,127 +0,0 @@
---
slug: cache-server
title: Cache Server для компьютерного клуба
description: Сервер для компьютерного клуба. Cache Server позволяет разгрузить интернет канал и скачивать обновления по локальной сети
image: ./logo-lan-cache-server.png
tags: [docker, linux, networks]
keywords: [cache, cache-server, docker, linux]
date: 2019-07-12
---
Сервер для компьютерного клуба. Cache Server позволяет разгрузить интернет канал и скачивать обновления по локальной сети
[![lan cache server](./logo-lan-cache-server.png)](/blog/cache-server)
<!--truncate-->
## CACHE SERVER - Сервер кэширования
## Сервер для компьютерного клуба
## Введение
Один из компьютерных клубов просил помочь отладить сеть, так как появились жалобы от пользователей, что «тормозит интернет, пинги скачут, временами лагает». Было выявлено, что такие проблемы начинаются при большой нагрузке канала, при скачивании и обновлении игр. Более 30 компьютеров в клубе.
Установили основной маршрутизатор Mikrotik, настроили приоритизацию трафика, основная часть проблемы ушла.
Во время анализа сети, увидели, что большую часть трафика составляют обновления, которые каждый включенный компьютер начинает скачивать с интернета. Игр различных множество, многие обновления имеют не маленький объем.
## Задача
Планировалось установить локальный сервер к которому компьютеры будут обращаться за обновлениями. Когда первый компьютер в сети скачает обновления, эти данные останутся на сервере. В дальнейшем другие компьютеры, которые планируют скачать те же самые файлы, получат их напрямую с сервера, значительно быстрее и не нагружая интернет канал.
![cache-server-shema](./cache-server-shema.png)
## Реализация
### Оборудование
Буду использовать один из имеющихся обычных ПК в качестве сервера.
- CPU — Intel i3-10100
- RAM — 8Gb
- SSD 120 Gb — под ОС
- NVMe A-Data 1Tb — под кэш
Под кэш нужен быстрый NVMe диск, на надежность можно не обращать внимания т.к. никаких важных данных там не будет.
Так же обязательно наличие гигабитной сети в компьютерном клубе, иначе особо эффекта не будет. (1Gb порты на коммутаторах)
### Операционная система
Можно использовать любую ОС Linux которая по душе. Мне в плане администрирования удобнее сразу же накатить Proxmox, так же будет запас для будущих проектов.
### Linux Container
LXC контейнер для удобства установки. Ubuntu 21.04 template.
А внутри него уже докер
```
apt-get update && apt-get upgrade -y
apt-get install net-tools
apt-get install docker.io -y
apt-get install docker-compose
systemctl enable docker
systemctl start docker
reboot
systemctl status docker
```
## CACHE SERVER
GAME CACHE SERVER
Есть готовый сервис для этих целей от [LANCACHE.NET](https://lancache.net/)
```
git clone https://github.com/lancachenet/docker-compose lancache
cd lancache
nano .env
```
Файл конфигурации
![cache-server-config](./cache-server-config.png)
- LANCACHE_IP - aдрес LXC
- DNS_BIND_IP - aдрес LXC
- СACHE_DISK_SIZE - Размер диска под кэш
- NVMe TZ (time zone) — Asia/Yekaterinburg
Запуск
```
docker-compose up -d
docker stats
```
Должно быть запущено 2 сервиса. DNS и Cache
![cache-server-stats](./cache-server-stats.png)
## Тестирование
На компьютере в настройках IP адреса, редактирую DNS Server, меняю на адрес нашего LXC сервера.
Скачивание игры с любого ПК и пробую загрузить эту же игру с другого ПК.
![compare-game-cacheserver](./compare-game-cacheserver.png)
Для наглядного сравнения.
- С интернета — 10 Мбайт/c (80 Мбит/c)
- С кэш сервера — 80 Мбайт/c (640 Мбит/c)
![NFS-hot-gaming-lounge](./NFS-hot-gaming-lounge.png)
Здесь уже упираюсь в пропускную способность сети и дисков на ПК
Обновления до 1 Гб скачиваются по щелчку пальцев.
Заказчик доволен тесты прошли успешно.
## Итоги
По результатам кэш сервер для компьютерного клуба дает ощутимые результаты и сильно разгружает интернет канал.
Зачем скачивать одни и те же файлы с интернета если сервер может один раз скачать и поделится по локальной сети.
![cache-server-shema](./cache-server-shema-2.png)
![cache-server-shema](./cache-server-shema-3.png)
## P.S.
Статья старая, давно на деле не проверял, сам сервис тоже обновлялся поэтому лучше ориентироваться на [Github страницу](https://github.com/lancachenet/docker-compose) и инструкции на офф.сайте

Binary file not shown.

Before

Width:  |  Height:  |  Size: 235 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 685 KiB

View File

@ -1,141 +0,0 @@
---
slug: docusaurus-comments
title: Docusaurus комментарии
description: Add commenst docusaurus, добавление коментариев в docusaurus с использованием Giscus
image: ./docusaurus-comments.png
tags: [docusaurus, github]
keywords: [docusaurus, comments, github, blog]
date: 2023-06-17
---
Добавить комментарии, обсуждения в записях блога docusaurus
[![docusaurus comments](./docusaurus-comments.png)](/blog/docusaurus-comments)
<!--truncate-->
## Комментарии и обсуждения для блога
На мой взгляд это очень полезная штука.
- Комментарии дают возможность высказаться и поделиться своим мнением, задать вопросы или дополнить тему статьи.
- Для обсуждения идей и обмена знаниями, могут стимулировать дискуссии и помочь узнать что-то новое.
Искал разные решения и в итоге остановился на **Giscus**
Это opensource проект для добавления обсуждений через Discussions Github
Офф.сайт - [https://giscus.app/ru](https://giscus.app/ru)
## Настройка Github
### Включить обсуждения
Нужно активировать Discussion в настройках репозитория
![Discussion](./discussions-enable.png)
После этого для удобства удалил лишние категории, оставил только Generals
### Установка Giscus App
Установить для выбранного репозитория Giscus GitHub App
[https://github.com/apps/giscus](https://github.com/apps/giscus)
## Настройка Giscus
Установка пакета
```
npm add @giscus/react
```
Создание компонента
```
npm run swizzle @docusaurus/theme-classic BlogPostItem -- --wrap
```
Дання команда создаст файл по пути `src/theme/BlogPostItem/index.js`
Переименовать файл в **BlogPostItem.tsx** и положить уровнем выше в итоге получится `src/theme/BlogPostItem.tsx`
Содержание файла
```tsx
import React from 'react';
import BlogPostItem from '@theme-original/BlogPostItem';
import { useBlogPost } from "@docusaurus/theme-common/internal";
import Giscus from "@giscus/react";
export default function BlogPostItemWrapper(props) {
const { isBlogPostPage } = useBlogPost();
if (!isBlogPostPage) {
return <BlogPostItem {...props} />;
}
return (
<>
<BlogPostItem {...props} />
{(
<div className="docusaurus-blog-comments">
<Giscus
repo="akmalovaa/akmalov.com"
repoId="R_kgDOI0gPCg"
category="General"
categoryId="DIC_kwDOI0gPCs4CXR_A"
mapping="pathname"
reactionsEnabled="1"
emitMetadata="0"
inputPosition="bottom"
theme="dark"
lang={'ru'}
loading="lazy"
/>
</div>
)}
</>
);
}
```
:::tip
Можно сделать лучше и кусок с Giscus перенести в `src/components` а переменные через dotenv файл потдягивать
:::
Пока буду делать просто и топорно, т.к. github Discussion сейчас активно развивается и возможны изменения в API - необходимо будет быстро исправить.
Пройдемся по переменным:
- `repo` тут все понятно автор и репо
- `repoId` нужно будет вытащить через API
- `category` название категории в Discussion
- `categoryId` нужно будет вытащить через API
Удобнее всего ID вытаскивать через GraphQL запрос вытаскивать.
Если уже установлена Github CLI то можно выполнить команду:
```bash
gh api graphql -f query='{
repository(owner: "akmalovaa", name:"akmalov.com"){
id
discussionCategories(first:10) {
edges {
node {
id
name
}
}
}
}
}
'
```
Нужно подставить свои **owner** и repo **name**. В ответ придет json с ID репозитория и категорий.
Можно попробовать через Github API эти данные вытащить, но способ выше показался проще.
## Итого
Вроде без особых сложностей можно добавить комментарии в своем блоге с docusaurus.
Некоторые сервисы (аналоги giscus) используют для комментов `github issue`, но мне кажется `github discussions` лучше для этого подходит и по логике и по функционалу.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 51 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 28 KiB

View File

@ -1,172 +0,0 @@
---
slug: gitlab-auto-reviewers
title: Gitlab auto add reviewers
description: Gitlab auto assign reviewer for merge request
image: ./gitlab-reviewers.png
tags: [gitlab, devops, bash, python]
date: 2023-05-30
---
Gitlab auto assign reviewer — Автоматическое подставление assignee и reviewers при создании mergre request
[![nginx logo](./gitlab-reviewers.png)](/blog/gitlab-auto-reviewers)
<!--truncate-->
## Gitlab auto add reviewers
**Цель**: при создании Merge Request сделать удобное добавление ревьюверов
![mr reviewers](./mr.png "mr reviewers")
## 1. Reviewer templates
Первый способ который поможет в добавлении ревьюверов - это использование templates. Встроенная фича Gitlab, бесплатная для всех версий.
Документация - [Description templates](https://docs.gitlab.com/ee/user/project/description_templates.html)
### Подготовка
Нужно создать директорию ```.gitlab/merge_request_templates```
Создать внутри любой файл расширения ```.md```
Например ```top_reviewers.md```
С таким содержанием, где нужно добавить username ревьюверов:
```
/assign_reviewer @user1 @user2
```
![gitlab template](./gitlab-template.png "gitlab template")
### Использование
После добавления такого template, при создании новых MR появится дополнительное поле, где можно выбрать созданные шаблоны
![gitlab template](./gitlab-mr-template.png "gitlab template")
Удобный способ, особенно если несколько разных групп ревбюверов, можно создавать несколько частых шаблонов и использовать их.
## 2. Bash gitlab API
Данный способ - добавление скрипта в ```.gitlab-ci.yml``` CI/CD, который позволит через API автоматический добавлять ревьюверов
### Подготовка
Для отслеживания создания merge request можно использовать разные события(триггеры):
- Gitlab CI workflow event
- Schedules
- Прочие события
Я буду использовать `workflow — merge request event`, для этого добавил в **workflow** триггер на создание MR:
```YAML
workflow:
rules:
- if: $CI_PIPELINE_SOURCE == "merge_request_event"
```
Переменные **Settings -> CI/CD -> Variables**
- `$TOKEN` - Gitlab API Token
В gitlab runner где запускается pipeline нужен jq
Заранее установленый или доставить перед запуском скрипта:
```YAML
before_script:
- apt-get install jq -y
```
### Скрипт
Пошаговая логика скрипта:
- Получить последний merge request ID
- Получить ID автора merge request
- Назначить Assigne = ID Автора
- Назначить Reviewers = из переменной Reviewers(list)
```YAML
variables:
PROJECT_URL: 'https://gitlab.com/api/v4/projects/$CI_PROJECT_ID/merge_requests'
REVIEWERS: '10043654' # Reviewers Gitlab ID List
.gitlab_add_assignee_reviewers:
stage: set up merge request
script:
- read LAST_MR_ID < <(curl --header "PRIVATE-TOKEN:$TOKEN" "$PROJECT_URL" | jq '.[0] | .iid')
- read MR_AUTHOR < <(curl --header "PRIVATE-TOKEN:$TOKEN" "$PROJECT_URL/$LAST_MR_ID" | jq '.author | .id')
# add assignee
- curl -s --request PUT --header "PRIVATE-TOKEN:$TOKEN" "$PROJECT_URL/$LAST_MR_ID" --form "assignee_ids=$MR_AUTHOR" | jq '.assignees'
# add reviewers
- curl -s --request PUT --header "PRIVATE-TOKEN:$TOKEN" "$PROJECT_URL/$LAST_MR_ID" --form "reviewer_ids=$REVIEWERS"
```
## 3. Python gitlab API
Данный вариант более гибкий и удобный в плане доработок под разные условия.
Есть так же возможность вызывать как python script в ``gitlab-ci``
Полный код на [github](https://github.com/akmalovaa/gitlab-auto-add-reviewers/tree/master/Python)
Python/settings.py
```Python
GITLAB_API_ADDR = '<https://gitlab.com>' # Your Gitlab URL
GITLAB_TOKEN='YOUR GITLAB API TOKEN' # API Token use import .env
GITLAB_ROOT_GROUP = '' # Root Group optional
GITLAB_REVIEWERS: list = [10043654] # Gitlab Reviewrs ID
```
Python/main.py
```Python
import gitlab
import settings
import typing
gl = gitlab.Gitlab(settings.GITLAB_API_ADDR, private_token=settings.GITLAB_TOKEN)
def get_last_merge_requests() -> None:
""" Get last merg request """
if settings.GITLAB_ROOT_GROUP == '':
all_mr: typing.Any = gl.mergerequests.list(state="opened")
else:
all_mr: typing.Any = gl.groups.get(settings.GITLAB_ROOT_GROUP).mergerequests.list(state="opened")
try:
last_mr: gitlab.v4.objects.merge_requests.MergeRequest = all_mr[0]
except IndexError:
print("Merge requests - Not found")
return
_auto_add_responsible(last_mr)
def _auto_add_responsible(mr: gitlab.v4.objects.merge_requests.GroupMergeRequest) -> None:
project: gitlab.v4.objects.projects.Project = gl.projects.get(
mr.project_id, lazy=True
)
editable_mr: gitlab.v4.objects.merge_requests.ProjectMergeRequest = (
project.mergerequests.get(mr.iid, lazy=True)
)
editable_mr.assignee_id = mr.author["id"]
editable_mr.reviewer_ids = settings.GITLAB_REVIEWERS
print(editable_mr)
editable_mr.save()
if __name__ == "__main__":
get_last_merge_requests()
```
example for ```.gitlab-ci.yml```
```YAML
.python_add_reviewers:
script:
- pip install virtualenv
- virtualenv venv
- source venv/bin/activate
- pip install -r Python/requirements.txt
- python Python/main.py
```

Binary file not shown.

Before

Width:  |  Height:  |  Size: 41 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 163 KiB

View File

@ -1,171 +0,0 @@
---
slug: image-generator-python-flask-docker
title: Image generator
description: Image generator Python - Создать изображение необходимого размера веса
image: ./image-generator.png
tags: [docker, python, flask, image]
kewords: [image-generator, docker, flask, image-size, github]
date: 2022-01-23
---
Image generator Python — простой сервис для создания (генерации) изображений необходимого размера веса
[![Releases update info](./image-generator.png)](/blog/image-generator-python-flask-docker)
<!--truncate-->
## Image generator
Для тестирования одного приложения появилось потребность в изображениях разного веса (размера) от 1 до 120 Мб, искал различные генераторы изображений, ничего подходящего не обнаружил (только по разрешению и качеству при изменении которых не угадаешь какой размер получится на выходе — но можно конечно попробовать рассчитать)
Страница [Github](https://github.com/akmalovaa/image-generator)
## Принцип работы
- Ввод необходимого размер
- Выбор типа изображения (формат, расширение)
- Генерация изображения
Вроде все просто но на 3 пункте, немного подвис, если создавать изображения с помощью сторонних библиотек где можно задавать только высоту и ширину добиваясь этими параметрами нужных размеров файла было не удобно.
Решил немного схитрить, генерировать файл заполненный случайными данными нужного размера, архивировать его в zip и подсунуть как нагрузку к любому изображению
## Консольный вариант
В качестве шаблона изображения выбирает случайный файл в директории ./images
```python
import os.path
import zipfile
import random
def _get_image(extension) -> str:
"""Get random image from template desire extension (jpg, png)"""
images: list = []
for root, dirs, files in os.walk('images/'):
for f in files:
if f[-4:] == f'.{extension}':
images.append(f)
if images:
return(f'images/{random.choice(images)}')
else:
print(f'No found template images')
def generate_image(size: int = 1, image_type: str = 'jpg') -> None:
""" Generate binary file and create zip archive """
if os.path.exists(f"generated/{size}.{image_type}"):
return
size_byte: int = size*1024*1024
filename: str = 'workload.dat'
generated_zip: str = 'generated.zip'
with open('%s'%filename, 'wb') as fout:
fout.write(os.urandom(size_byte)) #1
with zipfile.ZipFile(generated_zip, mode="w") as archive:
archive.write(filename)
os.remove(filename)
""" Merge zip and jpg file """
jpg_file = open(_get_image(image_type), 'rb')
jpg_data = jpg_file.read()
jpg_file.close()
zip_file = open(generated_zip, 'rb')
zip_data = zip_file.read()
zip_file.close()
# merge zip-jpg
new_file = open(f'generated/{size}.{image_type}', 'wb')
new_file.write(jpg_data)
new_file.write(zip_data)
new_file.close()
# Remove generated zip
os.remove(generated_zip)
if __name__ == '__main__':
input_size = input ("Enter the desired image size (Mb): ")
try:
image_size = int(input_size)
except ValueError:
print("Not interesting value, need number(int)")
if image_size > 0 and image_size < 1000:
generate_image(image_size)
else:
print('Sorry, dont want to do this')
```
## Web версия
Использовал Flask + Bootstrap для оформления.
Ранее не приходилось делать веб скрипты, появилось желание посмотреть и попробовать.
Цели:
- Поле ввода размера файла в Mb (только цифры от 1 до 999)
- Выпадающий список формата файлов
- Кнопка
Так выглядит без оформления:
![simple-web](./simple-web.png)
С использованием стилей Bootstrap:
![Bootstrap-flask](./bootstrap.png)
## Контейнеризация
Ну и чтоб удобнее было использовать собрать все это в docker
Dockerfile:
```
FROM python:3.10.5-slim-buster
RUN apt update && apt upgrade -y && pip install poetry
WORKDIR /image-generator
COPY . .
RUN poetry config virtualenvs.create false
RUN poetry install
```
Для удобства запуска docker-compose
```yaml
docker-compose.yml:
version: '3.7'
services:
app:
build: ./
image: image-generator
ports:
- 80:80
command: "python app.py"
volumes:
- ./images:/images
- ./generated:/generated
```
## Запуск
На сервере или VM с установленным docker, docker-compose
```bash
git clone https://github.com/akmalovaa/image-generator.git .
docker-compose up -d --build
```
## Заключение
Еще много всего можно доработать, и возможно лучше брать реальный расчет и генерировать нормальные изображения.
Цель достигнута познакомился с Flask скрипт работает, быстро и удобно разворачивается
![result-files](./result-files.png)
![file-info](./file-info.png)
Файлы открываются в Windows, Photoshop и WinRAR
Если изменить изображение в редакторе и сохранить нагрузочный архив исчезнет и картинка станет оригинального размера.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.7 MiB

View File

@ -1,169 +0,0 @@
---
slug: mikrotik-nginx
title: Mikrotik nginx reverse proxy
description: Mikrotik container nginx reverse proxy RouterOS container
image: ./logo.png
tags: [homelab, linux, networks]
keywords: [mikrotik, nginx, reverse-proxy, container, docker]
date: 2023-11-29
---
Mikrotik запустить NGINX Reverse Proxy как контейнер в роутере
[![mikrotik nginx container](./logo.png)](/blog/mikrotik-nginx)
<!--truncate-->
## Введение
## О контейнерах в Router OS
Начиная с RouterOS v7.4 и выше, в mikrotik подвезли такую штуку как **Container**, работает на устройствах **arm, arm64, x86**
Страница с описанием и примерами настроек на wiki [help.mikrotik.com](https://help.mikrotik.com/docs/display/ROS/Container)
Мне очень нравятся контейнеры, люблю Docker и с такой фичей возможности домашнего роутера теперь ограничиваются только фантазией и ресурсами
Про ресурсы, для тестов имеется устройство Mikrotik hap ax3 (C53UiG+5HPaxD2HPaxD) [спецификация](https://mikrotik.com/product/hap_ax3):
- **Architecture:** ARM 64bit
- **CPU:** IPQ-6010, 4 core, (864 - 1800) MHz
- **Size of RAM:** 1 GB
- **Storage size:** 128 MB
В целом 1Gb (из них свободно примерно 650Mb) не так и много на сегодня, что же можно там поднять? На сайте wiki разработчики показывают примеры с
- PiHole (DNS Server с возможностями блокировки рекламы) мне больше нравится его аналог AdguardHome
- freeradius server - не знаю, насколько актуален сегодня radius server
- mosquitto MQTT - Message Queuing Telemetry Transport (MQTT) Protocol. Для интернета вещей
- ThingsBoard MQTT/HTTP server - еще одна платформа для интернета вещей
:::tip Совет с официального сайта
Внедрение функции контейнера в RouterOS позволило запускать серверы для выполнения всевозможных задач внутри маршрутизатора. Это особенно актуально для людей, которые хотят уменьшить количество устройств в своей сети.
Вместо того, чтобы запускать сервер на отдельном устройстве/машине, почему бы не запустить его внутри маршрутизатора?
[![farcry](./farcry.png)](./farcry.png)
:::
## RouterOS nginx reverse proxy
На данный момент в качестве прокси сервера стоит отдельная виртуальная машина, на котором пробовал различные инструменты (nginx, traefik, caddy)
Попробую перенести и запустить это внутри маршрутизатора, выбрал **nginx** т.к. по ресурсам RAM, он потребляем меньше всего
### Подготовка
Функция **container** по умолчанию отключена, нужен физический доступ к маршрутизатору для включения
:::warning Disclaimer
- Запуск образа контейнера на вашем маршрутизаторе может открыть брешь в системе безопасности
- Если маршрутизатор взломан, контейнеры могут быть использованы для простой установки вредоносного программного обеспечения на ваш маршрутизатор и по сети
:::
Разработчики настаивают на использовании внешненго накопителя (usb, ssd), чтобы не насиловать файловую систему самого роутера. Установил туда небольшого размера флешку на 32Gb
[![mikrotik-usb](./mikrotik-usb.jpg)](./mikrotik-usb.jpg)
Имеется поддержка USB 3.0
[![mikrotik-usb-disk](./mikrotik-usb-disk.png)](./mikrotik-usb-disk.png)
**RouterOS**
1. Необходимо скачать [**Extra packages** с официального сайта](https://mikrotik.com/download) выбрав нужную архитектуру
В архиве несколько разных расширений, пример названия - `container-7.xx.x-arm64.npk`. Установить и перезагрузить
2. В терминале выполнить команду для включения функции **Container**
```
/system/device-mode/update container=yes
```
После этого в терминале напишет сообщение, что нужно подтвердить нажатием кнопки сброса или перезагрузкой по питанию
### Запуск nginx container
Добавить виртуальный интерфейс
```
/interface/veth/add name=veth1 address=172.17.0.2/24 gateway=172.17.0.1
```
Если нужно настроить для этого адреса NAT, добавить в bridge, проверить правила firewall
Настройка конфигурации **container**
```
/container/config/set ram-high=200 registry-url=https://registry-1.docker.io tmpdir=usb1/tm
```
[![routeros-container-config](./routeros-container-config.png)](./routeros-container-config.png)
**RAM Hight** - Ограничение использования оперативной памяти (по умолчанию без лимита, рекомендую указать)
**Mount Points**
Точки монтирования зависят от конфигурации которую планируется использовать.
>Свою конфигурацию NGINX [прикладываю на Github](https://github.com/akmalovaa/mikrotik-nginx)
Структура каталогов:
[![nginx-dir](./nginx-dir.png)](./nginx-dir.png)
В моей конфигурации для упрощения все хосты находятся в отдельных файлах
`config/proxy_host/*.conf`. Удобно при добавлении/удалении новых хостов - просто скопировать файл и изменить адрес, порт, домен (для отключения просто удалить файл). Остальные файлы конфигурации при этом можно вообще не трогать.
```
/container/mounts/add dst=/etc/nginx/nginx.conf name=nginx_conf src=/usb1/nginx/nginx.conf
/container/mounts/add dst=/etc/nginx/certs name=certs src=/usb1/nginx/certs
/container/mounts/add dst=/data name=nginx_data src=/usb1/nginx/data
/container/mounts/add dst=/etc/nginx/conf.d name=nginx_confd src=/usb1/nginx/config
```
:::tip Работа с файлами
Для удобства конфигурации и работы с файлами можно включить **IP -> SMB** и расшарить USB по сети
:::
Буду использовать [nginx alpine с docker hub](https://hub.docker.com/_/nginx)
На сегодня последняя версия это `nginx:1.25.3-alpine`
```
/container/add remote-image=nginx:1.25.3-alpine interface=veth1 root-dir=usb1/docker/nginx mounts=nginx_conf,nginx_confd,nginx_data,certs
```
Указать образ, виртуальный интерфейс, монтируемые директории,
[![mikrotik-container](./mikrotik-container.png)](./mikrotik-container.png)
Дополнительные возможности:
- передать ENV переменные
- запускать контейнер при включении роутера
- переопределять CMD и Entrypoint
- и т.д.
**root-dir** - используется как изолированная файловая система для контейнера (в docker **var/lib/docker/volume**)
## Итоги
### nginx container
NGINX запущен и работает, конфигурацию менять не очень удобно, как вариант можно использовать **Nginx Proxy Manager**
**Nginx Proxy Manager** - opensource проект, где в одном контейнере web-gui, db, nginx, certbot (и даже API для конфигурации)
- [Github проекта](https://github.com/NginxProxyManager/nginx-proxy-manager)
- [Статья](https://akmalov.com/blog/nginx-proxy-manager)
но, он использует гораздо больше **RAM** если на 1Gb запускать только его - думаю потянет.
Есть мысли как даже с минимальным nginx сделать удобнее изменение конфигурации, но пока ничего не сделано
### container stats
На данный момент нет возможности удобно смотреть в mikrotik сколько ресурсов использует тот или иной контейнер, не очень удобно
### что еще позапускать
- AdguardHome - можно, не особо требователен к ресурсам
- Home Assistant - не хватит ресурсов
- Альетрнативные reverse proxy - аналоги treafik, caddy
- Python, bash, go - различные скрипты для расширения функциональности роутера
- Prometheus exporter - было бы удобнее мониторить
- Статичные сайты - без проблем
- NextCloud, DB, S3, хранение файлов - попахивает извращением
- Speedtest - различные контейнеры которые позволяют проверять канал, скорость USB + RAM наверное подставят
Другие предложения, для чего еще можно использовать контейнеры в роутере микротик напижите пожалуйста в комментариях

Binary file not shown.

Before

Width:  |  Height:  |  Size: 837 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 384 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 80 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 208 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 58 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 241 KiB

View File

@ -1,207 +0,0 @@
---
slug: monitoring-pc-club
title: Мониторинг для компьютерного клуба
description: Система мониторинга в компьютерном клубе
image: ./monitoring-pc-club.png
tags: [docker, monitoring]
keywords: [monitoring, docker, linux, prometheus, grafana, monitoring]
date: 2023-05-28
---
Система мониторинга дает возможность отслеживать и оперативно узнавать об ошибках в работе и общей нагрузке на оборудование.
[![Releases update info](./monitoring-pc-club.png)](/blog/monitoring-pc-club)
<!--truncate-->
## Зачем мониторинг?
Благодаря мониторингу можно увидеть полноценную картину использования и работоспособности оборудования.
Позволяет многие технические проблемы решать до их проявления и улучшать качество обслуживания пользователей.
## Что мониторить?
- CPU (нагрузка на процессор, температура)
- GPU (нагрузка на видеокарту, температура)
- RAM (нагрузка на оперативную память)
- SSD, HDD (состояние дисков, свободный объем)
- Любая другая полезная информация, которую необходимо вывести
## Как мониторить?
Основная связка Prometheus + Grafana
Это самые популярные сервисы для мониторинга, быстрые и удобные
### Prometheus
Собирает и хранит все метрики. Сам ходит к каждому компьютеры и собирает нужную информацию
### Grafana
Берет данные с Prometheus и позволяет красиво все отобразить. Главная панель мониторинга
### Exporters
**Экспортер** - представляет собой службу, которая собирает информацию о системе и подготавливает ее в формате понятным для Prometheus. На каждом компьютере с которого нужная информация, должен быть запущен exporter
![monitoring](./monitoring.jpg)
## Подготовка сервера
Сервер или виртуалка с Linux (я использовал Ubuntu но для docker разницы нет)
### docker-compose
Для удобства обслуживания будет использоваться docker-compose
```YAML
version: "3.7"
services:
prometheus:
image: prom/prometheus:v2.44.0
container_name: prometheus
command:
- '--config.file=/etc/prometheus/prometheus.yml'
- '--storage.tsdb.path=/prometheus'
- '--web.console.libraries=/etc/prometheus/console_libraries'
- '--web.console.templates=/etc/prometheus/consoles'
- '--storage.tsdb.retention.time=30d'
- '--web.enable-lifecycle'
- '--web.external-url=https://prom.akmalov.com'
environment:
- TZ="Asia/Yekaterinburg"
ports:
- 9090:9090
volumes:
- ./prometheus/config:/etc/prometheus/
- ./prometheus/data:/prometheus/
restart: unless-stopped
grafana:
image: grafana/grafana:9.5.3-ubuntu
container_name: grafana
depends_on:
- prometheus
ports:
- 3000:3000
volumes:
- ./grafana/data:/var/lib/grafana
- ./grafana/provisioning:/etc/grafana/provisioning
environment:
- GF_SECURITY_ADMIN_USER=admin
- GF_SECURITY_ADMIN_PASSWORD=12345
- GF_USERS_ALLOW_SIGN_UP=false
- TZ="Asia/Yekaterinburg"
- BROWSER_TZ="Asia/Yekaterinburg"
restart: unless-stopped
```
### Конфигурация prometheus
Создать файл конфига по пути:
``` ./prometheus/config/prometheus.yml ```
В данном примере добавлены 5 ПК, отдельные job для Windows и GPU экспортеров
```
global:
scrape_interval: 15s
evaluation_interval: 15s
- job_name: 'GPU'
metrics_path: '/metrics'
scrape_interval: 5s
static_configs:
- targets:
- 192.168.18.11:9835
- 192.168.18.12:9835
- 192.168.18.13:9835
- 192.168.18.14:9835
- 192.168.18.15:9835
labels:
metrics: nvidia
- job_name: 'Windows'
metrics_path: '/metrics'
scrape_interval: 5s
static_configs:
- targets:
- 192.168.18.11:9182
- 192.168.18.12:9182
- 192.168.18.13:9182
- 192.168.18.14:9182
- 192.168.18.15:9182
labels:
metrics: OS
```
Создание config файла можно сильно упросить и автоматизировать с помощью Ansible
## Подготовка компьютеров
В данном случаи понадобиться установить два экспортера:
### [windows exporter](https://github.com/prometheus-community/windows_exporter)
[Windows Exporter](https://github.com/prometheus-community/windows_exporter) - позволяет мониторить состояние операционной системы Windows и собирать метрики для дальнейшей обработки, выводит различные параметры и характеристики Windows, такие как:
- Использование процессора и памяти;
- Загрузка дисков и средств хранения;
- Статистика сетевых интерфейсов;
- Статистика работы служб и сервисов Windows;
- Информация о запущенных процессах и открытых сокетах;
- Информация о состоянии производительности IIS и многие другие параметры.
Использование Windows Exporter позволяет проводить мониторинг и анализ состояния Windows и быстро реагировать на возможные проблемы, такие как ограниченная производительность, низкая доступность ресурсов и другие. Благодаря этому инструменту можно повысить стабильность и надежность работы системы Windows, а также улучшить качество обслуживания пользователей.
### [nvidia gpu exporter](https://github.com/utkuozdemir/nvidia_gpu_exporter)
[Nvidia GPU exporter](https://github.com/utkuozdemir/nvidia_gpu_exporter) - позволяет получать всю информация о видеокарте
## Настройка Grafana
Далее необходимо настроить Grafana (WEB интерфейс доступен по адресу сервера c docker на порту 3000)
`Configuration -> Data source -> Add Prometheus`
![grafana data source](./grafana-data-source.png)
Для того чтобы убедиться что все работает корректно, можно скачать и добавить готовые dashboard в графана
- [Windows exporter dashboard](https://grafana.com/grafana/dashboards/14694-windows-exporter-dashboard/)
- [Nvidia GPU dashboard](https://grafana.com/grafana/dashboards/14574-nvidia-gpu-metrics/)
`Dashboard -> Import -> JSON file`
### Windows exporter dashboard
![Windows exporter dashboard](./windows-exporter.png)
### Nvidia GPU exporter dashboard
![Nvidia GPU exporter dashboard](./nvidia-gpu-exporter.png)
## Создание собственной панели мониторинга
Теперь осталась создать свой dashboard и собрать в удобном виде все необходимые метрики
Для себя выбрал следующий тип отображения (в одну линию все необходимые данные)
![grafana pc dashboard](./grafana-pc-monitoirng.png)
## Итоги
Prometheus и Grafana дают возможность настроить удобный монитиринг для компьютерного клуба.
Легко установить, использовать, обслуживать.
Для большого числа компьютеров удобнее использовать Ansible для автоматической установки экспортеров и подготовки конфигурационного файла с помощью шаблонизатора.
Так же экспортеры можно встроить в установку с операционной системой, в таком случаи все новые компьютеры автоматически будут попопадть в систему мониторинга.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 304 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.0 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 237 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 147 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 226 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 114 KiB

View File

@ -1,180 +0,0 @@
---
slug: monitoring-web-hosts
title: Monitoring web hosts
description: monitoring web ssl certificate expried uptime kuma grafana prometheus docker
image: ./monitoring-web-hosts-logo.png
tags: [monitoring, ssl, docker]
keywords: [monitoring, grafana, ssl, telegram, prometheus, docker]
date: 2023-07-13T10:42
---
self-hosted сервер мониторинга доступности хостов, времени действия SSL сертификатов с оповещениями в telegram
[![Monitoring web hosts](./monitoring-web-hosts-logo.png)](/blog/monitoring-web-hosts)
<!--truncate-->
## Uptime-kuma
Если вам нужен самый простой и удобный инструмент мониторинга хостов, который можно поднять у себя на сервере проще воспользоваться сервисом `Uptime-Kuma`
[Uptime-Kuma](https://github.com/louislam/uptime-kuma)
![Uptime-Kuma](./uptime-kuma.jpg)
Главные фишки:
* Мониторинг HTTP(s) / TCP / HTTP(s) Keyword / HTTP(s) Json Query / Ping / DNS
* Лекго и просто развернуть в docker-compose
* Удобный и понятный графический интерфейс
* Оповещения в Telegram, Discord, Slack, Email (SMTP) и т.д.
* Информация о сертификате (SSL Certificate info)
* Поддержка Proxy и 2FA
При обнаружении проблем с доступностью, Uptime-Kuma быстро уведомляет пользователя различными способами, включая такие популярные платформы, как Telegram, Discord и Slack.
Аналитические функции, такие как графики и статистика, предоставляют полезные данные для понимания причин проблем с доступностью, помогая пользователям своевременно реагировать и улучшать свои сервисы.
В целом, Uptime-Kuma - это незаменимый инструмент для тех, кто хочет быть уверенным в непрерывной работе и доступности своих веб-сервисов.
## Сервер мониторинга
Если уже используется стэк для мониторинга Promeheus + Grafana можно воспользваться blackbox exporter и сделать удобный Dashboard для себя. Об этом сейчас и буду писать подробнее
**Простой пример мониторинга хостов и истечения срока действия SSL-сертификата**
[![Grafana ssl certificate expires](./grafana-ssl-certificate-expires.png)](./grafana-ssl-certificate-expires.png)
Используется следующие сервисы:
- Prometheus (сбор и база данных)
- Grafana (отображение данных)
- Blackbox (мониторинг http)
- Alertmanager (уведомления)
### Установка
Сам проект на [Github monitoring hosts](https://github.com/akmalovaa/monitoring-hosts-cert/tree/main)
используется docker-compose 🐳
```bash
git clone https://github.com/akmalovaa/monitoring-hosts-cert.git
cd monitoring-hosts-cert
```
- Изменить конечные хосты `/prometheus/prometheus.yml`
- Настройка для отправки сообщений в телеграм `/alertmanager/config.yml`
- Добавить права на директорию для графаны:
``` bash
chmod -R 777 data/grafana/
```
Запустить сервисы
```bash
docker-compose up -d
```
Проверить сервисы
```bash
docker-compose ps
```
Telegram уведомления:
![telegram alertmanager](./telegram-alertmanager.png)
---
### Дополнительные материалы
* Grafana labs - [Dashboard](https://grafana.com/grafana/dashboards/13230-certificate-monitor/)
* Grafana blog - [Post SSL alerting](https://grafana.com/blog/2020/11/25/how-we-eliminated-service-outages-from-certificate-expired-by-setting-up-alerts-with-grafana-and-prometheus/)
* Github Prometheus, Grafana, blackbox, alertmanager + caddy - [docker-compose example](https://github.com/stefanprodan/dockprom/tree/master)
#### Настройки Alertmanager telegram
##### Bot token
Создайте бота и получите ключ API бота в канале [BotFather](https://t.me/BotFather)
##### Получить Chat ID telegram
Напишите пару тестовых сообщений созданному только что боту, затем выполните запрос
```bash
curl https://api.telegram.org/bot<TOKEN>/getUpdates | jq
```
#### docker-compose
```
version: "3.7"
services:
prometheus:
container_name: prometheus
image: prom/prometheus:v2.46.0
command:
- '--config.file=/etc/prometheus/prometheus.yml'
- '--storage.tsdb.path=/prometheus'
- '--web.console.libraries=/etc/prometheus/console_libraries'
- '--web.console.templates=/etc/prometheus/consoles'
- '--storage.tsdb.retention.time=30d'
- '--web.enable-lifecycle'
user: root
ports:
- 9090:9090
volumes:
- ./prometheus:/etc/prometheus/
- ./data/prometheus:/prometheus/
restart: unless-stopped
environment:
- TZ="Asia/Yekaterinburg"
blackbox:
container_name: blackbox
image: prom/blackbox-exporter:v0.24.0
command:
- '--config.file=/config/blackbox.yml'
ports:
- 9115:9115
restart: unless-stopped
volumes:
- ./blackbox:/config
alertmanager:
container_name: alertmanager
image: prom/alertmanager:v0.25.0
command:
- '--config.file=/etc/alertmanager/config.yml'
- '--storage.path=/alertmanager'
ports:
- 9093:9093
volumes:
- ./alertmanager:/etc/alertmanager/
restart: unless-stopped
grafana:
container_name: grafana
image: grafana/grafana:10.0.3-ubuntu
depends_on:
- prometheus
ports:
- 3000:3000
volumes:
- ./data/grafana:/var/lib/grafana
- ./grafana/dashboards:/etc/grafana/provisioning/dashboards
- ./grafana/datasources:/etc/grafana/provisioning/datasources
restart: unless-stopped
environment:
- GF_SECURITY_ADMIN_USER=${ADMIN_USER:-admin}
- GF_SECURITY_ADMIN_PASSWORD=${ADMIN_PASSWORD:-admin}
- GF_USERS_ALLOW_SIGN_UP=false
- TZ="Asia/Yekaterinburg"
```

Binary file not shown.

Before

Width:  |  Height:  |  Size: 135 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 107 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 112 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 139 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

View File

@ -1,186 +0,0 @@
---
slug: nginx-proxy-manager
title: NGINX Proxy Manager
description: NGINX Proxy Manager - сервис (WEB GUI) для управления конфигурацией NGINX
image: ./nginx-proxy-manager-logo.png
tags: [docker, homelab, nginx]
keywords: [nginx, proxy, manager, web, gui, docker, docker-compose]
date: 2022-01-08
---
NGINX Proxy Manager - сервис (WEB GUI) для управления конфигурацией NGINX. Идет как готовый docker контейнер, в проекте реализовано максимально простое и удобное управление основными базовыми функциями NGINX.
[![nginx logo](./nginx-proxy-manager-logo.png)](/blog/nginx-proxy-manager)
<!--truncate-->
## NGINX Proxy Manager
Open Source проект ссылки на [Github](https://github.com/NginxProxyManager/nginx-proxy-manager) и [Офф сайт](https://nginxproxymanager.com/)
Возможности:
- Простой и удобный web интерфейс
- Легкая настройка проксирования без редактирования nginx config файла
- Управление пользователями, разрешения и журнал аудита
- Возможность установить свои или сгенерировать SSL сертификаты
- Контроль доступа, средства авторизации, разрешенные и запрещенные адрес листы.
Основное назначение это проксирование по URL домена.
Например имеются 3 домена:
- akmalov.com
- test.akmalov.com
- lvl.akmalov.com
Все домены обращаются по одному внешнему IP на маршрутизатор
Маршрутизатор перенаправляет все соединения которые идут на 80 или 443 порт на NGINX Proxy Manager
NGINX в зависимости от домена перенаправляет на необходимый сервер, VM, Container в локальной сети. Подставляет сертификат, управляет разрешениями.
![nginx exmaple shema](nginx-exmaple-shema.png "Схема использования NGINX Poroxy Manager")
### Установка NGINX Proxy Manager
#### 1. Подготовка среды
Буду устанавливать на LXC Proxmox
- OS: Ubuntu 22.02
- CPU: 2
- RAM: 1 Gb
- Disk: 10 Gb
Обновление пакетов и установка docker
```
apt update && apt upgrade -y
apt install -y docker.io docker-compose
```
#### 2. Настройка docker-compose.yaml
```YAML
version: "3"
services:
nginx-proxy-manager:
image: 'jc21/nginx-proxy-manager:latest'
restart: unless-stopped
ports:
- '80:80' # HTTP port
- '443:443' # HTTPS port
- '81:81' # Admin web port
volumes:
- ./data:/data
- ./letsencrypt:/etc/letsencrypt
```
По умолчанию создается файловая база данных SQLite - `data/database.sqlite`
Есть так же решения c использованием отдельной базы данных MySQL на офф.сайте.
В моем случаи SQLite хватает с огромным запасом
Запуск контейнера
```
docker-compose up -d
```
После запуска контейнера, можно подключиться к панели администратора
`http://YOUR-IP:81/`
Логин и пароль по умолчанию
```
Email: admin@example.com
Password: changeme
```
При первом запуске предложит настроить админскую учетную запись и изменить пароль
### Настройка NGINX Proxy Manager
Так выглядит изначально GUI главного экрана (Все по нулям т.к. ничего не добавляли еще)
![nginx proxy manager web](web-main.png "gui nginx proxy manager web")
SSL сертификаты есть возможность сгенерировать с помощью Let'Encrypt в одно нажатие или добавить свои сертификаты
![nginx proxy manager ssl](ssl-generate.png "Панель добавления или создания сертификата SSL")
### Настройка Host Proxy NGINX
Все также интуитивно понтяно, прописываю домен, порт, если нужно подставляю сертификат SSL для HTTPS
![nginx proxy manager proxy host1](add-host1.png "Добавление proxy host")
![nginx proxy manager proxy host3](add-host3.png "Добавление proxy host")
Для работы доменов из локальной сети необходимо в DNS домены которые добавлены в Proxy Host направлять на адрес NGINX Proxy Manager
В общем и целом этого хватает для решения задач которые описал выше. Хоть и конфиг был бы не такой сложной, но с помощью этого сервиса можно это сделать в несколько кликов.
## Дополнительные функции
Распишу еще кое какие полезные фичи, которые использую у себя
### Dashboard для nginx proxy manager
Проект отнсительно свежий и активно разрабаывается, выглядит интересно
[Ссылка на Git автора](https://github.com/xavier-hernandez/goaccess-for-nginxproxymanager)
![nginx proxy manager dashboard](monitoring.png "nginx proxy manager мониторинг")
Красивый графический вывод информации на основе логов, позволяет посмотреть статистику, оценить нагрузку. Написано на Go работает быстро, даже с большим объемом данных, не потребляет много ресурсов.
В docker-compose необходимо указать путь к логам от nginx proxy manager
### Страница 404 для nginx proxy manager
Nginx позволяет вместо ошибки 404 сделать redirect на любой другой хост или даже указать свой HTML код
![nginx proxy manager custom 404](404-host.png "nginx proxy manager 404")
Воспользуюсь Redirect и сделаю красивую страницу для 404
[Ссылка на Docker Hub проекта](https://hub.docker.com/r/kale5/rickroll)
![nginx proxy manager custom 404](rick.jpeg "nginx proxy manager 404 rickroll")
Теперь вместо страницы ошибок он будет перенаправлять на этот URL, с качественным видео
### Итоговый docker-compose
В итоге конечный docker-compose у меня выглядит так:
```YAML
version: "3"
services:
nginx-proxy-manager:
image: 'jc21/nginx-proxy-manager:latest'
restart: unless-stopped
ports:
- '80:80' # HTTP Port
- '443:443' # HTTPS Port
- '81:81' # Admin Web Port
volumes:
- ./data:/data
- ./letsencrypt:/etc/letsencrypt
npm-monitoring:
image: xavierh/goaccess-for-nginxproxymanager:latest
restart: always
environment:
- TZ=Asia/Yekaterinburg
- SKIP_ARCHIVED_LOGS=True #optional
- EXCLUDE_IPS=127.0.0.1 #optional
- LOG_TYPE=NPM
ports:
- '82:7880'
volumes:
- ./data/logs:/opt/log
error-page-404:
image: 'kale5/rickroll:latest'
restart: unless-stopped
ports:
- '83:80'
```
## Итоги
Мне очень нравится этот сервис позволяет быстро легко поднять и настроить NGINX, каких-то проблем с ним не было, сам продлевает сертификаты, одним словом настроил и забыл и иногда только заходил и через web добавлял новые хосты в 2-3 клика.
Так же есть аналог - Traefik, на данный момент активно его изучаю, но там нет удобного интерфейса и вся настройка через конфиги, т.к. больше погружаюсь в автоматизацию и много сервисов которые надо динамически настраивать, больше упор именно на traefik идет.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 117 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 578 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 73 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 112 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 237 KiB

View File

@ -1,71 +0,0 @@
---
slug: rdp-wrapper
title: RDP wrapper
description: Что такое RDP wrapper, как его устанавливать, краткая инструкция как создать пользователя для удаленного рабочего стола
image: ./logo-rdpwrap.png
tags: [rdp, windows, server]
keywords: [rdp, windows, server, wrapper, rdp-wrapper]
date: 2019-06-21
---
Для чего нужен RDP wrapper для дома, как его устанавливать, краткая инструкция как создать пользователя для удаленного рабочего стола
[![rdp wrapper](./logo-rdpwrap.png)](/blog/rdp-wrapper)
<!--truncate-->
## Для чего нужен RDP wrapper?
### Про стандартный RDP
RDP (Remote Desktop Protocol) — дословно протокол Удаленного Рабочего Стола. Позволяет подключится к компьютеру по IP адресу с любого другого компьютера.
Подключение по протоколу RDP осуществляется между компьютерами, находящимися в одной локальной сети, или по интернету, но для этого потребуются дополнительные действия проброс порта 3389 на роутере, либо соединение с удаленным компьютером по VPN.
Для подключения к удаленному рабочему столу , необходимо разрешить удаленное подключение — Свойства компьютера — дополнительные параметры системы — удаленный доступ
![access rdp](./access_rdp.png)
- **Windows 10 Home** — данная функция отключена
- **Windows 10 Pro** — позволяет одновременно использовать только одно подключение под выбранным пользователем
- **Windows Server** — позволяет подключаться сразу с нескольких устройств, под разными пользователями и работать одновременно.
При подключении используются все ресурсы удаленного компьютера, позволяет передавать принтеры, буфер обмена, диски, порты, устройства захвата. Благодаря этому часто в организациях ставят мощный сервер, а пользователям дают монитор с мышкой, клавиатурой и слабенький ПК в качестве тонкого клиента, который служит только для подключения к серверу. При этом все пользователи будут полноценно работать на производительном сервере.
![nuc-monitor](./nuc-monitor.png "тонкий клиент")
Так же RDP часто используется в 1С для работы с файловой базой данных
### О RDPwrapper
Была такая репа на Github [https://github.com/stascorp/rdpwrap](https://github.com/stascorp/rdpwrap)
Цель этого проекта - включить поддержку хоста удаленного рабочего стола и одновременные сеансы RDP в системах с ограниченной функциональностью для домашнего использования.
т.е. позволяет на любой системе использовать все преимущества RDP как в Windows Server, что является нарушением лицензии и делать такое нельзя. Далее в ознакомительных целях
## Установка
1. Отключить антивирус, создать папку C:\Program Files\RDP Wrapper и добавить его в ислючение
2. [Скачать RDP Wrapper](https://github.com/stascorp/rdpwrap/releases/download/v1.6.2/RDPWrap-v1.6.2.zip) и распаковать в ранее созданную папку
3. Скачать файл [autoupdate.bat](https://t.me/rdpwrap/31497) и распоквать в ту же папку с RDP Wrapper
4. Запустить run autoupdate.bat от имени администратора
5. Перезагрузить
6. Проверяем
![rdp wrap](./rdp_wrap2-1.png "rdp wrap")
## Добавление нового пользователя
Создать нового пользователя (учетную запись Windows)
![rdp_wrap_user](./rdp_wrap_user.png "rdp create user")
Добавить новому пользователю членство в группе «Пользователи удаленного рабочего стола»
![rdp_wrap_group](./rdp_wrap_group.png "rdp create user")
Таким образом можно спокйно использовать домашний ПК и его производительность делить на несколько пользователей
При обновлении Windows возможно будет необходимо запустить файл autoupdate.bat
Самое большое количество вопросов, обсуждений и помощи по данной теме происходит в телеграмм группе [https://t.me/rdpwrap](https://t.me/rdpwrap)

Binary file not shown.

Before

Width:  |  Height:  |  Size: 182 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 731 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 54 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 83 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 64 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 68 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 28 KiB

View File

@ -1,62 +0,0 @@
---
slug: releases-info
title: Releases info
description: releases check latest version
image: ./update-releases.png
tags: [docker, python, flask, releases, kubernetes]
date: 2023-05-15
---
Решение для проверки последних релизных версий. Готовый docker файл, написан с использованием Python, Flask
[![Releases update info](./update-releases.png)](/blog/releases-info)
<!--truncate-->
## Releases info
Страница на [Github](https://github.com/akmalovaa/releases-info)
Сервис проверяет новые версии ваших проектов и показывает, отставание от последних релизов
![Releases info](./example.png)
На данный момент проверка только с github проектов, где есть релизный список, планируется добавить проверку версий образов с [Docker hub](https://hub.docker.com/)
## Запуск
Скопировать .env.example в .env файл и вставить свой github token (нужен для обращения к github API)
```
cp .env.example .env
```
Запустить docker-compose
```
docker-compose up -d
```
## Настройка
Необходимо изменить файл config.yml:
```yaml
services:
sentry:
github:
owner: getsentry
repo: sentry
version: 22.11.0
```
Например ссылка [https://github.com/getsentry/sentry](https://github.com/getsentry/sentry)
- owner (владелец) - getsentry
- repo (репозиторий) - sentry
## Планы
- Добавить проверку обновлений Docker HUB
- Уведомления в Telegram о новых релизах
- Автоматический парсинг версии с iac
- Улучшить интерфейс, попробовать React
- Подумать насчет базы данных

Binary file not shown.

Before

Width:  |  Height:  |  Size: 261 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 65 KiB

View File

@ -1,169 +0,0 @@
---
slug: uptime-kuma
title: Uptime-kuma self-hosted monitoring
description: Простой и удобный способ мониторить хосты
image: ./uptime-kuma-logo.png
tags: [monitoring, docker, ssl]
keywords: [uptime-kuma, monitoring, docker, timeweb, selectel, uptime, ssl, telegram, caddy]
date: 2023-11-06T10:00
---
Внешний сервис для мониторинга доступности хостов
[![uptime-kuma](./uptime-kuma-logo.png)](/blog/uptime-kuma)
<!--truncate-->
## Внешний мониторинг хостов
Для того чтобы проверять доступность своих сервисов снаружи (с интернета), необходим внешний инструмент мониторинга.
Это один из сервисов, которые приходится поднимать снаружи, не на своей инфраструктуре, т.к. внутренний мониторинг в этом деле не особо подходит, даже когда внутри все сервисы выглядят живыми, снаружи может не быть доступа по разным причинам.
Пробовал использовать разные варианты но самым простым оказался **uptime-kuma** сервис, который предоставляет простой и удобный способ мониторинга хостов.
## О проекте uptime-kuma
Ссылка на [Github](https://github.com/louislam/uptime-kuma)
Основные плюсы:
- Большой выбор инструментов (способов) мониторинга HTTP, TCP, json, ping, DNS, Push, Steam сервисы, Docker контейнеры
- Простой интуитивно понятный web интерфейс
- Уведомления через Telegram, Discord, Gotify, Slack, Pushover, электронную почту (SMTP) и т.д.
- Мультиязычный
- Возможность создания отдельных страниц для предоставления общего доступа к статусам
- Вывод результатов в графике
- Информация о сертификатах SSL и сроках действия
- Поддержка прокси-сервера
- Поддержка 2FA (двухфакторной аутентификации)
- Open-source
[![uptime-kuma](./orig.png)](./orig.png)
## Установка
Планирую использовать облачный север от timeweb, можно взять сервер в РФ или заграницей
[![uptime-kuma-server](./timweb-server.png)](./timweb-server.png)
Подойдут минимальные характеристики, для удобства планирую использовать еще и доменное имя - `monitoring.example.com`
- **OS**: Ubuntu 22.02
- **CPU**: 1 x 2.8 ГГц
- **RAM**: 1 Gb
- **SSD**: 15 Gb
### 1. Подготовка
Обновление пакетов и установка docker
```
apt update && apt upgrade -y && apt install -y curl
curl -fsSL https://get.docker.com -o get-docker.sh && sudo sh get-docker.sh
```
Конфигурация DNS перенаправление `monitoring.example.com` - на полученный белый IP от timeweb
### 2. Настройка docker-compose.yaml
```YAML
version: '3.8'
services:
caddy:
image: caddy:2.7.5
ports:
- 80:80
- 443:443
volumes:
- ./Caddyfile:/etc/caddy/Caddyfile
restart: always
uptime-kuma:
image: louislam/uptime-kuma:1.23.3-debian
volumes:
- ./uptime-kuma:/app/data
restart: always
```
Для автоматического получения SSL сертификата использую Caddy и создаю файл конфигурации **Caddyfile**
```bash
touch Caddyfile
```
Содержимое **Caddyfile**:
```JSON
monitoring.example.com {
reverse_proxy uptime-kuma:3001
}
```
Запуск контейнера
```
docker compose up -d
```
## Запуск и настройка
После запуска контейнера, можно подключиться к веб панели по домену **monitoring.example.com**.
Proxy сервис Caddy сам сходит получит сертификат и будет перенаправлять на HTTPS
При первом подключении, нужно создать пользователя и придумать пароль
В настройках:
- Проверить временную зону
- Переключить на темную тему
- Сменить язык на удобный
- Добавить настройки для Telegram уведомлений
Далее можно уже добавить первый монитор
[![uptime-kuma-server](./main-site.png)](./main-site.png)
По всем настройкам интерфейса, делать скрины и подробно расписывать не вижу смысла, все и так интуитивно понятно, а если вдруг хочется посмотреть и потыкаться, то на офф странице есть [демо](https://uptime.kuma.pet/)
## Итоги
Мне очень понравился этот сервис, из того, что точно буду использовать:
- GET запрос для проверки сайта
- ping серверов
- проверка ответов API сервисов
- оповещения в telegram
- мониторинг срока действия ssl сертификатов
Использование ресурсов (поднятый docker + 10 точек мониторинга занимают 140Mb RAM и минимальное CPU)
Из необычного, что впечатлило:
- Есть реверс проверка статуса (когда наоборот, если монитор стал доступен, то как ошибку воспринимать)
- Push мониторинг - когда конечный сервис например за Proxy, NAT и нет к нему прямого доступа, можно с этого сервера Push отправлять на север uptime-kuma, которые он будет получать и мониторить
- Специфичные средства мониторинга (Steam игровой сервер, PostgreSQL, Redis, Kafka, MongoDB и т.д.)
- Можно создать дополнительную страницу, где вывести необходимые мониторы и поделиться ссылкой для просмотра (без аутентификации)
Из минусов это единственная точка(узел) мониторинга и если будут проблемы на стороне облачного провайдера, то внешний мониторинг встанет, так же мониторинг с единственного узла не всегда показывает полную картину (например с других стран могут быть проблемы, о которых не получится оперативно узнать)
### Бонус
Для минуса который описал выше, есть небольшое бесплатное решение, это мониторинг Selectel
[![selectel мониторинг](./selectel.png)](./selectel.png)
Если войти с панель управления под своим аккаунтом, можно бесплатно поставить в мониторинг до 3 метрик
Здесь так же имеются различные типы метрик, гибкие настройки, но самое главное 8 раличных точек мониторинга
[![selectel мониторинг](./selectel_get.png)](./selectel_get.png)
- Франкфурт
- Лондон
- Амстердам
- Москва
- Новосибирск
- Санкт-Петербург
- Нью-Йорк
- Сан-Франциско
Возможно, кому хватит такого количества метрик и нет желания поднимать и настраивать облачный сервер, данный вариант покажется даже удобнее.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 77 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 317 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 304 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 98 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 247 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 18 KiB

View File

@ -1,160 +0,0 @@
---
slug: wildcard-ssl-cert
title: Auto wildcard cert service
description: Простой способ получить wildcard ssl сертификат для своего домена с использованием Cloudflare и acme.sh
image: ./wildcard-logo.png
tags: [docker, homelab, ssl]
keywords: [wildcard, ssl, cloudflare, cert, wildcard, linux, docker, acme]
date: 2023-09-23T10:00
---
Простой способ получить wildcard SSL сертификат для своего домена с использованием Cloudflare и acme.sh
[![wildcard ssl cert](./wildcard-logo.png)](/blog/wildcard-ssl-cert)
<!--truncate-->
## Wildcard сертификат
Нравится изучать различные OpenSource проекты, и сейчас для многих сервисов которые запускаю у себя на серверах требуются доверенные сертификаты SSL
Имеется свой собственный домен `akmalov.com` и поддмены следующего уровня `*.akmalov.com` создавать в любом количестве и не проблема
Раньше пробовал использовать свой центр сертификации, прописывал в доверенных, создавал сампоподисанные сертификаты (очень неудобно, слишком много ресурсов для песочницы).
Далее решил перейти на скрипты и для отдельных поддоменов заказывал сертификаты с помощью **Let's Encrypt** и когда поддоменов набралось больше десятка решил попробовать **wildcard** сертификат, который может быть применен для всех поддоменов.
> Один сертификат для всех поддоменов
[![wildcard](./wildcard.jpg)](./wildcard.jpg)
## ACME Shell script
После того как перепробовал различные варианты получения сертификатов, для меня самым удобным показался **acme.sh**
Ссылка на офф [Github](https://github.com/acmesh-official/acme.sh)
- Unix shell скрипт без лишних зависимостей
- Не нужны root права
- Есть docker образ
- Поддерживает IPv6
- Можно использовать в cron-job для автоматического обновления сертификатов
- Простые команды для управления
- Умеет по API обращаться к Cloudflare
## Cloudflare
Для управлениями DNS записями домена использую Cloudflare, из за его популярности и возможности управления по API, для многих сервисов есть очень удобные интеграции. Одна из причин выбора acme.sh это как раз, то что он дружит Cloudflare.
:::note
Если используется другой DNS провайдер, можно использовать ручной способ указанный в документации, где придется вручную создавать `TXT` записи в админке домена
:::
Пошагово получение API токена в Cloudflare:
- Войти в свой аккаунт [Cloudflare](https://dash.cloudflare.com)
- Нажать на иконку профиля в верхней части экрана и выбрать **My Profile** в выпадающем меню.
- Далее выберите **API Tokens** на левой панели меню.
- Нажать на кнопку **Create Token** в верхней части страницы.
- Выбрать тип токена, который нужен, задать параметры и уровень доступа для токена.
- На странице созданного токена нужно скопировать **API Token** и сохранить его (отображается только при создании больше его увидеть не получится, только пересоздать)
:::danger Осторожно
Токен нельзя светить где попало
:::
[![Cloudflare](./cloudflare-api.png)](./cloudflare-api.png)
## Docker acme.sh
Как один из больших поклонников контейнеров, не фанат устанавливать что-либо на хост систему, даже если это просто копирование скриптов.
Разработчики данного сервиса такого же мнения 💕
Страница на Github - [**Run acme.sh in docker**](https://github.com/acmesh-official/acme.sh/wiki/Run-acme.sh-in-docker)
Официальный образ [**Dockerhub**](https://hub.docker.com/r/neilpang/acme.sh)
Загрузить последнюю версию или tag `latest`, привык использовать конкретную версию:
```bash
docker pull neilpang/acme.sh:3.0.6
```
Для удобства с переменными буду использовать `.env` файл, следующего содержания:
```
EMAIL=artur@example.com
URL=example.com
WILDCARD_URL=*.example.com
CF_Token=Your cloudflare API TOKEN
```
В начале необходимо выполнить команду регистрации ACME по **email**, которая будет использоваться для создания ключа.
Полученный в результате файл, нужен будет для запуска следующей команды и поэтому его необходимо сохранить вне контейнера.
Команда `-v "./acme_data":/acme.sh` позволит создать локально на хосте директорию в которую будут сохраняться полученные файлы и останутся даже когда контейнер отработает и закроется.
```bash
docker run --rm --env-file .env -v "./acme_data":/acme.sh neilpang/acme.sh:3.0.6 --register-account -m $EMAIL
```
В логах должно быть сообщение об успешной регистрации аккаунта
```
> Create account key ok.
> Registered
> ACCOUNT_THUMBPRINT='ACCOUNT KEY'
```
Запрос **wildcard** сертификата
```bash
docker run --rm --env-file .env -v "./acme_data":/acme.sh neilpang/acme.sh:3.0.6 --issue -d $URL -d $WILDCARD_URL --dns dns_cf
```
Процесс занимает примерно 3-7 минут
В логах по результатам запроса:
```
> Multi domain='DNS:example.com,DNS:*.example.com'
> Getting domain auth token for each domain
> Getting webroot for domain='example.com'
> Getting webroot for domain='*.example.com'
> Adding record
> Added, OK
> The txt record is added: Success.
> Let's check each DNS record now. Sleep 20 seconds first.
> Checking example.com for _acme-challenge.example.com
> Domain example.com '_acme-challenge.example.com' success.
> All success, let's return
> Verifying: example.com
> Processing, The CA is processing your order, please just wait. (1/30)
> Success
> Removing DNS records.
> Removed: Success
> Downloading cert.
> Cert success.
```
Сертификат получен и готов для использования (срок 3 месяца), все файлы сохранены локально в директории `./acme_data`
```bash
ls -la acme_data/example.com_ecc
```
```output
-rw-r--r-- 1456 Sep 24 18:33 example.com.cer
-rw-r--r-- 566 Sep 24 18:33 example.com.conf
-rw-r--r-- 477 Sep 24 18:29 example.com.csr
-rw-r--r-- 202 Sep 24 18:29 example.com.csr.conf
-rw------- 227 Sep 24 18:28 example.com.key
-rw-r--r-- 2668 Sep 24 18:33 ca.cer
-rw-r--r-- 4124 Sep 24 18:33 fullchain.cer
```
Можно проверить полученный сертификат командой:
```bash
openssl x509 -in acme_data/example.com_ecc/example.com.cer -text -noout
```
или онлайн сервисом [Certificate Decoder](https://www.sslshopper.com/certificate-decoder.html)
Дальше тоже можно автоматизировать, создав расписание на выполнение и отправку результатов куда нужно.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 95 KiB

Some files were not shown because too many files have changed in this diff Show More