<?xml version="1.0" encoding="utf-8"?> 
<rss version="2.0"
  xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd"
  xmlns:atom="http://www.w3.org/2005/Atom">

<channel>

<title>Очередной IT блог</title>
<link>https://crabs.pro/</link>
<description>Очередной IT блог</description>
<author></author>
<language>ru</language>
<generator>Aegea 11.2 (v4116)</generator>

<itunes:subtitle>Очередной IT блог</itunes:subtitle>
<itunes:image href="" />
<itunes:explicit></itunes:explicit>

<item>
<title>Боремся со спамом с помощью Asterisk</title>
<guid isPermaLink="false">3</guid>
<link>https://crabs.pro/all/boremsya-so-spamom-s-pomoschyu-asterisk/</link>
<pubDate>Fri, 24 Mar 2023 23:47:02 +0300</pubDate>
<author></author>
<comments>https://crabs.pro/all/boremsya-so-spamom-s-pomoschyu-asterisk/</comments>
<description>
&lt;p&gt;Сегодня мне на мобильный позвонили очередные спамеры-мошенники и я серьёзно задумался о том, чтобы избавиться от них насовсем, так как их подход становится всё агрессивнее и агрессивнее от месяца к месяцу. К тому же давно хотел получать голосовую почту в telegram и желания совпали с необходимостью. Я пользуюсь Мегафоном, так что я «стёр пыль» с услуги Мультифон, прикупил VPS на Ubuntu и сел писать скрипты для Asterisk. И так, если вам интересно пострить автоотбивку для спамеров а заодно и принимать голосовую почту в telegram, приветствую.&lt;/p&gt;
&lt;p&gt;Почему именно Asterisk, ведь есть куча приложений на телефон? Потому что asterisk может поднять трубку и проговорить «Номер абонента больше не используется» или включить что нибудь более особенное спамеру, а это значит что спамер заплатит за этот звонок, а вы нет. Потому что входящие бесплатны. Так же это позволит вообще не подходить к телефону при звонках спамеров, а только читать в ленте сообщений от телеграм бота что были спам звонки.&lt;/p&gt;
&lt;p&gt;Я пользуюсь Мегафоном, поэтому SIP шлюз у меня есть как услуга. Тем не менее вы можете использовать нижеописанный метод для любого оператора, предварительно изменив шаги таким образом, что бы они соответствовали вашей ситуации. Я так же не буду описывать покупку VPS так как тут вопрос на усмотрение каждого. Лишь скажу что рекомендую покупать поближе к точке терминации оборудования провайдера. В моём случае это Москва.&lt;/p&gt;
&lt;p&gt;ВАЖНО! Нулевым шагом мы настроим iptables. Важно хотя бы примерно понимать что означают те или иные команды. Так же я напоминаю что при первом входе необходимо сменить пароль системного пользователя на максимально сложный, или в идеальном случае сделать вход на сервер только по ключам, так как если злоумышеник получит доступ к серверу телефонии он сможет бесконтрольно звонить с вашего номера.&lt;/p&gt;
&lt;h2&gt;Шаг 0. «Усиливаем безопасноть».&lt;/h2&gt;
&lt;p&gt;Этот шаг исходит из того что на сервере нет ничего кроме asterisk. Если есть ещё что-то то вам придётся исправить правила iptables под свой случай. Итак, установим iptables-persistent и fail2ban&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;apt install iptables-persistent fail2ban&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Далее создадим два файла:&lt;br /&gt;
&lt;b&gt;/etc/iptables/rules.v4&lt;/b&gt;&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;# Generated by ip6tables-save v1.6.0 on Thu Sep  8 13:29:11 2016
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -i lo -j ACCEPT
#Лучше не блокировать icmp вообще так как получится blackhole, что не очень хорошо, а просто уменьшить доступную пропускную способность для icmp пакетов
-A INPUT -p icmp -m limit --limit 15/sec -j ACCEPT
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
#Multifon SBC
-A INPUT -s 193.201.229.35/32 -p udp -m udp --dport 5060 -j ACCEPT
#Multifon Media Gateway
-A INPUT -s 193.201.229.19/32 -p udp -m udp --dport 10000:10100 -j ACCEPT
#SSH
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
COMMIT&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;b&gt;/etc/iptables/rules.v6&lt;/b&gt;&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;# Generated by iptables-save v1.6.0 on Thu Sep  8 13:29:11 2016
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]
#BASE INPUT
-A INPUT -i lo -j ACCEPT
-A INPUT -p ipv6-icmp -m limit --limit 15/sec -j ACCEPT
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
#DROP ALL ANOTHER
-A INPUT -j REJECT --reject-with icmp6-port-unreachable
COMMIT&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;И настроим fail2ban, а именно проверим что в /etc/fail2ban/jail.d/defaults-debian.conf включено:&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;[sshd]
enabled = true&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Так же можно увеличить время бана на 24 часа в /etc/fail2ban/jail.conf:&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;bantime  = 24h&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Вообще очень рекомендую сделать rsa ключ и ходить только по нему выставив «PasswordAuthentication no» в /etc/ssh/sshd_config, но если такой возможности нет поставьте по настоящему сильный пароль (20 символов со спецзнаками, цифрами, большими и малыми буквами) и лучше не root’у а какому то пользователю с привилегиями sudo а root’а заблокируйте через «passwd -l».&lt;/p&gt;
&lt;p&gt;Теперь когда всё готово включим демон fail2ban и загрузим правила iptables:&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;systemctl enable --now fail2ban
iptables-restore &amp;lt; /etc/iptables/rules.v4
ip6tables-restore &amp;lt; /etc/iptabes/rules.v6&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Затем рекомендую отключиться от SSH и подключиться снова что бы проверить что всё работает корректно.&lt;/p&gt;
&lt;h2&gt;Шаг 1. «Настройка Asterisk»&lt;/h2&gt;
&lt;p&gt;Теперь когда настройка безопасности завершена поставим asterisk:&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;apt install asterisk asterisk-config asterisk-core-sounds-en asterisk-core-sounds-en-g722 asterisk-core-sounds-en-gsm asterisk-core-sounds-en-wav asterisk-core-sounds-ru asterisk-core-sounds-ru-g722 asterisk-core-sounds-ru-gsm asterisk-core-sounds-ru-wav asterisk-voicemail&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;И приступим к его настройке:&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;cd /etc/asterisk&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Далее в asterisk.conf:&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;defaultlanguage = ru           ; Default language
documentation_language = ru_RU  ; Set the language you want documentation&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Выключим лишние модули в modules.conf:&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;[modules]
autoload=no

