Блог и материалы,
Андрей.
Разработчик
Создаю веб-приложения, пишу о технологиях и делюсь опытом. Битрикс, fullstack, немного DevOps.
Bitrix Docker Kit
Полное локальное окружение 1С-Битрикс в Docker. 11 сервисов, быстрый запуск, HTTPS из коробки и удобные скрипты.
Bitrix Hybrid Kit
Гибридный стек для высокой скорости: база данных PostgreSQL/MySQL на хосте, веб-сервер и PHP в контейнерах Docker.
Танчики (Battle City)
Battle City на Phaser 3: классика, арена 360°, кооп на двоих, RPG-рогалик и редактор карт. Свободный запуск в браузере, Android и VK.
Морской бой: Легенды флота
Атмосферная морская тактика с кампанией, карточными умениями и локальным PvP на одном устройстве.
Самолёты: Небесный рубеж
Авиашутер с прокачкой в ангаре, анимированными монетами, 3 биомами и петлей уклонения.
Пошаговое решение: выпуск и продление SSL Let's Encrypt в BitrixVM на CentOS — certbot webroot, nginx, cron. Конфиги, команды, проверка, типичные ошибки, чеклист и диагностика.
После обновления ядра Битрикс кастомный код пропадает или ломается. Как правильно организовать /local: php_interface, init.php, components, templates — чтобы update и composer не затирали правки. Код и типичные конфликты.
Пошаговая настройка canonical в 1С-Битрикс через свойства страницы: SetPageProperty, SetDirProperty и ShowMeta с проверкой результата и типичными ошибками.
Разбираем реальный кейс Bitrix24: у администратора не открывался личный диск, вместо него отображалась лента, а вложения в почте не загружались. Причина оказалась неожиданной — отсутствующее персональное хранилище Disk Storage.
Пошаговое решение ошибки Class not found в PHP: настройка PSR-4 через Composer, конфигурация composer.json, рабочий код, проверка и типичные ошибки при переходе к ООП и отказе от ручных require.
Разбираем ошибку Unix socket lock file is empty в BitrixVM и CentOS. Диагностика MySQL, анализ логов, поиск причины и восстановление запуска сервиса без потери данных.
Сниппеты кода
Полезные примеры и готовые решения
Битрикс: поиск правила скидки с fallback по имени и значению
Метод resolveDiscount() для класса BirthdayCouponSender: поиск активного правила скидки сначала по фиксированному ID, затем по точному совпадению процента и USE_COUPONS, затем по ключевым словам в NAME/XML_ID.
Битрикс: защита от дублей купонов через маркер в поле DESCRIPTION
Методы hasCouponForYear() и buildCouponMarker() для класса BirthdayCouponSender: проверка уже выданных купонов за текущий год через строку-маркер 'birthday_coupon:user=N;year=YYYY' в поле DESCRIPTION таблицы купонов.
Битрикс: батчевый обход пользователей для рассылки купонов
Методы sendCouponsInBatches() и processBatch() для класса BirthdayCouponSender: постраничный обход активных пользователей через lastUserId вместо OFFSET, проверка дней до дня рождения, защита от дублей за год.
Docker: 403 Forbidden в Bitrix-окружении
Решение ошибки 403 Forbidden при развёртывании Bitrix в Docker — конфликт именованных томов, права доступа и force-recreate.
PostgreSQL: Node.js (pg) — Pool, параметризованные запросы, JSONB
Подключение к PostgreSQL из Node.js через пакет pg: Pool, query с $1 $2, запросы по JSONB. Копируй — вставляй — работает. По документации node-postgres.
PostgreSQL: JSONB и GIN-индекс — таблица, запросы, индексы
Создание таблицы с JSONB, GIN-индекс для быстрого поиска, операторы @> и ?. Копируй — вставляй — работает. По документации PostgreSQL.