• Есть ли какие-то best practices как организовывать файлы веб-проекта с докером?

    Уж не так все и просто, комрад ;)

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

    Итого, у вас в группе проектов на GitLab (или в организации на GitHub) должно выйти примерно следующее:

    /project-group (organization):
        /api - сюда можно вынести api вашего проекта.
        /desktop - здесь ваш web-проект для desktop на php, например.
        /mobile - здесь ваш web-проект для мобильной версии сайта, на той-же node.js.
        /admin - здесь ваша админка.
        /infrastructure - ну, или назовите проще, "server". Здесь ваши Dockerfile, docker-compose, ci/cd скрипты и т.п.


    Чтобы моч варировать вашу инфраструктуру в зависимости от окружения, вы должны разделить репозиторий инфраструктуры на отдельные сервисы. Например, не все сервисы проекта должны запускаться в test окружении или на сервере тестовых веток на поддоменах, когда вы делаете домены вида "feature-1.test.project.com", чтобы ваши тестировщики могли тестировать фичи параллельно и независимо друг от друга. Так же, на dev и/или test окружениях может потребоваться сделать сервисы-заглушки на внешние api которые вы используете. Ну, например, на сервисы онлайн оплаты товаров на вашем сайте, которые будут отвечать всегда "OK" или не "OK".

    Поэтому, чтобы можно было поднять среду с отличным от prod составом сервисов, нужно разделение.

    Таким образом, в репозитории infrastructure должно получиться примерно следующее:

    /infrastructure
       /api
           service.yml
           build.yml
           deploy.yml
       /mobile
           service.yml
           build.yml
           deploy.yml
       /desktop
           service.yml
           build.yml
           deploy.yml
       /admin
           service.yml
           build.yml
           deploy.yml
       /mysql
           mysql.cnf
           service.yml
       /redis
           redis.conf
           service.yml
       /php-fpm
           Dockerfile
           www-conf
           php.ini
           service.yml
       /nginx
           nginx.conf
           /prod
                site.conf
           /test
                site.conf
           /dev
                site.conf
       /cron
           Dockerfile
           crontab
           service.yml
    mobile-dev.sh
    desktop-dev.sh
    prod.sh
    test.sh


    В этих самых *.sh файлах, что указаны выше, вы производите запуск нужного состава сервисов. К примеру, разработчику мобильной версии на react не обязательно покупать мощный ПК, чтобы на его машине запускать вообще весь проект, с mysql, redis, admin и другими сервисами. Вам будет достаточно собрать образ мобильного приложения, и написать в mobile-dev.sh примерно следующее:

    docker-compose -f mobile/service.yml pull;
    docker-compose -f mobile/service.yml down;
    docker-compose -f mobile/service.yml up --detach;


    Ну а в mobile/service.yml может быть что-то следующее:

    version: "3.7"
    
    services:
      mobile:
        image: keymetrics/pm2:10-alpine
        environment:
          APP_ENV: ${APP_ENV}
          APP_LANG: ${APP_LANG}
          API_URL: ${API_URL}
          BASIC_TOKEN: ${BASIC_TOKEN}
        working_dir: /app
        command: pm2-runtime start config.js --env $APP_ENV
        volumes:
          - /etc/timezone:/etc/timezone:ro
          - /etc/localtime:/etc/localtime:ro
          - ${APP_DIR}:/app
        restart: always
        container_name: mobile


    API_URL при этом, можно приземлить на ваш тестовый или dev сервер. Таким образом, разработчик мобильной версии сайта будет иметь всегда ту версию api, которая по факту используется в проекте. Соответственно, код приложения должен уметь работать с переменными окружения для настройки своих параметров.

    Ваш сайт - так же, должен запускаться отдельным service.yml файлом. Service.yml - можно поменять на docker-compose.yml в директории каждого сервиса, но, service здесь смотрится красивее.

    Если требуется поднять все сервисы, необходимо передать последовательно все service.yml файлы через -f флаг вашему docker-compose. Это будет громоздкая команда, поэтому и делаются отдельные *.sh файлы для запуска.

    Требуется понимать, что не следует хранить Dockerfile в репозитории каждого проекта, если наличие образа потребуется для этого проекта. Не каждый разработчик умеет делать Dockerfile и, например, устанавилвать расширения для PHP в рамках этих Dockerfile. Делегировав ответственность по сборке Dockerfile разработчикам проекта, вы рискуете получить неработающий сервис. Лучшее место для Dockerfile - в нашем примере, это репозиторий infrastructure, находящийся в распоряжении ваших DevOps-инженеров.

    Та же история и с описанием build-процессов и процессов CI/CD. Не следует доаверять разработчику сборку его приложения в рамках целой огромной инфраструктуры проекта. Для этого в примере репозитория infrastructure - есть файлы build.yml/deploy.yml, в которых описана сборка и доставка сервисов. Любые CI/CD средства могут подключать фрагменты pipeline с внешних репозиториев, поэтому, когда у вас возникнет потребность сделать автобилд и автодеплой - проблем не будет, вы ведь уже учли все подводные камни совместной работы специалистов в вашей компании.

    Прошу учесть следующее.

    Выше описано, как правильно реализовать ваш проект на docker + docker-compose. Здесь не учтено наличие swarm-mode или kubernetes, тем не менее, данную структуру будет гораздо проще использовать в режиме swarm или c использованием kubernetes.

    ЗЫ. Конечно, есть и другие рабочие практики на эту тему ;) Эта нравится мне больше всего, и работает универсальней остальных.
    Ответ написан
    3 комментария
  • Как максимально быстро открыть ИП?

    @Narts
    Рассмотрят в течении 3 дней и потом скажут идти в налоговую для передачи документов.
    Через час после сдачи документов ИП уже будет открыто
    Ответ написан
    2 комментария
  • Как добавить openvpn-client соединение в автозапуск?

    @pcdesign
    А если так попробовать
    sudo systemctl enable openvpn-client@MyVPN
    Ответ написан
    Комментировать
  • Как добавить openvpn-client соединение в автозапуск?

    @rPman
    как вы так гуглили что команду systemctl нашли а про ключ enable нет?
    https://linoxide.com/linux-how-to/enable-disable-s...
    Ответ написан
    Комментировать
  • Как добавить openvpn-client соединение в автозапуск?

    karabanov
    @karabanov Куратор тега Linux
    Системный администратор
    systemctl enable openvpn-client
    Ответ написан
    Комментировать
  • Как в команде time задать на проверку длинную команду с другими параметрами?

    saboteur_kiev
    @saboteur_kiev Куратор тега Linux
    software engineer
    /usr/bin/time [-timeoptions] command [-commandoptions]

    Аргументы, которые следуют после команды будут относиться к команде, а не к time
    Ответ написан
    Комментировать
  • Как удалить повторяющиеся br?

    mosesfender
    @mosesfender
    Меланхолик, параноик, падал с коек
    Есть DOMDocument. Загружаешь в него весь текст, выбираешь все узлы br, и бегаешь по ним в цикле. Если за узлом в итерации следующий узел тоже br, то удаляешь его, вываливаешься из цикла, и всё заново повторяешь.

    В итоге всё сохраняешь в HTML. На выхлопе будет документ без двоения br.
    Ответ написан
    Комментировать
  • Можно заменить конденсатор 25В на 35В?

    GavriKos
    @GavriKos
    Можно. Главное чтобы совпадала емкость и допустимое напряжение было НЕ МЕНЬШЕ.
    Ответ написан
    2 комментария
  • Как работает хеш-таблица / ассоциативный массив на пальцах?

    samodum
    @samodum
    Какой вопрос - такой и ответ
    в данном случае хэш-функция возвращает int, а не строку. Цель хэш-функции превратить объект, используя его содержимое, в целочисленное значение - это и будет индекс для массива. Эту хэш-функцию надо грамотно написать, чтобы было минимум коллизий и для этого есть несколько базовых рекомендаций.
    Внутри хэшмэп устроен так, что у него есть массив списков. То есть, по индексу, который мы вычислили с помощью хэш-кода, мы из массива по этому индексу (вот он, О(1)) забираем список (список - как раз и есть те самые коллизии и чем их меньше, тем короче будет список), в котором хранятся значения и забираем/добавляем нужное значение.
    И тут есть замечания: если хэшкод всегда возвращает нам одно и то же число, то хэшмэп вырождается в список - все значения по любому из ключей будут храниться в списке, доступном по одному-единственному индексу.
    В идеале хэшкод должен возвращать уникальное число для каждого объекта (но всегда одно и то же для объекта с таким же содержимым, ключом)

    Общее понимание и прекрасное объяснение:
    https://en.wikipedia.org/wiki/Hash_function
    Функция для PHP:
    https://php.ru/manual/function.spl-object-hash.html
    Объяснение, почему нужно использовать простые числа на примере рекомендаций из книги "Effective Java" (объяснение есть и в википедии):
    https://computinglife.wordpress.com/2008/11/20/why...
    https://stackoverflow.com/questions/3613102/why-us...
    https://medium.com/@biratkirat/learning-effective-...
    Ответ написан
    3 комментария
  • Имеет ли смысл хранить MANY-TO-MANY в одном поле?

    sim3x
    @sim3x
    Как в профиле юзера посмотреть, какие записи он лайкнул?
    У вас появилась популярная и вы используете мускул. Что произойдет при одновременной вставке одного поля?
    Ответ написан
  • Имеет ли смысл хранить MANY-TO-MANY в одном поле?

    inoise
    @inoise
    Solution Architect, AWS Certified, Serverless
    Ну, раз как эксперта:
    - поставите text и потеряете индексацию
    - поиск осуществлять станет невозможно

    Это только из первого

    А ещё с чего вы решили что лайк имеет право менять запись поста. Б - безопасность
    Ответ написан
  • Какая оптимальная структура для таблицы "лайков"?

    @orbit070
    Если, чисто теоретически представить, что пользователей миллионы, а постов десятки миллионов, является ли такая структура оптимальной?

    Почти. Нужно применить дублирование и прокинуть в эту таблицу сразу все те поля, которые вам могут пригодиться для отображения, иначе каждый раз придется делать join, чего бы не хотелось при highload. То есть нужно добавить в таблицу сразу поля вроде user_name, post_title, post_body, и т.д(в общем все то, что вы планировали доставать с помощью join).

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

    нужно ли тут поле id, или PK сделать составной (post_id, user_id) или PK вообще не нужен? Это влияет на селект?


    Зависит от сценариев использования(подумайте, в каком случае вам нужно будет поле id), но в большинстве случаев оно не нужно и такие поля вводят для душевного спокойствия и гармонии. На селект это не влияет, ведь все равно вы будете делать выборку либо по user_id либо по post_id(опять же, это в большинстве распространенных сценариев, если у вас есть какая-то логика, где нужно будет выбирать из таблицы likes записи по какому-то намеренно введенному идентификтаору, то вводите).
    Ответ написан
    2 комментария
  • Почему не работает sscanf?

    Lobotomist
    @Lobotomist
    Software Developer
    Проходите тест кое-где? ;)
    Дело в том, что все это является строкой и соответствует первому спецификатору %s. Насколько мне известно, эти спецификаторы все жадные и нет опции сделать их не жадными. Для того, чтобы дефис не попадал, можно вместо %s использовать, например %[^\-].
    Ответ написан
    1 комментарий
  • Почему тут такой mangling?

    petermzg
    @petermzg
    Самый лучший программист
    Calling conventions таблица 21.
    Говориться, что это число указывает суммарное количество байт для всех параметров помещенное в стек
    А в стек вы можете поместить минимальное значение равное разрядности платформы.
    Для 32х битной платформы это 4 байта.
    Отсюда следует, что у вас 2 значения минимум по 4 байта. Суммарно 8
    Ответ написан
  • Session guard или token guard для SPA?

    Sanasol
    @Sanasol Куратор тега Laravel
    нельзя просто так взять и загуглить ошибку
  • Где хранить бизнес логику?

    @aylo
    Прочитайте про vuex. И через модули все можно сделать.
    Ответ написан
    Комментировать
  • Где хранить бизнес логику?

    bootd
    @bootd
    Гугли и ты откроешь врата знаний!
    Создать классы Cell.js, Game.js
    именно так. Vue вам не запрещает писать свои классы.
    Создайте папку, в ней пишите свои классы, после импортируйте их в шаблоны и работайте.

    Получается, весь код и вся логика игры должны находиться в файле Grid.vue? Которая будет обращаться к Settings за параметрами и собственно рендерить
    - если вам нужно сделать так, что бы компоненты общались между собой, то лучше всего используйте vuex, в котором из компонента Settings меняйте значения, а Grid будет смотреть эти значения из vuex и что либо делать. Тем самым вы вынесите настройки проекта и сможете их цеплять из любого места в приложении, иначе будет у вас лапша
    Ответ написан
    5 комментариев
  • Как убрать значки с рабочего стола?

    PavelMonro
    @PavelMonro
    Через gconf-editor по пути org.gnome.desktop.background - show-desktop-icons
    Ответ написан
    5 комментариев
  • Как синхронизировать две таблицы?

    @d-stream
    Готовые решения - не подаю, но...
    только 80/443
    ну значит строим туннель, например OpenVPN по 443 порту и дальше ни в чем себе не отказываем.
    Ответ написан
    Комментировать
  • Как синхронизировать две таблицы?

    Beshere
    @Beshere
    Разработчик
    Большинство СУБД умеют делать репликацию - настройте и все.
    Ответ написан
    4 комментария