<?xml version="1.0" encoding="utf-8" ?><rss version="2.0" xmlns:tt="http://teletype.in/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:media="http://search.yahoo.com/mrss/"><channel><title>Вячеслав Громов</title><generator>teletype.in</generator><description><![CDATA[Работаем так, чтобы было нестыдно.
Ведущий специалист отдела внедрения.]]></description><image><url>https://img3.teletype.in/files/6d/fe/6dfe3578-a75a-4e75-aa09-6cad16539354.png</url><title>Вячеслав Громов</title><link>https://teletype.in/@slakwik</link></image><link>https://teletype.in/@slakwik?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=slakwik</link><atom:link rel="self" type="application/rss+xml" href="https://teletype.in/rss/slakwik?offset=0"></atom:link><atom:link rel="next" type="application/rss+xml" href="https://teletype.in/rss/slakwik?offset=10"></atom:link><atom:link rel="search" type="application/opensearchdescription+xml" title="Teletype" href="https://teletype.in/opensearch.xml"></atom:link><pubDate>Tue, 07 Apr 2026 18:31:13 GMT</pubDate><lastBuildDate>Tue, 07 Apr 2026 18:31:13 GMT</lastBuildDate><item><guid isPermaLink="true">https://teletype.in/@slakwik/k44kU6wtFD</guid><link>https://teletype.in/@slakwik/k44kU6wtFD?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=slakwik</link><comments>https://teletype.in/@slakwik/k44kU6wtFD?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=slakwik#comments</comments><dc:creator>slakwik</dc:creator><title>Свой СА-сервер</title><pubDate>Thu, 29 May 2025 19:18:40 GMT</pubDate><media:content medium="image" url="https://img1.teletype.in/files/80/24/802470af-cae4-4261-9f00-787e9616230d.png"></media:content><category>Работа</category><description><![CDATA[<img src="https://img3.teletype.in/files/ad/01/ad012c6d-d34a-47d3-938c-18d2953b2e63.png"></img>Забавная ситуация: у клиента требуется свой собственный СА для выпуска внутренних сертификатов элподписи. Маленький сервис, казалось бы, но нет, из доступных (и не русских) только EJBCA... Поддержка вендора &quot;советует установить и использовать DogTag&quot; - так себе совет.]]></description><content:encoded><![CDATA[
  <p id="NWwc">Забавная ситуация: у клиента требуется свой собственный СА для выпуска внутренних сертификатов элподписи. Маленький сервис, казалось бы, но нет, из доступных (и не русских) только EJBCA... Поддержка вендора &quot;советует установить и использовать DogTag&quot; - так себе совет.</p>
  <p id="YxzR">В итоге, как говорит коллега, следами cloud-программирования был написан вебсервис СА по выпуску сертификатов.</p>
  <figure id="wJnV">
    <img src="https://img3.teletype.in/files/ad/01/ad012c6d-d34a-47d3-938c-18d2953b2e63.png" />
    <figcaption>Выглядит просто, но работает отлично.</figcaption>
  </figure>
  <p id="ZbH8">Для внутренних и доменных сервисов в самый раз. Например, для 1С: СЭД или вообще для всего что связано с сертификатами - в самый раз.</p>
  <p id="Pi4O">Конечно, важнее всего обезопасить вебсервис, чтобы избежать той же компроментации - но это уже другая история.</p>
  <p id="JJpG">А пока - дело сделано.</p>
  <p id="1r18">И слава Богу</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@slakwik/Q6Y_HJGEnLI</guid><link>https://teletype.in/@slakwik/Q6Y_HJGEnLI?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=slakwik</link><comments>https://teletype.in/@slakwik/Q6Y_HJGEnLI?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=slakwik#comments</comments><dc:creator>slakwik</dc:creator><title>Трансляция потока музыки в сеть Интернет и на видеохостинги. Часть 3: Liquidsoap в контейнере</title><pubDate>Wed, 23 Apr 2025 21:47:01 GMT</pubDate><category>Церковное служение</category><description><![CDATA[<img src="https://img3.teletype.in/files/66/03/6603daed-9d43-405d-ba4d-3fca5d20b51d.jpeg"></img>Описал, как запустить плеер стрима Liquidsoap в контейнере]]></description><content:encoded><![CDATA[
  <h2 id="9AZU"><br />Настройка Liquidsoap в docker-контейнере</h2>
  <h2 id="t7Oh">Настройка перед установкой</h2>
  <h3 id="Umsq">debian/ubuntu</h3>
  <pre id="QcMf">for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done
sudo apt-get update
sudo apt-get install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc
echo \
  &quot;deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
  $(. /etc/os-release &amp;&amp; echo &quot;${UBUNTU_CODENAME:-$VERSION_CODENAME}&quot;) stable&quot; | \
  sudo tee /etc/apt/sources.list.d/docker.list &gt; /dev/null
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin</pre>
  <h3 id="0QOb">alma linux/centos stream/redos</h3>
  <pre id="sLWU">
sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sudo dnf install docker-ce docker-ce-cli containerd.io docker-compose-plugin</pre>
  <h2 id="sLWU">Запускаем службу Docker</h2>
  <pre id="sLWU">sudo systemctl start docker.service
sudo systemctl enable docker.service</pre>
  <h2 id="dqhx">Структура файлов  каталогов</h2>
  <pre id="dqhx">/opt/radio				# Основной каталог
	    |
	    script.liq      # Скрипт работы Liquidsoap
	    music/			# Монтируемый каталог с медиа
	        |
	        songs       # Каталог с музыкой/подкастами
	          |
	          song1.mp3
	          song2.mp3
	          song3.mp3
	        jingles     # Каталог с джинглами
	          |
	          file1.mp3
	          file2.mp3
	          file3.mp3</pre>
  <h2 id="dYsZ">Создаем каталоги</h2>
  <pre id="siaH">sudo mkdir -p /opt/radio/liquidsoap
