DeSoft.ru
236 subscribers
116 photos
10 videos
1 file
213 links
Авторский канал: ИТ, разработка, безопасность, администрирование.

Сайт: desoft.ru
Автор: @y_demin
Download Telegram
🔥 Новость разлетелась про мессенджер MAX от VK. Что известно:

▫️ Копия Telegram: чаты, группы, реакции, стикеры.
▫️ Проект поддерживает государство, включая Минцифры.
▫️ В планах объединить мессенджер и Госуслуги, по аналогии с китайским WeChat.

Взял на пробу. Первые впечатления очень даже положительные.

Работает шустро
Привычное управление и интерфейс
В помощниках GigaChat для запросов, работы с текстом, изображениями, транскрибацией аудио и видео
Полный набор клиентов (веб, десктоп, мобилка)

Beta версия
До Telegram по функциональности еще далековато (каналы, боты, платежи, покупки, реклама в планах стоят, но не завезли пока)

🔎 Нагрузки маловато на систему и возможности только базовые открыты, чтобы делать какие-то выводы, но даже в таком виде легко заменит Whatsapp, так что наблюдаем, тестируем, переводим домовые чатики на отечественную платформу 😄

#news
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2🔥2👎1
⚠️ Сегодня обновил клиента Telegram desktop до версии 5.15 на Windows 10 x64 и обнаружил неприятный баг.

🔎 При попытке открыть контекстное меню (ПКМ) на собственном сообщении в приватной группе клиент экстренно завершает работу.

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

В support закинул информацию. Ожидаем hotfix.

upd: А вот и hotfix подъехал. В 5.15.1 поправили 💪

#telegram
👍4
Для централизованного сбора, управления и аналитики логов существуют серьезные решения, целые стеки, такие как PLG (Promtail, Loki, Grafana) или EFK / ELK (Elasticsearch, Kibana, Fluentd / Logstash). Однако, всегда стоит вопрос в целесообразности их применения, а также действительная необходимость в такой обширной функциональности в относительно небольших проектах.

💻 Мне зачастую не хватало простого и быстрого решения для элементарного просмотра логов с нескольких совместно трудящихся сервисов. И такое решение нашлось - легковесная self-hosted система мониторинга логов из docker контейнеров - dozzle.

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

❗️ Стоит отметить, что возможности собирать логи из файлов нет - только из sysout syserr потоков контейнеров по аналогии с командой docker logs.
❗️ Хранилища логов тоже нет, поэтому проанализировать полную историю не получится.

🔸 Готовим пользователя
Генерируем параметры доступа для базовой аутентификации в dozzle
docker run -it --rm amir20/dozzle generate testuser --password testpassword --email test@test.test --name "Test User" > data/users.yml


Получаем в выходном файле структуру вида
users:
testuser:
email: test@test.test
name: Test User
password: $2a$11$GstVlSugO7SmT0EV/RkU2ubm2qhXfuC1lWGd8FYIrV/Lg2cjKnro.
filter: ""

где password - bcrypt hash от пароля.

🔸 Заполняем compose
Итоговый compose будет выглядеть следующим образом
services:
dozzle:
image: amir20/dozzle:latest
container_name: dozzle
restart: always
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- ${HOME}/services/dozzle/data:/data
ports:
- 8080:8080
environment:
DOZZLE_AUTH_PROVIDER: simple
DOZZLE_ENABLE_ACTIONS: true
DOZZLE_NO_ANALYTICS: true
healthcheck:
test: ["CMD", "/dozzle", "healthcheck"]
interval: 3s
timeout: 30s
retries: 5
start_period: 30s

${HOME}/services/dozzle/data - каталог с созданным ранее users.yml
DOZZLE_AUTH_PROVIDER: simple - базовая аутентификация
DOZZLE_ENABLE_ACTIONS: true - включаем кнопки управления контейнерами (старт, стоп, перезапуск) в ui
DOZZLE_NO_ANALYTICS: true - отключаем сбор и отправку аналитики, потому что
Dozzle collects anonymous user configurations using a simple beacon written in Go.
Dozzle sends anonymous data to DigitalOcean, where it is written to a flat file for processing.