load =&amp;gt; chan_sip.so
load =&amp;gt; res_rtp_asterisk.so
load =&amp;gt; app_dial.so
load =&amp;gt; bridge_simple.so
load =&amp;gt; app_playback.so
load =&amp;gt; app_voicemail.so
load =&amp;gt; cdr_csv.so

load =&amp;gt; res_musiconhold.so
load =&amp;gt; res_adsi.so
load =&amp;gt; pbx_config.so

load =&amp;gt; codec_a_mu.so
load =&amp;gt; codec_adpcm.so
load =&amp;gt; codec_alaw.so
load =&amp;gt; codec_ulaw.so
load =&amp;gt; codec_gsm.so
load =&amp;gt; codec_lpc10.so

load =&amp;gt; func_shell.so
load =&amp;gt; func_callerid.so

load =&amp;gt; format_wav.so

load =&amp;gt; func_cut.so

load =&amp;gt; res_sorcery_config.so
load =&amp;gt; res_pjproject.so

[global]&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;В rtp.conf настроим количество портов для голосового трафика:&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;rtpstart=10000
rtpend=10100&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Не думаю что понадобится больше 100 параллельных вызовов.&lt;br /&gt;
Далее перейдём в sip.conf (замените $phone_number и $password на свои)&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;[general]
context=public
allowguest=no
allowoverlap=no
realm=asterisk.local
udpbindaddr=0.0.0.0
tcpenable=no
transport=udp

