add blog page
|
After Width: | Height: | Size: 11 KiB |
|
After Width: | Height: | Size: 48 KiB |
|
After Width: | Height: | Size: 85 KiB |
|
After Width: | Height: | Size: 26 KiB |
|
After Width: | Height: | Size: 16 KiB |
|
After Width: | Height: | Size: 127 KiB |
|
After Width: | Height: | Size: 37 KiB |
|
After Width: | Height: | Size: 30 KiB |
|
After Width: | Height: | Size: 46 KiB |
|
After Width: | Height: | Size: 38 KiB |
@@ -4,29 +4,192 @@ title: Adguard Home
|
|||||||
description: Adguard Home DNS server guide
|
description: Adguard Home DNS server guide
|
||||||
# image:
|
# image:
|
||||||
tags: [docker, homelab, adguard, dns]
|
tags: [docker, homelab, adguard, dns]
|
||||||
|
date: 2021-10-13T10:00
|
||||||
---
|
---
|
||||||
|
|
||||||
Простая установка и настройка домашнего DNS сервера с блокировкой рекламы и DOH (DNS over HTTPS)
|
Простая установка и настройка домашнего DNS сервера с блокировкой рекламы и DOH (DNS over HTTPS)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||

|
[](/blog/adguard-home)
|
||||||
|
|
||||||
|
|
||||||
<!--truncate-->
|
<!--truncate-->
|
||||||
## Adguard Home DNS сервер
|
## 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
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
Regular blog authors can be added to `authors.yml`.
|
## 1. Подготовка среды
|
||||||
|
|
||||||
The blog post date can be extracted from filenames, such as:
|
Буду устанавливать на LXC Proxmox
|
||||||
|
- OS: Ubuntu 22.02
|
||||||
|
- CPU: 2
|
||||||
|
- RAM: 1 Gb
|
||||||
|
- Disk: 10 Gb
|
||||||
|
|
||||||
- `welcome.md`
|
Обновление пакетов и установка docker
|
||||||
- `welcome/index.md`
|
```
|
||||||
|
apt update && apt upgrade -y
|
||||||
|
apt install -y docker.io docker-compose
|
||||||
|
```
|
||||||
|
|
||||||
A blog post folder can be convenient to co-locate blog post images:
|
|
||||||
|
|
||||||
The blog supports tags as well!
|
## 2. Настройка docker-compose.yaml
|
||||||
|
|
||||||
**And if you don't want a blog**: just delete this directory, and use `blog: false` in your Docusaurus config.
|
На официальной странице 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](1.1.1.1/help)
|
||||||
|
|
||||||
|

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

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

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

|
||||||
|
|
||||||
|
Позволяет быстро заблокировать популярные сайты и сервисы.
|
||||||
|
|
||||||
|
## Итоги
|
||||||
|
|
||||||
|
Очень интересный проект, мне кажется на данный момент самый лучший DNS сервер для дома, так же лицензия позволяет устанавливать в школах и образовательных учреждениях (для блокировки доступа к запрещенному контенту) и коммерческих организациях (возможно актуально для малого офиса для блокировки рекламы и отвлекающих сервисов)
|
||||||
|
Простота установки и настройки, удобный интерфейс управления.
|
||||||
|
|||||||
|
After Width: | Height: | Size: 15 KiB |
|
After Width: | Height: | Size: 48 KiB |
|
After Width: | Height: | Size: 22 KiB |
|
After Width: | Height: | Size: 163 KiB |
@@ -0,0 +1,170 @@
|
|||||||
|
---
|
||||||
|
slug: image-generator-python-flask-docker
|
||||||
|
title: Image generator
|
||||||
|
description: Image generator Python - Создать изображение необходимого размера веса"
|
||||||
|
# image:
|
||||||
|
tags: [docker, python, flask, image]
|
||||||
|
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
|
||||||
|
|
||||||
|
Если изменить изображение в редакторе и сохранить нагрузочный архив исчезнет и картинка станет оригинального размера.
|
||||||
|
After Width: | Height: | Size: 4.7 KiB |
|
After Width: | Height: | Size: 7.9 KiB |
|
After Width: | Height: | Size: 28 KiB |
@@ -0,0 +1,62 @@
|
|||||||
|
---
|
||||||
|
slug: releases-info
|
||||||
|
title: Releases info
|
||||||
|
description: releases check latest version
|
||||||
|
# image:
|
||||||
|
tags: [docker, python, flask, releases]
|
||||||
|
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>
|
||||||
|
|
||||||
|
- owner (владелец) - getsentry
|
||||||
|
- repo (репозиторий) - sentry
|
||||||
|
|
||||||
|
## Планы
|
||||||
|
|
||||||
|
- Добавить проверку обновлений Docker HUB
|
||||||
|
- Уведомления в Telegram о новых релизах
|
||||||
|
- Автоматический парсинг версии с iac
|
||||||
|
- Улучшить интерфейс, попробовать React
|
||||||
|
- Подумать насчет базы данных
|
||||||
|
After Width: | Height: | Size: 261 KiB |
@@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
.landing-section {
|
.landing-section {
|
||||||
padding: 12pt 0;
|
padding: 12pt 0;
|
||||||
|
min-width: 470px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.landing-section:first-child {
|
.landing-section:first-child {
|
||||||
|
|||||||
@@ -14,8 +14,8 @@
|
|||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
margin-top: 40px;
|
margin-top: 45px;
|
||||||
margin-bottom: 40px;
|
margin-bottom: 45px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.avatarContainer {
|
.avatarContainer {
|
||||||
|
|||||||