🔸 Запускаем
docker compose up -d

Идем в веб приложение на 8080 и наблюдаем статистику использования ресурсов, ленту логов с поиском и даже сплит-окна.

🔎 Из дополнительных возможностей

▪️ Подключение к удаленным хостам через агентов
▪️ Группировка контейнеров с помощью labels
▪️ Фильтрация списка отслеживаемых контейнеров

#logs #tools #selfhosted
👍4🔥2👏1
Продолжил настройку тестового сервера на базе Proxmox (подборку туториалов см. здесь). В версии 8.1 была добавлена поддержка SDN (Software Defined Networks) или программно-определяемые сети. SDN работает на программном уровне и обеспечивает централизованный контроль и управление сетью, что привносит гибкость в принятии решений при построении и обслуживании виртуальной инфраструктуры.

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

📌 Установка

🔹 Ставим сетевой пакет для поддержки SDN (по умолчанию установлен на версиях 8.1 и выше)
apt update
apt install libpve-network-perl

Проверяем наличие следующей записи в конце конфигурационного файла /etc/network/interfaces
source /etc/network/interfaces.d/*

🔹 Для поддержки DHCP в SDN proxmox использует dnsmasq. Устанавливаем и отключаем сервис по умолчанию.
apt install dnsmasq
systemctl disable --now dnsmasq

🔹 Перезагружаемся. Проверяем наличие раздела SDN в параметрах дата-центра proxmox.

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

🔹 Идем в раздел SDN - Zones и добавляем новую зону типа Simple.
▪️ В advanced не забываем проставить галочку automatic DHCP, если ожидаем работу DHCP-сервера в заданной сетевой зоне.

🔹 В разделе SDN - VNets добавляем новую сеть в созданную ранее зону.
▪️ Тут же станет доступной опция создания подсети в соседнем окне. Задаем адрес сети и шлюз (в моем случае 192.168.50.1/24 и 192.168.50.1).
▪️ Для того, чтобы хосты подсети имели доступ в интернет, включаем SNAT (Source-NAT).
▪️ На вкладке DHCP Ranges можно настроить диапазон назначаемых адресов.

🔹 В разделе SDN применяем все внесенные изменения (Apply). Новая зона появится в списке SDN сетей, а для подключения к виртуальной сети в списке устройств станет доступен новый мост с именем этой сети.

📚 Дополнительные материалы по теме

▪️ Официальный туториал от разработчиков Proxmox
▪️ Большая статья по настройке Proxmox кластера на VDS, в том числе с конфигурацией зоны SDN VLAN

P. S. В качестве альтернативы для такой простой задачи можно было использовать логическую сегментацию с помощью VLAN. Достаточно добавить vlan теги в параметрах своего роутера, включить vlan aware и указать теги vlan в параметрах сетевого оборудования виртуалок, что позволит быстро и просто разграничить доступ.

#proxmox
👍7
🚀 Если вы до сих пор используете ИИ модель по умолчанию, которую предложит чат, или просто самую свежую версию для любых задач, то рекомендую к просмотру ролик, где автор рассказывает о предназначении каждой из моделей ChatGPT, описывает задачи, для которых лучше использовать ту или иную версию, подчеркивает их плюсы и минусы.

🌐 Видео

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

🌐 Видео

#ai
👍3
На рабочей машине с Windows 10 x64 периодически пользую VirtualBox (v 7.0.18) для тестирования разных систем, инструментов и так далее, а одна из виртуалок и вовсе загружается и живет в фоне постоянно.

⚠️ С недавних пор стал ловить фризы системы - полное зависание без возможности каких-либо манипуляций, что довольно неприятная ситуация, особенно если что-то крутилось в работе. Тычешь кнопку перезагрузки, а иногда и вовсе через отключение бп перезапускаешь.. жуть.

🔎 В журналах Windows нашел ошибку сетевого драйвера VirtualBox вида
Драйвер обнаружил внутреннюю ошибку драйвера на \Device\VBoxNetLwf.

Как оказалось, сама ошибка встречается часто, много заметок, обсуждений на форумах на эту тему, но решения, в первую очередь, ориентированы на обновления драйверов, переустановку VirtualBox, корректировку параметров некоторых сетевых служб в реестре, а иногда и винду предлагают переустановить 🙃. Тому, что именно эта ошибка вызывает фризы системы, подтверждения найти не удалось.

🔍 Зашел с другой стороны. Что изменилось в системе, когда начались проблемы? Хоть и пришлось вернуться в историю установок разного софта и настроек системы на несколько месяцев назад, обнаружил, что началось это после установки vpn клиента ZeroTier, о работе с которым писал здесь и здесь.

⁉️ В списке сетевых подключений добавляется новый адаптер для работы в сети ZeroTier. В свойствах адаптера можно посмотреть набор используемых сетевых компонентов. Заметил там активный мост VirtualBox NDIS6 Bridged Networking Driver. Казалось бы, зачем он там, в vpn адаптере.

Поискал информацию о фризах винды, связанных с драйвером моста, и сразу наткнулся на старую тему на форуме VirtualBox, где описывается подобная проблема и конфликт драйвера (как Bridge, так и NAT) с vpn клиентами.

Отключил компонент драйвера моста в свойствах адаптера vpn подключения. Проблема более не повторялась.

#virtualbox #vpn
👍7🔥1
📝 Еще немного про VirtualBox. Сохраню здесь базовый набор команд управления, с помощью которых, в том числе, можно реализовать скрипт для фонового запуска виртуальной машины. Добавил себе такой в автозагрузку на Windows машине.

🔸 Поиск UUID виртуальной машины
▪️ Создать ярлык машины на рабочем столе. В свойствах ярлыка в объекте запуска найдем идентификатор машины вида {1c147e8f-0e29-4873-939c-24f8d639ab77}.
▪️ Через cli VBoxManage
# в рабочий каталог
cd "C:\Program Files\Oracle\VirtualBox"
# список машин с идентификаторами
VBoxManage list vms
# подробная информация о конкретной машине
VBoxManage showvminfo "my-test-vm"


🔸 Запуск виртуальной машины
Сразу приведу вариант .bat файла для запуска виртуальной машины в фоновом режиме.
@echo off
cd "C:\Program Files\Oracle\VirtualBox"
VBoxManage.exe startvm {1c147e8f-0e29-4873-939c-24f8d639ab77} --type headless

Параметр type
"gui" - vm в UI окне (значение по умолчанию)
"headless" - фоновый режим
"separate" - фоновый режим с запуском независимого UI окна, по закрытию которого, машина продолжит работу в фоне


Помещаем в автозагрузку
▫️ WIN + R
▫️ shell:startup
▫️ Закидываем в каталог батник

🔸 Управление состоянием виртуальной машины
# выключение машины без сохранения состояния
VBoxManage.exe controlvm {1c147e8f-0e29-4873-939c-24f8d639ab77} poweroff

# перезагрузка без сохранения состояния
VBoxManage.exe controlvm {1c147e8f-0e29-4873-939c-24f8d639ab77} reset

# сохранение состояния с записью на диск и остановкой вм
VBoxManage.exe controlvm {1c147e8f-0e29-4873-939c-24f8d639ab77} savestate

# приостановка работы, перевод в режим ожидания
VBoxManage.exe controlvm {1c147e8f-0e29-4873-939c-24f8d639ab77} pause

# возобновление работы, выход из режима ожидания
VBoxManage.exe controlvm {1c147e8f-0e29-4873-939c-24f8d639ab77} resume

# отправка сигнала ACPI для корректного завершения работы (если поддерживается гостевой ОС)
VBoxManage.exe controlvm {1c147e8f-0e29-4873-939c-24f8d639ab77} acpipowerbutton


🔸 Работа со снимками виртуальной машины
# создать snapshot
VBoxManage snapshot my-test-vm take my-test-vm-snapshot

# список snapshots
VBoxManage snapshot list my-test-vm

# восстановиться из snapshot
VBoxManage snapshot my-test-vm restore my-test-vm-snapshot

# удалить snapshot
VBoxManage snapshot my-test-vm delete my-test-vm-snapshot


🔎 Больше команд в официальном мануале.

#virtualbox #шпаргалка
👍3
🔎 Разработчики популярного объектного s3 хранилища с открытым исходным кодом MinIO наигрались в open source. В недавних обновлениях веб панели были вырезаны административные функции (управление пользователями, политиками доступа, бакетами, репликацией и прочие конфигурации), остался лишь базовый обозреватель объектов. Пользователям предлагается перейти полностью на работу через cli клиент mc (MinIO Client).

💵 А все почему? Выпуск корпоративного решения - AIStor, которое позиционируется как основной продукт компании на данный момент. Все уже предпринятые и будущие ограничения Community Edition направлены на то, чтобы склонить организации, эксплуатирующие инструмент на безвозмездной основе, к лицензированию, т.е. переходу на коммерческий проект.

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

⚙️ Осваиваем консольный клиент или прыгаем на форк, который любезно подхватило и развивает сообщество.

#opensource #minio #news
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4
💻 Давно хотел собрать отдельный раздел про разработку на канале. Начало этому решил положить коллега Максим Пьянков, который углубляется в Golang и, заодно, пробует себя в написании статей. В итоге получился интересный обзор на ORM Bun - своего рода абстракцию, прослойку между бд и кодом, позволяющую избежать, но не исключающую, необходимости погружаться в SQL.

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

Bun — это высокопроизводительный ORM и SQL-Query builder для Go, построенный поверх pg и полностью совместимый с database/sql. Он поддерживает PostgreSQL, MySQL, MariaDB и SQLite.

Bun ориентирован на производительность, лаконичность и гибкость, предлагая как полноценный ORM, так и возможность писать кастомный SQL.

🔍 Ключевые особенности

- Совместимость с `database/sql`
- 🚀 Высокая производительность (без рефлексии во время выполнения)
- 🔧 Миграции, ORM, SQL Builder — всё в одном
- 📦 Удобная работа со связями (has one, has many, many to many)
- 🧠 Простой синтаксис, без магии
- 📈 Поддержка soft-delete, hooks, embed'ов, кастомных типов

🔨 Примеры использования

1. Инициализация
import (
"github.com/uptrace/bun"
_ "github.com/lib/pq"
"database/sql"
)

dbSQL, _ := sql.Open("postgres", "postgres://user:pass@localhost:5432/db?sslmode=disable")
db := bun.NewDB(dbSQL, pgdialect.New())


2. Модель
type Example struct {
bun.BaseModel `bun:"table:examples"`

ID int64 `bun:",pk,autoincrement"`
Hash string `bun:",unique,notnull"`
Filename string `bun:",notnull"`
Source *string
CreatedAt time.Time `bun:",nullzero,notnull,default:current_timestamp"`
}


3. Создание записи
_, err := db.NewInsert().Model(&Example{
Hash: "abc123",
Filename: "order.xlsx",
}).Exec(ctx)


4. Запрос данных
var examples []Example
err := db.NewSelect().
Model(&examples).
Where("hash = ?", "abc123").
Scan(ctx)


💡 Когда выбирать Bun

Bun подойдет если:
▫️ Нужен баланс между низкоуровневым контролем и удобством ORM;
▫️ Нужна производительность, но без необходимости писать весь SQL вручную;
▫️ Проект использует database/sql и драйверы (pgx, pq, mysql, sqlite и др.);
▫️ Нужно прозрачное поведение;
▫️ Нужны удобные миграции и поддержка связей без лишнего веса.

❗️ На что обратить внимание

▪️ Bun не предлагает полную типобезопасность как Ent или sqlc — будьте внимательны к SQL;
▪️ Некоторые вещи (например, сложные JOIN'ы) всё равно лучше делать вручную;
▪️ Нет автоматической генерации GraphQL или OpenAPI.

#golang #orm #db
👍4
👍2🔥2
Я как-то упоминал в нескольких заметках об утечках секретов и их возможных причинах, но самые банальные и, казалось бы, глупые из них застают врасплох даже целые корпорации.

🥷 Вышла на днях новость об обнаруженной уязвимости в системе подбора персонала McDonald's McHire.
• Исследователи обнаружили, что один из административных аккаунтов в системе McHire имел пароль «123456» — что позволило им за полчаса получить полный админ доступ к платформе и базе с 64 млн настоящих анкет соискателей (имена, телефон, e mail, переписки).
• Более того, отсутствовала проверка прав доступа при смене параметра ID в URL (IDOR уязвимость), что открывало любые анкеты по простой подстановке числа.


Система McHire разрабатывается и поддерживается Paradox.ai, а не McDonald’s напрямую. Разработчики выпустили статью с раскрытием некоторых деталей (забыли тестовый аккаунт отключить), заверили в мгновенной реакции на инцидент, и представили планы запуска bug bounty программы для своих продуктов (пока петух не клюнет...).

Несмотря на заявление, что утечки не случилось, и что никто, кроме "белых хакеров", доступа к базе не успел получить, работы и пресс-релизов на эту тему у Paradox.ai явно прибавится, дабы как-то сгладить эффект от случившегося и прозрачно демонстрировать все предпринятые меры.

Источники: [1], [2], [3]

#news #security #leaks
👍3🔥1
🔎 В следующем мини-цикле планирую рассмотреть некоторые практические примеры работы с Nuclei - гибкого и быстрого инструмента с открытым исходным кодом для сканирования на наличие уязвимостей в приложениях, сетях и облачной инфраструктуре. Отличительной чертой этого решения является работа через YAML-шаблоны, определяющие способы отправки запросов и анализа ответов, и позволяющие реализовать самые разнообразные пользовательские сценарии.

📝 План

1️⃣ Исследование одиночного лабораторного хоста с заведомо уязвимыми приложениями на борту.
2️⃣ Анализ виртуальной сети из нескольких хостов. Сбор информации, оценка уязвимостей.
3️⃣ Работа с шаблонами. Применяем готовые, пишем свои, генерируем автоматически на основе предварительно собранной информации.

📚 А пока полезные материалы по теме

🔸 Репа проекта: [1]
🔸 Целая гора шаблонов: [1], [2], [3]
🔸 Обзорные статьи: [1], [2]

#security #scan #nuclei #полезное
🔥2👍1
Первая часть про Nuclei

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

🔹 web-dvwa
docker run -d -p 127.0.0.1:4380:80 vulnerables/web-dvwa

🔹 juice-shop
docker run -d -p 127.0.0.1:4480:3000 bkimminich/juice-shop


📚 Еще примеры образов и контейнеров с преднамеренными уязвимостями для обучения и тестирования:
▪️ vulnhub.com - виртуальные машины и образы
▪️ vulnhub github - уязвимые контейнеры с популярными инструментами
▪️ metasploitable-2 - специализированная машина для практики поиска и эксплуатации уязвимостей

🔨 Устанавливаем сканер
sudo apt install nuclei


🔎 Справка по основным параметрам запуска
-u        Указать домен
-l Список доменов
-t Указать шаблон
-j Вывод в формате JSON
-o Файл для вывода результатов
-irr Включить пары запрос/ответ в выходной отчет
-rl Ограничение скорости, макс количество запросов в секунду
-retries Количество попыток повторения неудачного запроса
-validate Проверка переданных шаблонов для Nuclei
-silent Отображать только результаты сканирования
-vv Показать загруженные шаблоны для сканирования
-H Добавить пользовательский агент
-tags Сканирование с шаблонами, помеченными определённым тегом
-itags Включить шаблоны по тегам (переопределяет настройки по умолчанию)
-etags Исключить шаблоны по тегам
-author Сканирование с шаблонами от определённого автора
-severity Сканирование с шаблонами определённой степени серьёзности (info, low, medium, high, critical)
-pt Фильтр по типу протокола


🚀 Выполним простое сканирования одиночных хостов с помощью Nuclei

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

🥷 Сканируем web-dvwa с экспортом отчета в формате markdown
mkdir report_dvwa
nuclei -u 127.0.0.1:4380 -irr -markdown-export ./report_dvwa

[dvwa-default-login] [http] [critical] http://127.0.0.1:4380/index.php [password="password",username="admin"]
[cookies-without-secure] [javascript] [info] 127.0.0.1:4380 ["security","PHPSESSID"]
[exposed-gitignore] [http] [info] http://127.0.0.1:4380/.gitignore
[configuration-listing] [http] [medium] http://127.0.0.1:4380/config/
...

Получаем каждую уязвимость в отдельном markdown-файле с детальной информацией внутри (см. примеры из отчета на скринах).

🥷 Для второго хоста выполняем такое же сканирование, но с отчетом в json
nuclei -u 127.0.0.1:4480 -j -o ./report_juice.json

Ожидал увидеть больше уязвимостей, однако нашлась всего парочка уровня info. Повторил процесс - сканирование завершилось, не успев начаться. Оказывается контейнер отвалился после первого запуска, а причиной тому стало переполнение памяти. 😐 В логах контейнера следующая информация:
FATAL ERROR: Ineffective mark-compacts near heap limit Allocation failed - JavaScript heap out of memory

💡 Попробовал снизить нагрузку на хост во время сканирования корректировкой параметров запуска
▫️Ограничиваем количество шаблонов для запуска (например, ищем только самые важные уязвимости)
nuclei -u 127.0.0.1:4480 -severity high,critical -j -o ./report_juice.json

▫️Снижаем скорость сканирования (флаг -rl - ограничение количества запросов в секунду)
nuclei -u 127.0.0.1:4480 -severity info,low,medium -rl 10 -j -o ./report_juice.json

Процесс отработал полностью в обоих случаях. Критических уязвимостей найдено не было. За счет снижения скорости сканер трудился значительно дольше, однако собрал довольно полную информацию, в том числе обнаружил одну medium уязвимость (см. примеры из отчета на скринах).

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

#security #scan #nuclei
🔥3👏1
"Собака лает - караван идет"

На фоне новости об утверждении MAX платформой, на базе которой будет создаваться национальный мессенджер (Распоряжение от 12 июля 2025 года №1880-р), интернет, мягко говоря, взвыл. Это давно заметный тренд - любая гос инициатива - высмеять, полить известной субстанцией и в красках рассказать свои ощущения в публичном пространстве.

Критика, зачастую, не прям-таки профессиональная. Соглашусь только на счет open source библиотек от сомнительных разработчиков, но дело поправимое, форк и вперед, также местами глаз цепляется за "иностранные слова" в национальном мессенджере, особенно в ответах встроенного помощника GigaChat.

А вот паника про слежку, хранение адресов, контактов и переписки, выглядит забавно - "о ужас! как же так, товарищ майор, мы под колпаком, все пропало...". Смотрим на альтернативные решения - данные утекают к зарубежным "партнерам" - "ну норм - это все, чтобы улучшить юзабилити, все на пользу, все для нас - любимых пользователей". Или это другое? 😉

⚠️ Но как-то из виду упустили важный шаг - 1 июля команда VK запустила публичную bug bounty программу ([1], [2], [3]) еще на этапе beta версии MAX с упором на защиту пользователей и их данных и вознаграждением до 5 млн рублей.

Пожелаем удачи VK и будем пробовать потихоньку новую функциональность. Кстати, каналы уже завезли в тестовом режиме 👍

#news #MAX
👍5😁2