SEMAPHORE! Автоматизация Linux

Сегодня развернем в докере сервер автоматизации под названием Semaphore. Сразу к делу…

mkdir /root/semaphore
mkdir /my_ssl
nano /root/semaphore/docker-compose.yaml

Создали папки, заполняем докер файл… Естественно везде ставим свои пароли и значения если необходимо

services:
  postgres:
    restart: unless-stopped
    image: postgres:14
    hostname: postgres
    volumes:
      - semaphore-postgres:/var/lib/postgresql/data
    environment:
      POSTGRES_USER: semaphore
      POSTGRES_PASSWORD: semaphore
      POSTGRES_DB: semaphore
    networks:
      default:
        ipv4_address: 172.20.0.100

  web:
    image: nginx
    restart: unless-stopped
    volumes:
       - ./nginx.conf:/etc/nginx/nginx.conf
       - /my_ssl:/etc/nginx/cert
    ports:
       - "80:80"
       - "443:443"
    networks:
      default:
        ipv4_address: 172.20.0.102

  semaphore:
    restart: unless-stopped
    ports:
      - 3000:3000
    image: semaphoreui/semaphore:latest
    environment:
      SEMAPHORE_DB_USER: semaphore
      SEMAPHORE_DB_PASS: semaphore
      SEMAPHORE_DB_HOST: postgres
      SEMAPHORE_DB_PORT: 5432
      SEMAPHORE_DB_DIALECT: postgres
      SEMAPHORE_DB: semaphore
      SEMAPHORE_PLAYBOOK_PATH: /tmp/semaphore/
      SEMAPHORE_ADMIN_PASSWORD: PASS
      SEMAPHORE_ADMIN_NAME: admin
      SEMAPHORE_ADMIN_EMAIL: admin@mail.ru
      SEMAPHORE_ADMIN: admin
      SEMAPHORE_ACCESS_KEY_ENCRYPTION: uWDFSdf234wDAKgvsHrV9Z/teoVQ4geotcogxaBg=
      SEMAPHORE_LDAP_ACTIVATED: 'no' # if you wish to use ldap, set to: 'yes'
      SEMAPHORE_SCHEDULE_TIMEZONE: Asia/Yekaterinburg
      TZ: Asia/Yekaterinburg
      ANSIBLE_HOST_KEY_CHECKING: "False"
    volumes:
      - ./playbooks:/home/semaphore/playbooks
      - /my_ssl:/home/semaphore/ssl
    depends_on:
      - postgres
    networks:
      default:
        ipv4_address: 172.20.0.103

volumes:
  semaphore-postgres:

networks:
  default:
    ipam:
      driver: default
      config:
        - subnet: 172.20.0.0/16

В данном примере создается подключение по https, поэтому нужны сертификаты, их кидаем в папку /my_ssl. Так же нам необходимо настроить прокси. Для этого создадим файлик nginx.conf

user  nginx;
worker_processes  auto;

error_log  /var/log/nginx/error.log notice;
pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}


