witr – или почему это работает?
witr – удобная интерактивная утилита название которой составлено как аббревиатура от фразы «Why is this running?» (почему это работает) и в этом заключается основное назначение этой утилиты.
Как пишет сам разработчик, основные задачи, которые выполняет утилита заключаются в быстром ответе на вопросы:
▫️ Что это запущено?
▫️ Как оно было запущено?
▫️ Что отвечает за его работу?
▫️ В каком контексте оно работает?
Утилита следует принципу одного экрана, что облегчает понимание ситуации и не заставляет пользователя переключаться, чтобы сопоставить различные источники информации. Что, по мнению разработчика, важно в условиях стресса при расследовании сбоев или вторжений.
И тут мы с ним полностью согласимся. Каждый кто занимался расследованием непонятных инцидентов знает, как важно быстро получить и сопоставить, а потом еще интерпретировать информацию из различных источников, особенно в условии авральной ситуации.
Сам по себе witr не сообщит вам ничего нового, всю эту информацию можно получить самостоятельно, воспользовавшись
Здесь же вы быстро получите всю возможную картину в одном месте, существенно сэкономив себе время и перейдя от догадок к уверенности.
Для установки утилиты воспользуйтесь скриптом от разработчика. Для Linux, macOS или FreeBSD выполните:
Для Windows:
Отметим, что версия утититы для Windows обладает более узкими возможностями, в частности не умеет работать с файлами.
После чего просто запустите ее от имени суперпользователя или sudo:
По умолчанию мы попадаем в интерактивный режим, перед нами открыт список процессов и переходя по ним мы можем сразу посмотреть всю его подноготную. В нашем случае показан процесс mc. Мы разу видим, что запущен он из SSH-сессии, в которой были повышены права через su.
Для подробностей мы можем нажать Enter и посмотреть подробное описание процесса, здесь мы уже видим кем и откуда запущен процесс, его рабочую директорию, переменные окружения, статистику его работы.
Следующая закладка – сетевые порты, по умолчанию показаны только порты в режиме прослушивания, но нажав кнопку a можно увидеть все используемые сетевые порты, и мы сразу видим связанный с этим портом процесс. Нажатие Enter на процессе сразу покажет нам все подробности.
Третья закладка – контейнеры, четвертая – файлы, по умолчанию нам покажут только заблокированные, но мы можем переключиться в режим всех открытых файлов. Здесь точно также по Enter мы можем получить все подробности о контейнере или работающему с файлом процессе.
Узнать больше о возможностях и применениях утилиты можно на официальной странице проекта: https://github.com/pranshuparmar/witr
Но в любом случае рекомендуем добавить ее в свой инструментарий, лишней не будет, особенно в авральной или непонятной ситуации.
witr – удобная интерактивная утилита название которой составлено как аббревиатура от фразы «Why is this running?» (почему это работает) и в этом заключается основное назначение этой утилиты.
Как пишет сам разработчик, основные задачи, которые выполняет утилита заключаются в быстром ответе на вопросы:
▫️ Что это запущено?
▫️ Как оно было запущено?
▫️ Что отвечает за его работу?
▫️ В каком контексте оно работает?
Утилита следует принципу одного экрана, что облегчает понимание ситуации и не заставляет пользователя переключаться, чтобы сопоставить различные источники информации. Что, по мнению разработчика, важно в условиях стресса при расследовании сбоев или вторжений.
И тут мы с ним полностью согласимся. Каждый кто занимался расследованием непонятных инцидентов знает, как важно быстро получить и сопоставить, а потом еще интерпретировать информацию из различных источников, особенно в условии авральной ситуации.
Сам по себе witr не сообщит вам ничего нового, всю эту информацию можно получить самостоятельно, воспользовавшись
ps, top, lsof, ss, systemctl, docker ps и т.д. Но, если вы не занимаетесь этим постоянно, то вам нужно помнить или искать нужные ключи, собирать и сопоставлять информацию, пытаться сделать правильные выводы.Здесь же вы быстро получите всю возможную картину в одном месте, существенно сэкономив себе время и перейдя от догадок к уверенности.
Для установки утилиты воспользуйтесь скриптом от разработчика. Для Linux, macOS или FreeBSD выполните:
curl -fsSL https://raw.githubusercontent.com/pranshuparmar/witr/main/install.sh | bash
Для Windows:
irm https://raw.githubusercontent.com/pranshuparmar/witr/main/install.ps1 | iex
Отметим, что версия утититы для Windows обладает более узкими возможностями, в частности не умеет работать с файлами.
После чего просто запустите ее от имени суперпользователя или sudo:
sudo witr
По умолчанию мы попадаем в интерактивный режим, перед нами открыт список процессов и переходя по ним мы можем сразу посмотреть всю его подноготную. В нашем случае показан процесс mc. Мы разу видим, что запущен он из SSH-сессии, в которой были повышены права через su.
Для подробностей мы можем нажать Enter и посмотреть подробное описание процесса, здесь мы уже видим кем и откуда запущен процесс, его рабочую директорию, переменные окружения, статистику его работы.
Следующая закладка – сетевые порты, по умолчанию показаны только порты в режиме прослушивания, но нажав кнопку a можно увидеть все используемые сетевые порты, и мы сразу видим связанный с этим портом процесс. Нажатие Enter на процессе сразу покажет нам все подробности.
Третья закладка – контейнеры, четвертая – файлы, по умолчанию нам покажут только заблокированные, но мы можем переключиться в режим всех открытых файлов. Здесь точно также по Enter мы можем получить все подробности о контейнере или работающему с файлом процессе.
Узнать больше о возможностях и применениях утилиты можно на официальной странице проекта: https://github.com/pranshuparmar/witr
Но в любом случае рекомендуем добавить ее в свой инструментарий, лишней не будет, особенно в авральной или непонятной ситуации.
👍43❤1
Новый формат DEB822 для источников APT
Так уж пошло, что многие привычные вещи воспринимаются нами чем-то незыблемым, а попытка нарушить текущий ход вещей часто воспринимается в штыки. Новый формат источников APT - DEB822 не исключение, он появился начиная с выпуска Debian 13, а пользователи Ubuntu познакомились с ним немного раньше, начиная с Ubuntu 24.04. В данной статье мы подробно разберем новый формат, его основные отличия и преимущества перед привычным старым.
Заметка на эту тему уже была, теперь полноценная статья, которую мы достали из черновиков, вычитали, причесали и опубликовали.
Статья серьезно расширена и дополнена, кроме подробного разбора опций в ней есть новые разделы, которых не было в заметке.
✅ Читать: https://interface31.ru/post/novyj-format-deb822-dlya-istochnikov-apt/
Так уж пошло, что многие привычные вещи воспринимаются нами чем-то незыблемым, а попытка нарушить текущий ход вещей часто воспринимается в штыки. Новый формат источников APT - DEB822 не исключение, он появился начиная с выпуска Debian 13, а пользователи Ubuntu познакомились с ним немного раньше, начиная с Ubuntu 24.04. В данной статье мы подробно разберем новый формат, его основные отличия и преимущества перед привычным старым.
Заметка на эту тему уже была, теперь полноценная статья, которую мы достали из черновиков, вычитали, причесали и опубликовали.
Статья серьезно расширена и дополнена, кроме подробного разбора опций в ней есть новые разделы, которых не было в заметке.
✅ Читать: https://interface31.ru/post/novyj-format-deb822-dlya-istochnikov-apt/
5👍15❤2
👍1
Их нравы
На конференции Linux App Summit Себастьян Вик (Sebastian Wick), мэйнтейнер инструментария Flatpak, и Адриан Вовк (Adrian Vovk), создатель инсталлятора для GNOME OS и один из разработчиков systemd-homed и systemd-sysupdate, выступили с докладом о будущем системы самодостаточных пакетов Flatpak.
В докладе упоминалось намерение создать для нужд Flatpak новый процесс systemd-appd для управления правами приложений и вложенной изоляции. Важный нюанс: код ещё не написан, а поддержка пока только задумывалась.
Но тут «разверзлись хляби небесные» в социальной сети Fediverse началась волна агрессии. Разработчиков обвинили в «насаждении диктатуры», «предательстве портативности» и «союзничестве с Ландьюком». Критика сыпалась на этапе концепции, без анализа доклада. Аргументы «мы ещё даже код не написали» игнорировались.
В результате Адриан Вовк заявил, что до начала этой токсичной кампании он искренне хотел найти элегантное решение для пользователей альтернативных init-систем (например, выделить appd в отдельный демон, как это сделали с elogind). Но после потока неконструктивной агрессии и обвинений у него пропала мотивация тратить личное время и силы на это:
К чему это привело? Да к тому, что systemd теперь станет обязательной зависимостью Flatpak, альтернативные решения разработчики больше рассматривать не желают.
И это не первый случай токсичного поведения меньшинств, которые потом искренне удивляются почему никто не хочет поддерживать их решения и вообще тратить на них время. Многие начинают склоняться к теориям заговора и козням корпораций.
На самом деле проблема не в systemd vs openrc (или подставьте сюда все что хотите). Проблема в культуре дискуссии. Токсичное меньшинство, кричащее громче всех, создаёт иллюзию «общественного мнения». Но реальные мейнтейнеры видят: за громкими лозунгами стоит оголтелый фанатизм и догматическое отторжение инакомыслия.
На конференции Linux App Summit Себастьян Вик (Sebastian Wick), мэйнтейнер инструментария Flatpak, и Адриан Вовк (Adrian Vovk), создатель инсталлятора для GNOME OS и один из разработчиков systemd-homed и systemd-sysupdate, выступили с докладом о будущем системы самодостаточных пакетов Flatpak.
В докладе упоминалось намерение создать для нужд Flatpak новый процесс systemd-appd для управления правами приложений и вложенной изоляции. Важный нюанс: код ещё не написан, а поддержка пока только задумывалась.
Но тут «разверзлись хляби небесные» в социальной сети Fediverse началась волна агрессии. Разработчиков обвинили в «насаждении диктатуры», «предательстве портативности» и «союзничестве с Ландьюком». Критика сыпалась на этапе концепции, без анализа доклада. Аргументы «мы ещё даже код не написали» игнорировались.
Брайан Ландьюк (Bryan Lunduke) — известный технический блогер, яростный критик systemd и корпоративного влияния в Linux . В данном контексте обвинение в «союзничестве» с ним используется как токсичный ярлык и обвинение в намеренном вреде проекту ради идеологии.
В результате Адриан Вовк заявил, что до начала этой токсичной кампании он искренне хотел найти элегантное решение для пользователей альтернативных init-систем (например, выделить appd в отдельный демон, как это сделали с elogind). Но после потока неконструктивной агрессии и обвинений у него пропала мотивация тратить личное время и силы на это:
Но, честно говоря, всё это обсуждение сейчас совершенно бессмысленно, пока мы не написали ни единой строчки кода. Если быть откровенным, до этой травли в Феди я планировал максимально тактично отнестись к сценарию использования без systemd. Но тут я увидел, как кто-то в открытую обвиняет нас в том, что мы «союзники Ландьюка».
Так что, извините, но у меня больше нет ни малейшего желания тратить своё время на это дерьмо. Оно того не стоит.
К чему это привело? Да к тому, что systemd теперь станет обязательной зависимостью Flatpak, альтернативные решения разработчики больше рассматривать не желают.
И это не первый случай токсичного поведения меньшинств, которые потом искренне удивляются почему никто не хочет поддерживать их решения и вообще тратить на них время. Многие начинают склоняться к теориям заговора и козням корпораций.
На самом деле проблема не в systemd vs openrc (или подставьте сюда все что хотите). Проблема в культуре дискуссии. Токсичное меньшинство, кричащее громче всех, создаёт иллюзию «общественного мнения». Но реальные мейнтейнеры видят: за громкими лозунгами стоит оголтелый фанатизм и догматическое отторжение инакомыслия.
👍22🤡1
TinyFileManager – простой и эффективный файловый веб-менеджер
В современных условиях часто встает вопрос удобного предоставления доступа к файлам самых разнообразных пользователей, в том числе мобильных и удаленных. Протокол SMB для этой задачи не самая лучшая идея, а создавать дублирующие хранилища наподобие Nextcloud избыточно.
Для такого случая может пригодиться TinyFileManager – простой файловый веб-менеджер в виде единственного PHP-файла. Но разработчик, судя по всему, сосредоточился именно на развитии самого скрипта, а подходы к созданию Docker-образа мягко скажем сомнительны. Поэтому образ мы будем собирать самостоятельно.
Общая структура проекта:
Dockerfile
docker-compose.yml
Caddyfile
php-session.ini
config.php
После чего создаем директорию для хранения файлов и устанавливаем на нее нужные права:
И сгенерируем хеши паролей реальным пользователям:
Обратите внимание, пользователи бывают двух типов, с правами загружать файлы и правами только на чтение.
Запускаем проект:
И переходим в браузере по указанному адресу.
В современных условиях часто встает вопрос удобного предоставления доступа к файлам самых разнообразных пользователей, в том числе мобильных и удаленных. Протокол SMB для этой задачи не самая лучшая идея, а создавать дублирующие хранилища наподобие Nextcloud избыточно.
Для такого случая может пригодиться TinyFileManager – простой файловый веб-менеджер в виде единственного PHP-файла. Но разработчик, судя по всему, сосредоточился именно на развитии самого скрипта, а подходы к созданию Docker-образа мягко скажем сомнительны. Поэтому образ мы будем собирать самостоятельно.
Общая структура проекта:
/opt/tinyfm/
├── Caddyfile
├── config.php
├── php-session.ini
├── docker-compose.yml
├── Dockerfile
└── data/
Dockerfile
FROM php:8.3-fpm-alpine
WORKDIR /var/www/html
RUN apk add --no-cache \
libzip-dev \
libpng-dev \
libjpeg-turbo-dev \
freetype-dev \
oniguruma-dev \
bzip2-dev \
curl \
&& docker-php-ext-configure gd --with-freetype --with-jpeg \
&& docker-php-ext-install zip gd mbstring bz2
RUN curl -L -o index.php https://raw.githubusercontent.com/prasathmani/tinyfilemanager/master/tinyfilemanager.php \
&& chown -R www-data:www-data /var/www/html
docker-compose.yml
services:
tinyfilemanager:
build: .
container_name: tinyfilemanager
restart: unless-stopped
user: "82:82"
volumes:
- app_code:/var/www/html
- ./data:/var/www/html/data
- ./config.php:/var/www/html/config.php:ro
- ./php-session.ini:/usr/local/etc/php/conf.d/session.ini:ro
tmpfs:
- /tmp:uid=82,gid=82,mode=1777
security_opt:
- no-new-privileges:true
cap_drop:
- ALL
caddy:
image: caddy:2-alpine
container_name: tinyfm-caddy
restart: unless-stopped
ports:
- "80:80"
- "443:443"
- "443:443/udp"
volumes:
- ./Caddyfile:/etc/caddy/Caddyfile:ro
- app_code:/var/www/html:ro
- ./data:/var/www/html/data:ro
- caddy_data:/data
- caddy_config:/config
depends_on:
- tinyfilemanager
volumes:
app_code:
caddy_data:
caddy_config:
Caddyfile
files.example.com {
#tls internal
encode gzip zstd
header {
Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
X-Content-Type-Options nosniff
X-Frame-Options DENY
Referrer-Policy no-referrer
}
root * /var/www/html
php_fastcgi tinyfilemanager:9000
file_server
}php-session.ini
session.gc_maxlifetime = 300
session.cookie_lifetime = 300
session.use_strict_mode = 1
session.cookie_secure = 1
session.cookie_httponly = 1
session.cookie_samesite = Lax
session.save_path = "/tmp"
config.php
<?php
$root_path = '/var/www/html/data';
$root_url = 'data';
$http_host = $_SERVER['HTTP_HOST'];
$use_auth = true;
$auth_users = array(
'admin' => '$2y$10$/K.hjNr84lLNDt8fTXjoI.DBp6PpeyoJ.mGwrrLuCZfAwfSAGqhOW', //admin@123
'user' => '$2y$10$Fg6Dz8oH9fPoZ2jJan5tZuv6Z4Kp7avtQ9bDfrdRntXtPeiMAZyGO', //12345
'guest' => '$2y$10$a.DMI5sRjAnvhb.8rFAXY.XPSEO/eatVb4qCMmTc2YcxTDKp9xMyC' //guest
);
$readonly_users = array(
'guest'
);
$exclude_items = array(
'.htaccess',
'.env',
'docker-compose.yml',
'Caddyfile',
'php-session.ini',
'config.php',
'.git',
'.DS_Store',
'..',
'.'
);
$online_viewer = false;
$default_timezone = 'Europe/Moscow';
После чего создаем директорию для хранения файлов и устанавливаем на нее нужные права:
mkdir -p /opt/tinyfm/data
chown -R 82:82 /opt/tinyfm/data
И сгенерируем хеши паролей реальным пользователям:
docker run --rm php:8.3-alpine php -r "echo password_hash('мой_пароль', PASSWORD_BCRYPT) . PHP_EOL;"Обратите внимание, пользователи бывают двух типов, с правами загружать файлы и правами только на чтение.
Запускаем проект:
docker compose up -d -–build
И переходим в браузере по указанному адресу.
👍29
Настраиваем Visual Studio Code для удаленной работы через SSH
Сегодня все чаще и чаще для конфигурационных файлов используются продвинутые текстовые форматы, такие как JSON или XML, имеющие строгий синтаксис и структуру.
Их применение облегчает программную обработку данных, но при этом они все еще остаются легко читаемыми человеком.
Однако работа с ними в привычных консольных редакторах имеет ряд неудобств, в частности связанных с соблюдением синтаксиса и формата разметки.
Поэтому гораздо удобнее использовать для этого специальные среды разработки, например, VS Code, тем более что он прекрасно умеет работать через SSH.
✅ Читать далее: https://interface31.ru/post/nastraivaem-visual-studio-code-dlya-udalennoy-raboty-cherez-ssh/
Сегодня все чаще и чаще для конфигурационных файлов используются продвинутые текстовые форматы, такие как JSON или XML, имеющие строгий синтаксис и структуру.
Их применение облегчает программную обработку данных, но при этом они все еще остаются легко читаемыми человеком.
Однако работа с ними в привычных консольных редакторах имеет ряд неудобств, в частности связанных с соблюдением синтаксиса и формата разметки.
Поэтому гораздо удобнее использовать для этого специальные среды разработки, например, VS Code, тем более что он прекрасно умеет работать через SSH.
✅ Читать далее: https://interface31.ru/post/nastraivaem-visual-studio-code-dlya-udalennoy-raboty-cherez-ssh/
👍12🔥11❤1
Обновление PostgreSQL в Docker через pg_dumpall
Обновление PostgreSQL между мажорными версиями задача не самая простая, недостаточно просто загрузить новый контейнер, нужно еще выполнить конвертацию структуры кластера СУБД, которая меняется от версии к версии.
Для небольших и средних баз идеально использовать импорт/экспорт при помощи утилиты pg_dumpall, что полностью исключает риск повреждения исходных данных, плюс у вас на руках всегда остается актуальная резервная копия в виде дампа всего кластера.
Итак, приступим, допустим мы изначально имеем:
В нашем случае:
▫️ db — имя сервиса Compose
▫️ postgres-db — реальное имя контейнера Docker
1️⃣ Остановим весь стек и запустим обратно только контейнер с СУБД, это исключит возможную запись в БД во время выгрузки:
Теперь выполним выгрузку дампа всего кластера:
Проверяем, что файл выгрузки создан. После чего останавливаем контейнер с БД:
2️⃣ Следующие шаги будут несколько различаться в отличие от того, используем ли мы Named Volumes или Bind mount, но в любом случае наша задача запустить новый контейнер СУБД с пустым томом.
🔹 Для Named Volumes было:
Стало:
🔹 Для Bind mount было:
Стало:
3️⃣ Запускаем СУБД:
Мы нее запускаем весь стек, чтобы раньше времени приложения не начали писать в новую чистую БД.
Ждем пока база инициализируется и готова будет принимать соединения, для этого выполним команду:
Как только появится сообщение:
Можно двигаться дальше. Загружаем дамп кластера СУБД:
Теперь запускаем весь стек:
4️⃣ После чего рекомендуется выполнить оптимизацию загруженной базы:
Это не мешает работе и можно запускать уже на работающем стеке. Старые тома лучше всего оставить на некоторое время, пока вы не убедитесь, что обновление прошло нормально.
Обновление PostgreSQL между мажорными версиями задача не самая простая, недостаточно просто загрузить новый контейнер, нужно еще выполнить конвертацию структуры кластера СУБД, которая меняется от версии к версии.
Для небольших и средних баз идеально использовать импорт/экспорт при помощи утилиты pg_dumpall, что полностью исключает риск повреждения исходных данных, плюс у вас на руках всегда остается актуальная резервная копия в виде дампа всего кластера.
Итак, приступим, допустим мы изначально имеем:
services:
db:
container_name: postgres-db
В нашем случае:
▫️ db — имя сервиса Compose
▫️ postgres-db — реальное имя контейнера Docker
1️⃣ Остановим весь стек и запустим обратно только контейнер с СУБД, это исключит возможную запись в БД во время выгрузки:
docker compose stop
docker compose up -d db
Теперь выполним выгрузку дампа всего кластера:
docker exec -t postgres-db pg_dumpall -U postgres > full_backup.sql
Проверяем, что файл выгрузки создан. После чего останавливаем контейнер с БД:
docker compose down
2️⃣ Следующие шаги будут несколько различаться в отличие от того, используем ли мы Named Volumes или Bind mount, но в любом случае наша задача запустить новый контейнер СУБД с пустым томом.
🔹 Для Named Volumes было:
services:
db:
image: postgres:17
volumes:
- pg_data:/var/lib/postgresql/data
volumes:
pg_data:
Стало:
services:
db:
image: postgres:18
volumes:
- pg_data_18:/var/lib/postgresql/data
volumes:
pg_data_18:
🔹 Для Bind mount было:
services:
db:
image: postgres:17
volumes:
- ./postgres-data:/var/lib/postgresql/data
Стало:
services:
db:
image: postgres:18
volumes:
- ./postgres-data-18:/var/lib/postgresql/data
3️⃣ Запускаем СУБД:
docker compose up -d db
Мы нее запускаем весь стек, чтобы раньше времени приложения не начали писать в новую чистую БД.
Ждем пока база инициализируется и готова будет принимать соединения, для этого выполним команду:
docker logs -f postgres-db
Как только появится сообщение:
database system is ready to accept connections
Можно двигаться дальше. Загружаем дамп кластера СУБД:
docker exec -i postgres-db psql -U postgres < full_backup.sql
Теперь запускаем весь стек:
docker compose up -d
4️⃣ После чего рекомендуется выполнить оптимизацию загруженной базы:
docker exec -it postgres-db vacuumdb -U postgres --all --analyze-only
Это не мешает работе и можно запускать уже на работающем стеке. Старые тома лучше всего оставить на некоторое время, пока вы не убедитесь, что обновление прошло нормально.
👍8⚡3😁2❤1
УТМ ЕГАИС 403 Forbidden - Доступ к странице с данного IP не разрешен
С такой ошибкой столкнулся сегодня один наш коллега. Предыстория проста. В самом веб-интерфейсе UTM есть фильтр IP-адресов, в котором можно указать доверенные адреса и сети, обращения с других адресов будут отклоняться.
А дальше – проще, немного не подумал или опечатался и доступа у тебя больше нет. Как раз этим наш коллега и решил заняться, тем более что в регионе у нас три «для трезвости» подряд. Но что-то пошло не так и доступ пропал отовсюду.
Поиск в сети, к удивлению, результатов не дал, везде написана какая-то ерунда, а в тематических сообществах и вовсе советуют переустановить УТМ, он бы так и сделал, но за неожиданные выходные в УТМ собралось много входящих документов.
В любом случае переустановка – это не наш метод, всегда следует разобраться в проблеме, иначе переустанавливать на каждый чих просто утомишься.
Итак, белые списки, если они есть, то должны где-то хранится, а каком-то конфигурационном файле. Вот поиском этого и займемся. Недолгие поиски привели нас к файлу
В самом низу он содержит две интересные опции:
Первая – это список адресов, с которых были попытки подключений. Хотя зачем они в конфиге? Логично было бы хранить их в логе. А вот последняя – это и есть наш белый список. Можете откорректировать его до нужных значений, а можете просто очистить.
Ошибка нашего коллеги была классическая, он набрал 192.186.х.х вместо 192.168.х.х.
После чего просто перезапустите службу УТМ и доступ восстановится.
С такой ошибкой столкнулся сегодня один наш коллега. Предыстория проста. В самом веб-интерфейсе UTM есть фильтр IP-адресов, в котором можно указать доверенные адреса и сети, обращения с других адресов будут отклоняться.
А дальше – проще, немного не подумал или опечатался и доступа у тебя больше нет. Как раз этим наш коллега и решил заняться, тем более что в регионе у нас три «для трезвости» подряд. Но что-то пошло не так и доступ пропал отовсюду.
Поиск в сети, к удивлению, результатов не дал, везде написана какая-то ерунда, а в тематических сообществах и вовсе советуют переустановить УТМ, он бы так и сделал, но за неожиданные выходные в УТМ собралось много входящих документов.
В любом случае переустановка – это не наш метод, всегда следует разобраться в проблеме, иначе переустанавливать на каждый чих просто утомишься.
Итак, белые списки, если они есть, то должны где-то хранится, а каком-то конфигурационном файле. Вот поиском этого и займемся. Недолгие поиски привели нас к файлу
transport/conf/transport.properties в директории установки УТМ. У нас указан путь для Linux установки, в Windows его расположение аналогично.В самом низу он содержит две интересные опции:
web.server.attempt.ip =
web.server.access.ip =
Первая – это список адресов, с которых были попытки подключений. Хотя зачем они в конфиге? Логично было бы хранить их в логе. А вот последняя – это и есть наш белый список. Можете откорректировать его до нужных значений, а можете просто очистить.
Ошибка нашего коллеги была классическая, он набрал 192.186.х.х вместо 192.168.х.х.
После чего просто перезапустите службу УТМ и доступ восстановится.
👍22🔥3❤2🤝2
Особенности установки УТМ ЕГАИС на Debian 13
Сегодня попробовали установить УТМ ЕГАИС на свежий дистрибутив Debian 13. Сама установка не вызывает особых сложностей и ее можно выполнить по нашей статье:
🔹 ЕГАИС. Устанавливаем УТМ 4.2.0 на Debian (Ubuntu)
При этом, вместо
Сам пакет u-trans тоже ставится без особых проблем, запускается, но не работает. Если вы откроете лог, то увидите, что УТМ не может обнаружить ключ. Странно, ведь инсталлятор увидел Рутокен и инструменты диагностики тоже его видят.
Поэтому читаем лог дальше и находим интересные записи:
Это значит, что библиотека требует наличия executable stack (исполняемый стек), который отключен в Debian 13 по соображениями безопасности (а также в Ubuntu, начиная с 25.10).
👆 Включить данную технологию не представляется возможным (во всяком случае без глубокого изменения системы), поэтому можно считать, что УТМ ЕГАИС несовместим с Debian 13 и грядущей Ubuntu 26.04 LTS.
😉 Ну если, конечно, разработчики Росалкогольтабакконтроль не перепишут программу, но надежды на это призрачные, с учетом того, что u-trans для Linux до сих пор 32-битное приложение.
С другой стороны, у нас все-таки Linux и каждый тут сам кузнец собственного счастья. Указанные в ошибках библиотеки являются библиотеками PKCS11Lib от Рутокен и поставляются вместе с пакетом УТМ.
Поэтому мы можем заменить их на более современные версии библиотек от Рутокен, которые не требуют executable stack.
Скачать их можно на https://download.rutoken.ru в разделе /Rutoken/PKCS11Lib/Current/Linux/x32/, просто качаем
Для этого перейдем в домашнюю папку и скачаем библиотеку через wget, в нашем случае это последняя на сегодня версия, вам же потребуется уточнить версию библиотеки:
Затем останавливаем УТМ, заменяем необходимые библиотеки (их там две копии) и снова запускаем УТМ:
После чего все запускается и отлично работает. Посмотреть лог УТМ в реальном времени можно командой:
Но данное действие вам придется выполнять всякий раз после переустановки или обновления УТМ.
❗️Также обратите внимание, что данный способ проверен только с токенами Рутокен и работа с JaCarta не проверялась и не гарантируется.
👉 Кроме того, добавим – непосредственной необходимости ставить УТМ ЕГАИС на Debian 13 в текущий момент нет, сервис это сугубо внутренний и при необходимости может эксплуатироваться даже на устаревших версиях системы.
Сегодня попробовали установить УТМ ЕГАИС на свежий дистрибутив Debian 13. Сама установка не вызывает особых сложностей и ее можно выполнить по нашей статье:
🔹 ЕГАИС. Устанавливаем УТМ 4.2.0 на Debian (Ubuntu)
При этом, вместо
libncurses5:i386 следует устанавливать libncurses6:i386, а библиотека SSL называется libssl3t64 и скорее всего будет установлена по умолчанию.Сам пакет u-trans тоже ставится без особых проблем, запускается, но не работает. Если вы откроете лог, то увидите, что УТМ не может обнаружить ключ. Странно, ведь инсталлятор увидел Рутокен и инструменты диагностики тоже его видят.
Поэтому читаем лог дальше и находим интересные записи:
/opt/utm/lib/librtpkcsllecp.so: невозможно задействовать исполняемый стек, как требует разделяемый объект
Это значит, что библиотека требует наличия executable stack (исполняемый стек), который отключен в Debian 13 по соображениями безопасности (а также в Ubuntu, начиная с 25.10).
👆 Включить данную технологию не представляется возможным (во всяком случае без глубокого изменения системы), поэтому можно считать, что УТМ ЕГАИС несовместим с Debian 13 и грядущей Ubuntu 26.04 LTS.
😉 Ну если, конечно, разработчики Росалкогольтабакконтроль не перепишут программу, но надежды на это призрачные, с учетом того, что u-trans для Linux до сих пор 32-битное приложение.
С другой стороны, у нас все-таки Linux и каждый тут сам кузнец собственного счастья. Указанные в ошибках библиотеки являются библиотеками PKCS11Lib от Рутокен и поставляются вместе с пакетом УТМ.
Поэтому мы можем заменить их на более современные версии библиотек от Рутокен, которые не требуют executable stack.
Скачать их можно на https://download.rutoken.ru в разделе /Rutoken/PKCS11Lib/Current/Linux/x32/, просто качаем
librtpkcs11ecp.so. Для этого перейдем в домашнюю папку и скачаем библиотеку через wget, в нашем случае это последняя на сегодня версия, вам же потребуется уточнить версию библиотеки:
cd ~
wget https://download.rutoken.ru/Rutoken/PKCS11Lib/Current/Linux/x32/librtpkcs11ecp.so
Затем останавливаем УТМ, заменяем необходимые библиотеки (их там две копии) и снова запускаем УТМ:
supervisorctl stop utm
cp -v librtpkcs11ecp.so /opt/utm/lib/librtpkcs11ecp.so
cp -v librtpkcs11ecp.so /opt/utm/lib/librtpkcs11ecp-replica.so
supervisorctl start utm
После чего все запускается и отлично работает. Посмотреть лог УТМ в реальном времени можно командой:
tail -f /opt/utm/transport/l/transport_info.log
Но данное действие вам придется выполнять всякий раз после переустановки или обновления УТМ.
❗️Также обратите внимание, что данный способ проверен только с токенами Рутокен и работа с JaCarta не проверялась и не гарантируется.
👉 Кроме того, добавим – непосредственной необходимости ставить УТМ ЕГАИС на Debian 13 в текущий момент нет, сервис это сугубо внутренний и при необходимости может эксплуатироваться даже на устаревших версиях системы.
1👍25🔥3
Store CLI – интерфейс командной строки для Microsoft Store
Не так давно без лишнего шума и анонсов в последних выпусках Windows появилась утилита командной строки Store CLI, предназначенная для работы с магазином Microsoft.
Для ее использования откройте терминал и просто наберите:
И вы получите короткую справку, которой достаточно чтобы начать с ней работать.
Для просмотра уже установленных из магазина приложений выполните:
Для поиска обновлений отдельного приложения выполните:
Сразу для всех:
Чтобы установить обновления добавьте ключ
Для поиска приложений используйте:
Также можно искать по расширению:
И вы получите все приложения для работы с mp4.
Если вы хотите подобрать альтернативы приложению, то выполните поиск похожих:
Для просмотра каталога можно воспользоваться специальными командами, например, сначала просмотрим категории и субкатегории:
Теперь выведем топ бесплатных приложений определенной категории:
Или топ платных в субкатегории:
Найдя нужное приложение, мы можем установить его командой:
В качестве параметра можно указать имя приложения или ID, второе предпочтительно, так как однозначно определяет приложение, даже если опубликовано несколько его версий. Например, для установки VLC можно использовать команды:
Возможности удаления приложений магазина в данной версии консольной утилиты нет.
Не так давно без лишнего шума и анонсов в последних выпусках Windows появилась утилита командной строки Store CLI, предназначенная для работы с магазином Microsoft.
Для ее использования откройте терминал и просто наберите:
store
И вы получите короткую справку, которой достаточно чтобы начать с ней работать.
Для просмотра уже установленных из магазина приложений выполните:
store installed
Для поиска обновлений отдельного приложения выполните:
store update AppName
Сразу для всех:
store updates
Чтобы установить обновления добавьте ключ
–apply: store update AppName --apply
store updates –apply
Для поиска приложений используйте:
store search AppName
Также можно искать по расширению:
store extension mp4
И вы получите все приложения для работы с mp4.
Если вы хотите подобрать альтернативы приложению, то выполните поиск похожих:
store similar vlc
Для просмотра каталога можно воспользоваться специальными командами, например, сначала просмотрим категории и субкатегории:
store app-categories
Теперь выведем топ бесплатных приложений определенной категории:
store browse-apps top-free --category "Utilities & tools"
Или топ платных в субкатегории:
store browse-apps top-paid --subcategory "Personal Security"
Найдя нужное приложение, мы можем установить его командой:
store install AppName/ID
В качестве параметра можно указать имя приложения или ID, второе предпочтительно, так как однозначно определяет приложение, даже если опубликовано несколько его версий. Например, для установки VLC можно использовать команды:
store install VLC
store install XPDM1ZW6815MQM
Возможности удаления приложений магазина в данной версии консольной утилиты нет.
👍14🤣7
Обновление PostgreSQL в Docker через pg_upgrade
Продолжаем тему обновления контейнеров PostgreSQL между мажорными версиями, в прошлой заметке мы рассмотрели миграцию при помощи утилиты pg_dumpall.
Это простой и надежный способ, но у него есть один существенный недостаток: pg_dumpall – однопоточен, использует для выгрузки и загрузки только одно ядро и выполняет все операции последовательно, как они записаны в файле дампа.
На крупных и даже средних базах такой подход может привести к неконтролируемому времени простоя, что неприемлемо. Поэтому сегодня мы рассмотрим миграцию при помощи другой утилиты - pg_upgrade.
Преимущество pg_upgrade в том, что он не делает экспорт/импорт, не пересоздает всю структуру СУБД, а работает на уровне файлов базы данных.
Итак, приступим, допустим мы изначально имеем:
В нашем случае:
▫️ db — имя сервиса Compose
▫️ postgres-db — реальное имя контейнера Docker
1️⃣ Остановим весь стек и запустим обратно только контейнер с СУБД для создания резервной копии, это исключит возможную запись в БД во время выгрузки:
Теперь выполним выгрузку дампа всего кластера:
Проверяем, что файл дампа создан и останавливаем контейнер с БД:
2️⃣ Следующие шаги будут несколько различаться в отличие от того, используем ли мы Named Volumes или Bind mount.
🔹 При Named Volumes создаем дополнительный именованный том для нового кластера СУБД:
И запускаем специальный контейнер для апгрейда:
Данный контейнер НЕ является официальным образом PostgreSQL, это community image от Tianon Gravi, но он де-факто является стандартом в мире Docker.
Обратите внимание на тег контейнера, он указывает версии, с которой и на которую мы переходим, в нашем случае это 17-to-18, в других случаях выбирайте контейнер с нужным тегом.
Затем меняем Compose, было:
Стало:
🔹 Для Bind mount создаем новую директорию:
И запускаем служебный контейнер:
Затем меняем Cpmpose, было:
Стало:
3️⃣ Запускаем стек:
И выполняем оптимизацию базы:
Это не мешает работе и можно запускать уже на работающем стеке. Старые тома лучше всего оставить на некоторое время, пока вы не убедитесь, что обновление прошло нормально.
Продолжаем тему обновления контейнеров PostgreSQL между мажорными версиями, в прошлой заметке мы рассмотрели миграцию при помощи утилиты pg_dumpall.
Это простой и надежный способ, но у него есть один существенный недостаток: pg_dumpall – однопоточен, использует для выгрузки и загрузки только одно ядро и выполняет все операции последовательно, как они записаны в файле дампа.
На крупных и даже средних базах такой подход может привести к неконтролируемому времени простоя, что неприемлемо. Поэтому сегодня мы рассмотрим миграцию при помощи другой утилиты - pg_upgrade.
Преимущество pg_upgrade в том, что он не делает экспорт/импорт, не пересоздает всю структуру СУБД, а работает на уровне файлов базы данных.
Итак, приступим, допустим мы изначально имеем:
services:
db:
container_name: postgres-db
В нашем случае:
▫️ db — имя сервиса Compose
▫️ postgres-db — реальное имя контейнера Docker
1️⃣ Остановим весь стек и запустим обратно только контейнер с СУБД для создания резервной копии, это исключит возможную запись в БД во время выгрузки:
docker compose stop
docker compose up -d db
Теперь выполним выгрузку дампа всего кластера:
docker exec -t postgres-db pg_dumpall -U postgres > full_backup.sql
Проверяем, что файл дампа создан и останавливаем контейнер с БД:
docker compose down
2️⃣ Следующие шаги будут несколько различаться в отличие от того, используем ли мы Named Volumes или Bind mount.
🔹 При Named Volumes создаем дополнительный именованный том для нового кластера СУБД:
docker volume create pg_data_18
И запускаем специальный контейнер для апгрейда:
docker run --rm \
-e POSTGRES_USER=postgres \
-v pg_data:/var/lib/postgresql/17/data \
-v pg_data_18:/var/lib/postgresql/18/data \
tianon/postgres-upgrade:17-to-18
Данный контейнер НЕ является официальным образом PostgreSQL, это community image от Tianon Gravi, но он де-факто является стандартом в мире Docker.
Обратите внимание на тег контейнера, он указывает версии, с которой и на которую мы переходим, в нашем случае это 17-to-18, в других случаях выбирайте контейнер с нужным тегом.
Затем меняем Compose, было:
services:
db:
image: postgres:17
volumes:
- pg_data:/var/lib/postgresql/data
volumes:
pg_data:
Стало:
services:
db:
image: postgres:18
volumes:
- pg_data_18:/var/lib/postgresql/data
volumes:
pg_data_18:
🔹 Для Bind mount создаем новую директорию:
mkdir ./data/postgres-data-18
И запускаем служебный контейнер:
docker run --rm \
-e POSTGRES_USER=postgres \
-v ./data/ postgres-data:/var/lib/postgresql/17/data \
-v ./data/postgres-data-18:/var/lib/postgresql/18/data \
tianon/postgres-upgrade:17-to-18
Затем меняем Cpmpose, было:
services:
db:
image: postgres:17
volumes:
- ./postgres-data:/var/lib/postgresql/data
Стало:
services:
db:
image: postgres:18
volumes:
- ./postgres-data-18:/var/lib/postgresql/data
3️⃣ Запускаем стек:
docker compose up -d
И выполняем оптимизацию базы:
docker compose exec -T db vacuumdb -U postgres --all --analyze-in-stages
Это не мешает работе и можно запускать уже на работающем стеке. Старые тома лучше всего оставить на некоторое время, пока вы не убедитесь, что обновление прошло нормально.
👍14❤1
Relax-and-Recover (ReaR) - средство аварийного восстановления системы
Среди инструментов резервного копирования существует отдельная группа - системы аварийного восстановления на "голое железо" (Bare Metal Disaster Recovery - BMDR), которые позволяют полностью восстановить систему в случае выхода из строя оборудования или уничтожения системы при воздействии иных факторов.
Relax-and-Recover - сокращенно ReaR - как раз и представляет такую систему, простую в использовании, но достаточно мощную в работе. С ее помощью вы сможете быстро восстановить вашу ОС Linux на новое оборудование, либо выполнить перенос системы со старого оборудования на новое, либо в виртуальную среду.
Перед тем как начинать работу с ReaR следует уточнить некоторые принципиальные моменты. ReaR предполагает создание двух достаточно независимых сущностей: загрузочного образа и резервной копии.
Загрузочный образ позволяет загрузить систему и выполнить восстановление ее макета, под которым подразумевается дисковая разметка, разделы и файловые системы на них, поддерживаются все типы разметки, включая программный RAID и LVM. Но при этом макет не содержит никаких данных, он просто восстановит структуру дисковой подсистемы.
Резервная копия не содержит сведений о структуре хранения, а просто содержит данные, которые там хранились. Это достигается за счет того, что файловая система Linux иерархична и всегда имеет общий корень, это позволяет просто скопировать все данные одним архивом, а как именно они располагаются на физических носителях определяется макетом.
Кстати, Relax-and-Recover поддерживает множество внешних систем резервного копирования, что позволяет разделить процесс резервного копирования макета и резервного копирования данных, но это выходит за рамки данной статьи и ниже мы будем использовать только встроенные средства.
✅ Читать далее: https://interface31.ru/post/relax-and-recover-sredstvo-avariynogo-vosstanovleniya-sistemy/
Среди инструментов резервного копирования существует отдельная группа - системы аварийного восстановления на "голое железо" (Bare Metal Disaster Recovery - BMDR), которые позволяют полностью восстановить систему в случае выхода из строя оборудования или уничтожения системы при воздействии иных факторов.
Relax-and-Recover - сокращенно ReaR - как раз и представляет такую систему, простую в использовании, но достаточно мощную в работе. С ее помощью вы сможете быстро восстановить вашу ОС Linux на новое оборудование, либо выполнить перенос системы со старого оборудования на новое, либо в виртуальную среду.
Перед тем как начинать работу с ReaR следует уточнить некоторые принципиальные моменты. ReaR предполагает создание двух достаточно независимых сущностей: загрузочного образа и резервной копии.
Загрузочный образ позволяет загрузить систему и выполнить восстановление ее макета, под которым подразумевается дисковая разметка, разделы и файловые системы на них, поддерживаются все типы разметки, включая программный RAID и LVM. Но при этом макет не содержит никаких данных, он просто восстановит структуру дисковой подсистемы.
Резервная копия не содержит сведений о структуре хранения, а просто содержит данные, которые там хранились. Это достигается за счет того, что файловая система Linux иерархична и всегда имеет общий корень, это позволяет просто скопировать все данные одним архивом, а как именно они располагаются на физических носителях определяется макетом.
Кстати, Relax-and-Recover поддерживает множество внешних систем резервного копирования, что позволяет разделить процесс резервного копирования макета и резервного копирования данных, но это выходит за рамки данной статьи и ниже мы будем использовать только встроенные средства.
✅ Читать далее: https://interface31.ru/post/relax-and-recover-sredstvo-avariynogo-vosstanovleniya-sistemy/
👍19❤1