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, то его необходимо сохранить и подключить в новой версии…

Редактирование ссылок в Nextcloud

Возможно, кому-то, когда-то требовалось изменить ссылку общего доступа в Nextcloud. В моем случае, мне необходимо было раскатить пользователям VPN клиенты. Закинул все в облако. А ссылка сформировалась в виде:

Естественно неудобно куда-то заходить, что-то искать, копировать вставлять и тд. Но вообще причин может быть множество. Но перейдем к сути, как изменить ссылку на свою?

Описывать весь процесс не буду, но первое что нам надо, это зайти в базу nextcloud

               sudo mysql -u root

Смотрим БД — Заходим в БД nextcloud — Смотрим список таблиц в БД — Смотрим какие колонки есть в таблице oc_share

               show databases;
               use nextcloud;
               show tables;
               SHOW COLUMNS FROM oc_share;

Далее ищем нашу ссылку. Если сделали недавно или только что, то можно просто отсортировать по ID, если давно, то лучше искать по token (как раз это наша ссылка)

               SELECT id, item_type, file_target, token FROM oc_share ORDER BY id DESC LIMIT 10;
               UPDATE oc_share SET token = "vpn" WHERE id=2049;

Что бы выйти:

\q

После этого у нас ссылка будет выглядеть так:

Бэкап и восстановление баз 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!