Bitrix VM 7 не обновляются сертификаты letsencrypt

Не перевыпускаются  сертификаты letseycrhpt на Bitrix VM 7.3.(0-3) 
Код ошибки: DLG_FLAGS_SEC_CERT_DATE_INVALID
Такую ошибку я видел уже несколько раз на серверах клиентов и всегда она ставила их в  тупик, поскольку  выдачей сертификатов занимается сама VM
Если у вас сертификат не смог  обновиться то  проверим  смело:

  • Удалите старые сайты, А запись которых не ведет на этот сервер, но сертификат пытается выпуститься на этом сервере.
  • Убедитесь что ААА — запись отсутствует,  letsencrypt не поддерживает эту запись 
  • Убедитесь что для домена www есть А запись и она отдается с этого же сервера.
  • У вас есть место на сервере.
  • Вы уже создали 5 раз за неделю сертификат.
 
Если  сертификат генерируется но не применяется, сразу смотрим патч внизу.
Если все вышесказанное уже сделано, то смотрим как генерируется сертификат в Bitrix VM 7.

В /etc/letsencrypt  ничего нет. Так же ничего нет в crontab,  да и вообще certbot тоже нет.
В Bitrix VM 7 используется dehydrated

Запустим  генерацию сертификатов аналог certbot renew 

 cd /home/bitrix/dehydrated/ && ./dehydrated -c 

Смотрим на чем встала генерация, и исправляем.
В том же каталоге лежит файл   со списком доменов для обновления /home/bitrix/dehydrated/domains.txt
Все что  нам остается это  применить сертификаты.

systemctl reload nginx

Ну и если это не помогло а ошибок при генерации сертификатов уже нет, то пересоздадим сертификат заново в меню VM 8 -> 3 ->1 ( и на вопрос о перегенерации отвечаем да) ждем минуту а желательно открываем в инкогнито и проверяем.

Где и что смотреть 

Запустить генерацию letsencrypt сертификата с консоли:

sudo -u root /opt/webdir/bin/bx-sites -a configure_le --site "site.ru" --email "le@site.ru" --dns "site.ru www.site.ru" -o json

Лог генерации битрикс вм:

 /opt/webdir/temp/номер вашей задачи


Лог генерации сертификата:

/home/bitrix/dehydrated_update.log


Сами сертификаты:

 /home/bitrix/dehydrated/certs


Так же из-за  способа проверки  валидности сертификата самой вм, возможна ошибка

"type": "urn:acme:error:rateLimited",  
"detail": "Error creating new cert :: too many certificates already issued for exact set of domains: site.ru,www.site.ru: see https://letsencrypt.org/docs/rate-limits/",
  "status": 429

Возникнуть она может по двум причинам
— Вы действительно слишком часто его создавали
— Алгоритм обновления сертификата дожидается  валидного завершения от ВСЕХ сайтов! При том он их действительно принудительно пере создает (даже валидные сертификаты).
Как следствие сертификат может быть даже реально создан, но поскольку ожидается код завершения по всем сертификатам на сервере и какой-то из них ошибочный то  ни один из сертификатов не примерится, даже если он реально нормальный.
Тех поддержка обещала исправить баг в коде, однако сроки не называют, так что предлагаю собственный патч на VM

#!/bin/bash
# патчим баг битиркс вм принудительные генерации сертификатов.
if cat /etc/ansible/roles/web/tasks/dehydrated.yml | grep '/home/bitrix/dehydrated/dehydrated -c --force'; then   sed  -i 's/dehydrated -c --force/dehydrated -c/g' /etc/ansible/roles/web/tasks/dehydrated.yml fi


Поскольку попытки действительно кончились, все что нам остается это дождаться следующего дня и убедиться что теперь сертификаты не только создаются но и нормально применяются.


Обратите внимание
ВМ 7.3.4 — полностью изменили  выдачу сертификатов на классическую certbot

Сперто https://klondike-studio.ru/blog/bitrix-vm-ne-obnovlyayutsya-sertifikaty-letsencrypt/

 

Количество элементов в разделе и подразделах с остатком больше 0 в Битрикс