[multifon]
username = $phone_number
type = peer
secret = $password
host = sbc.megafon.ru
port = 5060
insecure = invite
trustrpid=yes
callbackextension = $phone_number
fromuser = $phone_number
fromdomain = sbc.megafon.ru
context = from-sip
disallow = all
allow = alaw
nat = no
directmedia = no
dtmfmode = inband
language = ru&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Я так же хотел принимать сообщения атвоответчика в telegram, раз уж я всё равно получаю звонки на asterisk, поэтому мне понадобилось установить&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;apt install dos2unix lame sox&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;и настроить voicemail.conf (замените $voicemail_password и $tg_client_id на свои):&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;[general]
#format=wav49|gsm|wav
format=wav
serveremail=asterisk@voice.local
attach=yes
#maxmsg=180
#maxsecs=180
#minsecs=4
#maxlogins=1
emaildateformat=%A, %d %B %Y at %H:%M:%S
emailbody=XTGMESSAGE_ ${VM_CALLERID} _ ${VM_DATE}
mailcmd=/usr/local/sbin/telegrammp3
sendvoicemail=no

[zonemessages]
eastern=America/New_York|&amp;#039;vm-received&amp;#039; Q &amp;#039;digits/at&amp;#039; Imp
central=America/Chicago|&amp;#039;vm-received&amp;#039; Q &amp;#039;digits/at&amp;#039; Imp
central24=America/Chicago|&amp;#039;vm-received&amp;#039; q &amp;#039;digits/at&amp;#039; H N &amp;#039;hours&amp;#039;
military=Zulu|&amp;#039;vm-received&amp;#039; q &amp;#039;digits/at&amp;#039; H N &amp;#039;hours&amp;#039; &amp;#039;phonetic/z_p&amp;#039;
european=Europe/Copenhagen|&amp;#039;vm-received&amp;#039; a d b &amp;#039;digits/at&amp;#039; HM

[voicemail]
1 =&amp;gt; $voicemail_password,homegroup,$tg_client_id,delete=yes&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;А теперь перейдём к диалплану extensions.conf (все $phone_number надо заменить на свой номер телефона):&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;[incoming]
exten =&amp;gt; $(phone_number)1,1,Playback(/usr/share/asterisk/sounds/ru_RU/ss-noservice)
same =&amp;gt; n,Hangup()

exten =&amp;gt; $phone_number,1,ringing
same =&amp;gt; n,wait(30)
same =&amp;gt; n,Voicemail(1@voicemail,u)
same =&amp;gt; n,Hangup()

exten =&amp;gt; $(phone_number)0,1,ringing
same =&amp;gt; n,wait(30)
same =&amp;gt; n,Voicemail(1@voicemail,u)
same =&amp;gt; n,Hangup()

[curlblacklist]
exten =&amp;gt; _X.,1,Goto(incoming,${EXTEN}${SHELL(/usr/local/sbin/spamn.sh ${CALLERID(num)} ${EXTEN} | tr -d &amp;quot;\n&amp;quot;)},1)
same =&amp;gt; n,Hangup()

[from-sip]
exten =&amp;gt; $phone_number,1,Goto(curlblacklist,${CUT(CUT(SIP_HEADER(To),@,1),:,2)},1)
same =&amp;gt; n,Hangup()&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;При желании можно завести своих родственников на тот же самый Asterisk, для этого надо сделать запись по аналогии с [multifon] в sip.conf и продублировать все записи с $phone_number в extensions.conf.&lt;/p&gt;
&lt;h2&gt;Шаг 2. «Распаковка скриптов»&lt;/h2&gt;
&lt;p&gt;Нам понадоится установить curl и git&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;apt install curl git&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Затем скачаем скрипты:&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;git clone https://github.com/lifespirit/asterisk-scripts.git&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;и переместим их в рабочую папку:&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;cp asterisk-scripts/spamn.sh /usr/local/sbin/
cp asterisk-scripts/telegrammp3 /usr/local/sbin/
chmod +x  /usr/local/sbin/spamn.sh
chmod +x  /usr/local/sbin/stelegrammp3&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Далее необходимо ввести данные своего телеграм бота если вы хотите получать уведомления о звонках и голосовую почту в телеграм. Инструкции как создать телеграм бота можно найти в документации telegram и тут я это пропущу. В обоих скриптах нужно порпавить две переменных:&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;botid=bot111222333
botkey=AAssddffgghhjjkkllqqwwweerrttyyuuiioozxc&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;а также в скрипте spamn.sh нужно заменить&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;chatid=&amp;quot;444555666&amp;quot;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;на id своего аккаунта или чат группы.&lt;/p&gt;
&lt;p&gt;Осталось только переключить роутинг услуги Мультифон на sip+gsm режим, что бы если это спам или телефон долго не отвечает трубку снимал asterisk, а если всё нормально трубку можно было снять с мобильного телефона. Сделать это можно например с помощью API:&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;curl -s &amp;#039;https://sm.megafon.ru/sm/client/routing?login=71112223344&amp;amp;password=mysecret&amp;amp;routing=2&amp;#039;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;На этом настройка завершена. Приятного использования.&lt;/p&gt;
</description>
</item>

