Задать вопрос
  • Как работают дедлоки?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    Этот дедлок - проявление MVCC, механизма, чтобы несколько пользователей могли работать с БД одновременно.
    Визуализировать эту ситуацию можно как перекрестные стрелки в зависимостях
    667ef3df77793070431787.png

    Если мы говорим про postgres, то если ты обновил какую-то запись (кортеж), то неявно получаешь на нее (запись) блокировку. Когда кто-то другой хочет обновить эту же запись, то ждет ее освобождения.
    В данном случае (визуализация), 1 процесс выполнял UPDATE X, Y а другой UPDATE Y, X, т.е. первый взял блокировку сначала на X потом на Y, а другой - сначала на Y потом на X. Первая блокировка успешна, но вторые нет - они уже заняты.
    В данном случае, разрешить их нельзя, т.к. оба ждут пока один из них снимет блокировку, но этого не произойдет. Блокировка со строки снимется по окончании транзакции.

    Совет про сортировку взят, чтобы привнести единообразие в работу. Грубо говоря, дедлок появляется, когда нет согласованности в работе. Если оба выполнят UPDATE X, Y (в таком порядке), то дедлока не будет т.к. один из них сможет взять все блокировки на строки успешно. Поведение второго будет уже зависеть от уровня сериализации:
    - Read committed - обновит новые данные
    - Другие (repeatable read, serializable) - ошибка выполнения
    Это уже детали MVCC в postgres (read uncommitted нет)
    Ответ написан
    3 комментария
  • Как узнать будет ли работать колонка по usb на ubuntu?

    @Stariyded
    Сетевой админ
    На сайте производителя заявлено поддержка "ПК и Мас", что включает как винду, так и линуксы. По идее usb-устройства должны нормально работать в убунте
    Ответ написан
    5 комментариев
  • Нужен ли отдельный linux user для сайта?

    CityCat4
    @CityCat4
    //COPY01 EXEC PGM=IEBGENER
    что теперь нет нигде www-data и копипаст каких-то решений\конфингов может не завестись.

    И это очень хорошо, потому что бездумная копипаста может попросту сервак убить :)
    подскажите пожалуйста как делайте вы и почему именно так?

    Стандартный принцип - каждый сервис работает от своего юзера. redis - от юзера redis. mysql - от юзера mysql. apache - от юзера apache. Это на тот случай, если кто-то проломит сервис - он получит не права рута, а права сервиса, которые заметно меньше.
    Да, иногда нужно потанцевать с правами, но оно того стоит.
    Ответ написан
    Комментировать
  • Нужен ли отдельный linux user для сайта?

    neuotq
    @neuotq
    Прокрастинация
    Практик очень много, тут лучше идти в сторону лучших практик от devops, это большая тема, но полезная.

    Но если упрощенно и по старинке и быстро.
    1. Доступ на сервер только по ssh ключам, никаких паролей.
    2. Отдельный момент по sudo
    2.1 Для пользователя админа в целом оставляем запрос пароля на sudo
    2.2 Для сервисных аккаунтов(условные www-data и компашка,которые для служб, сервисов, автоматика того же ларавел) делаем sudo без пароля для избранных команд/программ. Таким образом автоматизация будет работать сама, независимо и стабильно.
    3. Бонус пункт. Подумать о переходе на докер контейнеры на сервере, многие штуки упрощаются. Можно начать с интеграции того же laradock как самый быстрый и лёгкий старт.
    PS почему rsync? Почему хотя бы не скрипты которые фетчат гит репо. rsync для некоторых сценариев бекапа еще понятно, но для деплоя кода ну не знаю. Более прозрачная схема через гит и билд на сервере. В крайнем случае в тот же гит можно и сбилженные релизы добавлять и их разворачивать на сервере.
    Ответ написан
  • Нужен ли отдельный linux user для сайта?

    Какой существует бестпрактис при разворачивании lemp стека с точки зрения пользователей.

    Обязательно нужен отдельный пользователь для работы веб-сервера, субд, php-fpm, redis итд - каждому из них выдать доступ только к тем директориям и файлам, к которым им доступ необходим.

    Нельзя чтобы они работали от рута или имени обычного пользователя, тк таким образом ты увеличиваешь площадь для атаки.

    А одном тг чатике сказали, что делают своего юзера, пусть будет app, через него запускают nginx и php-fpm и его же назначают владельцем и группой для файлов сайта (var/www/app), дают ssh авторизацию.

    Не вижу смысла выдавать app-юзеру права на логин по ssh. Все настройки можно делать и от имени административного пользователя - главное потом проверить что права выданы корректно.

    НО и надо помнить, что теперь нет нигде www-data и копипаст каких-то решений\конфингов может не завестись.

    Не вижу в этом никаких проблем - лишний раз включишь мозг чтобы понять, что ты там в конфигах воротишь => будешь сам знать где может быть потенциальная дыра или ошибка.

    у меня все работает, но, возможно, я не вижу какой-то ошибки, которая потом, в ci\cd, jenkinse, ansible или еще где-то мне ногу отстреллит.

    Значит потом для cicd / jenkins / ansible также заведёшь пользователя с нужными правами, как и у тебя, чтобы ворочать конфиги и файлы.
    Ответ написан
    2 комментария
  • Обработка 445 задач в секунду на Laravel?

    nokimaro
    @nokimaro
    Меня невозможно остановить, если я смогу начать.
    Очевидно обработку делать в фоне, используем очереди (queue), можно в том же redis.
    Дальше простая математика, например:
    Если одна задача из очереди обрабатывается в среднем за 0.5 секунд то вам понадобится минимум 222 обработчика очереди чтобы успевать обрабатывать 445 задач в секунду
    Каждый обработчик требует ресурсы сервера (CPU, RAM) и исходя из этого уже можно обозначить требования к машине где это будет крутиться
    Желательно БД сервер и redis сервер запускать на отдельных машинах чтобы нагрузка от них не мешала работе приложения.
    Ответ написан
    1 комментарий
  • Как получить XSRF-TOKEN куку в postman (laravel sunctum)?

    colonel
    @colonel
    Разработчик PHP, Laravel
    Домен .local заменить на .loc
    Ответ написан
    Комментировать
  • Почему ругается на сертификат (mkcert)?

    CityCat4
    @CityCat4
    //COPY01 EXEC PGM=IEBGENER
    Потому что русским по черному написано - subjectAltName не содерждит "nginx.localhost", а видимо надо. Нужно добавить SAN и в SAN прописать DNS:nginx.localhost. Хотя можно наверное и в CN его попробовать пихнуть - непонятно, почему Вы CN не заполнили.
    Ответ написан
    Комментировать
  • Как реализовать передачу кук сейсии на express.js и vue.js на разных портах?

    yarkov
    @yarkov Куратор тега Vue.js
    Помог ответ? Отметь решением.
    Как можно решить эту проблему?

    Traefik + Docker + mkcert решают проблему навсегда. Расписывать как их вместе завести это не влезет в ответ к этому вопросу.
    Просто рекомендую ознакомиться с приведёнными технологиями.
    Docker - запускаем 2 контейнера с фронтом и бэком
    Traefik - маршрутизирует запросы между контейнерами
    Mkcert - генерирует SSL сертификаты, которые можно использовать с Traefik локально
    Ответ написан
    2 комментария
  • Как тестировать данный метод?

    AleksandrB
    @AleksandrB
    Совсем недавно вывел "Hello world"
    - Метод setAuth был вызван ровно 1 раз
    - Метод sendRequest был вызван с конкретным параметром ровно 1 раз (хотя создание Request стоит вынести в фабрику)
    - После выбрасывания ClientExceptionInterface будем выброшено Exception

    Да, метод выглядит очень простым для тестирования, но если вы покрываете все юнит тестами то необходимо покрывать именно все. В какой-то момент sendRequest может начать принимать другой тип данных и если это не покрыть то будет вызвана ошибка уже на проде.
    Ответ написан
    3 комментария
  • Как исключить URL из правила редиректа?

    ky0
    @ky0 Куратор тега Nginx
    Миллиардер, филантроп, патологический лгун
    Это вы попытались привнести в нгинкс апачевский htaccess? Не надо так писать, разделите по-человечески на несколько локейшенов с разной обработкой.
    Ответ написан
    5 комментариев
  • Как через jms/serializer десериализовать null?

    SilenceOfWinter
    @SilenceOfWinter Куратор тега PHP
    та еще зажигалка...
    а как он задает приватное свойство?
    типы свойств jmsyst.com/libs/serializer/master/reference/annota...
    как вариант
    final class Element
    {
        /**
         * @XmlAttribute
         */
        private ?int $zone = null;
        public function __set(string $name, $value)
        {
               if ($name === 'zone' && $value === 0) {
                     $value = null;
               }
               $this->{$name} = $value;
        }
    }

    или
    final class Element
    {
        /**
         * @XmlAttribute
         */
        private ?int $zone = null;
    
        public function __get(string $name)
        {
               if ($name === 'zone' && $this->zone === 0) {
                     return null;
               }
               return $this->{$name};
        }
    }
    Ответ написан
    6 комментариев
  • Что означает синтаксис dockerfile (php-fpm)?

    Vamp
    @Vamp
    что такое dev суфикс (freetype и freetype-dev) и как понять какую версию ставить (я ставил методом тыка, когда получал ошибки и гуглил)

    Dev суффикс означает, что в данном пакете присутствуют файлы, необходимые для компиляции кода, использующего устанавливаемую библиотеку. Устанавливать нужно обе версии. Обычная версия "freetype" содержит саму библиотеку в so файле, которую gd будет подключать в рантайме. Dev версия "freetype-dev" нужна для сборки самого gd, так как модуль собирается из исходников.

    почему, например, для mycrypt мне сперва нужно загрузить именно libmcrypt-dev, потом через pecl скачать mcrypt, а потом через алиас docker-php-ext-enable включить (экспериментировал и не работает с другими сценариями), а если смотреть на opcache, тот тут сразу docker-php-ext-install и все, а xdebug еще один сценарий: pecl -> docker-php-ext-enable - почему все по разному, как это понять?

    Для разных модулей требуются разные сторонние библиотеки. Для gd это freetype (для работы со шрифтами), libpng (для поддержки формата png), libjpeg-turbo (для поддержки jpeg). У opcache таких зависимостей нет, поэтому ничего дополнительно устанавливать не требуется.

    в чем отличие этих сценариев установки расширений (что делает каждая команда, простыми словами)?

    У php есть модули, которые поставляются с самим php. Например: zip, opcache, pdo_mysql, intl. Такие модули устанавливаются специально предусмотренным для этого скриптом docker-php-ext-install. Этот скрипт распаковывает исходники php, собирает запрошенные вами модули, копирует их в /usr/local/lib/php/extensions/no-debug-non-zts-20190902 (в других образах php путь может отличаться), прописывает загрузку модуля в ini и удаляет распакованные ранее исходники. То есть под капотом скрипт docker-php-ext-install вызывает скрипты docker-php-source, docker-php-ext-configure, docker-php-ext-enable.

    А есть модули, которые хостятся отдельно на сайте pecl.php.net. Это официальный репозиторий, где хостятся всякие разные сторонние модули типа mcrypt, imagick, xdebug. Для их установки нужно использовать утилиту pecl. Так как pecl автоматически не включает модули в ini, из-за этого необходимо самому включать их при помощи скрипта docker-php-ext-enable.

    нагуглил что
    docker-php-source - создает /usr/src/php

    Ещё распаковывает туда исходники самого php и поставляемых с ним модулей.

    docker-php-ext-install - скачивает (ОТКУДА?)

    Из архива /usr/src/php.tar.xz

    docker-php-ext-configure- конфигурирует перед установкой (что это значит?)

    Этот скрипт настраивает настройки, с которыми будет скомпилирован модуль. Например, тот же gd можно собрать без поддержки jpeg если сконфигурировать без опции --with-jpeg. Нужно ли запускать docker-php-ext-configure так же зависит от того, что написано в документации. Очень мало модулей требует предварительной конфигурации перед установкой. Мне на ум приходит только gd.

    В целом, официальная документация php вам поможет понять каким способом нужно устанавливать модули. Смотрим раздел requirements. Если написано "This extension is bundled with PHP", значит нужно устанавливать при помощи скрипта docker-php-ext-install. Если написано что-то вроде "This PECL extension is not bundled with PHP", значит нужно устанавливать через pecl.

    Независимо от способа установки, нужно всегда устанавливать библиотеки, от которых зависят конкретные нужные вам модули. Например, в том же imagick написано "ImageMagick >= 6.2.4 is required". Это значит, что нужно установить библиотеку imagemagick. В вашем базовом образе на основе alpine 3.16 в репозиториях ОС присутствует версия 7.1.0, которая подходит под условие >= 6.2.4:

    /var/www/html # apk info imagemagick
    imagemagick-7.1.0.35-r0 description:
    Collection of tools and libraries for many image formats
    
    imagemagick-7.1.0.35-r0 webpage:
    https://imagemagick.org/
    
    imagemagick-7.1.0.35-r0 installed size:
    4664 KiB


    Для intl нужна "ICU library, version 4.0.0 or newer". Такая библиотека тоже присутствует в репозиториях альпины:

    /var/www/html # apk info icu
    icu-71.1-r2 description:
    International Components for Unicode library
    
    icu-71.1-r2 webpage:
    https://icu.unicode.org/
    
    icu-71.1-r2 installed size:
    796 KiB


    Dev версии библиотек нужны только в момент установки модулей. Дальше их желательно удалить, чтобы уменьшить размер вашего образа.
    Ответ написан
    6 комментариев
  • Как реализовать релейшен в laravel?

    Fragster
    @Fragster
    помогло? отметь решением!
    Такая промежуточная таблица предполагает, что количество размеров равно количеству цветов. Лучше сделать две таблицы. Ну, или можно одну полиморфную (product_id, relation_type, relation_id), но это в данном случае нерационально.
    Тип отношения называется many-to-many
    Ответ написан
    2 комментария
  • Какие способы доставки приложения на prod существуют в gitlab?

    4. Хоть тысяча, хоть миллион - проблемы вряд ли возникнут. В крайнем случае упаковать в архив и передать на прод в виде архива, и там его распаковать.
    Можно ещё с докером попробовать заморочиться.

    И да, на проде гит тебе не нужен.
    На счёт composer не подскажу, но по идее тоже не нужен, если отправлять сразу с загруженными зависимостями.

    С nuxt - точно также билдишь в gitlab ci и отправляешь уже собранные артефакты.
    Чтобы не уходить в простой, пока файлы подменяются - сделать хотябы два узла и раскатывать blue-green или rolling update.

    Вообще самой хорошей практикой считается собрать все твои результирующие файлы в какой-нибудь пакет/контейнер и сохранить его в каком-нибудь репозитории пакетов (Artifactory к примеру) в том же ДЦ, что и твоё основное приложение, а потом с рабочего узла его вытянуть и раскатать.

    Но в простом случае легче будет запаковать файлы в tar и передать по scp
    Ответ написан
    3 комментария
  • Как правильно настроить редирект htaccess если поменялся url_path товара?

    @dodo512
    nginx
    rewrite ^/catalog/razdel-1/(.*)$ https://foo.ru/catalog/NOVIY-RAZDEL/$1 permanent;


    .htaccess
    RewriteRule ^catalog/razdel-1/(.*)$ https://foo.ru/catalog/NOVIY-RAZDEL/$1 [R=301,L]
    Ответ написан
    2 комментария
  • Как организовать код в laravel?

    В альтернативу ответу который уже отмечен верным предложу вариант с Rich Domain Model.

    Работайте не с отдельным Item, а с целым заказом.
    Добавьте в сущность заказа метод changeItemQuantity(Item $item, integer $quantity)
    И в нем помимо смены количества в том числе производите пересчет всего заказа.
    Ответ написан
    1 комментарий
  • Как организовать код в laravel?

    @vism
    подскажите как бы вы сделали, где и как мне пересчитывать сам заказ, после смены его списка товаров?

    у меня в голове
    1) создаю сервис класс
    2) инициалиирую его в конструкторе контроллера
    3) в методе контроллера одной строкой меняю данные корзины
    4) тут же ниже дергаю метод сервиса "обновить заказ"
    но с другой стороны, другому программисту ничего не мешает взять обновить данные корзины
    и все, не пересчитывать заказ... как обезопаситься от этого?


    Вот чес слово, светлая голова! думаешь о другом программисте.
    А всё просто, не надо в контроллере обновлять.
    Сделай сервис класс, где будут методы обновления и перерасчёта.
    И прямо там это делай.
    Т.е. метод обновить данные корзины, в котором будет обновление и вызов метода этого же класса для перерасчёта заказа.
    И не забудь всё это в одну транзакцию обернуть.

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

    Но это всёравно ему заговнокодить не помешает.
    Для того, чтоб не дать говнокодить нужно как минимум симфони там делать сложные тру структуры кода, которые писать в раз 10 дольше, чем сервис класс на ларавель. А ещё в 10 раз можно больше самому намудрить(если ты задал вопрос тут, на который я отвечаю, то тебе это пока рано).
    А ещё чтоб всё тру-тру было, надо тесты прикрутить, что всё это ещё умножит на х3 по времени и тоже не даст гарантий:)

    И самое главное, бизнес будет тебя просить как ты щас делаешь с риском что кто-то сделает баг и потом пофиксить его, чем делать всё по канонам в 10-30 раз дольше, дороже и увеличия очень сильно вход для программситов. Ну а баги там тоже будут, только намного более сложные и трудноловимые.
    За мои 12 лет я понял, что надо делать как хочет бизнес, а это максимально простой, понятный код и иногда фиксить баги. И ВСЕГДА вычищать технический долг.
    626035402f57d385357678.jpeg
    Ответ написан
    5 комментариев
  • Как организовать доступ по доменным именам к разным проектам к vps?

    @mureevms
    Направление мысли верное, но детали не совсем.

    1. По домену все так.
    2. Домен надо делегировать на DNS хостинг. Поэтому не покупайте домен в nicru, они оборзели уже давно и хотят за это деньги. Купите на 2домен.ру или где еще, где бесплатный DNS хостинг.
    3. Да, создаете в админке DNS доменные имена третьего уровня (A записи) и в качестве дестинейшн указываете IP адрес VPC.
    4,5. Можно и в докере, даже удобнее будет. Тем самым будете указывать proxy_pass по имени контейнера приложения, иначе столкнетесь с тем, что при пересоздании контейнеров придется менять адреса в конфиге nginx, т.е. porject1.domain.ru -> porject1_container_name:1000

    Совершенно не изврат, это верный подход.
    Ответ написан
    2 комментария
  • Как синхронизироваться с файлами на vps при локальной смене ветки git?

    @Akela_wolf
    Extreme Programmer
    А зачем вам гит на vps? Должен быть какой-то один "источник правды".

    Мне кажется что история должна быть такой: git server (github/gitlab/etc) -> local repository -> rsync to vps -> volume to docker

    Соответственно, когда вы меняете ветку в локальном репозитории - rsync видит изменения файлов и синхронизирует их с vps, который ничего про гит не знает - для него это просто набор файлов.
    Ответ написан
    1 комментарий