Compare commits
60 Commits
721fb0b1e7
...
c9452ee5ed
| Author | SHA1 | Date |
|---|---|---|
|
|
c9452ee5ed | |
|
|
40efd4bef5 | |
|
|
a14f1d2ab3 | |
|
|
ade4f42398 | |
|
|
9f68cc73aa | |
|
|
36fa12fbdf | |
|
|
661f00fd6b | |
|
|
607a6c727d | |
|
|
9bb7d889e3 | |
|
|
c34382d54b | |
|
|
4ea297e3e9 | |
|
|
4b991a2999 | |
|
|
b0c6f043ea | |
|
|
0dc55644e8 | |
|
|
7fbdb2a7ba | |
|
|
b6229faedc | |
|
|
d56ccb47ab | |
|
|
74f7794e77 | |
|
|
af20f47aba | |
|
|
f392769491 | |
|
|
cd38768362 | |
|
|
e1604781f0 | |
|
|
23af64780d | |
|
|
4c96585ef1 | |
|
|
5d105ad9f3 | |
|
|
6039b0eb13 | |
|
|
0d18d193f5 | |
|
|
b59293a9d9 | |
|
|
6b08bfa2f5 | |
|
|
eb7cbd1f67 | |
|
|
d0d79bd132 | |
|
|
45bb38e051 | |
|
|
4b564e0224 | |
|
|
0d3b97502b | |
|
|
1ff695d823 | |
|
|
dfa432738e | |
|
|
30f18a3523 | |
|
|
172bd1fced | |
|
|
cf01231df2 | |
|
|
9cf2184bcb | |
|
|
1343e92f1e | |
|
|
863c2529a7 | |
|
|
31648ef1ed | |
|
|
b17c97cf0f | |
|
|
34c7938d3e | |
|
|
ff1f9114de | |
|
|
c9cd3f2606 | |
|
|
b000b80ec7 | |
|
|
40a60b3e50 | |
|
|
f45ae7599e | |
|
|
3868710cbe | |
|
|
e3ed893454 | |
|
|
ddc200f242 | |
|
|
aa7dfc7887 | |
|
|
35fd7fb5f7 | |
|
|
827865bbbc | |
|
|
ef3b5a3096 | |
|
|
861469eee4 | |
|
|
a5ee6be2ba | |
|
|
13cce4a94c |
|
|
@ -0,0 +1,74 @@
|
|||
<!--
|
||||
title: Установка XPEnology
|
||||
description:
|
||||
published: true
|
||||
date: 2023-11-15T17:00:34.979Z
|
||||
tags: xpenology
|
||||
editor: ckeditor
|
||||
dateCreated: 2023-11-15T16:50:54.856Z
|
||||
-->
|
||||
|
||||
<p>Источник: <a href="https://xpenology.club/install-dsm-7-on-baremetal-or-vm/">https://xpenology.club/install-dsm-7-on-baremetal-or-vm/</a></p>
|
||||
<p>На Proxmox <a href="https://www.wundertech.net/how-to-install-xpenology-on-proxmox-dsm-7/">https://www.wundertech.net/how-to-install-xpenology-on-proxmox-dsm-7/</a></p>
|
||||
<p><a href="https://www.wundertech.net/how-to-install-xpenology-on-proxmox-dsm-7/">https://www.wundertech.net/how-to-install-xpenology-on-proxmox-dsm-7/</a></p>
|
||||
<p>В новых материнских платах возможно потребуется отключить безопасную загрузку Windows в биосе.</p>
|
||||
<figure class="image"><img src="/attachments/xpenology/1.jpg"></figure>
|
||||
<p><strong>Тестовая версия, может что то не работать!</strong></p>
|
||||
<p>Идем по ссылке <a href="https://github.com/pocopico/tinycore-redpill">https://github.com/pocopico/tinycore-redpill</a> и качаем образ.</p>
|
||||
<figure class="image image_resized" style="width:62.59%;"><img src="/attachments/xpenology/2.jpg"></figure>
|
||||
<p>Разархивируем образ , должен появиться файл img.</p>
|
||||
<p>Вставляем флешку и записываем образ с помощью win32DiskImager или Rufus и делаем загрузку с USB.</p>
|
||||
<p> </p>
|
||||
<p>Удобнее работать удаленно через putty, поэтому нажимаем иконку терминала и смотрим ip адрес, который был получен.</p>
|
||||
<pre><code class="language-plaintext">ifconfig</code></pre>
|
||||
<p> </p>
|
||||
<figure class="image"><img src="/attachments/xpenology/3.jpg"></figure>
|
||||
<figure class="image"><img src="/attachments/xpenology/4.jpg"></figure>
|
||||
<p>Так же необходима программа WinSCP для того, чтобы скачать сформированный файл прошивки.</p>
|
||||
<figure class="image"><img src="/attachments/xpenology/5.png"></figure>
|
||||
<p><strong>Для входа используются логины и пароли:</strong></p>
|
||||
<blockquote>
|
||||
<p><strong>User: tc</strong><br><strong>Password: P@ssw0rd</strong></p>
|
||||
</blockquote>
|
||||
<p> </p>
|
||||
<p>Здесь вы можете найти нужные вам конфигурации. Вы можете заполнить их вручную (vid/pid/mac/disks) или попробовать использовать функции в скрипте.</p>
|
||||
<p>Вы можете редактировать файлы с помощью winscp. Но сначала нам нужно обновить скрипт до последней версии.</p>
|
||||
<p>Сначала проверьте, есть ли обновление скрипта.</p>
|
||||
<pre><code class="language-plaintext">sudo ./rploader.sh update now
|
||||
sudo ./rploader.sh fullupgrade now</code></pre>
|
||||
<p> </p>
|
||||
<figure class="image"><img src="/attachments/xpenology/6.jpg"></figure>
|
||||
<p> </p>
|
||||
<p>Когда это будет сделано, у вас будет последняя версия скрипта. Теперь пришло время отредактировать файл user_config.json</p>
|
||||
<figure class="image"><img src="/attachments/xpenology/7.png"></figure>
|
||||
<pre><code class="language-plaintext">user_config.json</code></pre>
|
||||
<p> </p>
|
||||
<figure class="image"><img src="/attachments/xpenology/8.png"></figure>
|
||||
<p> </p>
|
||||
<p>Вы можете вручную ввести правильные значения или попробовать использовать автоматическую функцию скрипта.</p>
|
||||
<pre><code class="language-plaintext">sudo ./rploader.sh serialgen DS3615xs realmac now
|
||||
...
|
||||
sudo ./rploader.sh satamap now
|
||||
...
|
||||
sudo ./rploader.sh identifyusb now
|
||||
...</code></pre>
|
||||
<p>Теперь пишем:</p>
|
||||
<pre><code class="language-plaintext">sudo ./rploader.sh</code></pre>
|
||||
<p>Чтобы просмотреть справку по скрипту и команды, которые вы можете использовать. Можнопоэкспериментировать с ними просто ради удовольствия.</p>
|
||||
<p>Убедитесь, что вы используете правильные настройки vid/pid/mac и диска. Если вы не используете правильный vid/pid, dsm не будет установлен.</p>
|
||||
<p>После генерации всех значений проверьте user_config.json, прежде чем запускать скрипт сборки.</p>
|
||||
<p>Есть еще команды, которые вы можете использовать, но они мне не нужны, поэтому я не буду их использовать. Вот помощь скрипта.</p>
|
||||
<p>В моем случае я использую:</p>
|
||||
<figure class="image"><img src="/attachments/xpenology/9.png"></figure>
|
||||
<pre><code class="language-plaintext">sudo ./rploader.sh build bromolow-7.0.1-42218</code></pre>
|
||||
<p>После завершения сборки загрузите файл *.pat через WinSCP по указанному пути и скачивайте на вашу локальную машину.</p>
|
||||
<pre><code class="language-plaintext">Found /home/tc/redpill-load/cache/ds3615xs_42218.pat, copying to cache directory : /mnt/sdc3/auxfiles</code></pre>
|
||||
<p> </p>
|
||||
<figure class="image"><img src="/attachments/xpenology/10.png"></figure>
|
||||
<p> </p>
|
||||
<p>Перезагрузите свой компьютер (оставьте USB включенным), и запустится новый загрузчик, и вы сможете установить dsm или снова запустить tinycore.</p>
|
||||
<p>Начните с <a href="http://find.synology.com">find.synology.com</a> в веб-браузере (или в программе <strong>Synology Assistant</strong>) и найдите свое хранилище dsm 7. Загрузите файл pat, который вы скачали, и будьте довольны своей версией DSM 7.</p>
|
||||
<figure class="image"><img src="/attachments/xpenology/11.png"></figure>
|
||||
<p> </p>
|
||||
<p> </p>
|
||||
<p> </p>
|
||||
|
|
@ -2,225 +2,262 @@
|
|||
title: Менеджер паролей Passwork
|
||||
description:
|
||||
published: true
|
||||
date: 2023-11-15T16:43:00.037Z
|
||||
date: 2023-11-15T16:47:23.462Z
|
||||
tags:
|
||||
editor: ckeditor
|
||||
dateCreated: 2023-11-15T16:36:08.780Z
|
||||
-->
|
||||
|
||||
<h1>Описание</h1>
|
||||
<p> </p>
|
||||
<blockquote>
|
||||
<p>Пассворк упрощает совместную работу с корпоративными паролями. Все данные безопасно хранятся на вашем сервере, а сотрудники быстро находят нужные пароли. Администратор управляет правами пользователей, отслеживает все действия и изменения.</p>
|
||||
<p> </p>
|
||||
</blockquote>
|
||||
<figure class="image"><img src="/attachments/image2022-12-12_11-39-19.png"></figure>
|
||||
<figure class="image"><img src="/attachments/image2022-12-12_11-39-59.png"></figure>
|
||||
<figure class="image"><img src="/attachments/image2022-12-12_11-41-52.png"></figure>
|
||||
<p>Рекомендации по установке</p>
|
||||
<h3><strong>Минимальные системные требования</strong></h3>
|
||||
<p>Пассворк не требователен к ресурсам сервера(-ов). Объемы необходимых ресурсов (RAM, CPU, HDD) и количество серверов зависят от количества активных пользователей, объема хранимых данных, а также требований к отказоустойчивости системы.</p>
|
||||
<blockquote>
|
||||
<p>Показатель IOPS имеет большое значения для скорости работы базы данных, поэтому желательно использовать SSD диски.</p>
|
||||
</blockquote>
|
||||
<p><strong>Варианты установки Пассворк на выделенных или виртуальных серверах</strong></p>
|
||||
<h3>1. Все на одном сервере</h3>
|
||||
<p>Обычно подходит для редакций до 500 пользователей, без специальных требований по хранению данных:</p>
|
||||
<figure class="table">
|
||||
<table>
|
||||
<tbody>
|
||||
<tr>
|
||||
<th>Кол-во пользователей</th>
|
||||
<th>RAM</th>
|
||||
<th>CPU</th>
|
||||
<th>HDD</th>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>до 50</th>
|
||||
<th>2-4 ГБ</th>
|
||||
<th>4</th>
|
||||
<th>100 ГБ</th>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>до 100</th>
|
||||
<th>4-8 ГБ</th>
|
||||
<th>8</th>
|
||||
<th>150 ГБ</th>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>до 500</th>
|
||||
<th>8-16 ГБ</th>
|
||||
<th>8</th>
|
||||
<th>200 ГБ</th>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</figure>
|
||||
<p><strong>2. Сервер приложения и база данных на разных серверах</strong></p>
|
||||
<p>База данных и сервер приложения разносятся по разным серверам. </p>
|
||||
<p>RAM-1, CPU-1, HDD-1 — сервер приложения.</p>
|
||||
<p>RAM-2, CPU-2, HDD-2 — база данных.</p>
|
||||
<figure class="table">
|
||||
<table>
|
||||
<tbody>
|
||||
<tr>
|
||||
<th>Кол-во пользователей</th>
|
||||
<th>RAM-1</th>
|
||||
<th>CPU-1</th>
|
||||
<th>HDD-1</th>
|
||||
<th>RAM-2</th>
|
||||
<th>CPU-2</th>
|
||||
<th>HDD-2</th>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>до 50</th>
|
||||
<th>2-4 ГБ</th>
|
||||
<th>4</th>
|
||||
<th>100 ГБ</th>
|
||||
<th>2-4 ГБ</th>
|
||||
<th>4</th>
|
||||
<th>100 ГБ</th>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>до 100</th>
|
||||
<th>4 ГБ</th>
|
||||
<th>8</th>
|
||||
<th>100 ГБ</th>
|
||||
<th>4 ГБ</th>
|
||||
<th>4</th>
|
||||
<th>150 ГБ</th>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>до 500</th>
|
||||
<th>8-16 ГБ</th>
|
||||
<th>8</th>
|
||||
<th>100 ГБ</th>
|
||||
<th>8 ГБ</th>
|
||||
<th>8</th>
|
||||
<th>200 ГБ</th>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>до 1000</th>
|
||||
<th>8-16 ГБ</th>
|
||||
<th>8</th>
|
||||
<th>100 ГБ</th>
|
||||
<th>16 ГБ</th>
|
||||
<th>8</th>
|
||||
<th>200 ГБ</th>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>до 10000</th>
|
||||
<th>16-32 ГБ</th>
|
||||
<th>16</th>
|
||||
<th>100 ГБ</th>
|
||||
<th>16-32 ГБ</th>
|
||||
<th>16</th>
|
||||
<th>200 ГБ</th>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</figure>
|
||||
<p> </p>
|
||||
<h1>Установка</h1>
|
||||
<h2>Установка Docker</h2>
|
||||
<p>Скачайте и установите Docker CE (<a href="https://docs.docker.com/engine/installation/">https://docs.docker.com/engine/installation/</a>).</p>
|
||||
<p>Cкачайте и установите Docker-сompose (<a href="https://docs.docker.com/compose/install/">https://docs.docker.com/compose/install/</a>)</p>
|
||||
<p><strong>Обновите систему:</strong></p>
|
||||
<pre><code class="language-plaintext">sudo –i
|
||||
apt-get update
|
||||
apt-get upgrade</code></pre>
|
||||
<p><strong>Установите Git:</strong></p>
|
||||
<pre><code class="language-plaintext">apt-get install git</code></pre>
|
||||
<p><strong>Скачайте файлы управления и шаблонные конфиг-файлы</strong></p>
|
||||
<p>Создайте директорию /server и склонируйте файлы:</p>
|
||||
<pre><code class="language-plaintext">rm /server/sites/prod/.gitkeep</code></pre>
|
||||
<p>Склонируйте репозиторий. Укажите логин и пароль, которые вам сообщили менеджеры Пассворк.</p>
|
||||
<pre><code class="language-plaintext">git clone http://passwork.download/passwork/passwork.git /server/sites/prod</code></pre>
|
||||
<pre><code class="language-plaintext">cd /server/sites/prod/
|
||||
git checkout v5</code></pre>
|
||||
<blockquote>
|
||||
<p>Где взять логин и пароль</p>
|
||||
<p>Мы отправляем логин и пароль к нашему репозиторию после покупки Пассворк.</p>
|
||||
</blockquote>
|
||||
<p><strong>Перейдите в каталог для Docker Compose</strong></p>
|
||||
<pre><code class="language-plaintext">cd /server/docker-compose/</code></pre>
|
||||
<p>В каталоге есть файл docker-compose.override.yml , в котором можно указать назначение портов, на случай если порты могут быть заняты.</p>
|
||||
<p><strong>Запустите Docker Compose</strong></p>
|
||||
<pre><code class="language-plaintext">docker-compose up -d</code></pre>
|
||||
<p><strong>Проверьте, что контейнеры запустились и работают:</strong></p>
|
||||
<pre><code class="language-plaintext">docker ps</code></pre>
|
||||
<h3><strong>Инсталляция</strong></h3>
|
||||
<p>При первом открытии Пассворк вы увидите диалог инсталляции, который проверит корректность настройки сервера и позволит ввести базовые параметры.</p>
|
||||
<figure class="image"><img src="/attachments/снимок_экрана_2023-11-15_193934.png"></figure>
|
||||
<p>Тут нужно подправить сервер и указать строчку: <a href="mongodb://db:27017">mongodb://db:27017</a></p>
|
||||
<p>Нужно будет сохранить ключ шифрования для восстановления, если появится такая необходимость.</p>
|
||||
<p><strong>Зарегистрируйте администратора Пассворк</strong></p>
|
||||
<p>Введите логин и пароль для первого пользователя. Пользователь автоматически станет администратором и владельцем организации.</p>
|
||||
<p> </p>
|
||||
<h1>Обслуживание</h1>
|
||||
<h2>Настройка фоновых задач</h2>
|
||||
<p>Фоновые задачи — это задачи, которые выполняются по планировщику в фоновом режиме. Например, синхронизация LDAP, загрузка фавиконов и другие задачи, которые требует много времени, постоянного выполнения или распределения ресурсов.</p>
|
||||
<p>Проверить список запланированных задач и корректность всех настроек можно на странице «Фоновые задачи».</p>
|
||||
<p> </p>
|
||||
<p> </p>
|
||||
<p>Для настройки фоновых задач необходимо настроить планировщик вашей операционной системы Cron (для Линукс) или Windows Scheduler. Планировщик должен запускать скрипт <code><u><папка с Пассворк>/app/tools/run-scheduled-tasks.php</u></code> каждую минуту.</p>
|
||||
<p>Скрипт проанализирует какие задачи необходимо запустить и для каждой задачи создаст отдельный поток. При выполнении каждая задача записывает лог в папку <code><u><папка Пассворк>/app/logs/</u></code><u> в файлы вида </u><code><u>task-*.log</u></code>, например, <code><u>task-62f8e9624e0446fba40bbb12.log</u></code>. После завершения задачи вы можете посмотреть и скачать лог со страницы Фоновые задачи → История задач.</p>
|
||||
<p>Системные логи планировщика (с ошибками) находятся в <code><u><папка Пассворк>/app/logs/run-command.log</u></code>.</p>
|
||||
<h2>О Docker-образах</h2>
|
||||
<p>Docker-образы устроены таким способом, что все важные данные вынесены в общие с хостовой машиной папки. Поэтому вы можете смело останавливать, удалять и создавать новые контейнеры. Конфигурационные файлы так же хранятся в общих папках (т.е. не в контейнере), поэтому вы можете провести любую настройку Nginx, PHP и MongoDB без внесения изменений непосредственно в образы или контейнеры. Просто внесите изменения в конфиг файлы и перезапустите контейнер или сервисы.</p>
|
||||
<p>Если вам необходимо внести изменения в образ, то войдите в контейнер, внесите изменения и затем сделайте коммит в ваш образ командой</p>
|
||||
<pre><code class="language-plaintext">docker commit <container id> you-name/image-name</code></pre>
|
||||
<p>Более подробно описано в официальной документации Docker.</p>
|
||||
<h2>Полезные команды</h2>
|
||||
<p>Скопируйте утилиту <i>dexec</i> в /usr/bin/:</p>
|
||||
<p><code>cp</code> <code>/server/dexec</code> <code>/usr/bin/dexec</code></p>
|
||||
<p>Вход в контейнер:</p>
|
||||
<p>bash]]></p>
|
||||
<p>Восстановление прав для файлов сайта (требуется после обновления):</p>
|
||||
<p>Перезагрузка Nginx без остановки:</p>
|
||||
<p>Контейнеры запущены с опцией autostart. Это означает, что Docker автоматически перезапустит контейнер, если он по каким-либо причинам остановится. Поэтому, если вам необходимо остановить контейнер, сперва отключите autostart:</p>
|
||||
<p>]]></p>
|
||||
<p>Включить autostart обратно:</p>
|
||||
<p>]]></p>
|
||||
<p>Без опции autostart вы можете остановить контейнеры принудительно:</p>
|
||||
<p>]]></p>
|
||||
<p>Обратите внимание, что если опция <i>autostart</i> включена, то эти команды перезапустят Nginx и MongoDB, Используйте ее в крайних случаях, так как это может повлечь порчу данных.</p>
|
||||
<h2>Структура файлов</h2>
|
||||
<p>Файлы конфигураций:</p>
|
||||
<p>Данные (база данных):</p>
|
||||
<p>Логи:</p>
|
||||
<p>Сайты:</p>
|
||||
<h2>Пример: Как изменить конфигурацию Nginx или PHP</h2>
|
||||
<p>Отредактируйте файлы:</p>
|
||||
<p>Перезапустите nginx и php-fpm:</p>
|
||||
<h2>Настройка почты</h2>
|
||||
<p>Nginx контейнер использует Postfix для отправки почты. Все конфигурационные файлы вы можете найти здесь:</p>
|
||||
<p>Отредактируйте их под свои нужды. Перезапустите Postfix, чтобы изменения вступили в силу.</p>
|
||||
<h2>Пример настройки Postfix</h2>
|
||||
<p>Откройте конфигурационный файл <code>/server/conf/postfix/</code><a href="http://main.cf"><code>main.cf</code></a>.</p>
|
||||
<p>Убедитесь в том, что параметр myhostname совпадает с полным доменным именем вашего сервера:</p>
|
||||
<h3>Настройка имен и паролей SMTP</h3>
|
||||
<p>Откройте или создайте файл <code>/server/conf/postfix/sasl_passwd</code>.</p>
|
||||
<p>Добавьте SMTP хост, имя пользователя и пароль должны быть записаны в следующем формате:</p>
|
||||
<p>Если вы хотите использовать нестандартный TCP-порт (например, 587), используйте следующий формат:</p>
|
||||
<p>для Gmail запись будет выглядеть следующим образом:</p>
|
||||
<p>Создайте хэшированную базу данных для Postfix, выполните команду postmap:</p>
|
||||
<p>После успешного выполнения команды в директории /server/conf/postfix должен появиться новый файл sasl_passwd.db.</p>
|
||||
<h3>Защита файла с паролями и хэш-файла.</h3>
|
||||
<p>Файлы /server/conf/postfix/sasl_passwd и /server/conf/postfix/sasl_passwd.db, созданные в предыдущих шагах, содержат ваши учетные данные SMTP в виде простого текста. По соображениям безопасности вы должны изменить права доступа к ним, так чтобы только пользователь root мог читать и записывать в файл.</p>
|
||||
<p>Выполните следующие команды, чтобы изменить владельца файлов на root и обновить права доступа для файлов:</p>
|
||||
<h3><strong>Конфигурация релей сервера</strong></h3>
|
||||
<p>Откройте файл <code>/server/conf/postfix/</code><a href="http://main.cf"><code>main.cf</code></a>.</p>
|
||||
<p>Измените параметр relayhost, на свой внешний SMTP релей. Если в файле sasl_passwd был указан нестандартный TCP-порт, то вы должны использовать тот же порт при настройке параметра relayhost.</p>
|
||||
<p>Укажите SMTP релей:</p>
|
||||
<p>для Gmail запись будет выглядеть следующим образом:</p>
|
||||
<p>В конце файла добавьте следующие параметры для включения аутентификации:</p>
|
||||
<p>Сохраните изменения.</p>
|
||||
<p>Перезапустите Postfix:</p>
|
||||
<p> </p>
|
||||
<p> </p>
|
||||
<p> </p>
|
||||
<p> </p>
|
||||
<p> </p>
|
||||
<p> </p>
|
||||
<p> </p>
|
||||
<h1>Описание</h1>
|
||||
<p> </p>
|
||||
<blockquote>
|
||||
<p>Пассворк упрощает совместную работу с корпоративными паролями. Все данные безопасно хранятся на вашем сервере, а сотрудники быстро находят нужные пароли. Администратор управляет правами пользователей, отслеживает все действия и изменения.</p>
|
||||
<p> </p>
|
||||
</blockquote>
|
||||
<figure class="image"><img src="/attachments/image2022-12-12_11-39-19.png"></figure>
|
||||
<figure class="image"><img src="/attachments/image2022-12-12_11-39-59.png"></figure>
|
||||
<figure class="image"><img src="/attachments/image2022-12-12_11-41-52.png"></figure>
|
||||
<p>Рекомендации по установке</p>
|
||||
<h3><strong>Минимальные системные требования</strong></h3>
|
||||
<p>Пассворк не требователен к ресурсам сервера(-ов). Объемы необходимых ресурсов (RAM, CPU, HDD) и количество серверов зависят от количества активных пользователей, объема хранимых данных, а также требований к отказоустойчивости системы.</p>
|
||||
<blockquote>
|
||||
<p>Показатель IOPS имеет большое значения для скорости работы базы данных, поэтому желательно использовать SSD диски.</p>
|
||||
</blockquote>
|
||||
<p><strong>Варианты установки Пассворк на выделенных или виртуальных серверах</strong></p>
|
||||
<h3>1. Все на одном сервере</h3>
|
||||
<p>Обычно подходит для редакций до 500 пользователей, без специальных требований по хранению данных:</p>
|
||||
<figure class="table">
|
||||
<table>
|
||||
<tbody>
|
||||
<tr>
|
||||
<th>Кол-во пользователей</th>
|
||||
<th>RAM</th>
|
||||
<th>CPU</th>
|
||||
<th>HDD</th>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>до 50</th>
|
||||
<th>2-4 ГБ</th>
|
||||
<th>4</th>
|
||||
<th>100 ГБ</th>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>до 100</th>
|
||||
<th>4-8 ГБ</th>
|
||||
<th>8</th>
|
||||
<th>150 ГБ</th>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>до 500</th>
|
||||
<th>8-16 ГБ</th>
|
||||
<th>8</th>
|
||||
<th>200 ГБ</th>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</figure>
|
||||
<p><strong>2. Сервер приложения и база данных на разных серверах</strong></p>
|
||||
<p>База данных и сервер приложения разносятся по разным серверам. </p>
|
||||
<p>RAM-1, CPU-1, HDD-1 — сервер приложения.</p>
|
||||
<p>RAM-2, CPU-2, HDD-2 — база данных.</p>
|
||||
<figure class="table">
|
||||
<table>
|
||||
<tbody>
|
||||
<tr>
|
||||
<th>Кол-во пользователей</th>
|
||||
<th>RAM-1</th>
|
||||
<th>CPU-1</th>
|
||||
<th>HDD-1</th>
|
||||
<th>RAM-2</th>
|
||||
<th>CPU-2</th>
|
||||
<th>HDD-2</th>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>до 50</th>
|
||||
<th>2-4 ГБ</th>
|
||||
<th>4</th>
|
||||
<th>100 ГБ</th>
|
||||
<th>2-4 ГБ</th>
|
||||
<th>4</th>
|
||||
<th>100 ГБ</th>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>до 100</th>
|
||||
<th>4 ГБ</th>
|
||||
<th>8</th>
|
||||
<th>100 ГБ</th>
|
||||
<th>4 ГБ</th>
|
||||
<th>4</th>
|
||||
<th>150 ГБ</th>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>до 500</th>
|
||||
<th>8-16 ГБ</th>
|
||||
<th>8</th>
|
||||
<th>100 ГБ</th>
|
||||
<th>8 ГБ</th>
|
||||
<th>8</th>
|
||||
<th>200 ГБ</th>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>до 1000</th>
|
||||
<th>8-16 ГБ</th>
|
||||
<th>8</th>
|
||||
<th>100 ГБ</th>
|
||||
<th>16 ГБ</th>
|
||||
<th>8</th>
|
||||
<th>200 ГБ</th>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>до 10000</th>
|
||||
<th>16-32 ГБ</th>
|
||||
<th>16</th>
|
||||
<th>100 ГБ</th>
|
||||
<th>16-32 ГБ</th>
|
||||
<th>16</th>
|
||||
<th>200 ГБ</th>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</figure>
|
||||
<p> </p>
|
||||
<h1>Установка</h1>
|
||||
<h2>Установка Docker</h2>
|
||||
<p>Скачайте и установите Docker CE (<a href="https://docs.docker.com/engine/installation/">https://docs.docker.com/engine/installation/</a>).</p>
|
||||
<p>Cкачайте и установите Docker-сompose (<a href="https://docs.docker.com/compose/install/">https://docs.docker.com/compose/install/</a>)</p>
|
||||
<p><strong>Обновите систему:</strong></p>
|
||||
<pre><code class="language-plaintext">sudo –i
|
||||
apt-get update
|
||||
apt-get upgrade</code></pre>
|
||||
<p><strong>Установите Git:</strong></p>
|
||||
<pre><code class="language-plaintext">apt-get install git</code></pre>
|
||||
<p><strong>Скачайте файлы управления и шаблонные конфиг-файлы</strong></p>
|
||||
<p>Создайте директорию /server и склонируйте файлы:</p>
|
||||
<pre><code class="language-plaintext">rm /server/sites/prod/.gitkeep</code></pre>
|
||||
<p>Склонируйте репозиторий. Укажите логин и пароль, которые вам сообщили менеджеры Пассворк.</p>
|
||||
<pre><code class="language-plaintext">git clone http://passwork.download/passwork/passwork.git /server/sites/prod</code></pre>
|
||||
<p> </p>
|
||||
<pre><code class="language-plaintext">cd /server/sites/prod/
|
||||
git checkout v5</code></pre>
|
||||
<p> </p>
|
||||
<blockquote>
|
||||
<p>Где взять логин и пароль</p>
|
||||
<p>Мы отправляем логин и пароль к нашему репозиторию после покупки Пассворк.</p>
|
||||
</blockquote>
|
||||
<p><strong>Перейдите в каталог для Docker Compose</strong></p>
|
||||
<pre><code class="language-plaintext">cd /server/docker-compose/</code></pre>
|
||||
<p>В каталоге есть файл docker-compose.override.yml , в котором можно указать назначение портов, на случай если порты могут быть заняты.</p>
|
||||
<p><strong>Запустите Docker Compose</strong></p>
|
||||
<pre><code class="language-plaintext">docker-compose up -d</code></pre>
|
||||
<p><strong>Проверьте, что контейнеры запустились и работают:</strong></p>
|
||||
<pre><code class="language-plaintext">docker ps</code></pre>
|
||||
<h3><strong>Инсталляция</strong></h3>
|
||||
<p>При первом открытии Пассворк вы увидите диалог инсталляции, который проверит корректность настройки сервера и позволит ввести базовые параметры.</p>
|
||||
<figure class="image"><img src="/attachments/снимок_экрана_2023-11-15_193934.png"></figure>
|
||||
<p>Тут нужно подправить сервер и указать строчку: <a href="mongodb://db:27017">mongodb://db:27017</a></p>
|
||||
<p>Нужно будет сохранить ключ шифрования для восстановления, если появится такая необходимость.</p>
|
||||
<p><strong>Зарегистрируйте администратора Пассворк</strong></p>
|
||||
<p>Введите логин и пароль для первого пользователя. Пользователь автоматически станет администратором и владельцем организации.</p>
|
||||
<p> </p>
|
||||
<h1>Обслуживание</h1>
|
||||
<h2>Настройка фоновых задач</h2>
|
||||
<p>Фоновые задачи — это задачи, которые выполняются по планировщику в фоновом режиме. Например, синхронизация LDAP, загрузка фавиконов и другие задачи, которые требует много времени, постоянного выполнения или распределения ресурсов.</p>
|
||||
<p>Проверить список запланированных задач и корректность всех настроек можно на странице «Фоновые задачи».</p>
|
||||
<p> </p>
|
||||
<p> </p>
|
||||
<p>Для настройки фоновых задач необходимо настроить планировщик вашей операционной системы Cron (для Линукс) или Windows Scheduler. Планировщик должен запускать скрипт <code><u><папка с Пассворк>/app/tools/run-scheduled-tasks.php</u></code> каждую минуту.</p>
|
||||
<p>Скрипт проанализирует какие задачи необходимо запустить и для каждой задачи создаст отдельный поток. При выполнении каждая задача записывает лог в папку <code><u><папка Пассворк>/app/logs/</u></code><u> в файлы вида </u><code><u>task-*.log</u></code>, например, <code><u>task-62f8e9624e0446fba40bbb12.log</u></code>. После завершения задачи вы можете посмотреть и скачать лог со страницы Фоновые задачи → История задач.</p>
|
||||
<p>Системные логи планировщика (с ошибками) находятся в <code><u><папка Пассворк>/app/logs/run-command.log</u></code>.</p>
|
||||
<h2>О Docker-образах</h2>
|
||||
<p>Docker-образы устроены таким способом, что все важные данные вынесены в общие с хостовой машиной папки. Поэтому вы можете смело останавливать, удалять и создавать новые контейнеры. Конфигурационные файлы так же хранятся в общих папках (т.е. не в контейнере), поэтому вы можете провести любую настройку Nginx, PHP и MongoDB без внесения изменений непосредственно в образы или контейнеры. Просто внесите изменения в конфиг файлы и перезапустите контейнер или сервисы.</p>
|
||||
<p>Если вам необходимо внести изменения в образ, то войдите в контейнер, внесите изменения и затем сделайте коммит в ваш образ командой</p>
|
||||
<pre><code class="language-plaintext">docker commit <container id> you-name/image-name</code></pre>
|
||||
<p>Более подробно описано в официальной документации Docker.</p>
|
||||
<h2>Полезные команды</h2>
|
||||
<p>Скопируйте утилиту <i>dexec</i> в /usr/bin/:</p>
|
||||
<pre><code class="language-plaintext">cp /server/dexec /usr/bin/dexec</code></pre>
|
||||
<p>Вход в контейнер:</p>
|
||||
<pre><code class="language-plaintext">docker exec -it <container> bash</code></pre>
|
||||
<p>Восстановление прав для файлов сайта (требуется после обновления):</p>
|
||||
<pre><code class="language-plaintext">/server/docker-nginx-permissions nginx</code></pre>
|
||||
<p>Перезагрузка Nginx без остановки:</p>
|
||||
<pre><code class="language-plaintext">/server/docker-nginx-reload nginx</code></pre>
|
||||
<p>Контейнеры запущены с опцией autostart. Это означает, что Docker автоматически перезапустит контейнер, если он по каким-либо причинам остановится. Поэтому, если вам необходимо остановить контейнер, сперва отключите autostart:</p>
|
||||
<pre><code class="language-plaintext">/server/docker-norestart <container></code></pre>
|
||||
<p>Включить autostart обратно:</p>
|
||||
<pre><code class="language-plaintext">/server/docker-autorestart <container></code></pre>
|
||||
<p>Без опции autostart вы можете остановить контейнеры принудительно:</p>
|
||||
<pre><code class="language-plaintext">docker stop <container></code></pre>
|
||||
<p>Обратите внимание, что если опция <i>autostart</i> включена, то эти команды перезапустят Nginx и MongoDB, Используйте ее в крайних случаях, так как это может повлечь порчу данных.</p>
|
||||
<h2>Структура файлов</h2>
|
||||
<p>Файлы конфигураций:</p>
|
||||
<pre><code class="language-plaintext">/server/conf/</code></pre>
|
||||
<p>Данные (база данных):</p>
|
||||
<pre><code class="language-plaintext">/server/data/</code></pre>
|
||||
<p>Логи:</p>
|
||||
<pre><code class="language-plaintext">/server/log/</code></pre>
|
||||
<p>Сайты:</p>
|
||||
<pre><code class="language-plaintext">/server/sites/</code></pre>
|
||||
<h2>Пример: Как изменить конфигурацию Nginx или PHP</h2>
|
||||
<p>Отредактируйте файлы:</p>
|
||||
<pre><code class="language-plaintext">mcedit /server/conf/nginx/prod.site
|
||||
mcedit /server/conf/nginx/nginx.conf
|
||||
mcedit /server/conf/php8/php.ini</code></pre>
|
||||
<p>Перезапустите nginx и php-fpm:</p>
|
||||
<pre><code class="language-plaintext">/server/docker-nginx-reload nginx
|
||||
docker restart php8</code></pre>
|
||||
<h2>Настройка почты</h2>
|
||||
<p>Nginx контейнер использует Postfix для отправки почты. Все конфигурационные файлы вы можете найти здесь:</p>
|
||||
<pre><code class="language-plaintext">/server/conf/postfix/</code></pre>
|
||||
<p>Отредактируйте их под свои нужды. Перезапустите Postfix, чтобы изменения вступили в силу.</p>
|
||||
<h2>Пример настройки Postfix</h2>
|
||||
<p>Откройте конфигурационный файл <code>/server/conf/postfix/</code><a href="http://main.cf"><code>main.cf</code></a>.</p>
|
||||
<pre><code class="language-plaintext">mcedit /server/conf/postfix/main.cf</code></pre>
|
||||
<p>Убедитесь в том, что параметр myhostname совпадает с полным доменным именем вашего сервера:</p>
|
||||
<pre><code class="language-plaintext">myhostname = passwork</code></pre>
|
||||
<h3>Настройка имен и паролей SMTP</h3>
|
||||
<p>Откройте или создайте файл <code>/server/conf/postfix/sasl_passwd</code>.</p>
|
||||
<pre><code class="language-plaintext">mcedit /server/conf/postfix/sasl_passwd</code></pre>
|
||||
<p>Добавьте SMTP хост, имя пользователя и пароль должны быть записаны в следующем формате:</p>
|
||||
<pre><code class="language-plaintext">[mail.isp.example] username:password</code></pre>
|
||||
<p>Если вы хотите использовать нестандартный TCP-порт (например, 587), используйте следующий формат:</p>
|
||||
<pre><code class="language-plaintext">[mail.isp.example]:587 username:password</code></pre>
|
||||
<p>для Gmail запись будет выглядеть следующим образом:</p>
|
||||
<pre><code class="language-plaintext">[smtp.gmail.com]:587 username:password</code></pre>
|
||||
<p>Создайте хэшированную базу данных для Postfix, выполните команду postmap:</p>
|
||||
<pre><code class="language-plaintext">docker exec -it postfix postmap /etc/postfix/sasl_passwd</code></pre>
|
||||
<p>После успешного выполнения команды в директории /server/conf/postfix должен появиться новый файл sasl_passwd.db.</p>
|
||||
<h3>Защита файла с паролями и хэш-файла.</h3>
|
||||
<p>Файлы /server/conf/postfix/sasl_passwd и /server/conf/postfix/sasl_passwd.db, созданные в предыдущих шагах, содержат ваши учетные данные SMTP в виде простого текста. По соображениям безопасности вы должны изменить права доступа к ним, так чтобы только пользователь root мог читать и записывать в файл.</p>
|
||||
<p>Выполните следующие команды, чтобы изменить владельца файлов на root и обновить права доступа для файлов:</p>
|
||||
<pre><code class="language-plaintext">chown root:root /server/conf/postfix/sasl_passwd /server/conf/postfix/sasl_passwd.db
|
||||
chmod 0600 /server/conf/postfix/sasl_passwd /server/conf/postfix/sasl_passwd.db</code></pre>
|
||||
<h3><strong>Конфигурация релей сервера</strong></h3>
|
||||
<p>Откройте файл <code>/server/conf/postfix/</code><a href="http://main.cf"><code>main.cf</code></a></p>
|
||||
<pre><code class="language-plaintext">mcedit /server/conf/postfix/main.cf</code></pre>
|
||||
<p>Измените параметр relayhost, на свой внешний SMTP релей. Если в файле sasl_passwd был указан нестандартный TCP-порт, то вы должны использовать тот же порт при настройке параметра relayhost.</p>
|
||||
<p>Укажите SMTP релей:</p>
|
||||
<pre><code class="language-plaintext">relayhost = [mail.isp.example]:587</code></pre>
|
||||
<p>для Gmail запись будет выглядеть следующим образом:</p>
|
||||
<pre><code class="language-plaintext">relayhost = [smtp.gmail.com]:587</code></pre>
|
||||
<p>В конце файла добавьте следующие параметры для включения аутентификации:</p>
|
||||
<pre><code class="language-plaintext"># enable SASL authentication
|
||||
smtp_sasl_auth_enable = yes
|
||||
# disallow methods that allow anonymous authentication.
|
||||
smtp_sasl_security_options = noanonymous
|
||||
# where to find sasl_passwd
|
||||
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
|
||||
# Enable STARTTLS encryption
|
||||
smtp_use_tls = yes
|
||||
# where to find CA certificates
|
||||
smtp_tls_CAfile = /etc/ssl/certs/ca-certificates.crt</code></pre>
|
||||
<p>Сохраните изменения.</p>
|
||||
<p>Перезапустите Postfix:</p>
|
||||
<pre><code class="language-plaintext">docker exec -i postfix service postfix reload</code></pre>
|
||||
<p> </p>
|
||||
<p> </p>
|
||||
<p> </p>
|
||||
<p> </p>
|
||||
<p> </p>
|
||||
<p> </p>
|
||||
<p> </p>
|
||||
|
|
|
|||
|
|
@ -0,0 +1,19 @@
|
|||
<!--
|
||||
title: Выделенный сервер 1С
|
||||
description:
|
||||
published: true
|
||||
date: 2023-11-15T16:48:23.320Z
|
||||
tags:
|
||||
editor: ckeditor
|
||||
dateCreated: 2023-11-15T16:48:23.320Z
|
||||
-->
|
||||
|
||||
<p>Я время от времени настраиваю сервера 1С для небольших организаций на основе файловых баз с публикацией в веб. Получается удобное, безопасное и законченное решение, которое почти не требует обслуживания и участия со стороны IT специалиста. Расскажу, как это всё выглядит на практике.</p>
|
||||
<p>Арендуется выделенный сервер в Selectel (<a href="https://serveradmin.ru/lklTref4">https://serveradmin.ru/lklTref4</a>). Последний из заказанных серверов стоил 5200р. и имел конфигурацию i7, 64 гига оперативы и 2 SSD диска по 480Гб. На таком сервере файловая 1С работает очень шустро. Для двух-трех человек в базе нормальный вариант. Баз может быть много.</p>
|
||||
<p>Далее на сервер ставится гипервизор Proxmox на софтовый RAID1 mdadm. На нём настраиваются 3 виртуальные машины:<br>1. Windows, где будет работать 1С.<br>2. Debian 11 для Nginx и Apache Guacamole.<br>3. Debian 11 для локальных бэкапов.</p>
|
||||
<p>Первым делом настраивается сам гипервизор и фаервол на нём. Максимально закрывается доступ, настраиваются пробросы к виртуальным машинам. Весь доступ к инфраструктуре будет через Apache Guacamole (<a href="https://t.me/srv_admin/1447">https://t.me/srv_admin/1447</a>), так что пробрасываем порты к нему и открываем 80 и 443 порты к виртуалке с Nginx. Всё остальное закрываем.</p>
|
||||
<p>Следующим этапом настраивается Nginx, который будет проксировать запросы на 1С. Я закрываю туда доступ через Basic Auth. И тут же настраиваем Apache Guacamole для доступа к виртуальным машинам через браузер. Особенно это актуально для доступа к Windows машине, так как проброс RDP порта с полным доступом из интернета делать нельзя. Дополнительно при желании через Nginx можно закрыть паролем доступ к самому Guacamole и веб интерфейсу Proxmox. В данном случае Apache Guacamole заменяет нам VPN, обеспечивая дополнительную безопасность и возможность получить прямой доступ к серверам напрямую через интернет. Пользователям ничего у себя настраивать не надо.</p>
|
||||
<p>На Windows сервере устанавливается как обычно платформа 1С и веб сервер Apache. Делается публикация баз. Тут никакой экзотики, всё стандартно.</p>
|
||||
<p>На третьем сервере настраивается Samba, создаётся сетевой диск с доступом только на чтение. Этот диск подключается к Windows машине. В этот сетевой диск ежедневно делаются бэкапы файловых баз, старые удаляются. Работает скрипт на самом сервере с бэкапами. Монтирует папку с Windows сервера и забирает файлы к себе, а отдаёт их уже только в режиме чтения. Это сделано, чтобы был оперативный доступ к бэкапам с Windows машины, но при этом их нельзя было удалить с неё. С самого бэкап сервера базы копируются куда-то во вне в зависимости от имеющихся ресурсов для хранения. Это может быть и обычный Яндекс.Диск.</p>
|
||||
<p>Схема получается гибкая. Вместо файловых баз можно настроить и клиент-серверную архитектуру на базе MSSQL или PostgreSQL. А сам внешний доступ будет такой же.</p>
|
||||
<p>Если хотите настроить что-то подобное, можете заказать настройку у меня. Готовых инструкций с подобной настройкой в сети нет.</p>
|
||||
|
After Width: | Height: | Size: 142 KiB |
|
After Width: | Height: | Size: 210 KiB |
|
After Width: | Height: | Size: 225 KiB |
|
After Width: | Height: | Size: 472 KiB |
|
After Width: | Height: | Size: 489 KiB |
|
After Width: | Height: | Size: 18 KiB |
|
After Width: | Height: | Size: 18 KiB |
|
After Width: | Height: | Size: 359 KiB |
|
After Width: | Height: | Size: 448 KiB |
|
After Width: | Height: | Size: 223 KiB |
|
After Width: | Height: | Size: 54 KiB |
|
After Width: | Height: | Size: 17 KiB |
|
After Width: | Height: | Size: 176 KiB |
|
After Width: | Height: | Size: 200 KiB |
|
After Width: | Height: | Size: 75 KiB |
|
After Width: | Height: | Size: 58 KiB |
|
After Width: | Height: | Size: 25 KiB |
|
After Width: | Height: | Size: 76 KiB |
|
After Width: | Height: | Size: 23 KiB |
|
After Width: | Height: | Size: 55 KiB |
|
|
@ -0,0 +1,210 @@
|
|||
---
|
||||
title: Bat как замена для cat
|
||||
description:
|
||||
published: true
|
||||
date: 2023-11-15T18:07:37.064Z
|
||||
tags:
|
||||
editor: markdown
|
||||
dateCreated: 2023-11-15T18:07:37.064Z
|
||||
---
|
||||
|
||||

|
||||
|
||||
Знакомлю вас с утилитой командной строки, которая мне очень понравилась. Речь пойдёт про bat, аналоге cat, только с подсветкой синтаксиса и не только.
|
||||
|
||||
Лично я утилиту cat использую постоянно. Сформировалась привычка при поиске чего-то делать сначала cat, потом grep. Например:
|
||||
|
||||
`cat /var/log/messages | grep kernel`
|
||||
|
||||
По идее, логичнее и проще сделать так:
|
||||
|
||||
`egrep "kernel" /var/log/messages`
|
||||
|
||||
Но я привык к первому варианту и cat использую постоянно. И при грепанье, и просто при просмотре чего-то в консоли. Перед тем, как что-то скопировать из файла, вывожу через cat в консоль.
|
||||
|
||||
Bat очень классно подсвечивает вывод в консоли. Нет смысла рассказывать, на картинке к посту все и так видно:
|
||||
|
||||
`bat /etc/hosts`
|
||||
|
||||
|
||||
Репозиторий утилиты - https://github.com/sharkdp/bat. В Debian/Ubuntu bat ставится из стандартных реп:
|
||||
```
|
||||
apt install bat
|
||||
ln -s /usr/bin/batcat /usr/bin/bat
|
||||
```
|
||||
Если нет в репах, то качаем с репозитория и устанавливаем.
|
||||
|
||||
```
|
||||
wget https://github.com/sharkdp/bat/releases/download/v0.18.2/bat-musl_0.18.2_amd64.deb
|
||||
dpkg -i bat-musl_0.18.2_amd64.deb
|
||||
```
|
||||
В Centos 8 (на 7 не заработает из-за устаревших пакетов) и форках придется бинарник качать:
|
||||
```
|
||||
wget https://github.com/sharkdp/bat/releases/download/v0.18.2/bat-v0.18.2-x86_64-unknown-linux-gnu.tar.gz
|
||||
tar xzvf bat-v0.18.2-x86_64-unknown-linux-gnu.tar.gz
|
||||
cd bat-v0.18.2-x86_64-unknown-linux-gnu
|
||||
cp bat /usr/bin/
|
||||
```
|
||||
|
||||
________________________
|
||||
Добавлю от себя, на centos вылетела ошибка
|
||||
```
|
||||
/lib64/libc.so.6: version `GLIBC_2.18' not found (required by ./bat)
|
||||
```
|
||||
|
||||
Поэтому пришлось найти решение вот такое.
|
||||
```bash
|
||||
#!/bin/sh
|
||||
|
||||
red=`tput setaf 1`
|
||||
green=`tput setaf 2`
|
||||
bold=`tput bold`
|
||||
reset=`tput sgr0`
|
||||
|
||||
echo ""
|
||||
echo "${bold}${green}Installing the latest CentOS release version of bat command from GitHub...${reset}"
|
||||
|
||||
echo ""
|
||||
echo "${bold}Note${reset}: For more information, please see https://github.com/sharkdp/bat."
|
||||
|
||||
echo ""
|
||||
echo "Finding the latest version tag from Github..."
|
||||
|
||||
BAT_VERSION=$(curl --silent "https://api.github.com/repos/sharkdp/bat/releases/latest" | grep -Eo '"tag_name": "v(.*)"' | sed -E 's/.*"([^"]+)".*/\1/')
|
||||
BAT_RELEASE="bat-$BAT_VERSION-x86_64-unknown-linux-musl"
|
||||
BAT_ARCHIVE="$BAT_RELEASE.tar.gz"
|
||||
|
||||
echo ""
|
||||
echo "Version ${bold}$BAT_VERSION${reset} found, downloading ${bold}$BAT_ARCHIVE${reset} from GitHub..."
|
||||
|
||||
curl -sOL "https://github.com/sharkdp/bat/releases/download/$BAT_VERSION/$BAT_ARCHIVE"
|
||||
|
||||
echo ""
|
||||
echo "Unarchiving ${bold}$BAT_ARCHIVE${reset} to ${bold}$HOME/$BAT_RELEASE${reset}..."
|
||||
|
||||
tar xzvf $BAT_ARCHIVE -C $HOME/
|
||||
|
||||
echo ""
|
||||
echo "Copying executable to ${bold}/usr/local/bin/bat${reset}..."
|
||||
|
||||
sudo sh -c "cp $HOME/$BAT_RELEASE/bat /usr/local/bin/bat"
|
||||
|
||||
echo ""
|
||||
echo "Removing ${bold}$BAT_ARCHIVE${reset} and cleaning up..."
|
||||
|
||||
rm $BAT_ARCHIVE
|
||||
|
||||
unset BAT_ARCHIVE
|
||||
unset BAT_RELEASE
|
||||
unset BAT_VERSION
|
||||
|
||||
if command -v bat &> /dev/null
|
||||
then
|
||||
echo ""
|
||||
echo "${bold}${green}Finished installing $(bat --version).${reset}"
|
||||
else
|
||||
echo ""
|
||||
echo "${bold}${red}Installation failed! Please examine this script and try steps manually.${reset}"
|
||||
exit 1
|
||||
fi
|
||||
```
|
||||
|
||||
|
||||
Знакомлю вас с утилитой командной строки, которая мне очень понравилась. Речь пойдёт про bat, аналоге cat, только с подсветкой синтаксиса и не только.
|
||||
|
||||
Лично я утилиту cat использую постоянно. Сформировалась привычка при поиске чего-то делать сначала cat, потом grep. Например:
|
||||
|
||||
`cat /var/log/messages | grep kernel`
|
||||
|
||||
По идее, логичнее и проще сделать так:
|
||||
|
||||
`egrep "kernel" /var/log/messages`
|
||||
|
||||
Но я привык к первому варианту и cat использую постоянно. И при грепанье, и просто при просмотре чего-то в консоли. Перед тем, как что-то скопировать из файла, вывожу через cat в консоль.
|
||||
|
||||
Bat очень классно подсвечивает вывод в консоли. Нет смысла рассказывать, на картинке к посту все и так видно:
|
||||
|
||||
`bat /etc/hosts`
|
||||
|
||||
Репозиторий утилиты - https://github.com/sharkdp/bat. В Debian/Ubuntu bat ставится из стандартных реп:
|
||||
```
|
||||
apt install bat
|
||||
ln -s /usr/bin/batcat /usr/bin/bat
|
||||
```
|
||||
Если нет в репах, то качаем с репозитория и устанавливаем.
|
||||
|
||||
```
|
||||
wget https://github.com/sharkdp/bat/releases/download/v0.18.2/bat-musl_0.18.2_amd64.deb
|
||||
dpkg -i bat-musl_0.18.2_amd64.deb
|
||||
```
|
||||
|
||||
В Centos 8 (на 7 не заработает из-за устаревших пакетов) и форках придется бинарник качать:
|
||||
```
|
||||
wget https://github.com/sharkdp/bat/releases/download/v0.18.2/bat-v0.18.2-x86_64-unknown-linux-gnu.tar.gz
|
||||
tar xzvf bat-v0.18.2-x86_64-unknown-linux-gnu.tar.gz
|
||||
cd bat-v0.18.2-x86_64-unknown-linux-gnu
|
||||
cp bat /usr/bin/
|
||||
```
|
||||
|
||||
________________________
|
||||
Добавлю от себя, на centos вылетела ошибка
|
||||
```
|
||||
/lib64/libc.so.6: version `GLIBC_2.18' not found (required by ./bat)
|
||||
```
|
||||
|
||||
Поэтому пришлось найти решение вот такое.
|
||||
```bash
|
||||
#!/bin/sh
|
||||
|
||||
red=`tput setaf 1`
|
||||
green=`tput setaf 2`
|
||||
bold=`tput bold`
|
||||
reset=`tput sgr0`
|
||||
|
||||
echo ""
|
||||
echo "${bold}${green}Installing the latest CentOS release version of bat command from GitHub...${reset}"
|
||||
|
||||
echo ""
|
||||
echo "${bold}Note${reset}: For more information, please see https://github.com/sharkdp/bat."
|
||||
|
||||
echo ""
|
||||
echo "Finding the latest version tag from Github..."
|
||||
|
||||
BAT_VERSION=$(curl --silent "https://api.github.com/repos/sharkdp/bat/releases/latest" | grep -Eo '"tag_name": "v(.*)"' | sed -E 's/.*"([^"]+)".*/\1/')
|
||||
BAT_RELEASE="bat-$BAT_VERSION-x86_64-unknown-linux-musl"
|
||||
BAT_ARCHIVE="$BAT_RELEASE.tar.gz"
|
||||
|
||||
echo ""
|
||||
echo "Version ${bold}$BAT_VERSION${reset} found, downloading ${bold}$BAT_ARCHIVE${reset} from GitHub..."
|
||||
|
||||
curl -sOL "https://github.com/sharkdp/bat/releases/download/$BAT_VERSION/$BAT_ARCHIVE"
|
||||
|
||||
echo ""
|
||||
echo "Unarchiving ${bold}$BAT_ARCHIVE${reset} to ${bold}$HOME/$BAT_RELEASE${reset}..."
|
||||
|
||||
tar xzvf $BAT_ARCHIVE -C $HOME/
|
||||
|
||||
echo ""
|
||||
echo "Copying executable to ${bold}/usr/local/bin/bat${reset}..."
|
||||
|
||||
sudo sh -c "cp $HOME/$BAT_RELEASE/bat /usr/local/bin/bat"
|
||||
|
||||
echo ""
|
||||
echo "Removing ${bold}$BAT_ARCHIVE${reset} and cleaning up..."
|
||||
|
||||
rm $BAT_ARCHIVE
|
||||
|
||||
unset BAT_ARCHIVE
|
||||
unset BAT_RELEASE
|
||||
unset BAT_VERSION
|
||||
|
||||
if command -v bat &> /dev/null
|
||||
then
|
||||
echo ""
|
||||
echo "${bold}${green}Finished installing $(bat --version).${reset}"
|
||||
else
|
||||
echo ""
|
||||
echo "${bold}${red}Installation failed! Please examine this script and try steps manually.${reset}"
|
||||
exit 1
|
||||
fi
|
||||
```
|
||||
|
|
@ -0,0 +1,28 @@
|
|||
<!--
|
||||
title: Foreman - централизованное управление серверами
|
||||
description:
|
||||
published: true
|
||||
date: 2023-11-15T18:15:58.065Z
|
||||
tags:
|
||||
editor: ckeditor
|
||||
dateCreated: 2023-11-15T18:15:38.027Z
|
||||
-->
|
||||
|
||||
<p>Для централизованного управления серверами и автоматизации задач существует старый и известный open source проект Foreman. Думаю, многие о нём слышали или знают. Он существует более 10-ти лет. В сети много информации по нему. Есть как текстовые руководства, так и курсы на Udemy за весьма небольшие деньги. То есть освоить этот продукт, если есть необходимость, не трудно.</p>
|
||||
<p>Я развернул его у себя на Debian 11 и потестировал. Установка простая, так как есть готовый репозиторий и автоматический установщик. Единственное, нужно убедиться, что у вас hostname имеет формат FQDN, так как в процессе установки будет выпущен самоподписанный tls сертификат, который хочет полное доменное имя, типа debian11.local, если запускаете в тестовой среде.</p>
|
||||
<pre><code class="language-plaintext">wget https://apt.puppet.com/puppet6-release-buster.deb
|
||||
dpkg -i /tmp/puppet6-release-buster.deb
|
||||
echo "deb http://deb.theforeman.org/ buster 3.1" | tee /etc/apt/sources.list.d/foreman.list
|
||||
echo "deb http://deb.theforeman.org/ plugins 3.1" | tee -a /etc/apt/sources.list.d/foreman.list
|
||||
apt-get -y install ca-certificates gpg
|
||||
wget -q https://deb.theforeman.org/pubkey.gpg -O- | apt-key add -
|
||||
apt update && apt install foreman-installer
|
||||
foreman-installer</code></pre>
|
||||
<p>Это всё. Несмотря на то, что в репе указан buster, на bullseye нормально установился. Можно идти в веб интерфейс и настраивать. Адрес сервера и учётка будут отображены в консоли.</p>
|
||||
<p>Foreman по дефолту работает на основе puppet, но может использовать и ansible. Далее вам нужно либо puppet-agent, либо ansible поставить на клиентские хосты, чтобы добавить их в Foreman и управлять. В сети инструкций много, проблем с настройкой возникнуть не должно. Есть подробное и свежее руководство даже под AstraLinux (<a href="https://wiki.astralinux.ru/pages/viewpage.action?pageId=57444668">https://wiki.astralinux.ru/pages/viewpage.action?pageId=57444668</a>).</p>
|
||||
<p>После этого пишите манифесты на выполнение тех или иных действий и применяете их к хостам или группам хостов. С помощью Foreman можно как конфигурировать существующие хосты, так и разворачивать новые, в том числе в автоматическом режиме. Посмотреть, как это выглядит в реальности можно в большой подборке скринкастов (<a href="https://theforeman.org/media.html#screencasts">https://theforeman.org/media.html#screencasts</a>).</p>
|
||||
<p>Чтобы быстро развернуть и попробовать функционал по управлению, посмотрите эту статью (<a href="http://ittraveler.org/ustanovka-i-nastrojka-foreman-puppet/">http://ittraveler.org/ustanovka-i-nastrojka-foreman-puppet/</a>). Тут прям конкретные примеры с манифестами и модулями puppet для выполнения различных действий на хостах. Я попробовал два примера. Один с обновлением серверов времени. Второй с созданием файлов. В целом понял, как всё это примерно работает.</p>
|
||||
<p>Раньше puppet вообще ни разу не видел. Сейчас посмотрел, как у него манифесты и модули выглядят. Показалось проще и нагляднее, чем в ansible. Прям даже попробовать захотелось. Хотя очевидно, что смысла большого нет. Ansible более распространён, а изучать и использовать обе системы незачем.</p>
|
||||
<p>Сайт - <a href="https://theforeman.org/">https://theforeman.org/</a><br>Исходники - <a href="https://github.com/theforeman/foreman">https://github.com/theforeman/foreman</a></p>
|
||||
<figure class="image"><img src="/attachments/base/3.png"></figure>
|
||||
<p><br> </p>
|
||||
|
|
@ -0,0 +1,20 @@
|
|||
<!--
|
||||
title: HSTR - история, утилита
|
||||
description:
|
||||
published: true
|
||||
date: 2023-11-15T18:17:34.603Z
|
||||
tags:
|
||||
editor: ckeditor
|
||||
dateCreated: 2023-11-15T18:17:34.603Z
|
||||
-->
|
||||
|
||||
<p>Существует простая и удобная консольная утилита для работы с историей команд - HSTR (HiSToRy). В свежих версиях Debian, Ubuntu, RHEL (epel) она присутствует в базовых репозиториях.</p>
|
||||
<p>Установка:</p>
|
||||
<pre><code class="language-plaintext">apt install hstr
|
||||
dnf install hstr</code></pre>
|
||||
<p><br>HSTR является заменой привычного функционала по Ctrl-r. Если просто запустить в консоли hstr (или алиас hh) без параметров, то увидите список всех команд из history, выстроенные по частоте их использования. Из этого списка их легко выбрать и запустить. По умолчанию будет активна строка поиска, где можно начать набор искомых команд. Поиск осуществляется по совпадению подстроки, регулярному выражению и ключевому слову</p>
|
||||
<p>Утилита умеет удалять строки из истории, добавлять в избранное команды, ранжировать команды по их длине. Ключей и возможностей нет так много, долго разбираться не придётся. Все их можно посмотреть через man или встроенную справку:</p>
|
||||
<pre><code class="language-plaintext">hh -h</code></pre>
|
||||
<p>HSTR маленькая и простая утилита. Написана на C. Присутствует в репозиториях, так что можно смело ставить и пользоваться. Хороший продукт.</p>
|
||||
<p>Исходники - <a href="https://github.com/dvorka/hstr">https://github.com/dvorka/hstr</a><br>Инструкция по настройке:<br><a href="https://github.com/dvorka/hstr/blob/master/CONFIGURATION.md">https://github.com/dvorka/hstr/blob/master/CONFIGURATION.md</a></p>
|
||||
<figure class="image"><img src="/attachments/base/4.png"></figure>
|
||||
|
|
@ -0,0 +1,48 @@
|
|||
---
|
||||
title: bg & less
|
||||
description:
|
||||
published: true
|
||||
date: 2023-11-15T18:09:58.490Z
|
||||
tags:
|
||||
editor: markdown
|
||||
dateCreated: 2023-11-15T18:09:58.490Z
|
||||
---
|
||||
|
||||
Любой администратор Linux так или иначе использует встроенную утилиту man для просмотра справочной информации по программам. Каждая подобная справка является отдельным документом, который пишут разработчики программного обеспечения.
|
||||
|
||||
Man использует утилиту less для постраничного вывода текстовой информации. Соответственно, чтобы использовать возможности по удобному перемещению и поиску по тексту в man, стоит изучить возможности less.
|
||||
|
||||
Например, для начала поиска по man достаточно ввести символ / и далее строку поиска. После нажатия Enter начнётся поиск вперёд по тексту. Для поиска назад, нужно использовать не слеш, а символ ?.
|
||||
|
||||
Теперь немного магии. Допустим, вам надо найти в man описание ключа -L. Для этого вводим в поиск:
|
||||
```
|
||||
/^\s+-L
|
||||
/ - поиск вперёд
|
||||
^ - начало строки
|
||||
\s - пробельный символ
|
||||
+ - повторитель, указывает, что предыдущий символ должен повторяться один или несколько раз
|
||||
-L - то, что мы ищем.
|
||||
```
|
||||
То есть будет найдена строка, которая начинается с пробелов, а далее идут символы -L. Типовая разметка для описания ключей в man.
|
||||
|
||||
Ориентироваться в результатах поиска можно следующим образом:
|
||||
- перейти к следующему совпадению клавиша (n);
|
||||
- перейти к предыдущему совпадению клавиша (N);
|
||||
- перейти в начало страницы клавиша (g);
|
||||
- перейти в конец страницы клавиша (G).
|
||||
|
||||
Также less хранит историю поиска. Вводите / и листаете клавишами вверх, вниз. Таким образом можно выбрать предыдущий шаблон поиска. Более подробно man less, man man. Как там искать вы уже знаете 😁
|
||||
|
||||
В конце страниц для утилит командной строки, обычно есть коды возврата и прочая полезная информация. Кстати утилиты systemd по умолчанию тоже используют less. Так что всё написанное выше актуально и для поиска в systemd.
|
||||
|
||||
И ещё одна маленькая и полезная фишка, которая сохранит вам много времени и нервов. Когда что-то ищешь в man, потом хочешь проверить это в терминале, по ошибке выходишь из справки и потом приходится опять искать то, что было найдено. Но man не обязательно закрывать. Его можно свернуть комбинацией клавиш CTRL+Z. Приложение уйдёт в фоновый режим. Посмотреть, что работает в фоне, можно введя в консоли:
|
||||
```
|
||||
# bg
|
||||
[1]+ man ls &
|
||||
[1]+ Stopped man ls
|
||||
```
|
||||
Теперь возвращаем из фона процесс с man:
|
||||
```
|
||||
# fg man
|
||||
```
|
||||
И продолжаем читать там, где остановились. Подобные трюки можно делать с любыми процессами, запущенными в консоли.
|
||||
|
|
@ -0,0 +1,23 @@
|
|||
---
|
||||
title: iftop
|
||||
description:
|
||||
published: true
|
||||
date: 2023-11-15T18:20:14.643Z
|
||||
tags:
|
||||
editor: markdown
|
||||
dateCreated: 2023-11-15T18:20:14.643Z
|
||||
---
|
||||
|
||||
Поделюсь простой и маленькой утилитой, которую я ставлю почти всегда по дефолту на сервера, которые настраиваю сам, наравне с screen, htop и mc. Речь пойдет об iftop - утилита для просмотра загруженности сетевого интерфейса. Она обычно присутствует в стандартных репозиториях linux дистрибутивов. Для Centos живет в epel.
|
||||
|
||||
С помощью iftop можно быстро через консоль оценить, кто и как загружает сеть на сервере. В какую сторону и какой трафик идет, по каким портам.
|
||||
|
||||
Наиболее частые ключи, которые использую, следующие:
|
||||
|
||||
`iftop -i ens18 -n -P`
|
||||
|
||||
|
||||
Ключ n отключает резолв ip адресов, а P добавляет в вывод информацию о задействованных портах, i, понятное дело, сетевой интерфейс, который слушаем.
|
||||
|
||||
Подозреваю, что подобных утилит существует великое множество. Но я как-то привык к iftop и ничего другого не использую. Меня устраивает полностью. А вы что используете для этих целей?
|
||||

|
||||
|
|
@ -0,0 +1,50 @@
|
|||
<!--
|
||||
title: Cервис localtunnel
|
||||
description:
|
||||
published: true
|
||||
date: 2023-11-15T18:12:21.370Z
|
||||
tags:
|
||||
editor: ckeditor
|
||||
dateCreated: 2023-11-15T18:11:13.511Z
|
||||
-->
|
||||
|
||||
<p>Узнал про необычный и полезный сервис localtunnel, решил с вами поделиться. Делает он простую вещь - пробрасывает во внешний мир какой-то локальный web сервис. Например, у вас крутится приложение на 127.0.0.1:80, а вы хотите его кому-то показать через интернет, не меняя настроек, пробросов портов и т.д. Localtunnel вам поможет. Работает он на NodeJS.</p>
|
||||
<p>Установка:</p>
|
||||
<figure class="table" style="height:auto;width:1468px;">
|
||||
<table style="background-color:rgb(255, 255, 255);border-bottom:0px;border-left:0px;border-right:0px;border-top:0px;">
|
||||
<tbody>
|
||||
<tr>
|
||||
<td style="border-bottom:0px;border-left:0px;border-right:0px;border-top:0px;height:auto;padding:0px 0px 0px 15px;width:1453px;">
|
||||
<p><code>dnf module enable</code> <code>nodejs:14</code></p>
|
||||
<p><code>dnf install</code> <code>nodejs</code></p>
|
||||
<p><code>npm install</code> <code>-g localtunnel</code></p>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</figure>
|
||||
<p> </p>
|
||||
<p>Для того, чтобы пробросить своё приложение, запускаете localtunnel:</p>
|
||||
<figure class="table" style="height:auto;width:1468px;">
|
||||
<table style="background-color:rgb(255, 255, 255);border-bottom:0px;border-left:0px;border-right:0px;border-top:0px;">
|
||||
<tbody>
|
||||
<tr>
|
||||
<td style="border-bottom:0px;border-left:0px;border-right:0px;border-top:0px;height:auto;padding:0px 0px 0px 15px;width:1453px;"><code>lt --port 80</code></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</figure>
|
||||
<p> </p>
|
||||
<p>После запуска получите url вида <a href="https://odd-fireant-71.loca.lt/">https://odd-fireant-71.loca.lt</a> Открыв его, вы увидите свое приложение, работающее на 127.0.0.1:80. Проверить очень просто. Я запустил nginx на localhost и пробросил его.</p>
|
||||
<p>Мне показался сервис очень полезным. Лично мне бы пригодился платный сервис на его основе со своей отдельной авторизацией. Прямо сейчас стоит задача опубликовать в интернет специфичный сервис, который работает локально. Просто как есть опубликовать в интернет нельзя, он не развивается и не обновляется, работает на <a href="http://asp.net/">asp.net</a>. Через nginx proxy корректно не заработал. Принял решение через vpn делать доступ, но это лишние проблемы по настройке пользователей. Но ничего лучше и безопаснее не придумал.</p>
|
||||
<p>Сайт -https://theboroer.github.io/localtunnel-www/<br>Исходники - <a href="https://github.com/localtunnel/localtunnel">https://github.com/localtunnel/localtunnel</a></p>
|
||||
<p> </p>
|
||||
<p>Позавчера рассказывал про сервис localtunnel (<a href="https://t.me/srv_admin/1477">https://t.me/srv_admin/1477</a>). Я подобный сервис увидел впервые, просто не знал о нём. Нашлось много людей, которые зачем-то стали доказывать, что это плохая идея, небезопасно, надо пробрасывать порты, ssh туннели и т.д. Можно много чего сделать, но только это немного другой подход.</p>
|
||||
<p>Как оказалось, подобный сервис очень востребован и популярен. Существует даже в реализации от Cloudflare под названием Cloudflare Argo Tunnel.</p>
|
||||
<p><a href="https://developers.cloudflare.com/pages/how-to/preview-with-cloudflare-tunnel">https://developers.cloudflare.com/pages/how-to/preview-with-cloudflare-tunnel</a></p>
|
||||
<p>Если поднимать вопрос доверия и безопасности, то получается и Cloudflare доверять нельзя, и любой защите от ddos, которая весь траф через себя пропускает. И облачным провайдерам, у которых есть полный доступ к вашим виртуалкам и данным внутри них, если вы не используете шифрование, а в некоторых случаях даже если используете. В общем, тема для дискуссии неконструктивная. Каждый сам в конкретном случае должен решить для себя, кому он доверяет и на какие риски готов пойти.</p>
|
||||
<p>Установить Cloudflare Tunnel очень просто. Есть deb и rpm пакеты (<a href="https://developers.cloudflare.com/cloudflare-one/connections/connect-apps/install-and-setup/installation">https://developers.cloudflare.com/cloudflare-one/connections/connect-apps/install-and-setup/installation</a>), докер образ (<a href="https://hub.docker.com/r/cloudflare/cloudflared">https://hub.docker.com/r/cloudflare/cloudflared</a>).<br>Как им пользоваться, рассказано отдельно (<a href="https://developers.cloudflare.com/cloudflare-one/connections/connect-apps/install-and-setup/tunnel-guide">https://developers.cloudflare.com/cloudflare-one/connections/connect-apps/install-and-setup/tunnel-guide</a>). В общем случае последовательность действий следующая:</p>
|
||||
<p>1. Устанавливаете Cloudflare Tunnel на компьютер.<br>2. Авторизуетесь в приложении с помощью своего аккаунта в Cloudflare.<br>3. Создаёте туннель и связываете его со своей учёткой.<br>4. Настраиваете конфиг туннеля, где указываете свой локальный сервис и его привязку к созданному ранее туннелю.<br>5. Связываете туннель со своим доменным именем, указанным в CNAME и запускаете.</p>
|
||||
<p>Если доверяете cloudflare, то такое решение можно использовать и на постоянку. Выглядит достаточно безопасно. Вам вообще не нужно настраивать доступ из интернета на свой веб сервер. Даже tls сертификаты не нужны, если готовы гнать нешифрованный траф в Cloudflare. Последний сам выдаст бесплатный сертификат для конечной публикации.</p>
|
||||
<p>Если я правильно понял, то для того, чтобы пользоваться Argo Tunnel бесплатно, нужно зарегистрировать Cloudflare For Teams free subscription.</p>
|
||||
<figure class="image"><img src="/attachments/base/2.png"></figure>
|
||||
|
|
@ -0,0 +1,51 @@
|
|||
---
|
||||
title: Cервис localtunnel
|
||||
description:
|
||||
published: true
|
||||
date: 2023-11-15T18:13:12.227Z
|
||||
tags:
|
||||
editor: markdown
|
||||
dateCreated: 2023-11-15T18:11:13.511Z
|
||||
---
|
||||
|
||||
Узнал про необычный и полезный сервис localtunnel, решил с вами поделиться. Делает он простую вещь - пробрасывает во внешний мир какой-то локальный web сервис. Например, у вас крутится приложение на 127.0.0.1:80, а вы хотите его кому-то показать через интернет, не меняя настроек, пробросов портов и т.д. Localtunnel вам поможет. Работает он на NodeJS.
|
||||
|
||||
Установка:
|
||||
```
|
||||
dnf module enable nodejs:14
|
||||
dnf install nodejs
|
||||
npm install -g localtunnel
|
||||
```
|
||||
Для того, чтобы пробросить своё приложение, запускаете localtunnel:
|
||||
```
|
||||
lt --port 80
|
||||
```
|
||||
После запуска получите url вида [https://odd-fireant-71.loca.lt](https://odd-fireant-71.loca.lt/) Открыв его, вы увидите свое приложение, работающее на 127.0.0.1:80. Проверить очень просто. Я запустил nginx на localhost и пробросил его.
|
||||
|
||||
Мне показался сервис очень полезным. Лично мне бы пригодился платный сервис на его основе со своей отдельной авторизацией. Прямо сейчас стоит задача опубликовать в интернет специфичный сервис, который работает локально. Просто как есть опубликовать в интернет нельзя, он не развивается и не обновляется, работает на [asp.net](http://asp.net/). Через nginx proxy корректно не заработал. Принял решение через vpn делать доступ, но это лишние проблемы по настройке пользователей. Но ничего лучше и безопаснее не придумал.
|
||||
|
||||
Сайт -https://theboroer.github.io/localtunnel-www/
|
||||
Исходники - [https://github.com/localtunnel/localtunnel](https://github.com/localtunnel/localtunnel)
|
||||
|
||||
Позавчера рассказывал про сервис localtunnel ([https://t.me/srv\_admin/1477](https://t.me/srv_admin/1477)). Я подобный сервис увидел впервые, просто не знал о нём. Нашлось много людей, которые зачем-то стали доказывать, что это плохая идея, небезопасно, надо пробрасывать порты, ssh туннели и т.д. Можно много чего сделать, но только это немного другой подход.
|
||||
|
||||
Как оказалось, подобный сервис очень востребован и популярен. Существует даже в реализации от Cloudflare под названием Cloudflare Argo Tunnel.
|
||||
|
||||
[https://developers.cloudflare.com/pages/how-to/preview-with-cloudflare-tunnel](https://developers.cloudflare.com/pages/how-to/preview-with-cloudflare-tunnel)
|
||||
|
||||
Если поднимать вопрос доверия и безопасности, то получается и Cloudflare доверять нельзя, и любой защите от ddos, которая весь траф через себя пропускает. И облачным провайдерам, у которых есть полный доступ к вашим виртуалкам и данным внутри них, если вы не используете шифрование, а в некоторых случаях даже если используете. В общем, тема для дискуссии неконструктивная. Каждый сам в конкретном случае должен решить для себя, кому он доверяет и на какие риски готов пойти.
|
||||
|
||||
Установить Cloudflare Tunnel очень просто. Есть deb и rpm пакеты ([https://developers.cloudflare.com/cloudflare-one/connections/connect-apps/install-and-setup/installation](https://developers.cloudflare.com/cloudflare-one/connections/connect-apps/install-and-setup/installation)), докер образ ([https://hub.docker.com/r/cloudflare/cloudflared](https://hub.docker.com/r/cloudflare/cloudflared)).
|
||||
Как им пользоваться, рассказано отдельно ([https://developers.cloudflare.com/cloudflare-one/connections/connect-apps/install-and-setup/tunnel-guide](https://developers.cloudflare.com/cloudflare-one/connections/connect-apps/install-and-setup/tunnel-guide)). В общем случае последовательность действий следующая:
|
||||
|
||||
1\. Устанавливаете Cloudflare Tunnel на компьютер.
|
||||
2\. Авторизуетесь в приложении с помощью своего аккаунта в Cloudflare.
|
||||
3\. Создаёте туннель и связываете его со своей учёткой.
|
||||
4\. Настраиваете конфиг туннеля, где указываете свой локальный сервис и его привязку к созданному ранее туннелю.
|
||||
5\. Связываете туннель со своим доменным именем, указанным в CNAME и запускаете.
|
||||
|
||||
Если доверяете cloudflare, то такое решение можно использовать и на постоянку. Выглядит достаточно безопасно. Вам вообще не нужно настраивать доступ из интернета на свой веб сервер. Даже tls сертификаты не нужны, если готовы гнать нешифрованный траф в Cloudflare. Последний сам выдаст бесплатный сертификат для конечной публикации.
|
||||
|
||||
Если я правильно понял, то для того, чтобы пользоваться Argo Tunnel бесплатно, нужно зарегистрировать Cloudflare For Teams free subscription.
|
||||
|
||||

|
||||
|
|
@ -0,0 +1,23 @@
|
|||
---
|
||||
title: Midnight Commander
|
||||
description:
|
||||
published: true
|
||||
date: 2023-11-15T18:21:18.474Z
|
||||
tags:
|
||||
editor: markdown
|
||||
dateCreated: 2023-11-15T18:21:18.474Z
|
||||
---
|
||||
|
||||
Казалось бы, чего там не знать в Midnight Commander. Я им пользуюсь практически с самого первого знакомства с Unix и Linux. Лет 15 где-то. И тем не менее, есть много удобных вещей, про которые я не знал, не использовал.
|
||||
|
||||
Так что всем, кто пользуется MC, рекомендую обзорное видео с основными возможностями этого файлового менеджера. Какие-то новые горячие клавиши или возможности, о которых не знали, могут сэкономить массу времени в ежедневной рутине.
|
||||
|
||||
Вот то, что я не использовал, но узнал из видео:
|
||||
◽️ Shift+F4 - создание нового файла. Я всегда по привычке писал в консоль touch filename.
|
||||
◽️ Alt+A - вывести текущий путь в консоль. Я привык сворачивать MC и набирать pwd, чтобы получить текущий путь для того, чтобы его скопировать. Такая привычка сформировалась из-за того, что у меня эта комбинация задействована в другой программе и не срабатывает в консоли.
|
||||
◽️ Alt+T - менять отображение панелей. Я редко это делаю, поэтому и комбинацию не запоминал никогда, но иногда надо.
|
||||
◽️ Ctrl+R - обновить содержимое панели. Очень зря я не знал про эту комбинацию. Это нужно постоянно, и я привык выходить из директории и заходить снова, для того, чтобы увидеть обновлённый список файлов.
|
||||
|
||||
Всё остальное, упомянутое в видео, знаю и использую. Рекомендую посмотреть, особенно про быстрый переход к файлам и создание закладок. Это прям то, что используется постоянно. Я даже когда-то писал об этом в одной из заметок, когда рассказывал о MC. С удивлением обнаруживаю, что закладками вообще мало кто пользуется. Автор видео тоже сделал на них акцент и назвал это одной из самых удобных и полезных фич.
|
||||
|
||||
https://youtu.be/CEp2-G3HQ_s
|
||||
|
|
@ -0,0 +1,43 @@
|
|||
---
|
||||
title: Nano - расцветка синтаксиса
|
||||
description:
|
||||
published: true
|
||||
date: 2023-11-15T18:23:47.499Z
|
||||
tags:
|
||||
editor: markdown
|
||||
dateCreated: 2023-11-15T18:23:47.499Z
|
||||
---
|
||||
|
||||
Основной конфигурационный файл nano имеет путь /etc/nanorc. В этом файле, в частности, прописаны источники глобальных настроек подсветки синтаксиса для разных типов файлов, которые подгружаются из внешних файлов *.nanorc.
|
||||
|
||||

|
||||
|
||||
Помимо того, что абсолютные пути к этим файлам прописаны в /etc/nanorc
|
||||
|
||||
Как видим, в нашей системе файлы настроек подсветки синтаксиса для разных типов файлов расположены в каталоге /usr/share/nano/. Если нужно переопределить глобальные настройки /etc/nanorc для текущего пользователя, то в профиле пользователя можно создать файл ~/.nanorc (по умолчанию отсутствует), в котором будут подключаться нужные файлы *.nanorc . Например, подключить все файлы *.nanorc из каталога /usr/share/nano/ можно такой командой:
|
||||
```bash
|
||||
find /usr/share/nano/ -iname "*.nanorc" -exec echo include {} \; >> ~/.nanorc
|
||||
```
|
||||
Однако с имеющимся по умолчанию набором файлов *.nanorc разные файлы часто используемых типов, например конфигурационные файлы с расширением .conf, будут по прежнему открываться в редакторе без подсветки синтаксиса. Мы можем создать для таких файлов собственный файл настроек подсветки синтаксиса:
|
||||
```
|
||||
nano /usr/share/nano/mysettings.nanorc
|
||||
```
|
||||
В первой строке файла зададим название цветовой схемы и определим расширения файлов, при открытии которых будет использоваться наша цветовая схема. Далее идут правила подсветки, где сначала определяется цвет, а затем маска текстовых строк, которые будут подсвечиваться этим самым цветом. В моём случае взяты некоторые цветовые параметры по примеру файла/usr/share/nano/sh.nanorc
|
||||
```bash
|
||||
syntax "mycolors" "\.(conf|config|cfg|cnf|txt|ini)$"
|
||||
|
||||
# comments
|
||||
color cyan "(^|[[:space:]])#.*$"
|
||||
color green "(^|[[:space:]])##.*$"
|
||||
# vars
|
||||
icolor brightred "\$\{?[0-9A-Z_!@#$*?-]+\}?"
|
||||
# strings
|
||||
color brightyellow ""(\\.|[^"])*"" "'(\\.|[^'])*'"
|
||||
```
|
||||
После того, как файл сохранён, делаем его присоединение либо в файле /etc/nanorc, либо в файле ~/.nanorc.
|
||||
```
|
||||
echo include "/usr/share/nano/mysettings.nanorc" >> ~/.nanorc
|
||||
```
|
||||
Теперь все файлы с расширениями *.conf, *.config, *.cfg, *.cnf, *.ini при открытии в nano будут "радовать глаз" нашей незатейливой цветовой схемой.
|
||||
|
||||

|
||||
|
|
@ -0,0 +1,479 @@
|
|||
<!--
|
||||
title: PGbouncer
|
||||
description:
|
||||
published: true
|
||||
date: 2023-11-15T17:47:12.972Z
|
||||
tags:
|
||||
editor: ckeditor
|
||||
dateCreated: 2023-11-15T17:46:34.218Z
|
||||
-->
|
||||
|
||||
<p>Типичные веб-проекты, разрабатываемые на чем-то вроде <a href="https://eax.me/python/"><u>Python</u></a> или PHP, характерны тем, что создают большое количество соединений к СУБД — по одному, а иногда и по несколько, <i>на каждый HTTP-запрос</i>. Имея классическую архитектуру «один процесс на соединение», PostgreSQL не очень хорошо справляется с большим (условно, больше 100) количеством соединений. Решить проблему позволяет пулер соединений под названием <a href="https://pgbouncer.github.io/"><u>PgBouncer</u></a>. Благодаря использованию библиотеки <a href="https://eax.me/libevent/"><u>libevent</u></a>, PgBouncer может поддерживать большое количество (тысячи) соединений, которые проксируются на несколько (пара десятков) соединений непосредственно к PostgreSQL.</p>
|
||||
<p>Данная заметка предполагает, что на сервере у вас используется Ubuntu Linux, так как сегодня это, по всей видимости, наиболее популярный серверный дистрибутив Linux. Отличия описанный далее шагов для других дистрибутивов будут минимальными. Также предполагается, что на сервере уже установлен PostgreSQL.</p>
|
||||
<p> </p>
|
||||
<p>Устанавливается PgBouncer очень просто:</p>
|
||||
<figure class="table" style="height:auto;width:1468px;">
|
||||
<table style="background-color:rgb(255, 255, 255);border-bottom:0px;border-left:0px;border-right:0px;border-top:0px;">
|
||||
<tbody>
|
||||
<tr>
|
||||
<td style="border-bottom:0px;border-left:0px;border-right:0px;border-top:0px;height:auto;padding:0px 0px 0px 15px;width:1453px;"><code>sudo</code> <code>apt-get install</code> <code>pgbouncer</code></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</figure>
|
||||
<p>По умолчанию прокси слушает порт 6432. Логи можно почитать так:</p>
|
||||
<figure class="table" style="height:auto;width:1468px;">
|
||||
<table style="background-color:rgb(255, 255, 255);border-bottom:0px;border-left:0px;border-right:0px;border-top:0px;">
|
||||
<tbody>
|
||||
<tr>
|
||||
<td style="border-bottom:0px;border-left:0px;border-right:0px;border-top:0px;height:auto;padding:0px 0px 0px 15px;width:1453px;"><code>less</code> <code>/var/log/postgresql/pgbouncer.log</code></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</figure>
|
||||
<p>Конфигурационный файл называется /etc/pgbouncer/pgbouncer.ini. Рассмотрим основные параметры.</p>
|
||||
<figure class="table" style="height:auto;width:1468px;">
|
||||
<table style="background-color:rgb(255, 255, 255);border-bottom:0px;border-left:0px;border-right:0px;border-top:0px;">
|
||||
<tbody>
|
||||
<tr>
|
||||
<td style="border-bottom:0px;border-left:0px;border-right:0px;border-top:0px;height:auto;padding:0px 0px 0px 15px;width:1453px;">
|
||||
<p><code>;; database</code> <code>name</code> <code>= connect</code> <code>string</code></p>
|
||||
<p><code>;;</code></p>
|
||||
<p><code>;; connect</code> <code>string params:</code></p>
|
||||
<p><code>;; dbname= host= port= user= password=</code></p>
|
||||
<p><code>;; client_encoding= datestyle= timezone=</code></p>
|
||||
<p><code>;; pool_size= connect_query=</code></p>
|
||||
<p><code>;; auth_user=</code></p>
|
||||
<p><code>[databases]</code></p>
|
||||
<p><code>* = host=localhost port=5432</code></p>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</figure>
|
||||
<p>Здесь мы можем указать, на каких серверах какие базы нужно искать. Звездочкой обозначается дэфолтный сервер. Кстати, это хоть еще и примитивный, но все-таки уже шардинг.</p>
|
||||
<p>Не менее важная настройка:</p>
|
||||
<figure class="table" style="height:auto;width:1468px;">
|
||||
<table style="background-color:rgb(255, 255, 255);border-bottom:0px;border-left:0px;border-right:0px;border-top:0px;">
|
||||
<tbody>
|
||||
<tr>
|
||||
<td style="border-bottom:0px;border-left:0px;border-right:0px;border-top:0px;height:auto;padding:0px 0px 0px 15px;width:1453px;">
|
||||
<p><code>; When</code> <code>server connection</code> <code>is</code> <code>released back to</code> <code>pool:</code></p>
|
||||
<p><code>; session - after</code> <code>client disconnects</code></p>
|
||||
<p><code>; transaction</code> <code>- after</code> <code>transaction</code> <code>finishes</code></p>
|
||||
<p><code>; statement - after</code> <code>statement finishes</code></p>
|
||||
<p><code>pool_mode = transaction</code></p>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</figure>
|
||||
<p>о умолчанию стоит в session, то есть, сессия будет удерживаться клиентом до тех пор, пока он не закроет соединение. Чаще всего значение имеет смысл заменить на transaction. В этом случае соединение будет возвращаться в общий пул после завершения транзакции. Значение statement означает, что соединение будет освобождаться после выполнения каждого отдельного выражения, чего вы почти наверняка не должны хотеть.</p>
|
||||
<p>Настройки размера пула:</p>
|
||||
<figure class="table" style="height:auto;width:1468px;">
|
||||
<table style="background-color:rgb(255, 255, 255);border-bottom:0px;border-left:0px;border-right:0px;border-top:0px;">
|
||||
<tbody>
|
||||
<tr>
|
||||
<td style="border-bottom:0px;border-left:0px;border-right:0px;border-top:0px;height:auto;padding:0px 0px 0px 15px;width:1453px;">
|
||||
<p><code>; total number of</code> <code>clients that can connect</code></p>
|
||||
<p><code>max_client_conn = 1000</code></p>
|
||||
<p><code>; default</code> <code>pool size. 20 is</code> <code>good number when</code> <code>transaction</code> <code>pooling</code></p>
|
||||
<p><code>; is</code> <code>in</code> <code>use, in</code> <code>session pooling it needs to</code> <code>be the number of</code></p>
|
||||
<p><code>; max</code> <code>clients you want to</code> <code>handle at</code> <code>any</code> <code>moment</code></p>
|
||||
<p><code>default_pool_size = 20</code></p>
|
||||
<p><code>;; Minimum number of</code> <code>server connections to</code> <code>keep in</code> <code>pool.</code></p>
|
||||
<p><code>;min_pool_size = 0</code></p>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</figure>
|
||||
<p>Здесь я увеличил максимальное количество клиентских соединений до 1000. Значение, используемое по умолчанию, равно 100.</p>
|
||||
<p>Настройки аутентификации:</p>
|
||||
<figure class="table" style="height:auto;width:1468px;">
|
||||
<table style="background-color:rgb(255, 255, 255);border-bottom:0px;border-left:0px;border-right:0px;border-top:0px;">
|
||||
<tbody>
|
||||
<tr>
|
||||
<td style="border-bottom:0px;border-left:0px;border-right:0px;border-top:0px;height:auto;padding:0px 0px 0px 15px;width:1453px;">
|
||||
<p><code>; any, trust, plain, crypt, md5, cert, hba, pam</code></p>
|
||||
<p><code>auth_type = md5</code></p>
|
||||
<p><code>auth_file = /etc/pgbouncer/userlist.txt</code></p>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</figure>
|
||||
<p>… и доступа к админке pgbouncer:</p>
|
||||
<figure class="table" style="height:auto;width:1468px;">
|
||||
<table style="background-color:rgb(255, 255, 255);border-bottom:0px;border-left:0px;border-right:0px;border-top:0px;">
|
||||
<tbody>
|
||||
<tr>
|
||||
<td style="border-bottom:0px;border-left:0px;border-right:0px;border-top:0px;height:auto;padding:0px 0px 0px 15px;width:1453px;">
|
||||
<p><code>;;;</code></p>
|
||||
<p><code>;;; Users allowed into</code> <code>database</code> <code>'pgbouncer'</code></p>
|
||||
<p><code>;;;</code></p>
|
||||
<p><code>; comma-separated list of</code> <code>users, who are allowed to</code> <code>change settings</code></p>
|
||||
<p><code>admin_users = eax</code></p>
|
||||
<p><code>; comma-separated list of</code> <code>users who are just allowed to</code> <code>use</code></p>
|
||||
<p><code>; SHOW command</code></p>
|
||||
<p><code>;stats_users = stats, root</code></p>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</figure>
|
||||
<p><strong>Важно!</strong> Параметр auth_type по умолчанию имеет значение trust. То есть, PgBouncer будет пускать всех в базу данных без запроса пароля. Вы почти наверняка этого не хотите.</p>
|
||||
<p>Файл /etc/pgbouncer/userlist.txt содержит имена пользователей и пароли, с которыми PgBouncer подключается к базе. Например:</p>
|
||||
<figure class="table" style="height:auto;width:1468px;">
|
||||
<table style="background-color:rgb(255, 255, 255);border-bottom:0px;border-left:0px;border-right:0px;border-top:0px;">
|
||||
<tbody>
|
||||
<tr>
|
||||
<td style="border-bottom:0px;border-left:0px;border-right:0px;border-top:0px;height:auto;padding:0px 0px 0px 15px;width:1453px;"><code>"eax"</code> <code>"qwerty"</code></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</figure>
|
||||
<p>Пароли не обязательно хранить открытым текстом:</p>
|
||||
<figure class="table" style="height:auto;width:1468px;">
|
||||
<table style="background-color:rgb(255, 255, 255);border-bottom:0px;border-left:0px;border-right:0px;border-top:0px;">
|
||||
<tbody>
|
||||
<tr>
|
||||
<td style="border-bottom:0px;border-left:0px;border-right:0px;border-top:0px;height:auto;padding:0px 0px 0px 15px;width:1453px;"><code>"eax"</code> <code>"md5175c641eaed0b6c05ae8444b73d789f0"</code></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</figure>
|
||||
<p>Здесь хэш <code>175c641e...</code> был посчитан как MD5 от пароля, следом за которым записано имя пользователя:</p>
|
||||
<figure class="table" style="height:auto;width:1468px;">
|
||||
<table style="background-color:rgb(255, 255, 255);border-bottom:0px;border-left:0px;border-right:0px;border-top:0px;">
|
||||
<tbody>
|
||||
<tr>
|
||||
<td style="border-bottom:0px;border-left:0px;border-right:0px;border-top:0px;height:auto;padding:0px 0px 0px 15px;width:1453px;"><code>echo</code> <code>-n 'qwertyeax'</code> <code>| md5sum</code></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</figure>
|
||||
<p>Теперь, когда PgBouncer настроен, можно перезапустить его:</p>
|
||||
<figure class="table" style="height:auto;width:1468px;">
|
||||
<table style="background-color:rgb(255, 255, 255);border-bottom:0px;border-left:0px;border-right:0px;border-top:0px;">
|
||||
<tbody>
|
||||
<tr>
|
||||
<td style="border-bottom:0px;border-left:0px;border-right:0px;border-top:0px;height:auto;padding:0px 0px 0px 15px;width:1453px;"><code>sudo</code> <code>service pgbouncer restart</code></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</figure>
|
||||
<p>… и ломиться в базу:</p>
|
||||
<figure class="table" style="height:auto;width:1468px;">
|
||||
<table style="background-color:rgb(255, 255, 255);border-bottom:0px;border-left:0px;border-right:0px;border-top:0px;">
|
||||
<tbody>
|
||||
<tr>
|
||||
<td style="border-bottom:0px;border-left:0px;border-right:0px;border-top:0px;height:auto;padding:0px 0px 0px 15px;width:1453px;"><code>psql -p 6432 -U eax</code></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</figure>
|
||||
<p>Если все было сделано правильно, PgBouncer запросит пароль. В приведенном примере пароль, с которым пользователь ходит в PostgreSQL напрямую, и пароль, запрашиваемый PgBouncer — это один и тот же пароль. Если вдруг что-то не работает, рекомендую начать с проверки настройки аутентификации самого PostgreSQL (файл pg_hba.conf).</p>
|
||||
<p>Выше пользователь eax был добавлен в admin_users, что дает ему доступ в админку PgBouncer. Вход в админку осуществляется так:</p>
|
||||
<figure class="table" style="height:auto;width:1468px;">
|
||||
<table style="background-color:rgb(255, 255, 255);border-bottom:0px;border-left:0px;border-right:0px;border-top:0px;">
|
||||
<tbody>
|
||||
<tr>
|
||||
<td style="border-bottom:0px;border-left:0px;border-right:0px;border-top:0px;height:auto;padding:0px 0px 0px 15px;width:1453px;"><code>psql -p 6432 -U eax pgbouncer</code></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</figure>
|
||||
<p>Наиболее интересная из доступных команд — это перечитывание конфигурации без перезапуска сервера:</p>
|
||||
<figure class="table" style="height:auto;width:1468px;">
|
||||
<table style="background-color:rgb(255, 255, 255);border-bottom:0px;border-left:0px;border-right:0px;border-top:0px;">
|
||||
<tbody>
|
||||
<tr>
|
||||
<td style="border-bottom:0px;border-left:0px;border-right:0px;border-top:0px;height:auto;padding:0px 0px 0px 15px;width:1453px;"><code>RELOAD;</code></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</figure>
|
||||
<p>Информацию о других доступных командах можно посмотреть так:</p>
|
||||
<figure class="table" style="height:auto;width:1468px;">
|
||||
<table style="background-color:rgb(255, 255, 255);border-bottom:0px;border-left:0px;border-right:0px;border-top:0px;">
|
||||
<tbody>
|
||||
<tr>
|
||||
<td style="border-bottom:0px;border-left:0px;border-right:0px;border-top:0px;height:auto;padding:0px 0px 0px 15px;width:1453px;"><code>SHOW HELP;</code></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</figure>
|
||||
<p>Пример вывода:</p>
|
||||
<figure class="table" style="height:auto;width:1468px;">
|
||||
<table style="background-color:rgb(255, 255, 255);border-bottom:0px;border-left:0px;border-right:0px;border-top:0px;">
|
||||
<tbody>
|
||||
<tr>
|
||||
<td style="border-bottom:0px;border-left:0px;border-right:0px;border-top:0px;height:auto;padding:0px 0px 0px 15px;width:1453px;">
|
||||
<p><code>DETAIL:</code></p>
|
||||
<p><code> SHOW HELP|CONFIG|DATABASES|POOLS|CLIENTS|SERVERS|VERSION</code></p>
|
||||
<p><code> SHOW FDS|SOCKETS|ACTIVE_SOCKETS|LISTS|MEM</code></p>
|
||||
<p><code> SHOW DNS_HOSTS|DNS_ZONES</code></p>
|
||||
<p><code> SHOW STATS|STATS_TOTALS|STATS_AVERAGES</code></p>
|
||||
<p><code> SET key = arg</code></p>
|
||||
<p><code> RELOAD</code></p>
|
||||
<p><code> PAUSE [<db>]</code></p>
|
||||
<p><code> RESUME [<db>]</code></p>
|
||||
<p><code> DISABLE <db></code></p>
|
||||
<p><code> ENABLE <db></code></p>
|
||||
<p><code> KILL <db></code></p>
|
||||
<p><code> SUSPEND</code></p>
|
||||
<p><code> SHUTDOWN</code></p>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</figure>
|
||||
<p>Проверяем, что все работает, запустив pgbench с 900 соединенинями:</p>
|
||||
<figure class="table" style="height:auto;width:1468px;">
|
||||
<table style="background-color:rgb(255, 255, 255);border-bottom:0px;border-left:0px;border-right:0px;border-top:0px;">
|
||||
<tbody>
|
||||
<tr>
|
||||
<td style="border-bottom:0px;border-left:0px;border-right:0px;border-top:0px;height:auto;padding:0px 0px 0px 15px;width:1453px;">
|
||||
<p><code>pgbench -i</code></p>
|
||||
<p><code>pgbench -p 6432 -c 900 -C -T 60 -P 1</code></p>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</figure>
|
||||
<p>Если все было сделано правильно, pgbench будет превосходно работать, а команда <code>SHOW CLIENTS;</code>, выполненная в админке PgBouncer, покажет 900 соединений. При этом вывод <code>ps wuax | grep postgres</code> покажет, что реально запущено лишь 20 бэкендов PostgreSQL.Типичные веб-проекты, разрабатываемые на чем-то вроде <a href="https://eax.me/python/"><u>Python</u></a> или PHP, характерны тем, что создают большое количество соединений к СУБД — по одному, а иногда и по несколько, <i>на каждый HTTP-запрос</i>. Имея классическую архитектуру «один процесс на соединение», PostgreSQL не очень хорошо справляется с большим (условно, больше 100) количеством соединений. Решить проблему позволяет пулер соединений под названием <a href="https://pgbouncer.github.io/"><u>PgBouncer</u></a>. Благодаря использованию библиотеки <a href="https://eax.me/libevent/"><u>libevent</u></a>, PgBouncer может поддерживать большое количество (тысячи) соединений, которые проксируются на несколько (пара десятков) соединений непосредственно к PostgreSQL.</p>
|
||||
<p>Данная заметка предполагает, что на сервере у вас используется Ubuntu Linux, так как сегодня это, по всей видимости, наиболее популярный серверный дистрибутив Linux. Отличия описанный далее шагов для других дистрибутивов будут минимальными. Также предполагается, что на сервере уже установлен PostgreSQL.</p>
|
||||
<p> </p>
|
||||
<p>Устанавливается PgBouncer очень просто:</p>
|
||||
<figure class="table" style="height:auto;width:1468px;">
|
||||
<table style="background-color:rgb(255, 255, 255);border-bottom:0px;border-left:0px;border-right:0px;border-top:0px;">
|
||||
<tbody>
|
||||
<tr>
|
||||
<td style="border-bottom:0px;border-left:0px;border-right:0px;border-top:0px;height:auto;padding:0px 0px 0px 15px;width:1453px;"><code>sudo</code> <code>apt-get install</code> <code>pgbouncer</code></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</figure>
|
||||
<p>По умолчанию прокси слушает порт 6432. Логи можно почитать так:</p>
|
||||
<figure class="table" style="height:auto;width:1468px;">
|
||||
<table style="background-color:rgb(255, 255, 255);border-bottom:0px;border-left:0px;border-right:0px;border-top:0px;">
|
||||
<tbody>
|
||||
<tr>
|
||||
<td style="border-bottom:0px;border-left:0px;border-right:0px;border-top:0px;height:auto;padding:0px 0px 0px 15px;width:1453px;"><code>less</code> <code>/var/log/postgresql/pgbouncer.log</code></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</figure>
|
||||
<p>Конфигурационный файл называется /etc/pgbouncer/pgbouncer.ini. Рассмотрим основные параметры.</p>
|
||||
<figure class="table" style="height:auto;width:1468px;">
|
||||
<table style="background-color:rgb(255, 255, 255);border-bottom:0px;border-left:0px;border-right:0px;border-top:0px;">
|
||||
<tbody>
|
||||
<tr>
|
||||
<td style="border-bottom:0px;border-left:0px;border-right:0px;border-top:0px;height:auto;padding:0px 0px 0px 15px;width:1453px;">
|
||||
<p><code>;; database</code> <code>name</code> <code>= connect</code> <code>string</code></p>
|
||||
<p><code>;;</code></p>
|
||||
<p><code>;; connect</code> <code>string params:</code></p>
|
||||
<p><code>;; dbname= host= port= user= password=</code></p>
|
||||
<p><code>;; client_encoding= datestyle= timezone=</code></p>
|
||||
<p><code>;; pool_size= connect_query=</code></p>
|
||||
<p><code>;; auth_user=</code></p>
|
||||
<p><code>[databases]</code></p>
|
||||
<p><code>* = host=localhost port=5432</code></p>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</figure>
|
||||
<p>Здесь мы можем указать, на каких серверах какие базы нужно искать. Звездочкой обозначается дэфолтный сервер. Кстати, это хоть еще и примитивный, но все-таки уже шардинг.</p>
|
||||
<p>Не менее важная настройка:</p>
|
||||
<figure class="table" style="height:auto;width:1468px;">
|
||||
<table style="background-color:rgb(255, 255, 255);border-bottom:0px;border-left:0px;border-right:0px;border-top:0px;">
|
||||
<tbody>
|
||||
<tr>
|
||||
<td style="border-bottom:0px;border-left:0px;border-right:0px;border-top:0px;height:auto;padding:0px 0px 0px 15px;width:1453px;">
|
||||
<p><code>; When</code> <code>server connection</code> <code>is</code> <code>released back to</code> <code>pool:</code></p>
|
||||
<p><code>; session - after</code> <code>client disconnects</code></p>
|
||||
<p><code>; transaction</code> <code>- after</code> <code>transaction</code> <code>finishes</code></p>
|
||||
<p><code>; statement - after</code> <code>statement finishes</code></p>
|
||||
<p><code>pool_mode = transaction</code></p>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</figure>
|
||||
<p>о умолчанию стоит в session, то есть, сессия будет удерживаться клиентом до тех пор, пока он не закроет соединение. Чаще всего значение имеет смысл заменить на transaction. В этом случае соединение будет возвращаться в общий пул после завершения транзакции. Значение statement означает, что соединение будет освобождаться после выполнения каждого отдельного выражения, чего вы почти наверняка не должны хотеть.</p>
|
||||
<p>Настройки размера пула:</p>
|
||||
<figure class="table" style="height:auto;width:1468px;">
|
||||
<table style="background-color:rgb(255, 255, 255);border-bottom:0px;border-left:0px;border-right:0px;border-top:0px;">
|
||||
<tbody>
|
||||
<tr>
|
||||
<td style="border-bottom:0px;border-left:0px;border-right:0px;border-top:0px;height:auto;padding:0px 0px 0px 15px;width:1453px;">
|
||||
<p><code>; total number of</code> <code>clients that can connect</code></p>
|
||||
<p><code>max_client_conn = 1000</code></p>
|
||||
<p><code>; default</code> <code>pool size. 20 is</code> <code>good number when</code> <code>transaction</code> <code>pooling</code></p>
|
||||
<p><code>; is</code> <code>in</code> <code>use, in</code> <code>session pooling it needs to</code> <code>be the number of</code></p>
|
||||
<p><code>; max</code> <code>clients you want to</code> <code>handle at</code> <code>any</code> <code>moment</code></p>
|
||||
<p><code>default_pool_size = 20</code></p>
|
||||
<p><code>;; Minimum number of</code> <code>server connections to</code> <code>keep in</code> <code>pool.</code></p>
|
||||
<p><code>;min_pool_size = 0</code></p>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</figure>
|
||||
<p>Здесь я увеличил максимальное количество клиентских соединений до 1000. Значение, используемое по умолчанию, равно 100.</p>
|
||||
<p>Настройки аутентификации:</p>
|
||||
<figure class="table" style="height:auto;width:1468px;">
|
||||
<table style="background-color:rgb(255, 255, 255);border-bottom:0px;border-left:0px;border-right:0px;border-top:0px;">
|
||||
<tbody>
|
||||
<tr>
|
||||
<td style="border-bottom:0px;border-left:0px;border-right:0px;border-top:0px;height:auto;padding:0px 0px 0px 15px;width:1453px;">
|
||||
<p><code>; any, trust, plain, crypt, md5, cert, hba, pam</code></p>
|
||||
<p><code>auth_type = md5</code></p>
|
||||
<p><code>auth_file = /etc/pgbouncer/userlist.txt</code></p>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</figure>
|
||||
<p>… и доступа к админке pgbouncer:</p>
|
||||
<figure class="table" style="height:auto;width:1468px;">
|
||||
<table style="background-color:rgb(255, 255, 255);border-bottom:0px;border-left:0px;border-right:0px;border-top:0px;">
|
||||
<tbody>
|
||||
<tr>
|
||||
<td style="border-bottom:0px;border-left:0px;border-right:0px;border-top:0px;height:auto;padding:0px 0px 0px 15px;width:1453px;">
|
||||
<p><code>;;;</code></p>
|
||||
<p><code>;;; Users allowed into</code> <code>database</code> <code>'pgbouncer'</code></p>
|
||||
<p><code>;;;</code></p>
|
||||
<p><code>; comma-separated list of</code> <code>users, who are allowed to</code> <code>change settings</code></p>
|
||||
<p><code>admin_users = eax</code></p>
|
||||
<p><code>; comma-separated list of</code> <code>users who are just allowed to</code> <code>use</code></p>
|
||||
<p><code>; SHOW command</code></p>
|
||||
<p><code>;stats_users = stats, root</code></p>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</figure>
|
||||
<p><strong>Важно!</strong> Параметр auth_type по умолчанию имеет значение trust. То есть, PgBouncer будет пускать всех в базу данных без запроса пароля. Вы почти наверняка этого не хотите.</p>
|
||||
<p>Файл /etc/pgbouncer/userlist.txt содержит имена пользователей и пароли, с которыми PgBouncer подключается к базе. Например:</p>
|
||||
<figure class="table" style="height:auto;width:1468px;">
|
||||
<table style="background-color:rgb(255, 255, 255);border-bottom:0px;border-left:0px;border-right:0px;border-top:0px;">
|
||||
<tbody>
|
||||
<tr>
|
||||
<td style="border-bottom:0px;border-left:0px;border-right:0px;border-top:0px;height:auto;padding:0px 0px 0px 15px;width:1453px;"><code>"eax"</code> <code>"qwerty"</code></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</figure>
|
||||
<p>Пароли не обязательно хранить открытым текстом:</p>
|
||||
<figure class="table" style="height:auto;width:1468px;">
|
||||
<table style="background-color:rgb(255, 255, 255);border-bottom:0px;border-left:0px;border-right:0px;border-top:0px;">
|
||||
<tbody>
|
||||
<tr>
|
||||
<td style="border-bottom:0px;border-left:0px;border-right:0px;border-top:0px;height:auto;padding:0px 0px 0px 15px;width:1453px;"><code>"eax"</code> <code>"md5175c641eaed0b6c05ae8444b73d789f0"</code></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</figure>
|
||||
<p>Здесь хэш <code>175c641e...</code> был посчитан как MD5 от пароля, следом за которым записано имя пользователя:</p>
|
||||
<figure class="table" style="height:auto;width:1468px;">
|
||||
<table style="background-color:rgb(255, 255, 255);border-bottom:0px;border-left:0px;border-right:0px;border-top:0px;">
|
||||
<tbody>
|
||||
<tr>
|
||||
<td style="border-bottom:0px;border-left:0px;border-right:0px;border-top:0px;height:auto;padding:0px 0px 0px 15px;width:1453px;"><code>echo</code> <code>-n 'qwertyeax'</code> <code>| md5sum</code></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</figure>
|
||||
<p>Теперь, когда PgBouncer настроен, можно перезапустить его:</p>
|
||||
<figure class="table" style="height:auto;width:1468px;">
|
||||
<table style="background-color:rgb(255, 255, 255);border-bottom:0px;border-left:0px;border-right:0px;border-top:0px;">
|
||||
<tbody>
|
||||
<tr>
|
||||
<td style="border-bottom:0px;border-left:0px;border-right:0px;border-top:0px;height:auto;padding:0px 0px 0px 15px;width:1453px;"><code>sudo</code> <code>service pgbouncer restart</code></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</figure>
|
||||
<p>… и ломиться в базу:</p>
|
||||
<figure class="table" style="height:auto;width:1468px;">
|
||||
<table style="background-color:rgb(255, 255, 255);border-bottom:0px;border-left:0px;border-right:0px;border-top:0px;">
|
||||
<tbody>
|
||||
<tr>
|
||||
<td style="border-bottom:0px;border-left:0px;border-right:0px;border-top:0px;height:auto;padding:0px 0px 0px 15px;width:1453px;"><code>psql -p 6432 -U eax</code></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</figure>
|
||||
<p>Если все было сделано правильно, PgBouncer запросит пароль. В приведенном примере пароль, с которым пользователь ходит в PostgreSQL напрямую, и пароль, запрашиваемый PgBouncer — это один и тот же пароль. Если вдруг что-то не работает, рекомендую начать с проверки настройки аутентификации самого PostgreSQL (файл pg_hba.conf).</p>
|
||||
<p>Выше пользователь eax был добавлен в admin_users, что дает ему доступ в админку PgBouncer. Вход в админку осуществляется так:</p>
|
||||
<figure class="table" style="height:auto;width:1468px;">
|
||||
<table style="background-color:rgb(255, 255, 255);border-bottom:0px;border-left:0px;border-right:0px;border-top:0px;">
|
||||
<tbody>
|
||||
<tr>
|
||||
<td style="border-bottom:0px;border-left:0px;border-right:0px;border-top:0px;height:auto;padding:0px 0px 0px 15px;width:1453px;"><code>psql -p 6432 -U eax pgbouncer</code></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</figure>
|
||||
<p>Наиболее интересная из доступных команд — это перечитывание конфигурации без перезапуска сервера:</p>
|
||||
<figure class="table" style="height:auto;width:1468px;">
|
||||
<table style="background-color:rgb(255, 255, 255);border-bottom:0px;border-left:0px;border-right:0px;border-top:0px;">
|
||||
<tbody>
|
||||
<tr>
|
||||
<td style="border-bottom:0px;border-left:0px;border-right:0px;border-top:0px;height:auto;padding:0px 0px 0px 15px;width:1453px;"><code>RELOAD;</code></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</figure>
|
||||
<p>Информацию о других доступных командах можно посмотреть так:</p>
|
||||
<figure class="table" style="height:auto;width:1468px;">
|
||||
<table style="background-color:rgb(255, 255, 255);border-bottom:0px;border-left:0px;border-right:0px;border-top:0px;">
|
||||
<tbody>
|
||||
<tr>
|
||||
<td style="border-bottom:0px;border-left:0px;border-right:0px;border-top:0px;height:auto;padding:0px 0px 0px 15px;width:1453px;"><code>SHOW HELP;</code></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</figure>
|
||||
<p>Пример вывода:</p>
|
||||
<figure class="table" style="height:auto;width:1468px;">
|
||||
<table style="background-color:rgb(255, 255, 255);border-bottom:0px;border-left:0px;border-right:0px;border-top:0px;">
|
||||
<tbody>
|
||||
<tr>
|
||||
<td style="border-bottom:0px;border-left:0px;border-right:0px;border-top:0px;height:auto;padding:0px 0px 0px 15px;width:1453px;">
|
||||
<p><code>DETAIL:</code></p>
|
||||
<p><code> SHOW HELP|CONFIG|DATABASES|POOLS|CLIENTS|SERVERS|VERSION</code></p>
|
||||
<p><code> SHOW FDS|SOCKETS|ACTIVE_SOCKETS|LISTS|MEM</code></p>
|
||||
<p><code> SHOW DNS_HOSTS|DNS_ZONES</code></p>
|
||||
<p><code> SHOW STATS|STATS_TOTALS|STATS_AVERAGES</code></p>
|
||||
<p><code> SET key = arg</code></p>
|
||||
<p><code> RELOAD</code></p>
|
||||
<p><code> PAUSE [<db>]</code></p>
|
||||
<p><code> RESUME [<db>]</code></p>
|
||||
<p><code> DISABLE <db></code></p>
|
||||
<p><code> ENABLE <db></code></p>
|
||||
<p><code> KILL <db></code></p>
|
||||
<p><code> SUSPEND</code></p>
|
||||
<p><code> SHUTDOWN</code></p>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</figure>
|
||||
<p>Проверяем, что все работает, запустив pgbench с 900 соединенинями:</p>
|
||||
<figure class="table" style="height:auto;width:1468px;">
|
||||
<table style="background-color:rgb(255, 255, 255);border-bottom:0px;border-left:0px;border-right:0px;border-top:0px;">
|
||||
<tbody>
|
||||
<tr>
|
||||
<td style="border-bottom:0px;border-left:0px;border-right:0px;border-top:0px;height:auto;padding:0px 0px 0px 15px;width:1453px;">
|
||||
<p><code>pgbench -i</code></p>
|
||||
<p><code>pgbench -p 6432 -c 900 -C -T 60 -P 1</code></p>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</figure>
|
||||
<p>Если все было сделано правильно, pgbench будет превосходно работать, а команда <code>SHOW CLIENTS;</code>, выполненная в админке PgBouncer, покажет 900 соединений. При этом вывод <code>ps wuax | grep postgres</code> покажет, что реально запущено лишь 20 бэкендов PostgreSQL.</p>
|
||||
|
|
@ -0,0 +1,172 @@
|
|||
---
|
||||
title: PGbouncer
|
||||
description:
|
||||
published: true
|
||||
date: 2023-11-15T17:53:03.556Z
|
||||
tags:
|
||||
editor: markdown
|
||||
dateCreated: 2023-11-15T17:46:34.218Z
|
||||
---
|
||||
|
||||
Типичные веб-проекты, разрабатываемые на чем-то вроде [_Python_](https://eax.me/python/) или PHP, характерны тем, что создают большое количество соединений к СУБД — по одному, а иногда и по несколько, *на каждый HTTP-запрос*. Имея классическую архитектуру «один процесс на соединение», PostgreSQL не очень хорошо справляется с большим (условно, больше 100) количеством соединений. Решить проблему позволяет пулер соединений под названием [_PgBouncer_](https://pgbouncer.github.io/). Благодаря использованию библиотеки [_libevent_](https://eax.me/libevent/), PgBouncer может поддерживать большое количество (тысячи) соединений, которые проксируются на несколько (пара десятков) соединений непосредственно к PostgreSQL.
|
||||
|
||||
Данная заметка предполагает, что на сервере у вас используется Ubuntu Linux, так как сегодня это, по всей видимости, наиболее популярный серверный дистрибутив Linux. Отличия описанный далее шагов для других дистрибутивов будут минимальными. Также предполагается, что на сервере уже установлен PostgreSQL.
|
||||
|
||||
Устанавливается PgBouncer очень просто:
|
||||
|
||||
```
|
||||
sudo apt-get install pgbouncer
|
||||
```
|
||||
|
||||
По умолчанию прокси слушает порт 6432. Логи можно почитать так:
|
||||
|
||||
```
|
||||
less /var/log/postgresql/pgbouncer.log
|
||||
```
|
||||
|
||||
Конфигурационный файл называется /etc/pgbouncer/pgbouncer.ini. Рассмотрим основные параметры.
|
||||
|
||||
```
|
||||
;; database name = connect string
|
||||
;;
|
||||
;; connect string params:
|
||||
;; dbname= host= port= user= password=
|
||||
;; client_encoding= datestyle= timezone=
|
||||
;; pool_size= connect_query=
|
||||
;; auth_user=
|
||||
[databases]
|
||||
|
||||
* = host=localhost port=5432
|
||||
```
|
||||
|
||||
Здесь мы можем указать, на каких серверах какие базы нужно искать. Звездочкой обозначается дэфолтный сервер. Кстати, это хоть еще и примитивный, но все-таки уже шардинг.
|
||||
|
||||
Не менее важная настройка:
|
||||
|
||||
```
|
||||
; When server connection is released back to pool:
|
||||
; session - after client disconnects
|
||||
; transaction - after transaction finishes
|
||||
; statement - after statement finishes
|
||||
pool_mode = transaction
|
||||
```
|
||||
|
||||
о умолчанию стоит в session, то есть, сессия будет удерживаться клиентом до тех пор, пока он не закроет соединение. Чаще всего значение имеет смысл заменить на transaction. В этом случае соединение будет возвращаться в общий пул после завершения транзакции. Значение statement означает, что соединение будет освобождаться после выполнения каждого отдельного выражения, чего вы почти наверняка не должны хотеть.
|
||||
|
||||
Настройки размера пула:
|
||||
|
||||
```
|
||||
; total number of clients that can connect
|
||||
max_client_conn = 1000
|
||||
|
||||
; default pool size. 20 is good number when transaction pooling
|
||||
; is in use, in session pooling it needs to be the number of
|
||||
; max clients you want to handle at any moment
|
||||
default_pool_size = 20
|
||||
|
||||
;; Minimum number of server connections to keep in pool.
|
||||
;min_pool_size = 0
|
||||
```
|
||||
|
||||
Здесь я увеличил максимальное количество клиентских соединений до 1000. Значение, используемое по умолчанию, равно 100.
|
||||
|
||||
Настройки аутентификации:
|
||||
|
||||
```
|
||||
; any, trust, plain, crypt, md5, cert, hba, pam
|
||||
auth_type = md5
|
||||
auth_file = /etc/pgbouncer/userlist.txt
|
||||
```
|
||||
|
||||
… и доступа к админке pgbouncer:
|
||||
|
||||
```
|
||||
;;;
|
||||
;;; Users allowed into database 'pgbouncer'
|
||||
;;;
|
||||
|
||||
; comma-separated list of users, who are allowed to change settings
|
||||
admin_users = eax
|
||||
|
||||
; comma-separated list of users who are just allowed to use
|
||||
; SHOW command
|
||||
;stats_users = stats, root
|
||||
```
|
||||
|
||||
**Важно!** Параметр auth\_type по умолчанию имеет значение trust. То есть, PgBouncer будет пускать всех в базу данных без запроса пароля. Вы почти наверняка этого не хотите.
|
||||
|
||||
Файл /etc/pgbouncer/userlist.txt содержит имена пользователей и пароли, с которыми PgBouncer подключается к базе. Например:
|
||||
|
||||
```
|
||||
"eax" "qwerty"
|
||||
```
|
||||
|
||||
Пароли не обязательно хранить открытым текстом:
|
||||
|
||||
```
|
||||
"eax" "md5175c641eaed0b6c05ae8444b73d789f0"
|
||||
```
|
||||
|
||||
Здесь хэш `175c641e...` был посчитан как MD5 от пароля, следом за которым записано имя пользователя:
|
||||
|
||||
```
|
||||
echo -n 'qwertyeax' | md5sum
|
||||
```
|
||||
|
||||
Теперь, когда PgBouncer настроен, можно перезапустить его:
|
||||
|
||||
```
|
||||
sudo service pgbouncer restart
|
||||
```
|
||||
|
||||
… и ломиться в базу:
|
||||
|
||||
```
|
||||
psql -p 6432 -U eax
|
||||
```
|
||||
|
||||
Если все было сделано правильно, PgBouncer запросит пароль. В приведенном примере пароль, с которым пользователь ходит в PostgreSQL напрямую, и пароль, запрашиваемый PgBouncer — это один и тот же пароль. Если вдруг что-то не работает, рекомендую начать с проверки настройки аутентификации самого PostgreSQL (файл pg\_hba.conf).
|
||||
|
||||
Выше пользователь eax был добавлен в admin\_users, что дает ему доступ в админку PgBouncer. Вход в админку осуществляется так:
|
||||
|
||||
```
|
||||
psql -p 6432 -U eax pgbouncer
|
||||
```
|
||||
|
||||
Наиболее интересная из доступных команд — это перечитывание конфигурации без перезапуска сервера:
|
||||
|
||||
`RELOAD;`
|
||||
|
||||
Информацию о других доступных командах можно посмотреть так:
|
||||
|
||||
`SHOW HELP;`
|
||||
|
||||
Пример вывода:
|
||||
|
||||
```
|
||||
DETAIL:
|
||||
SHOW HELP|CONFIG|DATABASES|POOLS|CLIENTS|SERVERS|VERSION
|
||||
SHOW FDS|SOCKETS|ACTIVE_SOCKETS|LISTS|MEM
|
||||
SHOW DNS_HOSTS|DNS_ZONES
|
||||
SHOW STATS|STATS_TOTALS|STATS_AVERAGES
|
||||
SET key = arg
|
||||
RELOAD
|
||||
PAUSE [<db>]
|
||||
RESUME [<db>]
|
||||
DISABLE <db>
|
||||
ENABLE <db>
|
||||
KILL <db>
|
||||
SUSPEND
|
||||
SHUTDOWN
|
||||
```
|
||||
|
||||
Проверяем, что все работает, запустив pgbench с 900 соединенинями:
|
||||
|
||||
```
|
||||
pgbench -i
|
||||
pgbench -p 6432 -c 900 -C -T 60 -P 1
|
||||
```
|
||||
|
||||
|
||||
|
||||
Если все было сделано правильно, pgbench будет превосходно работать, а команда `SHOW CLIENTS;`, выполненная в админке PgBouncer, покажет 900 соединений. При этом вывод `ps wuax | grep postgres` покажет, что реально запущено лишь 20 бэкендов PostgreSQL.
|
||||
|
|
@ -0,0 +1,16 @@
|
|||
---
|
||||
title: Создание пользователя с правами на базы
|
||||
description:
|
||||
published: true
|
||||
date: 2023-11-15T17:53:56.246Z
|
||||
tags:
|
||||
editor: markdown
|
||||
dateCreated: 2023-11-15T17:53:56.246Z
|
||||
---
|
||||
|
||||
```
|
||||
CREATE USER schema_auth WITH PASSWORD ‘postgres’;
|
||||
GRANT ALL PRIVILEGES ON DATABASE “mk_objects” to schema_auth;
|
||||
GRANT ALL PRIVILEGES ON DATABASE “smvu2” to schema_auth;
|
||||
ALTER ROLE schema_auth WITH Superuser;
|
||||
```
|
||||
|
|
@ -0,0 +1,55 @@
|
|||
---
|
||||
title: Анализ дисковой активности в Linux
|
||||
description:
|
||||
published: true
|
||||
date: 2023-11-15T17:57:25.992Z
|
||||
tags:
|
||||
editor: markdown
|
||||
dateCreated: 2023-11-15T17:57:25.992Z
|
||||
---
|
||||
|
||||
Расскажу кратко, с помощью каких консольных инструментов можно всесторонне рассмотреть дисковую активность на сервере под управлением Linux.
|
||||
|
||||
Начнём издалека и посмотрим общую дисковую активность отдельного устройства. Для этого можно воспользоваться утилитой btrace из пакета blktrace (есть в стандартных репах)
|
||||
`btrace -w 60 -a write /dev/mapper/rhel-root`
|
||||
|
||||
В течении 60 секунд утилита будет анализировать дисковую активность процессов и потоков ядра. В завершении покажет сводную статистику.
|
||||
|
||||
Наглядный вывод статистики по дисковым устройствам в режиме реального времени есть у iostat из пакета sysstat (есть в репозиториях). Я предпочитаю вот такое отображение с использованием watch:
|
||||
`watch -n 1 iostat -xk`
|
||||
|
||||
Более детально в режиме реального времени нагрузку на диск отдельных приложений можно посмотреть с помощью iotop (есть в репозиториях). Простой запуск без параметров похож на обычный top, только про диски. Более наглядную информацию можно получить, запустив iotop с ключами:
|
||||
`iotop -obPat`
|
||||
|
||||
Ещё один вариант отображения активности процессов в режиме реального времени - pidstat. Она тоже из пакета sysstat. Запускаем с обновлением раз в секунду:
|
||||
`pidstat -d 1`
|
||||
|
||||
Видим активность всех процессов. Можем конкретизировать, указав один из них по его pid:
|
||||
`pidstat -p PID -d 1`
|
||||
|
||||
|
||||
Двигаемся дальше и смотрим, в какие файлы производится запись с помощью fatrace (в deb дистрибутивах есть в репозиториях). Проверка очень простая и быстрая через анализ обращений к inotify.
|
||||
`fatrace -f W`
|
||||
|
||||
Можно записать всю файловую активность в лог файл и потом спокойно посмотреть:
|
||||
`fatrace -t -s 60 -o ~/fatrace.log`
|
||||
|
||||
|
||||
Более детально разобраться с тем, что пишет процесс на диск можно с помощью strace, указав ему в качестве параметра PID процесса:
|
||||
`strace -e trace=write -p PID`
|
||||
|
||||
|
||||
Напомню, что PID процесса или процессов можно узнать, например, вот так:
|
||||
`pgrep mariadb`
|
||||
|
||||
или так:
|
||||
`ps ax | grep mariadb`
|
||||
|
||||
|
||||
Смотрим список открытых файлов в конкретной директории с помощью lsof:
|
||||
`lsof +D /var/log`
|
||||
|
||||
|
||||
Приведённых стандартных инструментов достаточно, чтобы провести основной анализ. Я перечислю ещё несколько удобных инструментов, но их скорее всего придётся ставить вручную, минуя пакетный менеджер, что не очень удобно.
|
||||
◽️ утилита iosnoop из пакета perf-tools (https://github.com/brendangregg/perf-tools), показывает много полезной информации, в том числе latency, чего не делают перечисленные выше утилиты
|
||||
◽️ утилита biosnoop из пакета BPF Tools (https://github.com/iovisor/bcc), показывает активность процессов, в том числе используемые сектора дисков и latency, в этом же пакете к дискам имеют отношения утилиты: biolatency, biotop, bitesize, ext4slower и подобные для других файловых систем.
|
||||
|
|
@ -0,0 +1,70 @@
|
|||
---
|
||||
title: Анализ системы
|
||||
description:
|
||||
published: true
|
||||
date: 2023-11-15T18:00:46.536Z
|
||||
tags:
|
||||
editor: markdown
|
||||
dateCreated: 2023-11-15T18:00:08.853Z
|
||||
---
|
||||
|
||||

|
||||
|
||||
Иногда нужно понять, почему какая-то программа или сам сервер на Linux тормозит. Обычно анализ производительности начинается с высокоуровневых средств top, htop, atop и т.д. Если эти инструменты не дают однозначного ответа, в чём проблема, нужно спускаться на уровень ниже.
|
||||
|
||||
В Linux есть встроенные профилировщики - perf и ftrace. Они входят в состав ядра. На их базе есть большой набор утилит perf-tools, о которых я хочу рассказать. Кратко я уже делал отсылки к ним в разных заметках.
|
||||
|
||||
Автором perf-tools является небезызвестный Brendan Gregg. Производительности Linux у него на сайте посвящена отдельная страница (https://brendangregg.com/linuxperf.html), где в том числе упоминаются эти утилиты. Там же есть видео (https://www.youtube.com/watch?v=FJW8nGV4jxY) по работе с ними.
|
||||
|
||||
Утилиты хорошо структурированы, описаны и приведены примеры, так что работать с ними очень просто. Покажу на конкретном примере. Допустим, нам кажется, что тормозит диск. Надо разобраться, в чём проблема.
|
||||
|
||||
Запускаем утилиту iolatency и смотрим latency диска. Если это современный SSD, то большая часть запросов будут укладываться в диапазон 0 -> 1 мс.
|
||||
```bash
|
||||
./iolatency
|
||||
>=(ms) .. <(ms) : I/O |Distribution |
|
||||
0 -> 1 : 155 |######################################|
|
||||
1 -> 2 : 10 |### |
|
||||
2 -> 4 : 19 |##### |
|
||||
4 -> 8 : 47 |############ |
|
||||
8 -> 16 : 34 |######### |
|
||||
16 -> 32 : 5 |## |
|
||||
```
|
||||
Мы видим, что много запросов имеют latency значительно выше. Попробуем разобраться, что именно отвечает медленнее. Запускаем iosnoop и смотрим на отклик приложений:
|
||||
```bash
|
||||
./iosnoop
|
||||
Tracing block I/O. Ctrl-C to end.
|
||||
COMM PID TYPE DEV BLOCK BYTES LATms
|
||||
jbd2/sda3-28 286 WS 8,0 10834312 32768 0.72
|
||||
kworker/2:1H 140 WS 8,0 10834376 4096 0.31
|
||||
sh 48839 W 8,0 16379904 1073152 5.23
|
||||
sh 48839 W 8,0 16382000 8192 5.12
|
||||
sh 48839 W 8,0 16382016 1310720 7.71
|
||||
sh 48839 W 8,0 16384576 262144 8.88
|
||||
sh 48839 W 8,0 16387648 229376 11.20
|
||||
sh 48839 W 8,0 16385088 1310720 14.12
|
||||
sh 48839 W 8,0 16388096 1310720 32.67
|
||||
sh 48839 W 8,0 16390656 12288 32.67
|
||||
jbd2/sda3-28 286 WS 8,0 10834384 28672 0.67
|
||||
```
|
||||
Я для теста в соседней консоли запустил tar со сжатием, так что все медленные запросы были от него. В данном случае в качестве приложения указана оболочка sh, потому что tar запускает gzip в ней.
|
||||
|
||||
Если у вас несколько дисков в системе и они разные - SSD и HDD, то после общего запуска iolatency, можно запустить с анализом конкретного диска. В одном из примеров Brendan Gregg показывает, что отклик обычного HDD со смешанной нагрузкой read/write может быть существенно уменьшен изменением длины очереди со стандартных 128 до 4:
|
||||
```
|
||||
echo 4 > /sys/block/xvda1/queue/nr_requests
|
||||
```
|
||||
Указанные выше утилиты позволят проанализировать это и оценить результат, подобрать нужное значение.
|
||||
|
||||
Расскажу ещё про утилиту opensnoop. Она делают одну простую вещь - с помощью системных вызовов open() показывает открытые файлы и приложения, которые их открывают. Очень удобно для быстрого анализа того, что вообще происходит с диском.
|
||||
```
|
||||
./opensnoop
|
||||
```
|
||||
Вывод можно ограничить каким-то отдельным процессом по PID, или посмотреть файлы по маске:
|
||||
```
|
||||
./opensnoop -p 181
|
||||
./opensnoop 'log$'
|
||||
```
|
||||
Она же с помощью ключа -x может показать неудавшиеся попытки открыть файл. Это может быть очень полезно в некоторых ситуациях. Например, стартует сервис и не принимает настройки из конфига. Запустив opensnoop с этим ключом можно увидеть, что сервис пытается открыть конфиг по другому пути, а не там, где он у вас лежит.
|
||||
|
||||
Утилиты очень простые для освоения и использования. При этом позволяют выполнить низкоуровневый анализ работы системы и найти узкие места. Я показал пример с диском, но там же в репозитории есть инструменты для анализа cpu и сети.
|
||||
|
||||
Заметку заберите в закладки. Когда что-то пойдёт не так на сервере, пригодится.
|
||||
|
|
@ -0,0 +1,24 @@
|
|||
---
|
||||
title: VPN сервер ipsec
|
||||
description:
|
||||
published: true
|
||||
date: 2023-11-15T17:55:15.923Z
|
||||
tags:
|
||||
editor: markdown
|
||||
dateCreated: 2023-11-15T17:55:15.923Z
|
||||
---
|
||||
|
||||
Самый простой способ с генерацией логопаса и ipsec secret
|
||||
`wget https://get.vpnsetup.net -O vpn.sh && sudo sh vpn.sh`
|
||||
|
||||
Можно скачать скрипт и переделать под себя
|
||||
`wget https://get.vpnsetup.net -O vpn.sh`
|
||||
|
||||
Редактируем поля
|
||||
```
|
||||
YOUR_IPSEC_PSK=''
|
||||
YOUR_USERNAME=''
|
||||
YOUR_PASSWORD=''
|
||||
```
|
||||
И потом запускаем
|
||||
`sh vpn.sh`
|
||||
|
|
@ -0,0 +1,17 @@
|
|||
<!--
|
||||
title: Проброс портов в Windows
|
||||
description:
|
||||
published: true
|
||||
date: 2023-11-15T17:42:22.429Z
|
||||
tags:
|
||||
editor: ckeditor
|
||||
dateCreated: 2023-11-15T17:41:44.280Z
|
||||
-->
|
||||
|
||||
<p>Сколько лет использую Windows, в том числе расшаривая интернет на ней, а только недавно узнал, что оказывается ещё со времён Windows XP система умеет пробрасывать TCP (и только их) порты. Причём как локальные, так и на удалённые системы, которые используют её в качестве шлюза. Информация как-то мимо меня прошла, хотя много раз были ситуации, когда мне бы не помешал подобный функционал. Приходилось выкручиваться без него.</p>
|
||||
<p>Узнал об этом недавно, когда захотел прокинуть запросы внутрь Linux системы, запущенной в режиме WSL. Там уже и узнал, что эта возможность есть уже давно. Выглядит всё максимально просто и понятно. Проброс осуществляется следующим образом:</p><ac:structured-macro ac:name="code" ac:schema-version="1" ac:macro-id="7c2abec7-53ff-4054-b820-83ca4f7c792c"><ac:plain-text-body><![CDATA[netsh interface portproxy add v4tov4 listenaddress=192.168.13.17 listenport=8080 connectaddress=172.23.53.217 connectport=80]]></ac:plain-text-body></ac:structured-macro>
|
||||
<p>Прокинули запросы на 8080-й порт локальной системы в WSL на её внутренний адрес и порт 80. Причём делается это очень просто и быстро. Работает без всяких подводных камней. </p>
|
||||
<p>Важно, чтобы пробрасываемые порты на самой системе не были заняты. Проверять через netstat:</p><ac:structured-macro ac:name="code" ac:schema-version="1" ac:macro-id="86a5a9ca-783c-4a4e-94bf-879cccb4126c"><ac:plain-text-body><![CDATA[netstat -na | find "8080"]]></ac:plain-text-body></ac:structured-macro>
|
||||
<p>Список всех пробросов:</p><ac:structured-macro ac:name="code" ac:schema-version="1" ac:macro-id="e702aad5-756e-42ed-9e6b-98e49be9116c"><ac:plain-text-body><![CDATA[netsh interface portproxy show all]]></ac:plain-text-body></ac:structured-macro>
|
||||
<p>Удаление:</p><ac:structured-macro ac:name="code" ac:schema-version="1" ac:macro-id="186c8482-addb-4c51-bfe1-ee678fa587c0"><ac:plain-text-body><![CDATA[netsh interface portproxy delete v4tov4 listenport=8080 listenaddress=192.168.13.17]]></ac:plain-text-body></ac:structured-macro>
|
||||
<p class="auto-cursor-target"><ac:image><ri:attachment ri:filename="image2022-12-13_18-54-41.png" /></ac:image></p>
|
||||
|
|
@ -0,0 +1,31 @@
|
|||
---
|
||||
title: Проброс портов в Windows
|
||||
description:
|
||||
published: true
|
||||
date: 2023-11-15T17:44:43.816Z
|
||||
tags:
|
||||
editor: markdown
|
||||
dateCreated: 2023-11-15T17:41:44.280Z
|
||||
---
|
||||
|
||||
Сколько лет использую Windows, в том числе расшаривая интернет на ней, а только недавно узнал, что оказывается ещё со времён Windows XP система умеет пробрасывать TCP (и только их) порты. Причём как локальные, так и на удалённые системы, которые используют её в качестве шлюза. Информация как-то мимо меня прошла, хотя много раз были ситуации, когда мне бы не помешал подобный функционал. Приходилось выкручиваться без него.
|
||||
|
||||
Узнал об этом недавно, когда захотел прокинуть запросы внутрь Linux системы, запущенной в режиме WSL. Там уже и узнал, что эта возможность есть уже давно. Выглядит всё максимально просто и понятно. Проброс осуществляется следующим образом:
|
||||
```
|
||||
netsh interface portproxy add v4tov4 listenaddress=192.168.13.17 listenport=8080 connectaddress=172.23.53.217 connectport=80
|
||||
```
|
||||
Прокинули запросы на 8080-й порт локальной системы в WSL на её внутренний адрес и порт 80. Причём делается это очень просто и быстро. Работает без всяких подводных камней.
|
||||
|
||||
Важно, чтобы пробрасываемые порты на самой системе не были заняты. Проверять через netstat:
|
||||
```
|
||||
netstat -na | find "8080"
|
||||
```
|
||||
Список всех пробросов:
|
||||
```
|
||||
netsh interface portproxy show all
|
||||
```
|
||||
Удаление:
|
||||
```
|
||||
netsh interface portproxy delete v4tov4 listenport=8080 listenaddress=192.168.13.17
|
||||
```
|
||||

|
||||