sudo mkdir -p /opt/radio/music/{songs,jingles}</pre>
  <h2 id="0BGw">Редактируем файл /opt/radio/liquidsoap/docker-compose.yml</h2>
  <pre id="Z4uH">services:
	liquidsoap:
	  image: pltnk/liquidsoap
	  container_name: liquidsoap
	  restart: always
	  volumes:
	    - /opt/radio/script.liq:/etc/liquidsoap/script.liq
	    - /opt/radio/music:/music</pre>
  <h2 id="EZ8F">Редактируем файл /opt/radio/script.liq</h2>
  <pre id="4Uvk">
## Внизу файла замените:
## IP-АДРЕС-ХОСТА заменяем на внутренний ip-адрес хоста, где запущен сервис icecast2, куда мы будет транслировать аудиопоток
## ПАРОЛЬ-СТРИМА заменяем на пароль стрима, который мы указали в конфигурационном файле в icecast2
## ТОЧКА-МОНТИРОВАНИЯ заменяем на имя точки монтирования, которую мы указали в конфигурационном файле icecast2

# плейлист с джинглами
# указываем каталог с мр3-файлами джинглов. например, &#x27;/music/jingles&#x27;
jingles = mksafe(playlist(id=&quot;jingles&quot;,mode=&quot;randomize&quot;,reload_mode=&quot;watch&quot;,&#x27;/music/jingles&#x27;))

# дополнительная рандомизация
# отслеживает, чтобы последние два часа песни в рандоме не повторялись
l = playlog()
def check(r)
  m = request.metadata(r)
  if l.last(m) &lt; 17200. then
    false
  else
    l.add(m)
    true
  end
end

# плейлист с треками стрима
# указываем каталог с мр3-файлами стрима. например, &#x27;/music/songs&#x27;
s = playlist(check_next=check,mode=&quot;randomize&quot;,&#x27;/music/songs&#x27;)

# играем треки из каждого плейлиста, каждые 10 музыкальных треков - один джингл
radio = rotate(weights = [10, 1],[s,jingles])
radio = nrj(radio)

out = output.icecast(%mp3,
  host = &quot;IP-АДРЕС-ХОСТА&quot;,
  port = 8000,
  password = &quot;ПАРОЛЬ-СТРИМА&quot;,
  mount = &quot;ТОЧКА-МОНТИРОВАНИЯ&quot;,
  fallible=true,
  radio
)</pre>
  <h2 id="efCZ">Размещаем медиа</h2>
  <p id="SZF9">В каталог <strong>/opt/radio/music/songs</strong> копируем все ваши mp3-файлы с музкальными композициями/подкастами<br />В каталог <strong>/opt/radio/music/jingles</strong> копируем все ваши джинглы</p>
  <h2 id="QV8j">Запускаем liquidsoap</h2>
  <pre id="lZ9Q">cd /opt/radio/liquidsoap
docker compose up</pre>
  <h2 id="ffMD">Ожидаем запуск и наблюдаем за работой</h2>
  <p id="vClA">Сначала пройдёт процедура скачивания базового образа, затем будут выполнены команды запуска контейнера<br />Затем появятся журналы работы liquidsoap. Например, такие:</p>
  <pre id="vClA">Container liquidsoap  Created
Attaching to liquidsoap
liquidsoap  | 2025/04/23 21:11:03 &gt;&gt;&gt; LOG START
liquidsoap  | 2025/04/23 21:11:02 [main:3] Liquidsoap 2.0.3-1
liquidsoap  | 2025/04/23 21:11:02 [main:3] Using: graphics=[distributed with Ocaml] bytes=[distributed with OCaml 4.02 or above] pcre=7.4.6 sedlex=3.3 menhirLib=20211128 dtools=0.4.5 duppy=0.9.2 cry=0.6.7 mm=0.7.4 ogg=0.7.4 ogg.decoder=0.7.4 vorbis=0.8.0 vorbis.decoder=0.8.0 mad=0.5.3 dynlink=[distributed with Ocaml] lame=0.3.7 samplerate=0.1.6 taglib=0.3.10 camomile=1.0.2
liquidsoap  | 2025/04/23 21:11:02 [dynamic.loader:3] Could not find dynamic module for fdkaac encoder.
liquidsoap  | 2025/04/23 21:11:02 [clock:3] Using builtin (low-precision) implementation for latency control
liquidsoap  | 2025/04/23 21:11:03 [frame:3] Using 44100Hz audio, 25Hz video, 44100Hz main.
liquidsoap  | 2025/04/23 21:11:03 [frame:3] Video frame size set to: 1280x720
liquidsoap  | 2025/04/23 21:11:03 [frame:3] Frame size must be a multiple of 1764 ticks = 1764 audio samples = 1 video samples.
liquidsoap  | 2025/04/23 21:11:03 [frame:3] Targeting &#x27;frame.duration&#x27;: 0.04s = 1764 audio samples = 1764 ticks.
liquidsoap  | 2025/04/23 21:11:03 [frame:3] Frames last 0.04s = 1764 audio samples = 1 video samples = 1764 ticks.
liquidsoap  | 2025/04/23 21:11:03 [sandbox:3] Sandboxing disabled
liquidsoap  | 2025/04/23 21:11:03 [video.converter:3] Couldn&#x27;t find preferred video converter: ffmpeg.
liquidsoap  | 2025/04/23 21:11:03 [audio.converter:3] Using samplerate converter: libsamplerate.
liquidsoap  | 2025/04/23 21:11:03 [test.mp3:3] Connecting mount test.mp3 for source@93.191.60.93...
liquidsoap  | 2025/04/23 21:11:03 [test.mp3:3] Connection setup was successful.
liquidsoap  | 2025/04/23 21:11:03 [clock.main:3] Streaming loop starts in auto-sync mode
liquidsoap  | 2025/04/23 21:11:03 [clock.main:3] Delegating synchronisation to CPU clock
liquidsoap  | 2025/04/23 21:11:03 [switch_2:3] Switch to switch_1.
liquidsoap  | 2025/04/23 21:11:03 [switch_1:3] Switch to mksafe.
liquidsoap  | 2025/04/23 21:11:03 [mksafe:3] Switch to safe_blank.
liquidsoap  | 2025/04/23 21:11:03 [decoder.id3v2:2] Error while decoding file tags: Invalid_argument(&quot;String.sub / Bytes.sub&quot;)
liquidsoap  | 2025/04/23 21:11:03 [jingles:3] Prepared &quot;/music/jingles/Спасён_v1.mp3&quot; (RID 1).
liquidsoap  | 2025/04/23 21:11:03 [mksafe:3] Switch to jingles with transition.
liquidsoap  | 2025/04/23 21:11:03 [songs:3] Prepared &quot;/music/songs/Псалом 51 (на стихи Н.Басовского).mp3&quot; (RID 0).
&#x60;&#x60;&#x60;</pre>
  <p id="vClA">В этот момент можно перейти на icecast2 точку подключения и послушать, появился ли стрим.</p>
  <p id="aDBZ">И если всё ОК, звук есть, то завершите работу контейнера, нажав комбинацию клавиш Ctrl+C и дождитесь завершения работы контейнера.</p>
  <p id="hQ1M">Далее настроим автоматический запуск и работу нашего liquidsoap</p>
  <h2 id="2PDg">Настройка работы liquidsoap, как сервис</h2>
  <h3 id="8TNX">Редактируем файл сервиса /etc/systemd/system/liquidsoap.service<br /></h3>
  <pre id="jqUp">[Unit]
Description=liquidsoap as a docker container
After=docker.service
Requires=docker.service

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/bin/bash -c &quot;docker compose -f /opt/radio/liquidsoap/docker-compose.yml up --detach&quot;
ExecStop=/bin/bash -c &quot;docker compose -f /opt/radio/liquidsoap/docker-compose.yml stop&quot;

[Install]
WantedBy=multi-user.target</pre>
  <h2 id="LyIp">Обновляем сервисы</h2>
  <pre id="ES5a">sudo systemctl daemon-reload</pre>
  <h2 id="EPo9">Запускаем liquidsoap, как службу</h2>
  <pre id="4yIc">sudo systemctl start liquidsoap</pre>
  <h2 id="Jiie">Переключаем службу в автозапуск</h2>
  <pre id="QX5Q">sudo systemctl enable liquidsoap</pre>
  <h2 id="wLrv">Заключение</h2>
  <p id="rTFI">Остаётся только дать ссылку на документацию к Liquidsoap <a href="https://www.liquidsoap.info/doc-2.3.2/" target="_blank">https://www.liquidsoap.info/doc-2.3.2/</a></p>
  <p id="z71K">Надеюсь, что статьи помогут вам в работе ваших интернет-радиостанций.</p>
  <p id="NbUb">С Богом всё получится!</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@slakwik/YcIlmuuaG7G</guid><link>https://teletype.in/@slakwik/YcIlmuuaG7G?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=slakwik</link><comments>https://teletype.in/@slakwik/YcIlmuuaG7G?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=slakwik#comments</comments><dc:creator>slakwik</dc:creator><title>Трансляция потока музыки в сеть Интернет и на видеохостинги. Часть 2: Liquidsoap и Icecast2</title><pubDate>Sat, 19 Apr 2025 21:36:24 GMT</pubDate><category>Разработки</category><description><![CDATA[<img src="https://img1.teletype.in/files/c5/19/c519375f-82dd-4fcf-959f-34ae14922d7b.jpeg"></img>Ранее описывал настройку стрима через Icecast+EZStream. Но со временем решил чуть «усложнить» стрим, разбавив стрим джинглами (аудиовставки с названием радиостанции) в случайном порядке и файлы для стрима брать просто из каталога (тоже, в случайном порядке). Да и в целом, Liquidsoap работает стабильнее – не даром его используют на физических радиостанциях и эфирных студиях.]]></description><content:encoded><![CDATA[
  <p id="7Iz5">Ранее, в статье https://teletype.in/@slakwik/WT_5jy3Ug6 описывал настройку стрима через Icecast+EZStream. Но со временем решил чуть «усложнить» стрим, разбавив стрим джинглами (аудиовставки с названием радиостанции) в случайном порядке и файлы для стрима брать просто из каталога (тоже, в случайном порядке).<br />Да и в целом, Liquidsoap работает стабильнее – не даром его используют на физических радиостанциях и эфирных студиях.</p>
  <p id="QaLi">Пост будет продолжением\дополнением\обновлением предыдущего, только вместо EZStream мы настроим Liquidsoap, как источник аудиопотока.</p>
  <h2 id="3Xzt">Подготовка</h2>
  <p id="gEcs">Установите пакеты icecast2, liquidsoap и, если будете транслировать на видеохостинги, ffmpeg</p>
  <p id="bRYF">У меня радиостанция работает на Raspberry Pi 3B, версии пакетов:</p>
  <pre id="312L" data-lang="bash">icecast2:
  Installed: 2.4.4-4+b1
liquidsoap:
  Installed: 1:2.2.5-debian-bookworm-1
ffmpeg:
  Installed: 7:5.1.5-0+deb12u1  </pre>
  <p id="pJ8v">Под разные операционные системы могут быть разные версии пакетов, но желательно подбирать посвежее. Так же обратите внимание, что Liquidsoap может менять синтаксис файлов стрима – указанное ниже подходит к указанной версии и выше.</p>
  <h2 id="jX9C">Настраиваем Icecast2</h2>
  <p id="op2Z">### Файл конфигурации для Icecast2 /etc/icecast2/icecast.xml<br />&quot;ПАРОЛЬСТРИМА&quot; – паролья для подключения плеера ezstream<br />&quot;ПАРОЛЬРЕЛЕЯ&quot; – пароль для перенаправления потока (в моем случае не используется, но оставлен)<br />&quot;ПАРОЛЬАДМИНА&quot; – паролья от консоли администратора Icecast2<br /></p>
  <pre id="sB8J" data-lang="xml">&lt;icecast&gt;
    &lt;location&gt;Saint-Petersburg, Russia&lt;/location&gt;
    &lt;admin&gt;slakwik@ya.ru&lt;/admin&gt;
    &lt;limits&gt;
        &lt;clients&gt;100&lt;/clients&gt;
        &lt;sources&gt;3&lt;/sources&gt;
        &lt;queue-size&gt;524288&lt;/queue-size&gt;
        &lt;client-timeout&gt;30&lt;/client-timeout&gt;
        &lt;header-timeout&gt;15&lt;/header-timeout&gt;
        &lt;source-timeout&gt;10&lt;/source-timeout&gt;
        &lt;burst-on-connect&gt;1&lt;/burst-on-connect&gt;
        &lt;burst-size&gt;65535&lt;/burst-size&gt;
    &lt;/limits&gt;

    &lt;authentication&gt;
    &lt;source-password&gt;ПАРОЛЬСТРИМА&lt;/source-password&gt;
    &lt;relay-password&gt;ПАРОЛЬРЕЛЕЯ&lt;/relay-password&gt;
    &lt;admin-user&gt;admin&lt;/admin-user&gt;
    &lt;admin-password&gt;ПАРОЛЬАДМИНА&lt;/admin-password&gt;
    &lt;/authentication&gt;

    &lt;directory&gt;
        &lt;yp-url-timeout&gt;15&lt;/yp-url-timeout&gt;
        &lt;yp-url&gt;http://dir.xiph.org/cgi-bin/yp-cgi&lt;/yp-url&gt;
    &lt;/directory&gt;

    &lt;hostname&gt;station.spbchurch.ru&lt;/hostname&gt;

    &lt;listen-socket&gt;
        &lt;port&gt;8000&lt;/port&gt;
    &lt;/listen-socket&gt;
    &lt;http-headers&gt;
        &lt;header name=&quot;Access-Control-Allow-Origin&quot; value=&quot;*&quot; /&gt;
    &lt;/http-headers&gt;

    &lt;fileserve&gt;1&lt;/fileserve&gt;

    &lt;paths&gt;
        &lt;basedir&gt;/usr/share/icecast2&lt;/basedir&gt;
        &lt;logdir&gt;/var/log/icecast2&lt;/logdir&gt;
        &lt;webroot&gt;/usr/share/icecast2/web&lt;/webroot&gt;
        &lt;adminroot&gt;/usr/share/icecast2/admin&lt;/adminroot&gt;
        &lt;alias source=&quot;/&quot; destination=&quot;/status.xsl&quot;/&gt;
    &lt;/paths&gt;

    &lt;logging&gt;
        &lt;accesslog&gt;access.log&lt;/accesslog&gt;
        &lt;errorlog&gt;error.log&lt;/errorlog&gt;
        &lt;loglevel&gt;3&lt;/loglevel&gt; &lt;!-- 4 Debug, 3 Info, 2 Warn, 1 Error --&gt;
        &lt;logsize&gt;10000&lt;/logsize&gt; &lt;!-- Max size of a logfile --&gt;
    &lt;/logging&gt;

    &lt;mount&gt;
        &lt;mount-name&gt;/radio.mp3&lt;/mount-name&gt;
        &lt;charset&gt;UTF-8&lt;/charset&gt;
    &lt;/mount&gt;
    &lt;mount&gt;
        &lt;mount-name&gt;/broadcast.mp3&lt;/mount-name&gt;
        &lt;charset&gt;UTF-8&lt;/charset&gt;
    &lt;/mount&gt;
    &lt;security&gt;
        &lt;chroot&gt;0&lt;/chroot&gt;
    &lt;/security&gt;
&lt;/icecast&gt;
</pre>
  <h2 id="J53L">Настраиваем Liquidsoap</h2>
  <h3 id="Wt1x">Изменяем файл конфигурации службы</h3>
  <p id="vyXb">### Файл конфигурации службы Liquidsoap /etc/systemd/system/liquidsoap.service</p>
  <pre id="84LE" data-lang="bash">[Unit]
Description=Liquidsoap Streaming Service
After=network.target

[Service]
# Указываем путь к файлу стрима. Например, /opt/spbchurch.liq
ExecStart=/usr/bin/liquidsoap /opt/spbchurch.liq
#/opt/nsr.liq
#spbchurch.liq
Restart=always
RestartSec=5
User=liquidsoap
Group=liquidsoap

[Install]
WantedBy=multi-user.target</pre>
  <h3 id="44nz">Настраиваем файл стрима Liquidsoap</h3>
  <p id="JpBD">### Файл конфигурации стрима /opt/spbchurch.liq</p>
  <pre id="076u" data-lang="shell"># новый синтаксис настроек
# устанавливаем уровень 3 - для отладки достаточно
settings.log.level.set(3)
# если нужно - включаем вывод отладочной информации
#settings.log.stdout.set(true)
# если нужно включаем телнет-сервер для управления стримом (см. документацию ;-)
# server.telnet()

# включаем журналирование событий
log.file := true
# указываем путь к файлу-журналу
log.file.path := &quot;/var/log/liquidsoap/stream.log&quot;
log.stdout := false

# плейлист с джинглами
# указываем каталог с мр3-файлами джинглов. например, &#x27;/media/mp3&#x27;
jingles = mksafe(playlist(id=&quot;jingles&quot;,mode=&quot;randomize&quot;,reload_mode=&quot;watch&quot;,&#x27;/media/jingles&#x27;))

# дополнительная рандомизация
# отслеживает, чтобы последние два часа песни в рандоме не повторялись
l = playlog()
def check(r)
  m = request.metadata(r)
  if l.last(m) &lt; 17200. then
    log.info(&quot;Rejecting #{m[&#x27;filename&#x27;]} (played #{l.last(m)}s ago).&quot;)
    false
  else
    l.add(m)
    true
  end
end

# плейлист с треками стрима
# указываем каталог с мр3-файлами стрима. например, &#x27;/media/mp3&#x27;
s = playlist(check_next=check,mode=&quot;randomize&quot;,&#x27;/media/mp3&#x27;)

# играем треки из каждого плейлиста, каждые 10 музыкальных треков - один джингл
radio = rotate(weights = [10, 1],[s,jingles])
radio = nrj(radio)
#radio = crossfade(radio)

out = output.icecast(%mp3,
  host = &quot;127.0.0.1&quot;,
  port = 8000,
  password = &quot;ПАРОЛЬСТРИМА&quot;,
  mount = &quot;radio&quot;,
  fallible=true,
  radio
)</pre>
  <h3 id="Z4Ge">Обновляем службу, запускаем Icecast2 и Liquidsoap</h3>
  <pre id="dh27" data-lang="shell"># обновление служб
sudo systemctl daemon-reload
# перезапуск службы
sudo systemctl restart icecast2
sudo systemctl restart liquidsoap</pre>
  <h3 id="6esW">Проверяем работу</h3>
  <pre id="uVmV" data-lang="shell"># проверка состояния Liquidsoap
# запускается долго, если сервер не самый мощный
# у меня на raspberry pi 3b запускается минут 5
#
# запускаем команду и ждем ответа Liquidsoap
# пошел ли стрим или ошибки при запуске стрима
sudo tail -f /var/log/liquidsoap/stream.log</pre>
  <p id="gN1c">Открываем браузер, вводим адрес своего стрима. Например, <a href="http://10.0.1.13:8000/broadcast.mp3" target="_blank">http://10.0.1.13:8000/broadcast.mp3</a> <br />И если всё настроено верно – должен пойти стрим</p>
  <h3 id="RmKL">Настройка Ffmpeg для трансляции видеопотока с вашим стримом</h3>
  <p id="SAgz">### Скрипт для запуска потока на видеохостинг</p>
  <pre id="2JmL" data-lang="bash">#!/bin/bash

# видеофайл, который будет являться &quot;лицом&quot; стрима. например, рядом с скриптом лежит файл vkradio.mp4
VIDEO=&quot;vkradio.mp4&quot;

# адрес стрима icecast2 с локальной точкой подключения. например, http://10.0.1.13:8000/broadcast.mp3
BROADCAST=&quot;http://10.0.1.13:8000/broadcast.mp3&quot;

# параметры стрима
RESOLUTION=&quot;640x480&quot;
BITRATE=&quot;1500k&quot;
FRAMERATE=&quot;5&quot;

# URL для подключения к видеохостингу, ниже пример для Youtube
URL=&quot;rtmp://a.rtmp.youtube.com/live2/xxxx-xxxx-xxxx-xxxx-xxxx&quot;

# сам скрипт запуска трансляции
/usr/bin/ffmpeg  -re -stream_loop -1 -i &quot;$VIDEO&quot; -i &quot;$BROADCAST&quot; -c:a aac -s &quot;$RESOLUTION&quot; -ab 128k -b:v &quot;$BITRATE&quot; -threads 2 -crf 22 -preset fast -vcodec libx264 -pix_fmt yuv420p -maxrate 2048k -bufsize 2048k -framerate $FRAMERATE -g 2 -strict experimental -f flv &quot;$URL&quot;</pre>
  <p id="16jr">Примерно так это всё работает у меня сейчас (апрель 2025) и размещено по адресу radio.spbchurch.ru</p>
  <p id="CkU3">В следующей статье я опишу, как поднять вебсайт, создать веб-страницу с плеером стрима и создание простой страницы со списком текущих треков</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@slakwik/RAV5JI0KfIZ</guid><link>https://teletype.in/@slakwik/RAV5JI0KfIZ?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=slakwik</link><comments>https://teletype.in/@slakwik/RAV5JI0KfIZ?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=slakwik#comments</comments><dc:creator>slakwik</dc:creator><title>msg2eml</title><pubDate>Wed, 19 Feb 2025 13:40:21 GMT</pubDate><category>Разработки</category><description><![CDATA[Написал механизм конвертации msg в eml.]]></description><content:encoded><![CDATA[
  <p id="YJTs">Написал механизм конвертации msg в eml.</p>
  <p id="GEDz">За основу взят старый скрипт с гитхаба.</p>
  <p id="k7Xk">Ссылка на репозиторий: <a href="https://gitverse.ru/slakwik/msg2eml/content/master" target="_blank">https://gitverse.ru/slakwik/msg2eml/content/master</a></p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@slakwik/CTLTXUEveb</guid><link>https://teletype.in/@slakwik/CTLTXUEveb?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=slakwik</link><comments>https://teletype.in/@slakwik/CTLTXUEveb?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=slakwik#comments</comments><dc:creator>slakwik</dc:creator><title>Завёл себе открытый репозиторий</title><pubDate>Thu, 30 Jan 2025 06:15:20 GMT</pubDate><category>Работа</category><description><![CDATA[Много накопилось за годы работы администратором всякого разного, но делиться буду свежими наработками (после внедрения клиентам).]]></description><content:encoded><![CDATA[
  <p id="87mn">Много накопилось за годы работы администратором всякого разного, но делиться буду свежими наработками (после внедрения клиентам).</p>
  <p id="QCbw"><a href="https://gitverse.ru/slakwik" target="_blank">https://gitverse.ru/slakwik</a></p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@slakwik/vkvideobroadcast</guid><link>https://teletype.in/@slakwik/vkvideobroadcast?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=slakwik</link><comments>https://teletype.in/@slakwik/vkvideobroadcast?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=slakwik#comments</comments><dc:creator>slakwik</dc:creator><title>Настройка трансляции в ВКВидео</title><pubDate>Mon, 06 Jan 2025 09:56:10 GMT</pubDate><media:content medium="image" url="https://img3.teletype.in/files/22/ad/22ad3ad4-4883-44df-9732-7dfda4f2cd49.png"></media:content><category>Церковное служение</category><description><![CDATA[<img src="https://img2.teletype.in/files/9a/68/9a684b75-49f8-4bdc-a725-7035f6fd3073.jpeg"></img>Как настроить и запустить трансляцию в ВКВидео]]></description><content:encoded><![CDATA[
  <p id="7BNG">- Переходим на страницу vkvideo.ru</p>
  <p id="5XXH">- Сверху-справа нажимаем кнопку «<strong>+</strong>» и выбираем «Начать трансляцию»</p>
  <figure id="tMv2" class="m_original">
    <img src="https://img1.teletype.in/files/40/23/4023d632-1d1f-4a7f-bc0f-4ff3c052e350.png" width="438" />
  </figure>
  <p id="3scG">- Для трансляции из приложений (OBS, Wirecast и другие) выберите «Приложение»</p>
  <figure id="3JWu" class="m_column">
    <img src="https://img4.teletype.in/files/32/7b/327bf5a0-c843-44fc-9008-0de0b145cc45.png" width="1000" />
  </figure>
  <p id="8PRX">- Добавьте обложку трансляции, название, описание и выберите категорию (Категория «Религия» есть только в RuTube) «Другое»</p>
  <figure id="5bsc" class="m_column">
    <img src="https://img4.teletype.in/files/bf/9c/bf9c0b06-6a17-4acc-82eb-85023436ea6c.png" width="1000" />
  </figure>
  <p id="4SQS">- Укажите время начала трансляции – оно важно для отображения на странице трансляции, однако можно начать и раньше и позже указанного времени</p>
  <p id="eM5U">- Скопируйте URL и KEY со страницы</p>
  <p id="B8Z2">- Соедините URL и KEY. Например URL &quot;<strong>rtmp://ovsu.okcdn.ru/input/</strong>&quot;, а KEY &quot;<strong>7966703954х40_7283274680884_7ipхytpaiy</strong>&quot; одной строкой будет <strong>rtmp://ovsu.okcdn.ru/input/7966703954х40_7283274680884_7ipхytpaiy</strong></p>
  <p id="znGf">- Скопируйте полученную строку в ваше приложение (точно так же, как с Youtube)</p>
  <p id="f8hQ">- Настройте параметры трансляции, выбрав нужные галочки</p>
  <figure id="GHHP" class="m_column">
    <img src="https://img4.teletype.in/files/f5/57/f5570cf6-96c8-43e6-b6f1-ca0629f05820.png" width="1000" />
  </figure>
  <p id="UzFs">- Включите параметр «Предварительный просмотр», чтобы можно было увидеть входящий поток от вашего приложения до старта трансляции</p>
  <figure id="pk84" class="m_column">
    <img src="https://img2.teletype.in/files/5a/81/5a81d6a4-35dc-45f0-b873-a8bfe2eee017.png" width="992" />
  </figure>
  <p id="pPbM">- Укажите дополнительные параметры трансляции, выбрав кто может видеть и комментировать вашу трансляцию</p>
  <figure id="sgOD" class="m_column">
    <img src="https://img4.teletype.in/files/b6/36/b636b4ca-132b-4461-a9bc-2c38c8f21f5f.png" width="1000" />
  </figure>
  <p id="El2o">- Нажмите кнопку «Сохранить»</p>
  <p id="O7Rg">- Запустите трансляцию в вашем приложении</p>
  <p id="LjgI">- После получения потока с вашего приложения в окне трансляции будет видна картинка и будет слышен звук – проверьте, что всё настроено как надо</p>
  <figure id="HcgQ" class="m_column">
    <img src="https://img1.teletype.in/files/41/d4/41d43ecd-ccb3-427a-92b8-4ce5ad5af358.png" width="2528" />
  </figure>
  <p id="Dw43">- Нажмите кнопку «Опубликовать», чтобы трансляция стала доступна вашим подписчикам (они получат уведомление)</p>
  <p id="TKdG">- Прямая ссылка на трансляцию будет доступна по кнопке «Поделиться»</p>
  <p id="Gs3N">Вот, собственно и всё. Как видите, ничего сложно нет.</p>
  <p id="cZV7">:-)</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@slakwik/2G5uuT-dQE9</guid><link>https://teletype.in/@slakwik/2G5uuT-dQE9?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=slakwik</link><comments>https://teletype.in/@slakwik/2G5uuT-dQE9?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=slakwik#comments</comments><dc:creator>slakwik</dc:creator><title>Функционал АЛД ПРО, который не нужен</title><pubDate>Fri, 08 Nov 2024 19:50:48 GMT</pubDate><description><![CDATA[<img src="https://img1.teletype.in/files/ce/a0/cea01164-1946-4676-9764-4776085231a8.jpeg"></img>Какие части этого продукта не использую, а какие использую с удовольствием? И чем ненужные заменяю?]]></description><content:encoded><![CDATA[
  <p id="NPVD">Какие части этого продукта не использую, а какие использую с удовольствием? И чем ненужные заменяю?</p>
  <p id="EI5p">Так вышло, что серьёзно работать с этим продуктом мне пришлось только с середины этого года.</p>
  <p id="VhkT">И вот к концу года (уже) я отключил и не использую Групповые политики, редко использую развертывание ПК, не использую удаленный доступ на пк, сервер печати больше доставляет проблем, чем их решает, файловый сервер – так же, не использую dhcp-сервер изначально…</p>
  <p id="vFtF">как раз сегодня подводил итоги под завершение проекта и делал скриншоты для документации и… снимков удивительно мало!</p>
  <p id="rljj">ну, то есть продукт может быть и окей, но неясно для кого.</p>
  <p id="jNAz">Чем заменил:</p>
  <p id="s8El">- групповые политики (salt и мегакостыль salt+salt)) заменены на puppet</p>
  <p id="AY7Q">- система развертывания и поддержания пользовательских пк Foreman</p>
  <p id="vbGH">- dhcp-сервер берите любой, он всё равно будет лучше той конфигурации, что предлагает алд про</p>
  <p id="EwZn">- удаленный доступ отлично справляется rudesktop. Да, он единственный, что может попросить денег (условно), но он того стоит в больших количествах пк</p>
  <p id="4hu6">- файловый сервер лучше поднять отдельный (и даже не один, чтобы поднять  DFS), благо настраивать его не так и сложно, равно, как и сервер печати с сервером мониторинга – лучше поднять отдельно и управлять ими нормально.</p>
  <p id="Srdf">Подвести итог, нужен алд про или нет… наверное нет.</p>
  <p id="4im2">Freeipa, foreman+puppetserver и несколько сервисных серверов без графики (Файловый, Печати, DHCP, Мониторинг, Журналирования)</p>
  <p id="gTFu">Вендор алд про говорит, что у них есть всё и сразу, но верить им не стоит – продукт даже в версии 2.3.0 – очень сырой. И даже дело не в болезнях, а просто – продукт молодой.</p>
  <p id="2L9J">Что дальше?</p>
  <p id="PQQ9">В некоторых предыдущих постах я начал упоминать почтовый сервер Communigate – тоже есть над чем подумать, но лучше я пока не видел, да и коллеги из отдела уже внесли несколько существенных изменений в структуру (например, кластер кластеров нормально работает пока только у нас, копировать календари из Exchange пока видимо только мы, и по загрузочным тестам мы смогли защититься даже для больших компаний)</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@slakwik/1it92T0nW0A</guid><link>https://teletype.in/@slakwik/1it92T0nW0A?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=slakwik</link><comments>https://teletype.in/@slakwik/1it92T0nW0A?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=slakwik#comments</comments><dc:creator>slakwik</dc:creator><title>Радиостанция христианской музыки</title><pubDate>Fri, 08 Nov 2024 11:11:14 GMT</pubDate><media:content medium="image" url="https://img3.teletype.in/files/a4/30/a43071ca-95b0-484a-a578-a4e9148d135b.png"></media:content><category>Церковное служение</category><description><![CDATA[<img src="https://img4.teletype.in/files/b3/39/b339f93f-5f6d-45f1-b2fa-dc5ae0231816.jpeg"></img>«Наставляйте друг друга псалмами, гимнами и духовными песнопениями. Пойте и прославляйте Господа от всего сердца»]]></description><content:encoded><![CDATA[
  <p id="gOgl">Приведу текст со страницы радиостанции:</p>
  <p id="acLk">На радиостанции играет пополняемая коллекция гимнов, песен и псалмов в различных музыкальных стилях.<br />Изначальная идея заключалась в том, чтобы услышать традиционные гимны по-новому, но со временем это переросло в замену обычных песен.<br />Но чем дольше мы живем, тем больше понимаем, что всё происходящее вокруг имеет отражение и в окружающей нас музыке, и наше «радио» помогает нам прославлять Бога даже в обычных, бытовых обстоятельствах.</p>
  <blockquote id="CTYl"><em>«Наставляйте друг друга псалмами, гимнами и духовными песнопениями. Пойте и прославляйте Господа от всего сердца.»</em><br /> <strong><em>Послание эфесянам 5:19 НРП</em></strong></blockquote>
  <blockquote id="U4vk"> <em>«Пусть в вас живет слово Христа во всем его богатстве. Учите и наставляйте друг друга со всякой мудростью, и с благодарностью в своих сердцах пойте Богу псалмы, гимны и духовные песнопения.»</em><br /><strong><em> Послание колоссянам 3:16 НРП</em></strong></blockquote>
  <p id="rSpS">Тексты песен (стихи) мы берём из книги «Песнь Возрождения 3300» или получаем от авторов стихов. Присылайте свои стихи на адрес slakwik@ya.ru.<br /> Стили для песен, гимнов и псалмов подбираются не случайным образом, но с мыслью подчеркнуть текст и идею, а так же с целью дать послушать кому-то из тех людей, которым «не нравится слушать традиционные гимны».</p>
  <p id="MFHq"><a href="https://t.me/spbchurch_music" target="_blank">Ссылка на телеграм канал</a>, где некоторые из музыкальных композиций можно скачать.</p>
  <p id="JO67">Музыка распространяется свободно и может быть использована где угодно – мы будем только рады.</p>
  <p id="k33j">Слушать онлайн можно тут: <a href="https://spbchurch.ru/music.html" target="_blank">https://spbchurch.ru/music.html</a></p>
  <p id="0b6L">На странице есть и ссылка на каталог песен - всё можно скачать в mp3-файлах.</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@slakwik/2kj4-I79zNr</guid><link>https://teletype.in/@slakwik/2kj4-I79zNr?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=slakwik</link><comments>https://teletype.in/@slakwik/2kj4-I79zNr?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=slakwik#comments</comments><dc:creator>slakwik</dc:creator><title>Скрипт синхронизации почтовых ящиков между CommuniGate и MSExchange</title><pubDate>Fri, 08 Nov 2024 10:52:45 GMT</pubDate><media:content medium="image" url="https://img2.teletype.in/files/94/ea/94ea6a8c-761f-47d5-9c12-3c9ec5f12d9c.png"></media:content><category>Разработки</category><description><![CDATA[<img src="https://img1.teletype.in/files/4d/b3/4db34a21-6d8b-4c09-9c76-9bf09236e9e9.png"></img>Небольшой скрипт, позволяющий копировать почтовые ящики между Exchange и Communigate]]></description><content:encoded><![CDATA[
  <p id="hR7X">Запускать можно везде, где установлены пакеты imapsync и parallel.</p>
  <p id="VTR2">Заполните файл users_migrate.txt</p>
  <pre id="qMmq">АЛИАС-В-MSAD,ЛОГИН-В-CG,ПАРОЛЬ-ЛОГИНА-В-CG,EXCHANGE-СЕРВЕР,CG-СЕРВЕР
АЛИАС-В-MSAD,ЛОГИН-В-CG,ПАРОЛЬ-ЛОГИНА-В-CG,EXCHANGE-СЕРВЕР,CG-СЕРВЕР</pre>
  <pre id="AtVG">EXCHSVCLOGIN=&quot;MSAD\\svc_mbxaccess&quot; # Логин сервисной у-з в MS AD, которая имеет доступ к почтовым ящикам пользователей
EXCHSVCPWD=&#x27;PaSSw0rd&#x27; # Пароль от сервисной у-з в MS AD, которая имеет доступ к почтовым ящикам пользователей
PROCS=&#x27;30&#x27; # Количество одновременных сеансов
parallel --max-procs $PROCS --delay 1.4 --colsep &#x27;,&#x27; --arg-file users_migrate.txt --line-buffer --tagstring &quot;from {1} on {4} to {2} via {5}: &quot; \
        $DRYRUN imapsync --compress1 \
        --host1 {4} --user1 &quot;$EXCHSVCLOGIN\\{1}&quot; --password1 &quot;$EXCHSVCPWD&quot; \
        --host2 {5} --user2 {2} --password2 {3} \
        --syncinternaldates --useheader Message-ID --useheader Date --useheader Subject --useheader From --useheader To \
        --useheader Cc --useheader Bcc --useheader Reply-To --useheader In-Reply-To --useheader References --useheader Mime-Version \
        --useheader Content-Type --useheader Content-Transfer-Encoding --useheader Content-Disposition --useheader Content-Description \
        --useheader Content-ID --useheader Content-Location --useheader Content-Language --useheader Content-Base \
        --useheader Content-MD5 --sslargs2 SSL_verify_mode=0 --sslargs2 SSL_verify_mode=0 \
        --exclude &#x27;^Calendar\$&#x27; --exclude &#x27;^Contacts\$&#x27; --exclude &#x27;^\&amp;BBoEMAQ7BDUEPQQ0BDAEQARM-&#x27; \
        --pidfile &quot;/tmp/{2}_migrate.pid&quot;</pre>
  <p id="VlS4">Строка &quot;^\&amp;BBoEMAQ7BDUEPQQ0BDAEQARM-&quot; - это папка &quot;Календарь&quot;, её синхронизировать нельзя, тк ломает Календарь в CG.</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@slakwik/eT0WDI-VgUJ</guid><link>https://teletype.in/@slakwik/eT0WDI-VgUJ?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=slakwik</link><comments>https://teletype.in/@slakwik/eT0WDI-VgUJ?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=slakwik#comments</comments><dc:creator>slakwik</dc:creator><title>Avanpost FAM: Загадочные пропажи</title><pubDate>Sat, 02 Nov 2024 16:56:49 GMT</pubDate><media:content medium="image" url="https://img3.teletype.in/files/e8/fc/e8fc4d11-c5b0-4c81-844d-69525a60af40.png"></media:content><category>Работа</category><description><![CDATA[<img src="https://img1.teletype.in/files/cd/ae/cdae75e9-3f7c-4536-9d7e-42b618441012.png"></img>Для организации двухфакторной проверки продукт от Avanpost достаточно хороший.]]></description><content:encoded><![CDATA[
  <p id="vsTv">Для организации двухфакторной проверки продукт от Avanpost достаточно хороший.</p>
  <p id="zu0a">Поддерживаются отказоустойчивые конфигурации, модули есть под почти все операционные системы, ТОТР можно хранить даже в Яндекс.Ключ.</p>
  <p id="rjoX">Пользователей можно создавать прямо там, брать из Microsoft AD, Samba, Freeipa (ALD Pro, Avanpost DS).</p>
  <p id="sCha">База данных немного сложная связями, но специалистам будет просто сформировать отчётные скрипты для выгрузки нужных данных.</p>
  <p id="Rum1">Веб-интерфейс Личного кабинета не сказать, чтобы удобный, но терпимый. <br />Какие-то вещи отключить можно, но только через css-стили.</p>
  <p id="jX6i">Веб-интерфейс Административный такой же. Минусы, в невозможности выбора количества отображаемых элементов; малое количество отчетности для ИБ; журналы не выгрузить.</p>
  <p id="cI2D">Почти забыл, о чём хотел сказать…</p>
  <p id="U0PK">Вернёмся к выгрузке пользователей из каталогов.</p>
  <p id="Tg43">Базовые настройки описывать большого смысла нет, документация у Avanpost хорошая.</p>
  <p id="zj9Y">Но, имейте ввиду, что выгрузки пользователей — это одно, а выгрузки групп — совсем другое.</p>
  <p id="Sx37">В настройке списков пользователей мы можем указать большие, даже динамические группы по несколько тысяч пользователей.</p>
  <p id="AHRN">Но в настройке выгрузки групп учитывайте нюанс, что каталоги выдают столько членов групп, сколько сможет.</p>
  <p id="YGzt">Например, есть у вас группа allusers-g, которую вы настроили в каталоге, включили туда часть пользователей для тестирования, пусть даже 1000 пользователей. Тестирование прошло успешно и вы решаетесь развернуть на всех сотрудников. Добавляете остальные контейнеры в динамическую группу, количество пользователей в группе вырастает. И в какой-то момент вы обнаруживаете, что в Avanpost FAM пропали члены группы, которая раньше прекрасно синхронизировалась.</p>
  <p id="MbWR">Окей, пользователи у вас остались и в аварийном режиме можно прокликать пару сотен страниц, чтобы добавить несколько тысяч пользователей в группу доступа.</p>
  <p id="YSmj">Но в чём причина?</p>
  <p id="ZFYD">А причина в особенностях взаимодействия с каталогами. Если менеджер задач Avanpost FAM не смог выгрузить членов, то список членов групп очищается. И в моём случае, только из-за того, что членов в группе превысило 1500 объектов.</p>
  <p id="VeLt">Поэтому, учитывайте эти особенности, разбивайте доступа на небольшие группы.</p>
  <p id="CeNW">А так, продукт очень неплох. Могу рекомендовать точно, как админам, так и ИБ.</p>
  <p id="BIk3"></p>
  <p id="qgag">На неделе напишу про Avanpost DS. Пока скажу, что он мне тоже понравился, а как Каталог вообще отличный. Ничего особо лишнего, можно использовать в больших проектах, где есть свои системы развертывания и обслуживания устройств (мы у себя так сделали, тк ald pro, rudesktop и прочие системы слишком сырые, а где-то прикрутили что-то своё даже сбоку к ald pro))</p>

]]></content:encoded></item></channel></rss>