Похоже, что лучше ничего нет, чем

$arSelect = Array("ID");
$sect = CIBlockElement::GetList(
Array("ID" => "DESC"),
Array("IBLOCK_ID" => $arSection["IBLOCK_ID"],
"ACTIVE" => "Y",
"SECTION_ID" => Array($arSection['ID']),
"INCLUDE_SUBSECTIONS" => 'Y',
">CATALOG_QUANTITY" => "0"
),
false,
Array("nTopCount" => 3),
$arSelect);

while ($el = $sect->GetNextElement()) {
$res_count++;
break;
};

 

Документ (счет) в PDF Bitrix

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

Тогда для оживления счета были внесены некоторые изменения в код: Читать далее Документ (счет) в PDF Bitrix

Главное меню с ограничением по активному разделу

В прошлый раз было меню, где выпадали подразделы активного пункта, но и показывалось все остальное меню на ряду с ними. 

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

Мега-долгий запрос в компоненте catalog.section

Или это прикол, или так надо, но никому не надо, но битрикс при выводе элементов раздела зачем-то загружает все свойства каждого элемента, что в некоторых случаях приводит к оооооооочень долгой загрузке страницы сайта. Доходило до 60-70 секунд, если дожидаться до конца.

Тормозит все дело этот запрос:

$query = $connection->query(«
SELECT
P.ID
,P.CODE
,P.TEMPLATE
,P.ENTITY_TYPE
,P.ENTITY_ID
,IP.VALUE
,IP.ELEMENT_ID
FROM
b_iblock_element_iprop IP
INNER JOIN b_iblock_iproperty P ON P.ID = IP.IPROP_ID
WHERE
IP.IBLOCK_ID = «.$this->iblockId.»
AND IP.ELEMENT_ID in («.implode(«, «, $ids).»)
«);

Еще бы написали просто select *, да и зачем мне свойства элементов, если я их не заказывал?!

Итого было принято решение тупо закоментить код функции

public function queryValues()
{ }

Ибо она в моем проекте не нужна. Профит! 0.7-1.5 секунды!

ах, да, лежит все это в /home/bitrix/www/bitrix/modules/iblock/lib/inheritedproperty/elementvalues.php

Добавление в корзину через CSaleBasket::Add()

Как бы все кладется в корзину, но после оформления заказа в админке товар в заказе был без связи с самим товаров.
После долгих переборов было выявлено, что нужно передавать следующий набор данных:

$arFields = array(
"PRODUCT_ID" => $row["ID"],
'CATALOG_XML_ID' => $row['IBLOCK_EXTERNAL_ID'],
'PRODUCT_XML_ID' => $row['EXTERNAL_ID'],
"PRODUCT_PRICE_ID" => 0,
"PRICE" => $_SESSION["BYORDERPRICE"][$row["ID"]],
"CURRENCY" => "RUB",
"QUANTITY" => 1,
"LID" => SITE_ID,
"DELAY" => "N",
"CAN_BUY" => "Y",
"NAME" => $row["~NAME"],
"WEIGHT" => $row["WEIGHT"],
"MODULE" => "catalog",
"NOTES" => "LONGORDER",
"DETAIL_PAGE_URL" => $row["DETAIL_PAGE_URL"],
"CALLBACK_FUNC" => "CatalogBasketCustomCallback",
"ORDER_CALLBACK_FUNC" => "CatalogBasketOrderCustomCallback",
"CANCEL_CALLBACK_FUNC" => "CatalogBasketCancelCallback",
"PAY_CALLBACK_FUNC" => "CatalogPayOrderCallback"
);

Где $row заполняется свойствами элемента CIBlockElement::getList().

Тогда товар попадает в корзину, потом в заказ, и из админки виден со ссылкой на карточку товара.

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

Но теперь все ок )


Обработчик Яндекс Касса yandex (yandex_3) не активен

Не знаю что за чудо, но пропал, хотя и был раньше, обработчик из списка в Битриксе.

Теперь там только эти:

а нужен был такой: Читать далее Обработчик Яндекс Касса yandex (yandex_3) не активен