Задать вопрос
  • Gitlab как клонировать дерево проектов?

    @sergey_privacy Автор вопроса
    Админ со стажем, начинающий DevOps
    cat Clone_git_group.md
    # Как клонировать группу из Gitlab с кучей подгрупп и проектов

    1. Устанавливаем Personal Access Token для пользователя в своем Gitlab-е

    2. Устанавливаем репозиторий и утилиту glab

    ```
    # Add WakeMeOps repository
    curl -sSL "https://raw.githubusercontent.com/upciti/wakemeops..." | sudo bash

    # Install glab
    apt install glab
    ```

    3. Проверяем, что все встало

    ```
    glab --version
    ```

    4. Настраиваем хост для подключения и подключаемся для авторизации

    ```
    glab config init
    glab auth login --hostname --token xxxxx
    ```

    5. Заходим в свой локальный Gitlab, находим нужную группу, справа жмем три точки и смотрим ID нужной группы

    6. Создаем нужную папку для клонирования. Переходим в нее. Запускаем

    ```
    glab repo clone -g -p --paginate --per-page=200
    ```
    Ответ написан
    Комментировать
  • Как в Jenkins триггерить задачу при изменениях в определенном бранче Bitbucket-а?

    @sergey_privacy Автор вопроса
    Админ со стажем, начинающий DevOps
    Попробовал решить через плагин "Bitbucket Push and Pull Request" - не работает.
    Попробовал решить через плагин "Bitbucket Server Integration". Только в "Multibranch pipeline" появляются нужные типы фильтрации. Как это сделать во пристайл типе я так и не нашел.
    Наконец наткнулся на инструкцию и по ней настроил через плагин "Generic Webhook Trigger Plugin".

    Post content parameters ->Variable = "branch"
    Post content parameters ->Expression = "$.changes[0].ref.displayId"
    Token = "мой токен". (При создании веб-хука в битбакете указал его же http://<адрес Jenkins>/generic-webhook-trigger/invoke?token=<мой токен>)
    Optional filter ->Expression = "dev" (нужный мне бранч)
    Optional filter ->Text = "$branch"
    Ответ написан
    Комментировать
  • Как сделать сводный отчет по портфелю ценных бумаг в Google таблицах?

    @sergey_privacy Автор вопроса
    Админ со стажем, начинающий DevOps
    =QUERY({C:C\ARRAYFORMULA(IF(B:B="Продажа";D:D*-1;D:D))};"Select Col1,sum(Col2) where Col1 is not null group by Col1 label sum(Col2)'Количество'";1)
    Ответ написан
  • Как отключить сихронизацию времени между гостевой и хостовой ОС в Virtual Box?

    @sergey_privacy
    Админ со стажем, начинающий DevOps
    VBoxManage setextradata "Bitbucket-Jenkins 192.168.255.121" "VBoxInternal/Devices/VMMDev/0/Config/GetHostTimeDisabled" 1
    
    VBoxManage setextradata "Bitbucket-Jenkins 192.168.255.121" "VBoxInternal/TM/TSCTiedToExecution" 1
    
    VBoxManage guestproperty set "Bitbucket-Jenkins 192.168.255.121" "/VirtualBox/GuestAdd/VBoxService/--timesync-set-on-restore" 0
    
    VBoxManage guestproperty set "Bitbucket-Jenkins 192.168.255.121" "/VirtualBox/GuestAdd/VBoxService/--timesync-set-start" 0

    Смотрим мануалы здесь: "https://docs.oracle.com/en/virtualization/virtualb..."
    Ответ написан
  • Есть ли под Ubuntu (KDE) нормально РАБОТАЮЩИЙ менеджер консолей типа xshell или SecureCRT?

    @sergey_privacy Автор вопроса
    Админ со стажем, начинающий DevOps
    Написал в Asbru-cm о проблеме, они выпустили новый релиз, в котором "забывчивость" программы исправлена. На данный момент это самый удобный менеджер под линукс НА МОЙ ВКУС
    Ответ написан
    Комментировать
  • Как защитить обучающие материалы от слива?

    @sergey_privacy
    Админ со стажем, начинающий DevOps
    Любой контент, отданный пользователю, может быть сграблен. Ни практически, ни теоретически этого избежать не получится. Даже не трать силы/время/деньги на достижение недостижимого.
    Он может поставить камеру и снимать экран.
    Он может подключить устройство по USB и гнать изображение параллельно на соседнее устройство, где происходит запись.
    Ты можешь как угодно пытаться контролировать его компьютер, но он запустит браузер в виртуалке, а на хостовом компе - OSB studio и будет писать все, что творится в виртуалке.
    В этой вселенной на текущем уровне технического развития это абсолютно невозможно. 100500%
    Ответ написан
    Комментировать
  • Как из alertmanager передать текст с переменными по web-hook?

    @sergey_privacy Автор вопроса
    Админ со стажем, начинающий DevOps
    Долгое общение с коллегами по работе и вопросы в гелегоканале девопсов помогли разрулить вопрос.

    Самое смешное, что практически у всех вебхуком оправляется в программу-посредник-телеграмобот, который уже ТАКИМ ЖЕ вебхуком отправляет в API телеграма. На вопрос, а почему сразу напрямую не слать в телеграм? Отвечают одно - не получилось изначально победить, решили накостылить. Лишний трафик, лишняя точка отказа, лишний риск где то по дороге что то потерять. Не наш путь. Показываю, как делать это правильно.

    1. Создаем правило в прометее. Правило простейшее, просто для примера
    # cat /etc/prometheus/rules/alert.rules.yml 
    groups:
    - name: alert.rules
      rules:
      - alert: InstanceDown
        expr: up == 0
        for: 0m
        labels:
          severity: critical
        annotations:
          description: "Server down {{ $labels.instance }} or service {{ $labels.job }}"
          instancename: "{{ $labels.instance }}"
          summary: "Instance down"


    В labels можем напихать любых тегов, которые потом доступны в алертах alertmanager-а. Но только статика. Засунуть переменную типа
    instancename: {{ $labels.instance }}

    У меня не получилось, прометей все время валится и не стартует.

    2. Потом в alertmanager-е настраиваем нативный метод отправки. Можно и через веб-хук с GET-запросом, но там ограничение на длину строки. Придется быть очень лаконичным. Вот простейший проверенный конфиг:

    # cat /etc/alertmanager/alertmanager.yml 
    global:
    
    # Отсюда читаем все шаблоны:
      - '/etc/alertmanager/templates/*.tmpl'
    
    route:
      # Группировка алертов
      group_by: ['alertname', 'cluster', 'service']
      # время ожидания перед отправкой уведомления для группы
      group_wait: 10s
      # время отправки повторного сообщения для группы
      group_interval: 10s
      # время до отправки повторного сообщения
      repeat_interval: 10s
      receiver: 'telega'
    receivers:
      - name: 'telega'
        telegram_configs:
        - bot_token: '<Здесь указываем ваш bot_token>'
          api_url: 'https://api.telegram.org'
          chat_id: <Здесь указываем ваш chat_id <b>БЕЗ КАВЫЧЕК!!!</b>>
          message:  "Alertname: {{ .GroupLabels.alertname }}\n Severity: {{ .CommonLabels.severity }}\n {{ range .Alerts }}{{ .Annotations.description }}\n{{ end }}"
        <b>  parse_mode: ''</b>


    Код присылает уведомления такого вида:
    monitoring_bot, [02.04.2022 14:38]
    Alertname: InstanceDown
     Severity: critical
     Server down 192.168.0.210:8300 or service Consul SD 192.168.0.211


    Важно!!!
    1. chat_id указываем без кавычек
    2. Мои параметры отправки - тестовые, для ускорения дебага. Такие параметры увидеть в реальном мониторинге вы точно не захотите, меняйте сразу.
    3. По умолчанию метод telegram_configs: парсит параметры из прометея и отсылает сообщения только если там был голый текст. Как только попадаются переменные - сообщений не будет. Поэтому парсинг указываем обязательно. Если метод парсинга указан пустой, то передаваемые данные не парсятся и все отправляется.
    4. В прометее, в разделе аннотации, вы можете наплодить любые свои метки типа таких:
    annotations:
          description: "Server down {{ $labels.instance }} or service {{ $labels.job }}"
          instancename: "{{ $labels.instance }}"
          summary: "Instance down"
          aaaaaaaaa: 'XXXXXXXX'
          bbbbbbbb: 'XXXXXXXX'
          cccccccccc: 'XXXXXXXX'


    А в alertmanager-е обращаться к ним вот так:
    {{ range .Alerts }}{{ .Annotations.aaaaaaaaa }}
    Ответ написан
    5 комментариев
  • Можно ли в windows dlna показывать только папки и правильные названия файлов?

    @sergey_privacy Автор вопроса
    Админ со стажем, начинающий DevOps
    Задолбался перебирать DLNA-сервера, но все таки нашел идеальный - Serviio (не реклама, он самый простой в настройке и делает то что надо на 400%)
    Ответ написан
    Комментировать
  • Как скрыть IP адрес сервера?

    @sergey_privacy
    Админ со стажем, начинающий DevOps
    У тебя может наружу торчать только один сервер с NGINX-ом, который в зависимости от порта или dns-имени будет перенаправлять запросы хоть на сотню разных внутренних серверов.
    Пришел запрос на имя aaa.bbb.ccc - перенаправляем его на сервер xxx.yyy.zzz на порт 666.
    Пришел запрос на имя ddd.eee.fff - перенаправляем его на тот же сервер xxx.yyy.zzz, но на порт 777.
    Пришел запрос на имя kkk.lll.mmm - перенаправляем его на сервер rrr.sss.ttt.
    Ответ написан
    Комментировать
  • GRE туннель поверх GRE. Возможно ли?

    @sergey_privacy
    Админ со стажем, начинающий DevOps
    Как вариант, можно попробовать:
    1. Указать в статической маршрутизации не адреса, а конкретные туннели типа
    ip route 192.168.0.1 255.255.255.255 Tunnel0
    2. Проверить статику на всех устройствах. Скорее всего, на стороне филиала будет правильно использовать в статике 2 записи: 1-я запись для указания маршрута к провайдеру, а вторая запись - завернуть весь траффик на туннель: ip route 0.0.0.0 0.0.0.0 Tunnel0
    3. Попробуйте keepalive 2 3 поставить на туннелях. У нас на некоторых кошках с некоторыми ИОСами была проблема, когда туннель не работал без постоянных keepalive-пакетов.
    4. Включите дебаг и посмотрите, где что проходит, а где - нет
    Ответ написан
  • Как проще с помощью jQuery(в крайнем случае чистом JS) перебрать/вывести список всех установленных на сайте куков?

    @sergey_privacy Автор вопроса
    Админ со стажем, начинающий DevOps
    Сам дочитался, допилил:
    $.each($.cookie(),function(index,value){
    alert(index);
    });
    Ответ написан
    Комментировать
  • Где взять таблицу/базу с максимальным количеством вендоров ПО и железа? А реально найти еще список продукции с привязкой по вендору?

    @sergey_privacy Автор вопроса
    Админ со стажем, начинающий DevOps
    При чем здесь драйвера? Есть производитель каких-нибудь межсетевых экранов. Корпус, материнка, сетевые карты - все из общего набора комплектухи рабочих станций или серверов. Такой вендор вообще не попадет в базу драйверов. Производители софта тоже в этом списке отсутствуют.
    Ответ написан
  • Есть ли инструменты/плагины для chrome и firefox, которые поверх страницы могут выводить настраиваемую сетку?

    @sergey_privacy Автор вопроса
    Админ со стажем, начинающий DevOps
    Сам нашел методом перебора - Toggle rulers - то что надо!
    Ответ написан
    Комментировать
  • Какие есть гибкие/настраиваемые CMS?

    @sergey_privacy
    Админ со стажем, начинающий DevOps
    Я много разных движков пробовал. В свое время ModX Evo был крайне неудобным для меня. Зато относительно недавно попробовал modX Revo и однозначно остановился на нем. Не утверждаю, что это самый лучший движок, но лично мне в нем наиболее комфортно и продуктивно работается (соотношение по затраченному времени на 1 сайт).
    Ответ написан
    Комментировать
  • Как переменную php вставить в инпут?

    @sergey_privacy
    Админ со стажем, начинающий DevOps
    <input type="hidden" name="date" value="<? echo date("Y-m-d H:i:s"); ?>">

    Хотя, если дата совпадает с текущей (а это так), то не надо городить огород. Просто у поля типа DATETIME ставим по умолчанию значение "текущая дата". Делается это в настройках самой таблицы. Или при вставке в базу использовать CURRENT()
    Ответ написан
  • Стоит ли делать RAID из SSD?

    @sergey_privacy
    Админ со стажем, начинающий DevOps
    У меня есть один знакомый, который в лучшем смысле этого слова является компьютерным гиком, фанатом, маньяком своего дела. Пару лет назад задал я ему этот же вопрос. Он пытался мне что то объяснить, почему не получится, но прозвучало малоубедительно. Затарились мы с ним пивом, железом и начали тестировать. Интересовал только RAID-0, т.к. нужна была максимальная скорость, а не надежность. Коллега работает "ремонтником", поэтому у него выбор железа под руками оказался приличным. 3 разных контроллера и конфигурации от 2 до 4 дисков были опробованы нами. Скорость - практически такая же, как у одного из дисков. После моего безмерного удивления, собрали на обычных жестких дисках формата 2,5. При конфигурации из 2-х дисков на том же самом контроллере скорость возросла процентов до 190 от скорости одного диска. Три диска дали нам примерно 270 процентов скорости от скорости одного диска. 4 диска- 330-350% от скорости одного диска. Теоретическое обоснование сейчас не вспомню, т.к. не понял его и тогда. Но резюме следующее: сборка SSD в нулевой рейд скорости тебе не прибавит, только уменьшится надежность. Сборка SSD в рейды другого уровня намного быстрее угробит твои диски.
    Ответ написан
    7 комментариев
  • Оправдано ли дублирование полей в БД?

    @sergey_privacy
    Админ со стажем, начинающий DevOps
    Главная задача любой программы - работать быстро. Если без дублирующегося поля приходится делать более сложные запросы, которые выполняются намного дольше, то есть смысл в дублировании. Я неоднократно изначально "вылизывал" базу на этапе проектирования, исключая любое дублирование. Когда нагрузка достигала определенных величин, сервер переставал справляться с некоторыми запросами и слегка притормаживал. Анализ запросов показал, что добавление одного лишнего поля в одну-две таблицы позволит запросы сократить весьма значительно. Объемный пакет операций, который раньше занимал 1,5-3 минуты, стал отрабатываться за 5-10 секунд. Нормализация может быть хороша при достаточных объемах памяти, процессорных мощностях, определенном количестве пользователей. В реальных организациях зачастую ресурсы небезграничны и оптимизация приводит к дублированиям и увеличению объема данных в угоду скорости.
    Ответ написан
    1 комментарий
  • Что быстрее 10 запросов к файлам или 10 к базе?

    @sergey_privacy
    Админ со стажем, начинающий DevOps
    На Ваш вопрос нет однозначного ответа. Аналогично вопросу: что быстрее, поезд или автомобиль? Кто то будет сравнивать советский поезд с бугатти, другой будет сравнивать японские скоростные поезда с жигуленком.

    Базы с поддержкой SQL бывают разные: MySQL, MsSQL, Oracle и т.д. У каждой из них своя методика работы с кэшем, индексами, памятью. Очень многое зависит от размеров базы, размеров таблиц, построения индексов, самого запроса, настроек сервера БД и операционки. Если база нормально сконфигурирована, таблицы с нормальной архитектурой, правильно построены индексы, сервер обладает достаточным количеством памяти, то запрос будет быстрее большинства самопальных решений для работы с файлами.

    Если же файлы проектировала группа высококлассных специалистов, обвязка спроектирована именно под такие запросы, то выигрыш по скорости может быть значительным в этом варианте. Но такой "путь самурая" предполагает перенос объема вычислений в более быструю область сервера: память-процессор. У тебя будет меньше работа с дисковой системой, но вся логика работы приложения должна быть перелопачена под такой вид данных. Без фундаментальных знаний алгоритмов программирования и математики-информатики в целом, такие велосипеды лучше не городить. Теория графов, матрицы, хеши, алгоритмы сортировки должны быть у тебя на уровне выше институтского. Про удобные таблицы на 5-10 полей можешь забыть. У тебя будет куча небольших упорядоченных файлов со списками ключ-значение. Индексы, хеши, хеши по хешам, индексы по хешам и т.д. - это на долгое время будет твой кошмар, который ты должен будешь представлять у себя в голове. Работа с файлами напрямую не имеет смысла, если ты не планируешь создавать высоконагруженное приложение с большими объемами данных. В этом случае у тебя проработка архитектуры хранения данных займет на порядок больше времени, чем проработка архитектуры базы. Предварительный поиск по одному символу, по двум, трем, ссылка на файлы, которые содержат следующую часть, по которой уже идет поиск. Не забудь блокировки файлов, обработку ошибок доступа, обработку оборванных транзакций, уникальность значений, индексов или ключей и т.д. Отсутствие удобных select-ов с join-ами и блэкджеком потребует от тебя проработки возможных видов запросов, чтобы сам вид хранения данных оптимизировать под кастрированные возможности. А из запросов будут только аналоги простейших "SELECT xxx FROM file_yyy WHERE Id=zzz", "UPDATE file_xxx SET yyy WHERE Id=zzz", "INSERT INTO file_xxx yyy=zzz", "DELETE xxx FROM file_yyy WHERE Id=zzz". Этими 4-мя операциями тебе придется обходиться.

    Сейчас есть уже готовые "велосипеды" noSQL, но это не "путь джедая". Типовой сайтик, с десятком или сотней уников в час не стоит такого геморроя.
    Ответ написан
    Комментировать
  • Где можно попрактиковаться в php?

    @sergey_privacy
    Админ со стажем, начинающий DevOps
    Может быть я не прав и вас интересует программирование в качестве развлечения. Но основная масса программистов зарабатывает этим деньги. Поэтому зайдите на биржу фрилансеров, прочитайте первое попавшееся задание и попробуйте его сделать. Потом второе, третье. ДВИЖКИ ПИСАТЬ НЕ НАДО! Возьмите ModX и на нем реализуйте несколько заданий. Потом возьмите вордпресс и еще пару популярных и на каждом по 3-4 задачи сделайте.
    Ответ написан
    Комментировать
  • Как правильно указывать пути из PHP-скрипта?

    @sergey_privacy
    Админ со стажем, начинающий DevOps
    Возможен вариант, что на файл при его закачке были установлены неверные права. Если есть доступ по SSH, то выполните в каталоге с файлом команду
    chmod 444 a.txt
    . Через панель управления хостингом или через FTP тоже можно установить атрибуты файла r--r--r--.

    Чуть выше вам дали тоже верный ответ, но я отвечу чуть более развернуто. Если указываете просто "a.txt", то по умолчанию находит в том же каталоге, где и php-скрипт. В случае указания конкретной папки XXX/a.txt, вы указываете что файл лежит в папке XXX, находящейся в текущей папке со скриптом. Вариант с указанием пути от корня, начинается с символа "/" и зачастую указывает на полный путь от реального корня диска. Но, если мне не изменяет память, директивами веб-сервера можно перебить это и корнем будет считаться корневая папка сервера или конкретного виртуального хоста. Сложнее вариант с многочисленными вызовами разных файлов из разных папок. Один файл может инклудиться из разных файлов в разных подпапках и тогда может возникнуть путаница, когда функция временами работает, а временами не работает. Тут может помочь только вариант указания полного пути от корня.
    Ответ написан