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

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

Подключение 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

Удаление скрытых имен в Excel

Бывает, у пользователей случается траблы с Excel, в виде каких-то скрытых имен. Для решения этой проблемы пользователю приходится завершать Excel через диспетчер задач, либо кликать по всплывающему окну бесчисленное количество раз…

Открываем Excel и включаем режим разработчика: Файл — параметры — Настроить ленту — Разработчик

В ленте появился новый пункт: Разработчик — Visual Basic

Слева в колонке кликаем два раза на «Эта книга«, и справа в открывшемся окне вводим наш код:

Sub DeleteHiddenNames()
	Dim n As Name
	Dim Count As Integer
	
	For Each n In ActiveWorkbook.Names
		If Not n.Visible Then
			n.Delete
			Count = Count + 1
		End If
	Next n
	
	MsgBox "Скрытые имена в количестве " & Count & " удалены"
End Sub

После этого запускаем наш код

Наслаждаемся результатом. Необходимо сохранить изменения. После этого файл должен работать как положено.

Публикация базы 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!

Активация Windows через KMS сервер

Предполагается что у вас уже развернут KMS сервер, хотя можно взять и интернетовские общедоступные…

Запускаем командную строку от имени администратора и вводим для начала ключи windows:

#Для Windows 10
slmgr /ipk N69G4-B89J2-4G8F4-WWYCC-J464C
#Для Windows 11
slmgr /ipk W269N-WFGWX-YVC9B-4J6C9-T83GX

Далее нам необходимо указать сервер KMS (можно найти в интернете):

slmgr /skms kms.domain.ru

Далее непосредственно активируем Windows!

slmgr /ato