<item>
<title>AWX на CentOS8 / RHEL8 без использования Docker</title>
<guid isPermaLink="false">2</guid>
<link>https://crabs.pro/all/awx-na-centos8-rhel8-bez-ispolzovaniya-docker/</link>
<pubDate>Fri, 24 Mar 2023 23:39:40 +0300</pubDate>
<author></author>
<comments>https://crabs.pro/all/awx-na-centos8-rhel8-bez-ispolzovaniya-docker/</comments>
<description>
&lt;p&gt;Давно хотел мигрировать AWX в нормальную виртуалку с зоопарка контейнеров. Вот рецепт миграции:&lt;/p&gt;
&lt;p&gt;Сначала подключаем репозитории.&lt;/p&gt;
&lt;p&gt;Для RHEL понадобится ansible-2-for-rhel-8-x86_64-rpms.&lt;br /&gt;
Для всех понадобятся nodejs14 repo и epel.&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;cat &amp;lt;&amp;lt; EOF &amp;gt; /etc/yum.repos.d/nodejs.repo
[nodesource]
name=Node.js Packages for Enterprise Linux 8 - $basearch
baseurl=https://rpm.nodesource.com/pub_14.x/el/8/$basearch
failovermethod=priority
enabled=1
gpgcheck=0
gpgkey=file:///etc/pki/rpm-gpg/NODESOURCE-GPG-SIGNING-KEY-EL
EOF

