Задать вопрос
  • Какой самый выгодный способ получения удаленного Kubernetes кластера?

    Inlore
    @Inlore
    Можно купить одну vps и катнуть туда k0s в single режим

    Я писал доку по удобному деплою в кубер хелмфайлом, там же в разделе "Быстрый старт" можешь глянуть, как k0s быстро катнуть
    Ответ написан
    5 комментариев
  • Kubernetes dynamic persistent volume в vmware?

    Inlore
    @Inlore
    Если это vsphere кластер, то можно подключить vsphere controller storage interface (CSI) https://vsphere-csi-driver.sigs.k8s.io/

    Нужно:
    - версия vsphere не ниже 6.7U3
    - датастор для хранения дисков, которые будут PV в кубере
    - сервисная учётка с нужными правами https://vsphere-csi-driver.sigs.k8s.io/driver-depl...
    - развернуть в кубере vsphere cloud provider interface (CPI) https://vsphere-csi-driver.sigs.k8s.io/driver-depl... и затем компоненты CSI https://vsphere-csi-driver.sigs.k8s.io/driver-depl...

    Для разворачивания CPI и CSI можно взять helm чарты, которые я делал по манифестам из доков:
    https://github.com/zam-zam/helm-charts/tree/master...
    https://github.com/zam-zam/helm-charts/tree/master...
    Ответ написан
    3 комментария
  • Как грамотно настроить обратное прокси nginx - docker nginx?

    Inlore
    @Inlore
    А nginx контейнера точно слушает 8081 на 127.0.0.1 хоста (запаблишен или использует сеть хоста)?
    Ответ написан
  • Letsencrypt сertbot docker получение с сертификата wildcard?

    Inlore
    @Inlore
    Богдан, чтобы не заниматься ручным обновлением сертификата, прописывая TXT записи в DNS, нужно использовать поддерживаемый DNS, типа cloudflare или cloudns. Общий смысл в том, что certbot (или какой-нибудь acme.sh) будет обращаться по API к DNS, используя некий логин и пароль или токен, чтобы создавать необходимые TXT-записи, они будут проверяться на стороне letsencrypt, после чего будет выпускаться wildcard-сертификат. В таком случае wildcard-сертификаты будут нормально обновляться автоматически.
    Вот тут, например, можно найти список поддерживаемых DNS-провайдеров

    В этом случае команда для выпуска сертификата через certbot будет выглядеть примерно так (на примере cloudflare):
    certbot certonly --dns-cloudflare \
      --dns-cloudflare-credentials ~/.secrets/certbot/cloudflare.ini \
      --dns-cloudflare-propagation-seconds 10 \
      --server https://acme-v02.api.letsencrypt.org/directory \
      --preferred-challenges dns-01 \
      --noninteractive \
      --agree-tos \
      --email <your_email@address> \
      -d <your-domain.name> \
      -d <*.your-domain.name>
    Ответ написан
    Комментировать
  • Почему после git clone в папке не все файлы?

    Inlore
    @Inlore
    Можете попробовать обойти ограничение командой
    git config --system core.longpaths true

    Здесь подробнее
    Ответ написан
    Комментировать
  • Почему нельзя примонтировать в контейнер папку из другого контейнера?

    Inlore
    @Inlore
    Этап 1. Stateless
    Собирайте один образ для обоих контейнеров nginx и php-fpm, в котором у вас будет находится код самого приложения в /app и будут установлены нужные пакеты. Здесь у вас должны быть только не изменяемые во время работы приложения данные. Запускаете оба контейнера, просто для одного точкой входа будет nginx, а для другого php-fpm. Вдвоём места на диске они будут занимать только по размеру образа, т.к. это будет один и тот же readonly-слой
    Этап 2. Statefull
    Все данные, которые изменяются во время работы приложения, должны жить в отдельном хранилище, которое будет подключаться к обоим контейнерам куда-нибудь в /app/storage, будь это просто named volume, какой-нибудь rbd ceph или s3 хранилище (в этом случае nginx туда отправляет просто через определённые для таких данных location)
    Ответ написан
    Комментировать
  • Как через Gitify стянуть пользовательские таблицы в MODX?

    Inlore
    @Inlore
    Добавьте в .gitify в раздел data:
    users:
        class: modUser
        primary:
            - username
    user_group_roles:
        class: modUserGroupRole
        primary:
            - id
            - name
    user_attributes:
        class: modUserProfile
        primary:
            - id
    membergroup_names:
        class: modUserGroup
        primary:
            - id
            - name
    member_groups:
        class: modUserGroupMember
        primary:
            - id


    Общий смысл в том, что надо всего лишь указать название класса (модели), через который данные будут экспортироваться и импортироваться в/из БД. В данном случае мы вытягиваем несколько таблиц (сами юзеры, их разрешения, группы и т.п.)
    5b214feb5235d323041799.png
    Ответ написан
    3 комментария
  • Сайт не доступен в 3х городах РФ. Что делать?

    Inlore
    @Inlore
    Если сайт недоступен из-за блокировок, то, чтобы быстро сделать его доступным, можно арендовать недорогой vps, поставить туда nginx, на nginx настроить proxy_pass на доменное имя, после чего поменять в DNS A-запись на IP-адрес арендованного VPS-сервера.
    А затем уже можно в спокойном темпе думать, что дальше делать и как дальше жить (менять ip, переезжать)

    У моего клиента так на Hetzner IP попал в подсеть, заблокированную РКН. Настроил ему proxy_pass, а спустя какое-то время Hetzner выдал IP из другой подсети
    Ответ написан
    Комментировать
  • Frewalld. Проблемы с ограничением IP (mysql)?

    Inlore
    @Inlore
    Добавляю сервис:
    firewall-cmd --zone=public --add-service=mysql --permanent

    Добавление сервиса в firewalld означает, что вы открываете порты этого сервиса для всех. Просто удалите это правило и всё будет ок
    Ответ написан
    1 комментарий
  • Есть ли способ удаления лишних закрывающих тегов при парсинге?

    Inlore
    @Inlore
    А можно парсить через DOMDocument и получать содержимое body без тегов
    $url = 'http://yandex.ru';
    $result = file_get_contents($url);
    
    $dom = new \DOMDocument();
    libxml_use_internal_errors(true);
    /* По-умолчанию loadHTML использует iso-8859-1, поэтому явно указываем преобразование */
    $dom->loadHTML(mb_convert_encoding($result, 'HTML-ENTITIES', 'UTF-8'));
    libxml_use_internal_errors(false);
    $bodyContent = $dom->getElementsByTagName('body')[0]->textContent;


    В тексте останутся ненужные части, типа скриптов и стилей, но можно перед созданием DOMDocument регуляркой убрать их из html.

    Если не нужен целиком body, можно получать контент отдельных элементов
    Ответ написан
  • Что такое ?? в php и почему нету нигде информации?

    Inlore
    @Inlore
    https://secure.php.net/manual/ru/migration70.new-f...
    Раздел "Оператор объединения с null" ("null coalesce operator")

    ...
    Он возвращает первый операнд, если он задан и не равен NULL
    ...

    Одинаковый результат у вас получается, потому что у $a есть значение и оно не равно NULL

    Т.е. это всё равно что написать
    if (isset($a) && $a !== NULL) {
      print $a;
    } else {
      print 'adsad';
    }
    Ответ написан
  • Как обойти Bad Request: challenge_required?

    Inlore
    @Inlore
    Хорошие приватные прокси такого же региона, в каком зареган аккаунт
    Ответ написан
    Комментировать
  • Как оптимизировать sql запрос с несколькими Join-ами в ActiveQuery Yii2?

    Inlore
    @Inlore
    Using temporary; Using filesort
    говорит о том, что создаётся временная таблица, которая ещё и сортируется переборкой каждого поля.
    Для disabled и date_added есть индексы?
    Ответ написан
    2 комментария
  • Зависает VDS как узнать причину?

    Inlore
    @Inlore
    Kdump включен? Можно посмотреть, если возникает ошибка ядра.
    Недавно столкнулся с проблемой, что CentOS 7 нестабильно работала на Xeon D-1521 интеловского семейства skylake. На skylake в линуксовом ядре (в т.ч. в свежих версиях) есть проблемы с работой с функциями электросбережения, которые динамически понижают частоты. Может помочь установка microcode_ctl пакета из реп
    Ответ написан
    Комментировать
  • Стоит ли обновлять ядро в CentOS 7 с 3.10 до 4 ветки?

    Inlore
    @Inlore
    Имеет смысл, если вам нужны какие-то очень специфичные вещи из ядра, например:
    - Поддержка определённого железа
    - Оптимизация специфичный фс, типа btrfs
    - Софт, основанный на специфичных функциях ядра, типа docker

    Т.к. вы упомянули, что у вас skylake, то у старых версий ядра есть проблемы с управлением питанием на этом семействе процессоров

    А так ядро 3.10 на CentOS7 официально считается стабильным и для него продолжают выходить обновления безопасности.
    Ответ написан
    Комментировать
  • Насколько легко взломать сайт на Wordpress?

    Inlore
    @Inlore
    Про сам вордпресс и его код и плагины вам ответили, а по https поясню:
    Https нужен для того, что соединение между клиентским устройством (комьютер, телефон и т.п.) и веб-сервером было зашифровано, а значит будут зашифрованы и передаваемые данные.
    Что это даёт?
    Если вы логинитесь в админку сайта по обычному http, то на пути от вашего устройства до веб-сервера сетевые пакеты можно перехватить и прочитать переданные вами данные (логин, пароль) в открытом виде в виде текста. Если будет использован https, то сетевые пакеты так же перехватываются, но прочитать их содержимое можно только если расшифровать его закрытым ключом, который хранится на веб сервере. Сами сообщения зашифровываются на стороне клиента открытым ключом, который веб-сервер передаёт любому, установившему соединение.
    При передаче данных обратно, от сервера к клиенту, используется сгенерированная на клиенте пара открытый-закрытый ключ. Тут уже веб-сервер шифрует сообщения открытым ключам клиента, а клиент расшифровывает их своим закрытым.
    Т.е. ключи для расшифровки сообщений текущей сессии знают только клиент и сервер.

    И, да, не слушайте Site Developer, где он в комментариях говорит по поводу того, что клиент не знает, что к нему прилетает, потому что как раз клиентское устройство знает, что к нему прилетает.
    Ответ написан
    6 комментариев
  • Когда менять HDD на сервере?

    Inlore
    @Inlore
    Только SMART, только данные о текущем состоянии диска. Одна и та же модель может прожить и год, и пять лет, заранее вы никогда не будет знать, когда произойдет отказ.
    Да, и поэтому используйте зеркалирование. RAID0 только для быстрых некритичных данных
    Ответ написан
    Комментировать
  • Как настроить автоматическое копирование бэкапов на сторонний FTP?

    Inlore
    @Inlore
    Как раз недавно искал подобное решение и остановился на backupninja
    Умеет по расписанию бэкапить БД и файлы и отправлять их на сторонний сервер разными способами, включая rsync, rdiff, duplicity

    В /etc/backup.d/ создаёте конфиги вида 10-db.mysql , 50-ftp.dup
    Числа в начале файла описывают очерёдность выполнения в случае одновременного запуска (сначала сдампить базу, а затем заливать из папки с архивом на ftp).
    Расширение файла указывает на тип задачи (.mysql - бэкап mysql, .dup - используем duplicity)

    Время выполнение бэкапов по-умолчанию задаётся в /etc/backupninja.conf
    ...
    when = everyday at 01:00
    ...

    Его можно переопределить для каждого отдельного бэкапа в начале его конфига
    when = sundays at 02:00
    when = 30th at 22
    when = 30 at 22:00
    when = everyday at 01            <-- the default
    when = Tuesday at 05:00
    when = hourly

    Подробнее о конфигах backupninja здесь

    Сам duplicity, которым я, например, делаю бэкапы, поддерживает кучу протоколов, в том числе и передачу по ftp. Также поддерживает ротацию бэкапов

    Конфиг для duplicity выглядит примерно так:
    ## Переопределяем время выполнения
    when = sundays at 02:00
    ## Параметры, передаваемые напрямую duplicity при запуске бэкапа
    ## --no-encryption позволяет отключить шифрование архивов с бэкапом и получить обычный .tar.gz
    #options = --no-encryption
    
    testconnect = no
    tmpdir = /tmp
    
    [source]
    include = /var/backups/mysql
    include = /home/user/projects/site1
    exclude = /home/user/projects/.git
    
    [gpg]
    ## Ключ для симметричного шифрования. Duplicity шифрует бэкапы с помощью gpg. Должен быть указан, даже если стоит --no-encryption, хоть и не будет использоваться
    password = 123
    
    [dest]
    ## perform incremental backups
    incremental = yes
    
    ## days of incremental backups before doing full backup again
    increments = 7
    
    ## how many days of data to keep
    keep = 14
    
    ## for how many full backups do we keep their later increments
    keepincroffulls = all
    
    desturl = ftp://backup_user@your_backup_server/
    ftp_password = backup_user_password


    В бэкапах получаются на первый взгляд не очень понятные файлы, типа
    duplicity-full-signatures.20130510T160711Z.sigtar.gpg
    duplicity-full.20130510T160711Z.manifest.gpg
    duplicity-full.20130510T160711Z.vol1.difftar.gpg

    Тут можно чуть поподробнее прочитать про них

    С бэкапами лучше работать самой утилитой duplicity, но можно и вручную их вытащить. Вручную минус в том, что инкрементальные бэкапы придётся вручную накатывать на полные, когда duplicity сделает это автоматом при указании даты восстановления.
    duplicity collection-status src выдаст что-то типа этого
    Total number of contained volumes: 3
    Type of backup set:                        Time:                        Num volumes:
    Full                            Mon Apr 17 00:24:46 2017                 1
    Incremental                     Mon Apr 17 01:00:03 2017                 1
    Incremental                     Mon Apr 17 09:53:38 2017                 1

    после чего можно прочитать содержимое архива на определённую дату
    duplicity list-current-files --time 2017-04-17T05:00:00 src (покажет бэкап Mon Apr 17 01:00:03 2017, т.е. ближайший ДО указанного времени)
    и восстановить
    duplicity restore --time 2017-04-17T05:00:00 src dst

    src - это то, где ваши бэкапы хранятся.
    Это может быть и локальная директория file:///var/backups//
    И ftp ftp://user:password@backup_server//var/backups

    Сами файлы хранятся в vol#.difftar.[tar.gz|gpg], если надо вручную вытащить
    Если шифровали, то сначала расшифровать .gpg, чтобы получить .tar.gz
    Ответ написан
    2 комментария