http {
        server {
          listen 443 ssl;
          server_name  semaphore.domain.com;

          # add Strict-Transport-Security to prevent man in the middle attacks
          add_header Strict-Transport-Security "max-age=31536000" always;

          # SSL
          ssl_certificate /etc/nginx/cert/fullchain.pem;
          ssl_certificate_key /etc/nginx/cert/privkey.pem;

          # Recommendations from
          # https://raymii.org/s/tutorials/Strong_SSL_Security_On_nginx/
          #ssl_protocols TLSv1.1 TLSv1.2;
          ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
          #ssl_ciphers 'EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH';
          ssl_ciphers ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+3DES:DH+3DES:RSA+AESGCM:RSA+AES:RSA+3DES:!aNULL:!MD5:!DSS;


          ssl_prefer_server_ciphers on;
          ssl_session_cache shared:SSL:10m;

          # required to avoid HTTP 411: see Issue #1486
          # (https://github.com/docker/docker/issues/1486)
          chunked_transfer_encoding on;

          location / {
            proxy_pass http://172.20.0.103:3000/;
            proxy_set_header Host $http_host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

            proxy_set_header X-Forwarded-Proto $scheme;

            proxy_buffering off;
            proxy_request_buffering off;
          }

          location /api/ws {
            proxy_pass http://172.20.0.103:3000/api/ws;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "upgrade";
            proxy_set_header Origin "";
          }
        }

        include       /etc/nginx/mime.types;
        default_type  application/octet-stream;

        log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

        access_log  /var/log/nginx/access.log  main;

        sendfile        on;
        #tcp_nopush     on;

        keepalive_timeout  65;

        #gzip  on;

        include /etc/nginx/conf.d/*.conf;
}

После этого запускаем наш докер-компоуз. Т.к. у нас защищенное соединение, необходимо подключаться по DNS имени. Поэтому необходимо в DNS прописать актуальные значения, или в файле hosts на windows.

После этого мы должны попасть на главную страницу.

Логин и пароль вводим те же, что и файлик docker-compose.yaml

Нам сразу же предложит ввести имя проекта.

Заполняем поля и жмем CREATE

Можно сменить язык при необходимости.

Обновление серверной платформы 1С на Linux

Скачиваем дистрибутив c сервером и закидываем на тачку с линуксом. В моем случае версия будет server64_8_3_27_1859.

Прежде чем продолжить, я бы отключил сеансы пользователей от самой 1С-ки.

Переходим в каталог с текущей версией 1С, запускаем службу ras и смотрим идентификатор кластера утилитой rac

cd /opt/1cv8/x86_64/8.3.25.1560/
./ras --daemon cluster
./rac cluster list

Смотрим активные сессии, подставив свой идентификатор


./rac session --cluster="Здесь вставить идентификатор кластера" list | grep session

И далее выгоняем все сессии

./rac session --cluster="Здесь вставить идентификатор кластера" terminate --session="Здесь вставить ID сессии"

Останавливаем службу сервера

systemctl stop srv1cv8-8.3.25.1560.service
systemctl stop ras-8.3.25.1560.service

Отключаем службу

systemctl disable srv1cv8-8.3.25.1560.service
systemctl disable ras-8.3.25.1560.service

Переходим в каталог с установочным файлом, делаем его исполняемым и запускаем

cd /home/user/server64_8_3_27_1859
chmod +x setup-full-8.3.27.1859-x86_64.run
./setup-full-8.3.27.1859-x86_64.run --mode unattended --enable-components server,ws,server_admin

Далее регистрируем службу и автозапуск

systemctl link /opt/1cv8/x86_64/8.3.27.1859/srv1cv8-8.3.27.1859\@.service
systemctl link /opt/1cv8/x86_64/8.3.27.1859/ras-8.3.27.1859.service

systemctl start srv1cv8-8.3.27.1859@default.service
systemctl start ras-8.3.27.1859.service

systemctl enable srv1cv8-8.3.27.1859@default.service
systemctl enable ras-8.3.27.1859.service

systemctl status srv1cv8-8.3.27.1859@default.service
systemctl status ras-8.3.27.1859.service

После этого у нас должно все заработать!

Т.к. у меня единственный кластер, и место на нем ограничено, я удаляю старые версии 1С-ок

Переходим в каталог со старой версией 1С и запускаем деинсталляцию

cd /opt/1cv8/x86_64/8.3.25.1560/
./uninstaller-full

ВАЖНО! Если у вас есть файл usr1cv8.keytab, то его необходимо сохранить и подключить в новой версии…

Подключение Grafana к БД PostgreSQL

В данной статье будем забирать данные из базы PostgreSQL в дашборд Grafana. Переходим к делу:

Первым делом нам необходима развернутая БД и естественно Grafana. В моем случае будет данная среда будет развернута с помощью docker-compose

version: '3.9'

services:
  postgres:
    container_name: postgres
    image: postgres:15
    networks:
      default:
        ipv4_address: 172.20.0.101
    restart: always        
    environment:
      POSTGRES_DB: name_db
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: your_secure_password
    ports:
      - "5432:5432"
    volumes:
      - ./postgres:/var/lib/postgresql/data

  grafana:
    container_name: grafana
    image: grafana/grafana
    networks:
      default:
        ipv4_address: 172.20.0.103
    links:
      - postgres
    restart: always
    ports:
      - '3000:3000'
    depends_on:
      - postgres
    volumes:
      - ./grafana-storage/_data:/var/lib/grafana

networks:
  default:
    ipam:
      driver: default
      config:
        - subnet: 172.20.0.0/16

В базе данных необходимо создать таблицы и наполнить их данными, которые мы будем извлекать… Если прям вручную, то можно с помощью программы DBeaver(бобер). Описывать данный процесс не буду.

Заходим в нашу графану по ip и порту 3000: http://localhost:3000 со стандартным логином и паролем admin:admin

Далее нам необходимо придумать новый пароль или нажать skip, если хотим оставить стандартные.

После этого попадаем в главное окно.

Далее нам необходимо настроить источники. Заходим в Connections — Data sources — PostgreSQL

Заполняем данные для подключения к БД.

Вводим имя источника. Host-URL — нам необходимо указать ip адрес контейнера, тк. они ж у нас в одной виртуальной сети. Имя БД, пользователя и пароль вводим свои, какие задали. Т.к. у нас нет SSL , поэтом упроверку ставим в DISABLE.

Остальные параметры оставляем по умолчанию. Листаем вниз и жмем Save & test

После этого уже можно непосредственно создавать наш дашборд!

Переходим в Dashboards — Create dashboard

Жмем Add visualization

Выбираем наш источник

Далее мы попадаем сразу в создание новой панели и в конструктор запросов. Либо можно создавать запросы с помощью SQL синтаксиса

Мне больше нравится использовать SQL запросы для выборки данных

Построим на основе этого простой график.

Сохраняем панельку и любуемся результатом

Бэкап и восстановление баз 1С на PostgreSQL

В данной статье скрипты и советы для саааааамого базового бэкапа и восстановления. Ни о какой оптимизации или изяществе речи нет. На предприятии всего пару баз, поэтому разглагольствовать нет смысла.

Предполагается что у вас уже все настроено и необходимо сделать бэкап базы в postgresql. Заходим на сервер с БД и выполняем команду:

sudo pg_dump -Fc -h localhost -p 5432 -U postgres -d  buhgalteriya -f /home/ivan/buhgalteriya.custom

-Fc — Указывает что формат вывода custom
-h — Имя или ip сервера
-p — Порт сервера
-U — Имя пользователя для доступа в БД
-d — Имя БД которой надо сделать бэкап
-f — Путь и название БД

Треть пути пройдено! После того как мы сделали бэкап боевой базы, нам необходимо убедиться что она не битая. Для этого необходимо создать тестовую базу в PostgreSQL и зарегистрировать в кластере 1С.

Можно все это по отдельности через консоль, но мы пойдем легким путем через консоль администрирования 1С.

Далее заполняем данные. Желательно поля «Имя» и «База данных» совпадали — что бы потом не запутаться. Потому что имя базы в 1с и в postgres — это разные вещи. Не забываем поставить галочку «Создать базу данных в случае ее отуствия»

База должна появиться в списке. Можно сразу попробовать зайти в 1С и подключиться к базе. Но т.к. она пустая — смысла нет. Поэтому переходим к этапу восстановления.

Возвращаемся на сервер с БД и вводим команду:

sudo pg_restore -h localhost -p 5432 -U postgres -e -W -d test -v /home/ivan/buhgalteriya.custom

-h — Имя или ip сервера
-p — Порт сервера
-U — Имя пользователя для доступа в БД
-e — Прерывает процесс восстановления при возникновении ошибки
-W — Запрос пароля для пользователя
-d — Указывает в какую БД необходимо восстановить
-v — Показывает подробный вывод процесса восстановления

На данном этапе возможна ошибка восстановления. Происходит эт из за того что БД в postgres создана через 1С с какой-то кривой кодировкой. Особо вникать не стал, но решается это удалением БД через postgres и созданием ее снова.

sudo dropdb -h localhost -U postgres test
sudo createdb -h localhost -E UTF8 -U postgres test
sudo pg_restore -h localhost -p 5432 -U postgres -e -W -d test -v /home/ivan/buhgalteriya.custom

После этого у нас все должно восстановиться без ошибок. Можно запустить 1С и попытаться войти в базу. Важно! Было замечено, что если дропнуть БД, потом создать, потом попытаться войти в 1С, то команда восстановления уже не сработает. Т.е. необходимо что бы удаление, создание и восстановление — шло друг за другом, и никто в это время не пытался влезть в базу!

Бинго!

Базовая настройка безопасности Linux (Debian)

Минимальные рекомендации, которые необходимо сделать на Linux сервере.

1. Установить последние обновления (хотя бы безопасности):

sudo apt update && sudo apt upgrade

2. Сменить порт SSH

sudo nano /etc/ssh/sshd_config
Port 2222

3. Установить и настроить брандмауэр (UFW)

sudo apt install ufw
sudo ufw default deny incoming #запрещаем все входящие
sudo ufw default allow outgoing #разрешаем все исходящие
sudo ufw allow ssh #разрешаем стандартный порт 22 
sudo ufw allow 2222 #разрешаем порт 2222
sudo ufw enable
sudo ufw status #смотрим действующие правила

4. Установка и настройка fail2ban

sudo apt install fail2ban
sudo systemctl enable fail2ban

Создаем конфиг

nano /etc/fail2ban/jail.d/01_my_jail.conf
[sshd]
enabled = true
port = 2222
logpath = /var/log/auth.log
maxretry = 3
bantime = 3600

5. Создание пользователя с sudo правами

sudo adduser username
sudo usermod -aG sudo username

6. Отключение root логина

sudo passwd -l root  #блокировка пароля root

Публикация базы 1С на Linux

Предположим что у вас уже установлена Клиент-Серверная платформа 1С… В моем случае это Debian 12 и 1С 8.3.25.1560. Первым делом необходимо обновить пакеты:

apt update && apt upgrade

Устанавливаем сервер Apache и добавляем его в автозагрузку. Так же сразу узнаем его версию:

apt install apache2
systemctl enable apache2
systemctl status apache2
apache2 -v

Создадим папки с публикациями наших баз:

mkdir /var/www/1c
mkdir /var/www/1c/buhtest

Переходим в папку с платформой 1С и публикуем базу:

cd /opt/1cv8/x86_64/8.3.25.1560/
./webinst -publish -apache24 -wsdir buhtest -dir /var/www/1c/buhtest -connstr "Srvr=db;Ref=buhtest" -confpath /etc/apache2/apache2.conf

Перезапустим Apache:

systemctl restart apache2

Пробуем открыть нашу базу через браузер… И если все хорошо, то увидим заветную картину:

Если хотим что бы работало по HTTPS, то необходимо изменить конфигу Apache:

nano /etc/apache2/sites-available/000-default.conf
<VirtualHost *:443>
		SSLEngine on
		SSLCertificateFile /etc/ssl/certs/server1.crt
		SSLCertificateKeyFile /etc/ssl/certs/server1.key
</VirtualHost>

Включаем модуль SSL для Apache и перезапускаем:

sudo a2enmod ssl
systemctl restart apache2

После этого базы будут доступны по протоколу HTTPS!