MVP for hosting
@ -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": [],
|
||||
|
Before Width: | Height: | Size: 11 KiB |
Before Width: | Height: | Size: 48 KiB |
Before Width: | Height: | Size: 85 KiB |
Before Width: | Height: | Size: 26 KiB |
Before Width: | Height: | Size: 16 KiB |
Before Width: | Height: | Size: 242 KiB |
Before Width: | Height: | Size: 127 KiB |
@ -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 |
Before Width: | Height: | Size: 37 KiB |
Before Width: | Height: | Size: 30 KiB |
Before Width: | Height: | Size: 46 KiB |
Before Width: | Height: | Size: 38 KiB |
@ -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)
|
||||
|
||||
|
||||
|
||||
[](/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
|
||||
|
||||

|
||||
|
||||
## 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
|
||||
```
|
||||

|
||||
|
||||
*systemd-resolved занял 53 порт*
|
||||
|
||||
Редактирую файл, где установлю DNSStubListener = no
|
||||
```
|
||||
nano /etc/systemd/resolved.conf
|
||||
```
|
||||

|
||||
|
||||
```
|
||||
[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/`
|
||||

|
||||

|
||||
|
||||
Далее установить логин и пароль, далее идет инструкция, жму готово. И перекидывает на основную панель.
|
||||
|
||||
|
||||
На основном маршрутизаторе указываю IP этого хоста как основной DNS сервер
|
||||
В целом можно уже в основных настройках DNS установить необходимый сервер, и начать пользоваться, далее необязательные настройки и дополнительные фичи.
|
||||
|
||||
### Черные списки DNS
|
||||
Первым делом настраиваю черные списки DNS
|
||||

|
||||
|
||||
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 сертификат
|
||||
Настройки -> Настройки шифрования
|
||||

|
||||
|
||||
### 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)
|
||||
|
||||

|
||||
|
||||
|
||||
**Проверка DNS блокировка рекламы**
|
||||
|
||||
Для тестирования использую сервис [checkadblock.ru](https://checkadblock.ru/)
|
||||

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

|
||||
|
||||
где видно как Яндекс Станция активно пытается отправлять метрики, но их блокирует DNS Server.
|
||||
|
||||
|
||||
**Дополнительные настройки**
|
||||
|
||||
Так же можно тонко настраивать клиентов и распределять их по группам с разными правилами, ручные записи DNS, белые списки, блокировать контент 18+ и т.д.
|
||||
|
||||
**Блокировка сервисов**
|
||||
|
||||

|
||||
|
||||
Позволяет быстро заблокировать популярные сайты и сервисы.
|
||||
|
||||
## Итоги
|
||||
|
||||
Очень интересный проект, мне кажется на данный момент самый лучший DNS сервер для дома, так же лицензия позволяет устанавливать в школах и образовательных учреждениях (для блокировки доступа к запрещенному контенту) и коммерческих организациях (возможно актуально для малого офиса для блокировки рекламы и отвлекающих сервисов)
|
||||
Простота установки и настройки, удобный интерфейс управления.
|
Before Width: | Height: | Size: 15 KiB |
30
blog/blog-setup/index.md
Normal file
@ -0,0 +1,30 @@
|
||||
---
|
||||
slug: blog-setup
|
||||
title: Установка этого блога к себе на сервер
|
||||
description: Описание
|
||||
image: ./logo.png
|
||||
tags: [blog, javascript, nginx]
|
||||
keywords: [docker, linux]
|
||||
date: 2023-11-29
|
||||
---
|
||||
|
||||
Описание для предварительного просмотра на главной странице
|
||||
|
||||
[](/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>
|
||||
|
||||
:::
|
BIN
blog/blog-setup/logo-template.psd
Normal file
BIN
blog/blog-setup/logo.png
Normal file
After Width: | Height: | Size: 180 KiB |
Before Width: | Height: | Size: 232 KiB |
Before Width: | Height: | Size: 51 KiB |
Before Width: | Height: | Size: 130 KiB |
Before Width: | Height: | Size: 315 KiB |
Before Width: | Height: | Size: 52 KiB |
Before Width: | Height: | Size: 11 KiB |
Before Width: | Height: | Size: 526 KiB |
@ -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 позволяет разгрузить интернет канал и скачивать обновления по локальной сети
|
||||
|
||||
[](/blog/cache-server)
|
||||
<!--truncate-->
|
||||
## CACHE SERVER - Сервер кэширования
|
||||
## Сервер для компьютерного клуба
|
||||
|
||||
## Введение
|
||||
|
||||
Один из компьютерных клубов просил помочь отладить сеть, так как появились жалобы от пользователей, что «тормозит интернет, пинги скачут, временами лагает». Было выявлено, что такие проблемы начинаются при большой нагрузке канала, при скачивании и обновлении игр. Более 30 компьютеров в клубе.
|
||||
|
||||
Установили основной маршрутизатор Mikrotik, настроили приоритизацию трафика, основная часть проблемы ушла.
|
||||
|
||||
Во время анализа сети, увидели, что большую часть трафика составляют обновления, которые каждый включенный компьютер начинает скачивать с интернета. Игр различных множество, многие обновления имеют не маленький объем.
|
||||
|
||||
## Задача
|
||||
Планировалось установить локальный сервер к которому компьютеры будут обращаться за обновлениями. Когда первый компьютер в сети скачает обновления, эти данные останутся на сервере. В дальнейшем другие компьютеры, которые планируют скачать те же самые файлы, получат их напрямую с сервера, значительно быстрее и не нагружая интернет канал.
|
||||
|
||||

|
||||
|
||||
|
||||
## Реализация
|
||||
### Оборудование
|
||||
|
||||
Буду использовать один из имеющихся обычных ПК в качестве сервера.
|
||||
|
||||
- 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
|
||||
```
|
||||
|
||||
Файл конфигурации
|
||||

|
||||
|
||||
- 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
|
||||

|
||||
|
||||
## Тестирование
|
||||
|
||||
На компьютере в настройках IP адреса, редактирую DNS Server, меняю на адрес нашего LXC сервера.
|
||||
Скачивание игры с любого ПК и пробую загрузить эту же игру с другого ПК.
|
||||

|
||||
|
||||
|
||||
Для наглядного сравнения.
|
||||
|
||||
- С интернета — 10 Мбайт/c (80 Мбит/c)
|
||||
- С кэш сервера — 80 Мбайт/c (640 Мбит/c)
|
||||
|
||||

|
||||
|
||||
Здесь уже упираюсь в пропускную способность сети и дисков на ПК
|
||||
|
||||
Обновления до 1 Гб скачиваются по щелчку пальцев.
|
||||
|
||||
Заказчик доволен тесты прошли успешно.
|
||||
|
||||
## Итоги
|
||||
По результатам кэш сервер для компьютерного клуба дает ощутимые результаты и сильно разгружает интернет канал.
|
||||
|
||||
Зачем скачивать одни и те же файлы с интернета если сервер может один раз скачать и поделится по локальной сети.
|
||||
|
||||

|
||||

|
||||
|
||||
## P.S.
|
||||
|
||||
Статья старая, давно на деле не проверял, сам сервис тоже обновлялся поэтому лучше ориентироваться на [Github страницу](https://github.com/lancachenet/docker-compose) и инструкции на офф.сайте
|
Before Width: | Height: | Size: 235 KiB |
Before Width: | Height: | Size: 14 KiB |
Before Width: | Height: | Size: 685 KiB |
@ -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
|
||||
|
||||
[](/blog/docusaurus-comments)
|
||||
|
||||
<!--truncate-->
|
||||
## Комментарии и обсуждения для блога
|
||||
|
||||
На мой взгляд это очень полезная штука.
|
||||
|
||||
- Комментарии дают возможность высказаться и поделиться своим мнением, задать вопросы или дополнить тему статьи.
|
||||
- Для обсуждения идей и обмена знаниями, могут стимулировать дискуссии и помочь узнать что-то новое.
|
||||
|
||||
Искал разные решения и в итоге остановился на **Giscus**
|
||||
|
||||
Это opensource проект для добавления обсуждений через Discussions Github
|
||||
|
||||
Офф.сайт - [https://giscus.app/ru](https://giscus.app/ru)
|
||||
|
||||
|
||||
## Настройка Github
|
||||
|
||||
### Включить обсуждения
|
||||
|
||||
Нужно активировать Discussion в настройках репозитория
|
||||
|
||||

|
||||
|
||||
После этого для удобства удалил лишние категории, оставил только 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` лучше для этого подходит и по логике и по функционалу.
|
||||
|
Before Width: | Height: | Size: 51 KiB |
Before Width: | Height: | Size: 35 KiB |
Before Width: | Height: | Size: 28 KiB |
@ -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
|
||||
|
||||
[](/blog/gitlab-auto-reviewers)
|
||||
|
||||
<!--truncate-->
|
||||
## Gitlab auto add reviewers
|
||||
|
||||
**Цель**: при создании Merge Request сделать удобное добавление ревьюверов
|
||||
|
||||
|
||||

|
||||
|
||||
|
||||
## 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
|
||||
```
|
||||
|
||||

|
||||
|
||||
|
||||
### Использование
|
||||
|
||||
После добавления такого template, при создании новых MR появится дополнительное поле, где можно выбрать созданные шаблоны
|
||||
|
||||

|
||||
|
||||
Удобный способ, особенно если несколько разных групп ревбюверов, можно создавать несколько частых шаблонов и использовать их.
|
||||
|
||||
## 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
|
||||
```
|
Before Width: | Height: | Size: 41 KiB |
Before Width: | Height: | Size: 48 KiB |
Before Width: | Height: | Size: 22 KiB |
Before Width: | Height: | Size: 163 KiB |
@ -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 — простой сервис для создания (генерации) изображений необходимого размера веса
|
||||
|
||||
[](/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)
|
||||
- Выпадающий список формата файлов
|
||||
- Кнопка
|
||||
|
||||
Так выглядит без оформления:
|
||||
|
||||

|
||||
|
||||
С использованием стилей Bootstrap:
|
||||
|
||||

|
||||
|
||||
## Контейнеризация
|
||||
Ну и чтоб удобнее было использовать собрать все это в 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 скрипт работает, быстро и удобно разворачивается
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
|
||||
|
||||
Файлы открываются в Windows, Photoshop и WinRAR
|
||||
|
||||
Если изменить изображение в редакторе и сохранить нагрузочный архив исчезнет и картинка станет оригинального размера.
|
Before Width: | Height: | Size: 4.7 KiB |
Before Width: | Height: | Size: 7.9 KiB |
Before Width: | Height: | Size: 2.7 MiB |
@ -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 как контейнер в роутере
|
||||
|
||||
[](/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.png)
|
||||
:::
|
||||
|
||||
## RouterOS nginx reverse proxy
|
||||
|
||||
На данный момент в качестве прокси сервера стоит отдельная виртуальная машина, на котором пробовал различные инструменты (nginx, traefik, caddy)
|
||||
|
||||
Попробую перенести и запустить это внутри маршрутизатора, выбрал **nginx** т.к. по ресурсам RAM, он потребляем меньше всего
|
||||
|
||||
### Подготовка
|
||||
|
||||
Функция **container** по умолчанию отключена, нужен физический доступ к маршрутизатору для включения
|
||||
|
||||
:::warning Disclaimer
|
||||
- Запуск образа контейнера на вашем маршрутизаторе может открыть брешь в системе безопасности
|
||||
- Если маршрутизатор взломан, контейнеры могут быть использованы для простой установки вредоносного программного обеспечения на ваш маршрутизатор и по сети
|
||||
:::
|
||||
|
||||
Разработчики настаивают на использовании внешненго накопителя (usb, ssd), чтобы не насиловать файловую систему самого роутера. Установил туда небольшого размера флешку на 32Gb
|
||||
|
||||
|
||||
[](./mikrotik-usb.jpg)
|
||||
|
||||
Имеется поддержка USB 3.0
|
||||
|
||||
[](./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.png)
|
||||
|
||||
**RAM Hight** - Ограничение использования оперативной памяти (по умолчанию без лимита, рекомендую указать)
|
||||
|
||||
|
||||
**Mount Points**
|
||||
|
||||
Точки монтирования зависят от конфигурации которую планируется использовать.
|
||||
|
||||
>Свою конфигурацию NGINX [прикладываю на Github](https://github.com/akmalovaa/mikrotik-nginx)
|
||||
|
||||
Структура каталогов:
|
||||
[](./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.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 наверное подставят
|
||||
|
||||
Другие предложения, для чего еще можно использовать контейнеры в роутере микротик напижите пожалуйста в комментариях
|
Before Width: | Height: | Size: 837 KiB |
Before Width: | Height: | Size: 34 KiB |
Before Width: | Height: | Size: 384 KiB |
Before Width: | Height: | Size: 80 KiB |
Before Width: | Height: | Size: 208 KiB |
Before Width: | Height: | Size: 12 KiB |
Before Width: | Height: | Size: 24 KiB |
Before Width: | Height: | Size: 58 KiB |
Before Width: | Height: | Size: 241 KiB |
@ -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
|
||||
---
|
||||
|
||||
Система мониторинга дает возможность отслеживать и оперативно узнавать об ошибках в работе и общей нагрузке на оборудование.
|
||||
|
||||
[](/blog/monitoring-pc-club)
|
||||
|
||||
<!--truncate-->
|
||||
## Зачем мониторинг?
|
||||
|
||||
Благодаря мониторингу можно увидеть полноценную картину использования и работоспособности оборудования.
|
||||
|
||||
Позволяет многие технические проблемы решать до их проявления и улучшать качество обслуживания пользователей.
|
||||
|
||||
|
||||
## Что мониторить?
|
||||
|
||||
- CPU (нагрузка на процессор, температура)
|
||||
- GPU (нагрузка на видеокарту, температура)
|
||||
- RAM (нагрузка на оперативную память)
|
||||
- SSD, HDD (состояние дисков, свободный объем)
|
||||
- Любая другая полезная информация, которую необходимо вывести
|
||||
|
||||
## Как мониторить?
|
||||
|
||||
Основная связка Prometheus + Grafana
|
||||
|
||||
Это самые популярные сервисы для мониторинга, быстрые и удобные
|
||||
|
||||
### Prometheus
|
||||
|
||||
Собирает и хранит все метрики. Сам ходит к каждому компьютеры и собирает нужную информацию
|
||||
|
||||
|
||||
### Grafana
|
||||
|
||||
Берет данные с Prometheus и позволяет красиво все отобразить. Главная панель мониторинга
|
||||
|
||||
|
||||
### Exporters
|
||||
|
||||
**Экспортер** - представляет собой службу, которая собирает информацию о системе и подготавливает ее в формате понятным для Prometheus. На каждом компьютере с которого нужная информация, должен быть запущен exporter
|
||||
|
||||

|
||||
|
||||
|
||||
## Подготовка сервера
|
||||
|
||||
Сервер или виртуалка с 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`
|
||||
|
||||

|
||||
|
||||
Для того чтобы убедиться что все работает корректно, можно скачать и добавить готовые 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
|
||||

|
||||
|
||||
### Nvidia GPU exporter dashboard
|
||||

|
||||
|
||||
## Создание собственной панели мониторинга
|
||||
|
||||
Теперь осталась создать свой dashboard и собрать в удобном виде все необходимые метрики
|
||||
|
||||
Для себя выбрал следующий тип отображения (в одну линию все необходимые данные)
|
||||
|
||||

|
||||
|
||||
|
||||
## Итоги
|
||||
|
||||
Prometheus и Grafana дают возможность настроить удобный монитиринг для компьютерного клуба.
|
||||
Легко установить, использовать, обслуживать.
|
||||
|
||||
Для большого числа компьютеров удобнее использовать Ansible для автоматической установки экспортеров и подготовки конфигурационного файла с помощью шаблонизатора.
|
||||
|
||||
Так же экспортеры можно встроить в установку с операционной системой, в таком случаи все новые компьютеры автоматически будут попопадть в систему мониторинга.
|
||||
|
||||
|
Before Width: | Height: | Size: 304 KiB |
Before Width: | Height: | Size: 1.0 MiB |
Before Width: | Height: | Size: 237 KiB |
Before Width: | Height: | Size: 147 KiB |
Before Width: | Height: | Size: 226 KiB |
Before Width: | Height: | Size: 114 KiB |
@ -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
|
||||
|
||||
|
||||
|
||||
[](/blog/monitoring-web-hosts)
|
||||
|
||||
|
||||
<!--truncate-->
|
||||
## Uptime-kuma
|
||||
|
||||
Если вам нужен самый простой и удобный инструмент мониторинга хостов, который можно поднять у себя на сервере проще воспользоваться сервисом `Uptime-Kuma`
|
||||
|
||||
[Uptime-Kuma](https://github.com/louislam/uptime-kuma)
|
||||
|
||||

|
||||
|
||||
Главные фишки:
|
||||
* Мониторинг 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.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 уведомления:
|
||||

|
||||
|
||||
---
|
||||
|
||||
### Дополнительные материалы
|
||||
|
||||
* 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"
|
||||
```
|
||||
|
Before Width: | Height: | Size: 135 KiB |
Before Width: | Height: | Size: 107 KiB |
Before Width: | Height: | Size: 112 KiB |
Before Width: | Height: | Size: 139 KiB |
Before Width: | Height: | Size: 32 KiB |
Before Width: | Height: | Size: 23 KiB |
Before Width: | Height: | Size: 14 KiB |
Before Width: | Height: | Size: 13 KiB |
Before Width: | Height: | Size: 16 KiB |
Before Width: | Height: | Size: 16 KiB |
@ -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.
|
||||
|
||||
[](/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 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 главного экрана (Все по нулям т.к. ничего не добавляли еще)
|
||||

|
||||
|
||||
|
||||
SSL сертификаты есть возможность сгенерировать с помощью Let'Encrypt в одно нажатие или добавить свои сертификаты
|
||||

|
||||
|
||||
|
||||
|
||||
### Настройка Host Proxy NGINX
|
||||
Все также интуитивно понтяно, прописываю домен, порт, если нужно подставляю сертификат SSL для HTTPS
|
||||

|
||||

|
||||
|
||||
Для работы доменов из локальной сети необходимо в DNS домены которые добавлены в Proxy Host направлять на адрес NGINX Proxy Manager
|
||||
|
||||
В общем и целом этого хватает для решения задач которые описал выше. Хоть и конфиг был бы не такой сложной, но с помощью этого сервиса можно это сделать в несколько кликов.
|
||||
|
||||
## Дополнительные функции
|
||||
|
||||
Распишу еще кое какие полезные фичи, которые использую у себя
|
||||
|
||||
### Dashboard для nginx proxy manager
|
||||
|
||||
Проект отнсительно свежий и активно разрабаывается, выглядит интересно
|
||||
|
||||
[Ссылка на Git автора](https://github.com/xavier-hernandez/goaccess-for-nginxproxymanager)
|
||||
|
||||

|
||||
|
||||
Красивый графический вывод информации на основе логов, позволяет посмотреть статистику, оценить нагрузку. Написано на Go работает быстро, даже с большим объемом данных, не потребляет много ресурсов.
|
||||
|
||||
В docker-compose необходимо указать путь к логам от nginx proxy manager
|
||||
|
||||
|
||||
### Страница 404 для nginx proxy manager
|
||||
|
||||
Nginx позволяет вместо ошибки 404 сделать redirect на любой другой хост или даже указать свой HTML код
|
||||

|
||||
|
||||
|
||||
Воспользуюсь Redirect и сделаю красивую страницу для 404
|
||||
|
||||
[Ссылка на Docker Hub проекта](https://hub.docker.com/r/kale5/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 идет.
|
Before Width: | Height: | Size: 117 KiB |
Before Width: | Height: | Size: 578 KiB |
Before Width: | Height: | Size: 73 KiB |
Before Width: | Height: | Size: 112 KiB |
Before Width: | Height: | Size: 31 KiB |
Before Width: | Height: | Size: 17 KiB |
Before Width: | Height: | Size: 16 KiB |
Before Width: | Height: | Size: 237 KiB |
@ -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 для дома, как его устанавливать, краткая инструкция как создать пользователя для удаленного рабочего стола
|
||||
|
||||
[](/blog/rdp-wrapper)
|
||||
<!--truncate-->
|
||||
|
||||
## Для чего нужен RDP wrapper?
|
||||
### Про стандартный RDP
|
||||
|
||||
RDP (Remote Desktop Protocol) — дословно протокол Удаленного Рабочего Стола. Позволяет подключится к компьютеру по IP адресу с любого другого компьютера.
|
||||
|
||||
Подключение по протоколу RDP осуществляется между компьютерами, находящимися в одной локальной сети, или по интернету, но для этого потребуются дополнительные действия – проброс порта 3389 на роутере, либо соединение с удаленным компьютером по VPN.
|
||||
|
||||
Для подключения к удаленному рабочему столу , необходимо разрешить удаленное подключение — Свойства компьютера — дополнительные параметры системы — удаленный доступ
|
||||
|
||||

|
||||
|
||||
- **Windows 10 Home** — данная функция отключена
|
||||
- **Windows 10 Pro** — позволяет одновременно использовать только одно подключение под выбранным пользователем
|
||||
- **Windows Server** — позволяет подключаться сразу с нескольких устройств, под разными пользователями и работать одновременно.
|
||||
|
||||
При подключении используются все ресурсы удаленного компьютера, позволяет передавать принтеры, буфер обмена, диски, порты, устройства захвата. Благодаря этому часто в организациях ставят мощный сервер, а пользователям дают монитор с мышкой, клавиатурой и слабенький ПК в качестве тонкого клиента, который служит только для подключения к серверу. При этом все пользователи будут полноценно работать на производительном сервере.
|
||||
|
||||

|
||||
|
||||
Так же 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. Проверяем
|
||||
|
||||

|
||||
|
||||
## Добавление нового пользователя
|
||||
Создать нового пользователя (учетную запись Windows)
|
||||

|
||||
|
||||
Добавить новому пользователю членство в группе «Пользователи удаленного рабочего стола»
|
||||
|
||||

|
||||
|
||||
Таким образом можно спокйно использовать домашний ПК и его производительность делить на несколько пользователей
|
||||
|
||||
При обновлении Windows возможно будет необходимо запустить файл autoupdate.bat
|
||||
|
||||
Самое большое количество вопросов, обсуждений и помощи по данной теме происходит в телеграмм группе [https://t.me/rdpwrap](https://t.me/rdpwrap)
|
Before Width: | Height: | Size: 182 KiB |
Before Width: | Height: | Size: 731 KiB |
Before Width: | Height: | Size: 54 KiB |
Before Width: | Height: | Size: 83 KiB |
Before Width: | Height: | Size: 64 KiB |
Before Width: | Height: | Size: 68 KiB |
Before Width: | Height: | Size: 28 KiB |
@ -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
|
||||
|
||||
[](/blog/releases-info)
|
||||
|
||||
|
||||
<!--truncate-->
|
||||
## Releases info
|
||||
|
||||
Страница на [Github](https://github.com/akmalovaa/releases-info)
|
||||
|
||||
Сервис проверяет новые версии ваших проектов и показывает, отставание от последних релизов
|
||||

|
||||
|
||||
На данный момент проверка только с 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
|
||||
- Подумать насчет базы данных
|
Before Width: | Height: | Size: 261 KiB |
Before Width: | Height: | Size: 65 KiB |
@ -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
|
||||
---
|
||||
|
||||
Внешний сервис для мониторинга доступности хостов
|
||||
|
||||
|
||||
[](/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
|
||||
|
||||
|
||||
[](./orig.png)
|
||||
|
||||
|
||||
## Установка
|
||||
|
||||
Планирую использовать облачный север от timeweb, можно взять сервер в РФ или заграницей
|
||||
|
||||
[](./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 уведомлений
|
||||
|
||||
Далее можно уже добавить первый монитор
|
||||
|
||||
[](./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.png)
|
||||
|
||||
Если войти с панель управления под своим аккаунтом, можно бесплатно поставить в мониторинг до 3 метрик
|
||||
|
||||
Здесь так же имеются различные типы метрик, гибкие настройки, но самое главное 8 раличных точек мониторинга
|
||||
[](./selectel_get.png)
|
||||
|
||||
- Франкфурт
|
||||
- Лондон
|
||||
- Амстердам
|
||||
- Москва
|
||||
- Новосибирск
|
||||
- Санкт-Петербург
|
||||
- Нью-Йорк
|
||||
- Сан-Франциско
|
||||
|
||||
Возможно, кому хватит такого количества метрик и нет желания поднимать и настраивать облачный сервер, данный вариант покажется даже удобнее.
|
Before Width: | Height: | Size: 77 KiB |
Before Width: | Height: | Size: 317 KiB |
Before Width: | Height: | Size: 304 KiB |
Before Width: | Height: | Size: 34 KiB |
Before Width: | Height: | Size: 98 KiB |
Before Width: | Height: | Size: 247 KiB |
Before Width: | Height: | Size: 18 KiB |
@ -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
|
||||
|
||||
|
||||
[](/blog/wildcard-ssl-cert)
|
||||
|
||||
|
||||
<!--truncate-->
|
||||
## Wildcard сертификат
|
||||
|
||||
Нравится изучать различные OpenSource проекты, и сейчас для многих сервисов которые запускаю у себя на серверах требуются доверенные сертификаты SSL
|
||||
|
||||
Имеется свой собственный домен `akmalov.com` и поддмены следующего уровня `*.akmalov.com` создавать в любом количестве и не проблема
|
||||
|
||||
Раньше пробовал использовать свой центр сертификации, прописывал в доверенных, создавал сампоподисанные сертификаты (очень неудобно, слишком много ресурсов для песочницы).
|
||||
Далее решил перейти на скрипты и для отдельных поддоменов заказывал сертификаты с помощью **Let's Encrypt** и когда поддоменов набралось больше десятка решил попробовать **wildcard** сертификат, который может быть применен для всех поддоменов.
|
||||
|
||||
> Один сертификат для всех поддоменов
|
||||
|
||||
[](./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-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)
|
||||
|
||||
Дальше тоже можно автоматизировать, создав расписание на выполнение и отправку результатов куда нужно.
|
||||
|
Before Width: | Height: | Size: 95 KiB |