dnf install https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Затем включаем postgres 12 и выключаем nodejs по умолчанию&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;dnf -y module enable &amp;#039;postgresql:12&amp;#039;
dnf -y module disable &amp;#039;nodejs:10&amp;#039;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Далее устанавливаем руками то, чего нет в epel&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;cd ~
wget http://repo.okay.com.mx/centos/8/x86_64/release/xmlsec1-openssl-devel-1.2.25-4.el8.x86_64.rpm
wget http://repo.okay.com.mx/centos/8/x86_64/release/xmlsec1-openssl-1.2.25-4.el8.x86_64.rpm
wget http://repo.okay.com.mx/centos/8/x86_64/release/xmlsec1-nss-devel-1.2.25-4.el8.x86_64.rpm
wget http://repo.okay.com.mx/centos/8/x86_64/release/xmlsec1-nss-1.2.25-4.el8.x86_64.rpm
wget http://repo.okay.com.mx/centos/8/x86_64/release/xmlsec1-devel-1.2.25-4.el8.x86_64.rpm
wget http://repo.okay.com.mx/centos/8/x86_64/release/xmlsec1-1.2.25-4.el8.x86_64.rpm
wget http://repo.okay.com.mx/centos/8/x86_64/release/xmlsec1-gnutls-devel-1.2.25-4.el8.x86_64.rpm
wget http://repo.okay.com.mx/centos/8/x86_64/release/xmlsec1-gnutls-1.2.25-4.el8.x86_64.rpm
wget http://repo.okay.com.mx/centos/8/x86_64/release/xmlsec1-gcrypt-devel-1.2.25-4.el8.x86_64.rpm
wget http://repo.okay.com.mx/centos/8/x86_64/release/xmlsec1-gcrypt-1.2.25-4.el8.x86_64.rpm
dnf install ~/*.rpm&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Устанавливаем необходимые пакеты&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;dnf -y install ansible gcc gcc-c++ cpp git git-core git-lfs glibc-langpack-en libcurl-devel libffi-devel libtool-ltdl-devel make nodejs nss openldap-devel patch @postgresql:12 postgresql-devel python3 virtualenv python3-devel python3-pip python3-libselinux python3-psycopg2 python3-setuptools swig unzip xmlsec1 xmlsec1-devel xmlsec1-openssl xmlsec1-openssl-devel openssl-devel redis acl bubblewrap krb5-workstation libcgroup-tools nginx rsync subversion vim-minimal which supervisor&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Готовим awx&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;cd /var/lib/
wget https://github.com/ansible/awx/archive/17.1.0.zip
unzip 17.1.0.zip
cd ./awx-17.1.0&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Если нужна интеграция с bitbucket hooks вставляем руками обратно коммит &lt;a href="https://github.com/ansible/awx/commit/885841caeaea0f7c86d39d6e7a66b960124289c2#diff-c80eb18efdbf596480ee605607043d318310e113ec4d6215ab78c3f46ea1eaf4"&gt;https://github.com/ansible/awx/commit/885841caeaea0f7c86d39d6e7a66b960124289c2#diff-c80eb18efdbf596480ee605607043d318310e113ec4d6215ab78c3f46ea1eaf4&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Готовим файлы&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;for dir in \
      /var/log/tower \
      /var/run/supervisor \
    do mkdir -m 0775 -p $dir ; chmod g+rw $dir ; chgrp root $dir ; done

rm /usr/bin/launch_awx.sh /usr/bin/launch_awx_task.sh /etc/tower/settings.py /etc/supervisord.conf /etc/supervisord_task.conf /usr/bin/config-watcher
ln -s /var/lib/awx-17.1.0/installer/roles/image_build/files/launch_awx.sh /usr/bin/launch_awx.sh
ln -s /var/lib/awx-17.1.0/installer/roles/image_build/files/launch_awx_task.sh /usr/bin/launch_awx_task.sh
ln -s /var/lib/awx-17.1.0/installer/roles/image_build/files/settings.py /etc/tower/settings.py
ln -s /var/lib/awx-17.1.0/installer/roles/image_build/files/supervisor.conf /etc/supervisord.conf
ln -s /var/lib/awx-17.1.0/installer/roles/image_build/files/supervisor_task.conf /etc/supervisord_task.conf
ln -s /var/lib/awx-17.1.0/tools/scripts/config-watcher /usr/bin/config-watcher&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Начинаем сборку&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;make clean
make clean-tmp
make clean-venv
make requirements
make release_build
make install_collection
make ui-release&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Устанавливаем то что неразрешилось при сборке&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;. /var/lib/awx/venv/awx/bin/activate
pip install django-rest-swagger django-debug-toolbar
pip install .

. /var/lib/awx/venv/ansible/bin/activate
pip install django-rest-swagger django-debug-toolbar
cat requirements/requirements.txt requirements/requirements_local.txt | /var/lib/awx/venv/ansible/bin/pip install -r /dev/stdin
cat requirements/requirements.txt requirements/requirements_git.txt | /var/lib/awx/venv/ansible/bin/pip install --no-binary cffi,pycparser,psycopg2,twilio,pycurl -r /dev/stdin
pip install .&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Копируем UI в директорию AWX, создаём дополнительные папки&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;cp -r awx/ui_next/build/static ../awx/
cp awx/static/* ../awx/static/
mkdir ../awx/projects
mkdir ../awx/rsyslog&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Далее подгоняем конфиги под себя&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;vi /etc/tower/settings.py # правим доступ к базе и секретный ключ (SECRET_KEY и DATABASES)
vi ./installer/roles/local_docker/templates/nginx.conf.j2 #из этого собираем конфиг для nginx.conf и переносим в /etc/nginx/nginx.conf
vi /etc/redis.conf #выставляем порт 0, указываем сокет unixsocket /var/run/redis/redis.sock с правами unixsocketperm 777
vi /etc/supervisord.conf #сращиваем с /etc/supervisor_task.conf, добавляем venv. например: /bin/bash -c &amp;#039;source &amp;quot;$0&amp;quot; &amp;amp;&amp;amp; exec &amp;quot;$@&amp;quot;&amp;#039; /var/lib/awx/venv/awx/bin/activate daphne -b 127.0.0.1 -p 8051 --websocket_timeout -1 awx.asgi:channel_layer и далее по аналогии. Удаляем nginx и rsyslog из supervisord.config, потому что они и так прекрасно работают на systemd. Правим файлы логов что бы писать в файл а не в stdout. Правим шапку супервизора на дефолтную.
postgresql-setup --initdb
vi /var/lib/pgsql/data/pg_hba.conf #заменяем тип авторизации для 127.0.0.1 на md5&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;В supervisord.conf получается что то вроде&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;[supervisord]
logfile=/var/log/supervisor/supervisord-tower.log  ; (main log file;default $CWD/supervisord.log)
logfile_maxbytes=50MB       ; (max main logfile bytes b4 rotation;default 50MB)
logfile_backups=10          ; (num of main logfile rotation backups;default 10)
loglevel=info               ; (log level;default info; others: debug,warn,trace)
pidfile=/run/supervisord-tower.pid ; (supervisord pidfile;default supervisord.pid)
nodaemon=false              ; (start in foreground if true;default false)
minfds=1024                 ; (min. avail startup file descriptors;default 1024)
minprocs=200                ; (min. avail process descriptors;default 200)
;umask=022                  ; (process file creation umask;default 022)
;user=chrism                 ; (default is current user, required if root)
;identifier=supervisor       ; (supervisord identifier, default is &amp;#039;supervisor&amp;#039;)
;directory=/tmp              ; (default is not to cd during start)
;nocleanup=true              ; (don&amp;#039;t clean up tempfiles at start;default false)
;childlogdir=/tmp            ; (&amp;#039;AUTO&amp;#039; child log dir, default $TEMP)
;environment=KEY=value       ; (key value pairs to add to environment)
;strip_ansi=false

[program:uwsgi]
command = /bin/bash -c &amp;#039;source &amp;quot;$0&amp;quot; &amp;amp;&amp;amp; exec &amp;quot;$@&amp;quot;&amp;#039; /var/lib/awx/venv/awx/bin/activate uwsgi --socket 127.0.0.1:8050 --module=awx.wsgi:application --vacuum --processes=5 --harakiri=120 --no-orphans --master --max-requests=1000 --master-fifo=/var/lib/awx/awxfifo --lazy-apps -b 32768
directory = /var/lib/awx
autostart = true
autorestart = true
stopwaitsecs = 15
stopsignal = INT
stdout_logfile=/var/log/supervisor/uwsgi.log
stdout_logfile_maxbytes=102400
stderr_logfile=/var/log/supervisor/uwsgi-error.log
stderr_logfile_maxbytes=102400&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Всё что скопировано с supervisord_task.conf (dispatcher и callback-receiver) должно работать с /var/lib/awx/venv/ansible/bin/activate, всё остальное с /var/lib/awx/venv/awx/bin/activate&lt;/p&gt;
&lt;p&gt;Далее стартуем все сервисы&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;systemctl start postgres
systemctl enable postgres
systemctl start redis
systemctl enable redis
systemctl start nginx
systemctl enable nginx&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Создаём БД&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;sudo -u postgres psql

#Заполняем базу и пароли так же как указали в /etc/tower/settings.py
CREATE DATABASE awx;
CREATE USER awx WITH PASSWORD &amp;#039;awxpass&amp;#039;;
GRANT ALL PRIVILEGES ON DATABASE &amp;quot;awx&amp;quot; to awx;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Если восстанавливаемся из бэкапа&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;sudo -u postgres pg_restore -d awx /awx.bak
make migrate&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Если это чистая раскатка&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;make genschema
. /var/lib/awx/venv/ansible/bin/activate &amp;amp;&amp;amp; awx-manage provision_instance --hostname=$(hostname) &amp;amp;&amp;amp; awx-manage register_queue --queuename=tower --instance_percent=100
echo &amp;quot;from django.contrib.auth.models import User; User.objects.create_superuser(&amp;#039;$AWX_ADMIN_USER&amp;#039;, &amp;#039;root@localhost&amp;#039;, &amp;#039;$AWX_ADMIN_PASSWORD&amp;#039;)&amp;quot; | awx-manage shell # $AWX_ADMIN_USER и $AWX_ADMIN_PASSWORD а так же другие данные нужно поменять на свои&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Если используется LDAP сейчас самое время установить CA и прочие сертификаты для LDAP. Как это сделать лучше нагуглить отдельно.&lt;/p&gt;
&lt;p&gt;И наконец запускаем AWX&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;systemctl start supoervisord
systemctl enable supervisord&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Если что то пошло не так смотрите процессы через supervisorctl и файлы логов, настроенные в /etc/supervisord.conf&lt;/p&gt;
&lt;p&gt;Надеюсь эта заметка будет полезной.&lt;/p&gt;
</description>
</item>


</channel>
</rss>