Запуск и деплой сайта с Docker

Практическое использование Docker. Построение сетевой структуры сайта. Использование контенеров для локальной разработки. Сборка образов для продакшена и методы деплоя.

Скрытый контент
Комментарии (232)
Arunas

Спасибо большое.

Ответить
Arunas

где можно найти код?

Ответить
Дмитрий Елисеев

Добавили ссылку.

Ответить
Arunas

Спасибо, Вы самие лучшие.

Ответить
Юлия Елисеева

Спасибо за высокую оценку нашей работы!

Ответить
Антон

Не могу найти ссылку, где она?

Ответить
Антон

Все, я понял, это платно

Ответить
Александр Кулик

Вопрос поддерживаю.

Ответить
Дмитрий Елисеев

Добавили ссылку.

Ответить
Дмитрий Ориховский

Спасибо Дмитрий! Курс топ! Если будет возможность можешь раскатать как настроить Xdebug + Phpstorm + Docker. Спасибо!

Ответить
Роман

Да было бы хорошо, научиться пользоваться Xdebug особенно как правильно проверять свои строчки кода (с учетом фреймворка, когда нужно обойти кучу строк самого фреймворка. Да и вообще интересно лучшие практики посмотреть.

Ответить
Альберт

+

Ответить
Руслан

Было бы супер, у самого постоянные проблемы с докером и x-debug

Ответить
Максим

Поддерживаю про Xdebug

Ответить
Ruslan

Ребята, Вы вообще охренели? Здесь курсы о Программировании, как настроить Xdebug + Phpstorm на youtube посмотрите может и с Docker найдете. Разница в том, что нужно 9000 порт прокинуть, но вы же о Docker видео внимательно смотрели сообразите.

Ответить
Дмитрий Елисеев

Да, прокинуть 9000 порт. Но не снаружи внутрь, а изнутри наружу. Это сложнее.

Ответить
Дмитрий Елисеев

Да, добавил в седьмой эпизод.

Ответить
Software Engineer

Поддерживаю про Xdebug

Ответить
Алексей

Поддерживаю. Научиться дебажить было бы круто!

Ответить
Denis

А почему изменилась темная тема на светлую? В чем причина?

Ответить
Дмитрий Елисеев

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

Ответить
Aёct'ann

Нужно просто в браузере темную тему выставить и все будет гуд )

Ответить
Sergei

Есть замечательный плагин для хрома Dark reader. Делает все темным xD

Ответить
Arunas

про nginx, certbot, gateway: если gateway принцип с nginx и SSL сделать снаружи, вместе с certbot, letsendcrypt, а в докере оставить полный функционал сайта, ведь простом nginx ( не в докере) легче - проще следит за логами, запросами клиентов, делать certbot renew (с cron) , restart nginx...

Ответить
Дмитрий Елисеев

Если gateway с nginx и SSL сделать снаружи

Да, можно поднять отдельно снаружи без Docker. Но тогда нужно будет настраивать и обновлять его вручную или отдельными скриптами. Также придётся задавать контейнерам фиксированные IP-адреса, чтобы их указывать в proxy_pass такого прокси-сервера. А если ссылаемся на порты, то закрывать их от прямого доступа снаружи.

Так что дело вкуса и как всем будет удобнее. Если нужно вынести, то можно установить отдельно. Если не выносить, то отдельная работа с ним не нужна.

Делать certbot renew (с cron), restart nginx

Сам certbot с renew так и будет снаружи. А вместо service nginx restart можно также вызывать docker-compose restart gateway.

А в общем чтобы не возиться с Lets Encrypt на всех хостах проще один раз купить wildcard сертификат на год или два и его закидывать при деплое.

Проще следить за логами, запросами клиентов

Логи всё равно в итоге собираются из всех источников в одну кучу. Так что по удобству разницы нет.

Ответить
Arunas

Спасибо. А будут (хотя очень кратко) про логи - как: "итоге собираются из всех источников в одну кучу"?

Ответить
Дмитрий Елисеев

Да, когда дойдём до мониторинга.

Ответить
Ruslan

А правильно программировать учится будем ? :) Какой-то у вас план охватить весь производственный цикл? Это круто конечно, но праграммировать тоже хочется :)

Ответить
Дмитрий Елисеев

Да, здесь план охватить всё, как и анонсировали перед началом.

Ответить
Dmitry

А не лучше ли вместо apache воспользоваться внутренним механизмом certbot, да еще и его под docker'ом использовать?

Пример:

docker run -it --rm --name certbot \
            -v "/etc/letsencrypt:/etc/letsencrypt" \
            -v "/var/lib/letsencrypt:/var/lib/letsencrypt" \
	    -p 80:80 \
            certbot/certbot certonly --standalone \
              --email user@example.com \
              --agree-tos --no-eff-email \
              -d example.com
Ответить
Дмитрий Елисеев

Можно. Но тогда нужно будет как-то обойти ситуацию, когда появится новый поддомен и standalone повторно уже на поднятом проекте не сработает.

Ответить
Dmitry

Ну... А запустить больше одного раза? (для разных доменов)...

Ответить
Ruslan

Дмитрий всё написал уже, я бы добавил: wildcard сертификат - можно получить от Lets Encrypt через API домен диллера и через Ansible раскатать его повсюду логи: я тоже иногда туда заглядываю. Для дев машины :

docker exec -it web bash
web - название инстанца к которому вы хотите подключится.

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

Ответить
Ruslan

Супер материал.

Ответить
Руслан

Спасибо, все супер, когда ожидается следующий выпуск?

Ответить
Дмитрий Елисеев

Уже монтируем. Завтра будет.

Ответить
Maxim Niko

Спасибо, выпуск очень понравился! Если можно - сделайте шрифт побольше, а то даже с большого дисплея телефона 6.2" нужно всматриваться.

Ответить
Виктор

+++

Ответить
Дмитрий Елисеев

На смартфоне можно зумить видео.

Ответить
Sergei

Столько нюансов на докере, разгребать не просто :)

Ответить
Sergei

У меня есть вопрос: как очистить порты от предыдущего проекта? У меня на 8080 висят до симфони докера. Хочется не переименовывать порыт в конфигурации, а просто вычистить старые.

Ответить
Дмитрий Елисеев

Зайти в предыдущий и там выполнить docker-compose down

Ответить
Sergei

Спасибо за оперативность :)

Ответить
Ildar

Спасибо. все отлично, вопрос про продакшен: с какой целью копируется папка public (nginx) в докер контейнере?

Ответить
Дмитрий Елисеев

Чтобы скопировать favicon.ico.

Ответить
Ruslan

Вы не могли бы описать платформу на которой вы запускаете Докер, это Mac?

И еще, добавьте как на youtube like - dislake :) а то в ленте большая часть с благодарностями, и сложно искать полезные вопрос - ответы. Я так понимаю отдельного слак канала или форума нет.

Ответить
Дмитрий Елисеев

Эпизоды разрабатываю и записываю на компьютере с Ubuntu. Дома запускаю на MacBook.

Функциональность комментариев доработаю. Добавлю что-то вроде избранного.

Ответить
Ruslan

Тогда наших трудностей не видать (я о Винде)

Может кому пригодится я искал как удобно использовать VirtualBox and Docker, вот две статьи

Скрипты для этого занятия у меня отработали. (соврал, полностью не заработало). WSL 2 - чуть ли не единственный вариант для нормальной работы.

Ответить
elmut

переписал файл start.sh чтобы ручками постоянно не создавать

    win_to_unix_path(){ 
	wd="$(pwd)"
	cd "$1"
		the_path="$(pwd)"
	cd "$wd"
	echo $the_path
    }

    #VM=${DOCKER_MACHINE_NAME-default}
    VM=My-app
    VIRTUALBOX_CPU_COUNT=2
    VIRTUALBOX_MEMORY_SIZE=2024
    SHARE="C:\OSPanel\domains\Slim_Mobile_Framework\\"
    VIRTUALBOX_SHARE_FOLDE="${SHARE}\:$(win_to_unix_path "${SHARE}")"
    "${DOCKER_MACHINE}" create --driver=virtualbox --virtualbox-no-vtx-check --virtualbox-share-folder "${VIRTUALBOX_SHARE_FOLDE}" --virtualbox-cpu-count "${VIRTUALBOX_CPU_COUNT}" --virtualbox-memory "${VIRTUALBOX_MEMORY_SIZE}" $PROXY_ENV "${VM}"
Ответить
Павел

Дмитрий, вы как-то решали проблему медленной работы монтируемых VOLUMES под MAC OS X?

Ответить
Дмитрий Елисеев

Вариант обсуждали в комментариях.

Ответить
Александр Кулик

Кто работает на винде, как решить проблему с запуском команд из Makefile?

Он ругается, что docker-compose не найден, хотя алиас настроен и если из консоли, то все нормально работает.

Ответить
Ruslan

Установите в git в Windows

Ответить
Александр Кулик

Установлено, что дальше?

Ответить
Ruslan

Если ответить на ваш вопрос, то возьмите отсюда нужную часть, установите choco и потом Маке, кстати идея Шоколада мне понравилась. Но сразу хочу предупредить, путь через VirtualBox не будет простым и вам всегда придется думать о том, что вы сначала монтируете папку в виртуалку, а потом папку виртуалки в контейнер. В ссылке на статью вы найдете, что можно сунуть докер в старую винду, со старыми версиями и в текущей не работает. Опять "Но" - если установите WSL 2, то всё заработает. (Точнее я xdebug еще не тестил, но хочется верить что работает :) )

Ответить
Павел

Если кто-то будет пытаться запустить Docker на виртуальном сервере Используйте KVM а не OpenVZ Виртуализация OpenVZ работает на уровне ядра Linux также как и docker, т.е. docker там не запускается

Ответить
Сарибжанов Ильдар

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

Но это, конечно же, ИМХО.

Ответить
Дмитрий Елисеев

Проект строится именно под ключ, как и анонсировали в блоге перед его началом.

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

Ответить
Альберт

Подскажите почему не создается контейнер, вылетает с ошибкой php-cli_1 exited with code 0.

Ответить
Дмитрий Елисеев

Если код 0, то это не ошибка, а обычное завершение работы. Контейнер php-cli не запускается навечно как php-fpm, поэтому запускается и сразу завершается.

Ответить
Альберт

Спасибо чет тупанул )

Ответить
Arunas

в каком образе, в каком месте (при билде для прода) собырается-копируется каталог api/src? Напр. api/public копируется в api/docker/production/nginx/Dockerfile (стр.: COPY ./public ./public), а где есть (COPY ./crc ./src) ни где ненашёл :(...

Ответить
Дмитрий Елисеев

В php-образах копируется всё содержимое папки api в /app строкой COPY ./ ./

Ответить
Arunas

спасибо :)

Ответить
Konstantin

localhost:8080 открывается, а localhost:8081 - "Не удается получить доступ к сайту".

version: "3.3"
services:
  subproject1:
    build:
      context: subproject1/docker/development/nginx
    ports:
      - "8080:80"
    volumes:
      - ./subproject1:/app

  subproject2:
    build:
      context: subproject2/docker/development/nginx
    ports:
      - "8081:80"
    volumes:
      - ./subproject2:/app
    depends_on:
      - subproject2-php-fpm

  subproject2-php-fpm:
    build:
      context: subproject2/docker/development/php-fpm
    volumes:
      - ./subproject2:/app
"Containers": {
            "935768a945a1041daa9daa047c298cbe52ce81c489d6f7dd2cba50544cdb52cc": {
                "Name": "myproject_subproject2-php-fpm_1",
                "EndpointID": "c7d7c45d690a733c4212ae66e655bf8667f2558f1de2fa1559c4366fc7cc8fdc",
                "MacAddress": "02:42:c0:a8:10:02",
                "IPv4Address": "192.168.16.2/20",
                "IPv6Address": ""
            },
            "f140b5c683ae7a8ae0f754a3a7bf5b400dc2d9c3e778f5a6647a92e0b847ba6d": {
                "Name": "myproject_subproject1_1",
                "EndpointID": "38de8c3f33fca4ac7ad28a8796d2f1e1d7bdfa31a3391746db3bc157c804ce65",
                "MacAddress": "02:42:c0:a8:10:03",
                "IPv4Address": "192.168.16.3/20",
                "IPv6Address": ""
            }
        },

nmap показывает PORT STATE SERVICE 8080/tcp open http-proxy

PORT STATE SERVICE 8081/tcp closed blackice-icecap

Ответить
Konstantin

IP адреса 192.168.16.2 и 192.168.16.3 пингуются. В чем же дело? Порт 8081 закрыт? Как же его открыть?

Ответить
elmut
VBoxManage controlvm "${VM}" natpf1 "frontend,tcp,127.0.0.1,8080,,8080"
VBoxManage controlvm "${VM}" natpf1 "app,tcp,127.0.0.1,8081,,8081"
VBoxManage controlvm "${VM}" natpf1 "gateway-frontend,tcp,127.0.0.1,8085,,8085"
VBoxManage controlvm "${VM}" natpf1 "gateway-app,tcp,127.0.0.1,8086,,8086"
VBoxManage controlvm "${VM}" natpf1 "postgres,tcp,127.0.0.1,5432,,54321"
proxy_pass        http://frontend;
proxy_pass        http://app-nginx:81;
http://127.0.0.1:8086
http://127.0.0.1:8085
Ответить
Konstantin

Обнаружил одну странность. Выполнил инициализацию docker-compose - make init. Устал, хотел поиграть в CSS. Docker-compose еще запущен. Запускаю Steam, а он не может пройти авторизацию - что-то с сетью случилось. Остановил docker-compose - male down, после чего Steam удалось пройти авторизацию. Данное видео просмотрел 25 минут от начала.

Ответить
Николай

Рекомендую фичу: Я смотрю ваши видео с десктопа и планшета. На десктопе в браузере стоит расширение "The Great Suspender", которое "суспендит" неактивные вкладки и выгружает их из памяти, но когда я повторно открываю (перезапускаю) эту вкладку, то видео начинается с начала, а не с того места, где я остановился.

Youtube, например, запоминает момент на котором я остановился, более того, он запоминает это не только на текущем устройстве, а на всех (в аккаунте), таким образом, закрыв видео и открыв его на другом устройстве, оно начнет проигрываться с того момента, где закрыл.

Ответить
MaGu

Спасибо.

Ответить
Konstantin

Доброго дня!

Почему в случае development путь к conf.d: COPY ./common/nginx/conf.d /etc/nginx/conf.d, а в prod ./docker/common/nginx/conf.d /etc/nginx/conf.d?

Я расматриваю frontend

Ответить
Дмитрий Елисеев

Потому что указываются разные изначальные пути сборки в build: context: для дева и в docker build для прода.

В прод через COPY надо вкопировать файлы проекта, поэтому ему указываем корневую папку сборки frontend. А для дева копировать ничего из корня не нужно, поэтому можем указать frontend/docker.

Ответить
elmut

windows-10

docker-machine ip -- это IP виртуальной машины он может быть случайным docker is configured to use the default machine with IP 192.168.99.106

как его сделать localhost (127.0.0.1)

ответ:

ports:
    - "8080:80"

как переопределяли на 80 он выйдет нас 192.168.99.106:80

что бы изменить надо в Oracle VM VirtualBox изменить сеть. http://joxi.ru/J2bkO4LuGqd3gA

Ответить
Konstantin

Не могу найти в документации, как подключить блок кода в Dockerfile?

В Dockerfile перед командами (сразу после from ...) надо задать ENV для proxy. Это надо прописать в каждый Dockerfile. Хотел бы в одном месте пропиcать адреса proxy и их использовать уже в Dockerfile.

Ответить
Дмитрий Елисеев

Если нужно что-то передать в образ именно в момент сборки, то можно использовать build-arg.

А вообще чтобы такие вещи передавать через environments можно изначально расставить вместо значений плейсхолдеры и при запуске подменять их в своём ENTRYPOINT c помошью утилиты sed.

Ответить
Konstantin

Ребята, ребята, как решить проблему composer'а

[RuntimeException]
  Could not scan for classes inside "database/seeds" which does not appear to be a file nor a folder.

я в api поставил Laravel

Ответить
Дмитрий Елисеев

Указать правильно путь к database/seeds.

Ответить
Konstantin

Смотрю production/php-fpm/Dockerfile. Там написано copy ./composer.json ./composer.lock ./ и ниже composer install. Получается в пустую директорию копируются вот эти два файла и выполняется установка пакетов. А где будут лежать файлы проекта? Я смотрю build production.

Ответить
Дмитрий Елисеев

Файлы проекта докопируются уже ниже командой COPY ./ ./.

Ответить
MaGu

У кого 10 винда и doker для винды установлен. И все вроде норм, но команда make как и Makefile бесполезен => тут я 2 варианта нашел.

Проект оперсорс.

Все по инструкции и добавить установленную папку в переменный среды винды PATH.
Только в каждый проект надо 3 файла добавлять в рабочую папку проекта. Ну и соответственно их надо в гитИгнор кинуть

Ответить
Дмитрий

Спасибо, работает :)

Ответить
liskar

У меня почему то без

location / {
    root /app/public;
 }

в default.conf не работало

Ответить
Sergei

Там на офиц сайте докера появилась некая эксперbментальная версия Edge. Обещают, что будет работать лучше с виндой, но это не точно :)

Ответить
ProMix

А будет где-то репак с кодом?

Ответить
Дмитрий

Почему nginx для веб-сервера?

Ответить
Дмитрий Елисеев

Потому что это производительный и легковесный сервер.

Ответить
Максим

Как насчёт редеплоя отдельного сервиса?

Ответить
Дмитрий Елисеев

Что имеется в виду?

Ответить
Максим

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

Ответить
Дмитрий Елисеев

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

Ответить
Ivan

Чем вообще отличается php-fpm от apache? Почему юзаем фпм а не апач?

Ответить
Дмитрий Елисеев

Для PHP используют либо Apache с mod_php, либо Nginx с php-fpm.

Nginx легковеснее, универсальнее и более удобен в конфигурации.

Ответить
Ivan

ну я имею в виду по принципу работы - php-fpm чем-то отличается от мод пхп?

Ответить
Дмитрий Елисеев

Пакет mod_php – это просто плагин к Apache.
А php-fpm – это отдельно запускаемый на своём порту процесс.

Ответить
Ivan

Да, я понимаю. Я имею в виду - что из этого следует? mod_php как-то по-другому обрабатывает php нежели php-fpm? Расскажите пожалуйста подробнее про принцип работы

Ответить
Дмитрий Елисеев

Есть внутренние различия работы с выделением процессов.

Ответить
Дмитрий

Дима, если попытаться зайти на сайт через www.demo-auction.deworker.pro, то получаем ошибку

Не удается получить доступ к сайту
Не удалось найти IP-адрес сервера www.demo-auction.deworker.pro
Ответить
Дмитрий Елисеев

Добавил CNAME запись в DNS. Теперь открывается.

Ответить
Ivan

А где в production api conf обращение к php fpm для файлов php?

Ответить
Ivan

А, все правильно. он по 80 порту

Ответить
Дмитрий Елисеев

В конфигурации Nginx настроено проксирование на php-fpm:9000.

Ответить
Ivan

Спасибо, все в порядке ) я смотрел не туда (в самом api-nginx это есть- я смотрел на gateway и перепутал)

Ответить
Дмитрий

В целом все неплохо, но вот какая вещь: хочется всегда делать по нарастающей и наблюдать результат, чтобы была возможность пощупать все самому. В видео, скорее всего при монтаже теряется часть материала и по итогу ты смотришь, код пописываешь и тут "хоба" make init и все запустилось. Сразу вопрос - сфигали оно запустилось, если даже docker-compose еще не заполняли? В репозиторий смотришь, а там нет делений по урокам, уже версии в докер-файлах обновлены и написано там всего лишнего наперед. Я еще ладно со стажем, так сказать, но блин, если тут будет какой жуниор учить, то я уверен он получит травму не только головы... Более того, если тупо с экрана переписать руками файлы, то они не запускаются ввиду всяких ошибок. Попробуйте make init с тем кодом который удалось записать с экрана не заглядывая в репозиторий до 22минуты 4го урока

Ответить
Дмитрий Елисеев

Можете сюда ошибку из своей консоли на 22-ой минуте процитировать?

Ответить
Дмитрий

Приветствую, ошибка там связана с COPY conf.d настроек (что-то вроде COPY failed: stat [path/to/files]/daa343da: no such file or directory), потому что контекст. Но получается по видео у вас все запускается и далее потом есть правки этой ситуации

Ответить
slo_nik

Доброе утро.

~~Вроде всё понятно из урока, но когда попытался сделать push на dockerhub - результат "0".~~
~~На dockerhub зарегистрировался, создал частный репозиторий.~~
~~ ********~~
~~Как решить данную проблему?~~

Проблема решилась)))

Но, делал по Вашим ранним примерам. В них команда для сбора образа выглядит так

docker build --pull --file=site/docker/production/redis.docker --tag ${REGISTRY_ADDRESS}/site-redis:${IMAGE_TAG} site

для push так:

docker tag ${IMAGE_TAG} ${REGISTRY_ADDRESS}/site-redis:${IMAGE_TAG}

Когда изменил на

docker build --pull --file=site/docker/production/redis.docker --tag ${REGISTRY_ADDRESS}:${IMAGE_TAG} site

   docker push ${REGISTRY_ADDRESS}:${IMAGE_TAG}

Всё заработало.

Ответить
slo_nik

Добрый день.

Всё-таки проблема не решилась до конца.

Взял Ваш пример из https://github.com/ElisDN/demo-project-manager

В makefile команда для сборки состоит из нескольких строк для разных образов.

build-production:
docker build --pull --file=manager/docker/production/nginx.docker --tag ${REGISTRY_ADDRESS}/manager-nginx:${IMAGE_TAG} manager
docker build --pull --file=manager/docker/production/php-fpm.docker --tag ${REGISTRY_ADDRESS}/manager-php-fpm:${IMAGE_TAG} manager
docker build --pull --file=manager/docker/production/php-cli.docker --tag ${REGISTRY_ADDRESS}/manager-php-cli:${IMAGE_TAG} manager

Для push

push-production:
docker push ${REGISTRY_ADDRESS}/manager-nginx:${IMAGE_TAG}
docker push ${REGISTRY_ADDRESS}/manager-php-fpm:${IMAGE_TAG}
docker push ${REGISTRY_ADDRESS}/manager-php-cli:${IMAGE_TAG}

Вроде бы всё хорошо, всё работает. Но загрузить всё это на dockerhub не получается, выдаёт ошибку (мой комментарий выше).

Проблема решается редактированием команд

от такого вида

 docker build --pull --file=manager/docker/production/nginx.docker --tag ${REGISTRY_ADDRESS}/manager-nginx:${IMAGE_TAG} manager

надо привести всё к такому виду

 docker build --pull --file=manager/docker/production/nginx.docker --tag ${REGISTRY_ADDRESS}:${IMAGE_TAG} manager

docker push ${REGISTRY_ADDRESS}:${IMAGE_TAG}

Тогда всё заработает.

Но тогда при build каждый следующий образ будет затирать предыдущий.

И в итоге будет создан один образ, по последнему dockerfile php-cli.docker

С предыдущих dockerfile в образ ничего не попадает?

Получается, что в образе не будет nginx.docker и php-fpm.docker?

Как тогда в этом случае объединить всё в один образ?

Ответить
Дмитрий Елисеев

Например так:

--tag ${REGISTRY_ADDRESS}:manager-nginx-${IMAGE_TAG} manager
Ответить
slo_nik

У меня была мысль так сделать.

А что произойдёт в этом случае?

На dockerhub будут загружены эти все образы, а как потом сборка на сервер будет происходить?

Команду надо будет изменить?

ssh -o StrictHostKeyChecking=no ${PRODUCTION_HOST} -p ${PRODUCTION_PORT} 'docker-compose pull'

Как тогда собрать все образы в один и запустить на сервере?

Ответить
Дмитрий Елисеев

Заменить также в тестовых и продакшеновском docker-compose.yml

Ответить
slo_nik

Получается, что надо заменить

image: ${REGISTRY_ADDRESS}/manager-nginx:${IMAGE_TAG}

на

image: ${REGISTRY_ADDRESS}:manager-nginx-${IMAGE_TAG}

Правильно?

Ответить
Дмитрий Елисеев

На нужный вариант из:

image: ${REGISTRY_ADDRESS}/manager-nginx:${IMAGE_TAG}
image: ${REGISTRY_ADDRESS}/manager:nginx-${IMAGE_TAG}
image: ${REGISTRY_ADDRESS}:manager-nginx-${IMAGE_TAG}
Ответить
Дмитрий Елисеев

На DockerHub либо делать несколько образов, либо для экономии делать один образ с разными тэгами.

Ответить
slo_nik

Если делать несколько образов для одного сайта это же не очень удобно будет?

В чём причина, что изначальная команда не работает при push на dockerhub?

docker build --pull --file=manager/docker/production/nginx.docker --tag ${REGISTRY_ADDRESS}/manager-nginx:${IMAGE_TAG} manager
Ответить
Дмитрий Елисеев

Видимо вы в ${REGISTRY_ADDRESS} вписали не только свой логин.

Ответить
slo_nik

Да, вписал логин и название репозитория.

Просто скопировал строку, которая рекомендуется на dockerhub.

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

Выглядит так

 docker push myLogin/nameRepo:tagName
Ответить
slo_nik

Если четыре строки, то каждая создаёт отдельный образ, а тег для всех одинаков?

Ответить
Дмитрий Елисеев

Я бы у себя сделал:

${REGISTRY_ADDRESS}/manager:nginx-${IMAGE_TAG}
${REGISTRY_ADDRESS}/manager:php-fpm-${IMAGE_TAG}

И в качестве адреса бы указал:

REGISTRY_ADDRESS=elisdn

Тогда в одном репозитории manager у меня бы хранились образы с версиями:

elisdn/manager:nginx-jenkins-master-24
elisdn/manager:php-fpm-jenkins-master-24
elisdn/manager:nginx-jenkins-master-23
elisdn/manager:php-fpm-jenkins-master-23
Ответить
slo_nik

Сейчас попробую.

Под manager подразумевается имя репозитория?

Ответить
Дмитрий Елисеев

Да.

Ответить
slo_nik

А в чём разница, указывать только логин или логин/репозиторий в REGISTRY?

Ответить
Дмитрий Елисеев

В сопоставлении обычного именования:

registry/image:tag

и именования на DockerHub:

username/repository:tag
Ответить
slo_nik

Благодарю, пошёл пробовать)))

Ответить
slo_nik

И всё-таки один вопрос остался.

Сейчас имеется пять docker конфигураций для разных образов, nginx, fpm, cli и т.д.

Можно ли собрать их в одном dockerfile, чтобы в команде build обойтись одной строкой?

Если да, то как?

Или не стоит так делать?

Ответить
Дмитрий Елисеев

Не надо.

Ответить
slo_nik

Не надо потому, что усложнится работа с образами или по какой причине?

С созданием и push образов разобрался, спасибо за подсказки.

Теперь ломаю голову над deploy.

Виртуальную машину на сервер создал.

Теперь пытаюсь выполнить команду

deploy-production:
ssh -o StrictHostKeyChecking=no ${PRODUCTION_HOST} -p ${PRODUCTION_PORT} 'rm -rf docker-compose.yml .env'
scp -o StrictHostKeyChecking=no -P ${PRODUCTION_PORT} docker-compose-production.yml ${PRODUCTION_HOST}:docker-compose.yml
ssh -o StrictHostKeyChecking=no ${PRODUCTION_HOST} -p ${PRODUCTION_PORT} 'echo "REGISTRY_ADDRESS=${REGISTRY_ADDRESS}" >> .env'

В .env файле указал PRODUCTION_HOST -> ip сервера, PRODUCTION_PORT -> 22

Запускаю команду, сразу требует пароль для доступа по ssh.

Но в логин подставляется логин с локального компьютера, но на сервере совершенно другой, поэтому не могу подключиться.

Как это можно обойти?

Создать на сервере пользователя под моим локальным логином?

Ответить
slo_nik

Разобрался с deploy-production.

Ответить
slo_nik

Добрый день.

Как на сервере нужно настроить nginx, чтобы можно было получить доступ к сайту по id.

Сейчас у меня такая конфигурация nginx

server{
listen 80;
server_name _;
index index.php index.html;
root /app/public;
charset utf-8;

add_header X-Frame-Options "SAMEORIGIN"

location ~* \.(?:ico|gif|jpe?g|png|woff2?|eot|otf|ttf|svg|js|css)$ {
    access_log off;
    expires max;
    add_header Pragma public;
    add_header Cache-Control "public";
    try_files $uri /index.php?$args;
}

location / {
   try_files $uri /index.php?$args;
}

location ~ \.php$ {
   fastcgi_split_path_info ^(.+\.php)(/.+)$;
   fastcgi_pass pohoron-php-fpm:9000;
   fastcgi_index index.php;
   include fastcgi-params;
   fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
   fastcgi_param PATH_INFO $fastcgi_path_info;
}
}
Ответить
slo_nik

Добрый день.

Нашёл причину почему не запускается nginx на сервере, но вот как решить не могу найти.

2020/12/28 15:23:22 [emerg] 1#1: open() "/etc/nginx/fastcgi-params" failed (2: No such file or directory) in 
/etc/nginx/conf.d/default.conf:26
nginx: [emerg] open() "/etc/nginx/fastcgi-params" failed (2: No such file or directory) in 
/etc/nginx/conf.d/default.conf:26
Ответить
slo_nik

Доброй ночи.

До конца не могу разобраться с проблемой env переменных при deploy на рабочий сервер.

Опять же взял за основу Ваш пример

scp  -P ${PORD_PORT} docker-compose-production.yml ${PRODUCTION_HOST}:docker-compose.yml
ssh ${PROD_HOST} -p ${PROD_PORT} 'echo "DB_USER=${DB_USER}" >> .env'
ssh ${PROD_HOST} -p ${PROD_PORT} 'echo "DATABASE_URL=${DATABASE_URL}" >> .env'
ssh ${PROD_HOST} -p ${PROD_PORT} 'echo "DB_PASSWORD=${DB_PASSWORD}" >> .env'
ssh ${PROD_HOST} -p ${PROD_PORT} 'echo "DB_NAME=${DB_NAME}" >> .env'
ssh ${PROD_HOST} -p ${PROD_PORT} 'echo "FACEBOOK_SECRET=${FACEBOOK_SECRET}" >> .env'

Получается, что на сервер копируется файл docker-compose-production.yml, переименовывается в docker-compose.yml.

Рядом с ним создаётся файл .env, в который записываются параметры для сборки на рабочем сервере.

Значения для этих параметров берутся из локального файла .env?

Но проблема в том, что они подставляются только если вначале файла Makefile явно подключить этот файл.

include ${PWD}/project/.env

В противном случае в .env на сервере записываются пустые параметры.

Как победить эту проблему?

Ответить
Дмитрий Елисеев

Если запускать команду деплоя вручную, то да, предварительно подгружать значения через include.

А у нас эту команду автоматически запускает Jenkins, в котором эти переменные заполняются из его секретов.

Ответить
slo_nik

Значит использование include не будет сильным "костылём"?

Ответить
Дмитрий Елисеев

При ручном запуске не будет. Можно вписать её прямо в Makefile в команде deploy первой строкой.

Ответить
slo_nik

Я сейчас так и делаю. Благодарю, а то чуть мозгом не потёк))) Думал, что что-то упустил и кинулся пересматривать, перечитывать и так далее)))

У меня ещё пару вопросов.

Развёртывание предполагается на "голом" сервере, а если надо будет подключить панель управления типа IspManager.

То как настроить работу панели с сайтом?

И как работать с почтовым сервером?

Его же надо устанавливать на сервере отдельно или можно в docker образ добавить? Как будет правильно?

Что конкретно можно об этом почитать? Информации в инете валом, но иногда разнится так, что не поймёшь что к чему.

Ответить
Дмитрий Елисеев

Развёртывание предполагается на "голом" сервере, а если надо будет подключить панель управления типа IspManager.

Подход "Инфраструктура как код" подразумевает полную автоматизацию работы с инфраструктурой (сервером) через написание кода скриптов и конфигов, хранящегося в Git наравне с кодом сайта. Это нужно для однозначности, предсказуемости, тестируемости и повторяемости.

Если что-то сделать через какую-то панель вручную мышкой или дать кому-то поправить php.ini прямо на сервере, то никто потом не вспомнит, что там накликали или исправили.

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

А в случае с полной автоматизацией мы легко можем взять чистую виртуалку и выполнить наши provision и deploy и восстановить БД из дампа.

Если на локалке мы разворачиваем проект автоматически через Docker или Vagrant, то нам не нужен вручную настраиваемый OpenServer. Так и в продакшене если мы работаем с виртуалкой через Ansible и Docker, то на ней нам не нужен ручной IspManager.

Ответить
Дмитрий Елисеев

И как работать с почтовым сервером?

Можно взять любой сторонний сервис вроде Яндекс.Коннект или Google для бизнеса и завести почту для домена там.

И потом для отправки писем-уведомлений с сайта можно напрямую подключить его по SMTP к SwiftMailer как сделано у нас. Но там лимит примерно на тысячу писем в день.

Либо для отправки уведомлений дополнительно взять отдельный сервис вроде MailChimp или UniOne и письма с сайта посылать также по SMTP через него. Там уже безлимитно, но платно.

А если всё-таки хочется поднять свой почтовый сервер, то да, установить его напрямую или также через Docker.

Ответить
slo_nik

С панелью понятно, не используем.

Почтовый сервер.

Если ставить напрямую, то при переносе получится такая же ситуация как и с панелью, нужно будет всё настраивать заново, отдельно от сайта.

Если в docker, то настройка будет проходить автоматически, вместе с сайтом. Так же нужна панель управления для почты (если я правильно выразился).

Какой сервер Вы посоветуете использовать в контейнере и что использовать для просмотра почты?

Ответить
Дмитрий Елисеев

С установкой своих почтовых серверов не работал, так что не посоветую.

Ответить
slo_nik

Понял, будем искать.

Ответить
slo_nik

Добрый вечер.

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

Настроил так, как Вы рассказываете в уроке.

Для директории src в настройка PhpStorm указал "Sources Root", добавил псевдоним "App".

Но при попытке перенести класс почти ничего не происходит.

Навожу курсор на имя класса - F6 - указываю новую директорию и новый namespace.

Так же отмечаю "Search in comments and string" и "Search for text occurrences", на секунду появляется окошко

сканирования проекта и всё, дальше дело не идёт. Окно preview не открывается.

В чём может быть проблема?

P.S. При создании нового файла namespace подставляется правильный, все классы по указанным

namespace PhpStorm видит.

Ответить
Дмитрий Елисеев

Проблема в вашем PhpStorm

Ответить
slo_nik

Да, Вы правы. Был конфликт YII2 Support и Symfony Support. Но большей частью виноват YII2 Support, почему он лез в symfony проект - не понял. Отключил нафиг.

Ответить
slo_nik

Добрый вечер.

А как можно получить более подробную информацию об ошибке в работе сайта?

Сейчас на одной из страниц сервер возвращает 500.

Пытаюсь посмотреть логи контейнера nginx

docker logs name_container

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

"GET /admin/users/cae87b19-a747-4539-9b3f-d44ba06d94d4 HTTP/1.1" 500 843 "http:// domain/admin/users" 
"Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:84.0) Gecko/20100101 Firefox/84.0" "-"
Ответить
Дмитрий Елисеев

Смотрите логи контейнеров php-fpm и node, а не nginx.

Ответить
slo_nik

Что-то не помогает

Запускаю команду

 docker logs --details container-php-fpm_1

Получаю ту же неинформативную ошибку.

 172.20.0.6 -  11/Jan/2021:13:18:23 +0000 "GET /index.php" 500

На локальном, в dev режиме всё отлично работает. А в prod именно на одной странице, просмотр пользователя, такая фигня. При этом он создаётся, на index пользователей всё показывает.

Ответить
Дмитрий Елисеев

А логирование в sdtderr настроено?

Ответить
slo_nik

Вот тут я не знаю))) Первый раз делаю подобное. Где производить настройку?

Ответить
Дмитрий Елисеев

В настройках логера. У нас Monolog настраивается в api/config/common/logger.php.

Ответить
slo_nik

У меня не совсем этот проект.

Сам проект на symfony, по Вашему примеру с project-manager

Значит у меня не настроен вывод и надо это делать перед упаковкой в контейнер?

Попробую сделать.

Ответить
Дмитрий Елисеев

Для продакшена там у нас настроен handler.

Ответить
slo_nik

Да, я уже нашёл)))

Благодарю.

Но это не очень удобно, можно как-то процесс просмотра логов сделать более удобным?

Набрёл вчера на статью https://habr.com/ru/company/southbridge/blog/517636/

Ответить
Дмитрий Елисеев

Да. Для этого как раз используют наборы ELK/EFK, где логи со всех контейнеров собирают в ElasticSearch и смотрят в Kibana.

Ответить
slo_nik

Но это настраивается отдельно от docker контейнера? Или тоже упаковывают?

Ответить
Дмитрий Елисеев

Обычно поднимают рядом в свойх контейнерах.

Ответить
slo_nik

Свой контейнер, но всё собирается в один build, правильно?

Если сейчас у меня четыре контейнера - nginx, php-fpm, postgresql и redis, то будет ещё один для ELK/EFK?

Ответить
Дмитрий Елисеев

Будут ещё три:

services:
    nginx
    php-fpm
    postgresql
    fluentbit     // сборщик логов
    elasticsearch // хранение логов
    kibana        // панель просмотра
Ответить
slo_nik

Понятно, благодарю.

Ответить
slo_nik

Всё получилось, благодарю.

Логи читаются приемлемо)))

Ошибка была в отсутствии модуля php - php-intl

Ответить
Алескандр

Докер не может сбилдить имейдж для 'api-php-fpm':

No releases available for package "pecl.php.net/xdebug"

Запускаю через make init

Ответить
Дмитрий Елисеев

Попробуйте указать версию:

&& pecl install xdebug-3.0.2 \
Ответить
Алескандр

оно и было с версией, я просто склонировал ваш репозиторий и сделал make init. Пробовал разные версии, результат такой же

Ответить
Дмитрий Елисеев

Значит проблема с сервером Pecl. Повторите завтра.

Ответить
Алескандр

Видимо. Повторил, не помогло. Какая надежная система :-)

Ответить
Олег

Тоже столкнулся с недоступностью репозитория pecl.php.net Этот сайт может не отвечать часами.

Ответить
Дмитрий Елисеев

Скоро для PHP 8 мы перейдём на установку напрямую из репозитория вместо pecl. Тогда проблем не будет.

Ответить
Олег

Пытаюсь воспроизвести простейший пример с запуском Nginx, но получаю ошибку 403. Начинаю выяснять и вижу, что в контейнере worker Nginx запускается от пользователя Nginx, а на файлы в public права rwxrwx--- для User=root (0) и Group=ping (999). Встаёт вопрос, а как у вас всё завелось само без дополнительного тюнинга /etc/nginx/nginx.conf?

Ответить
Олег

Всё, разобрался. Оказывается, всё, что из хоста монтируется в контейнер, изнутри самого хоста видно с правами не с точки зрения контейнера, а с точки зрения хоста. У вас в ролике все папки монтировались, скорее всего, с правами 755, а файлы с правами 644, поэтому nginx мог читать файлы в public независимо от пользователя, которому они принадлежали. А у меня расшаренная из винды папка проекта в виртуалбокс монтируется почему-то с правами 770 и на файлы и на папки (я решил на сей раз не использовать Vagrant, который общие папки монтирует с правами 777), из-за чего собранные из таких файлов контейнеры недоступны для чтения nginx-ом в контейнере.

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

Ответить
Дмитрий Елисеев

Папки и файлы монтируются как есть с проставленными у них исходными идентификаторами пользователя и группы. Монтирование никак права не меняет.

Ответить
Dan

Я так же столкнулся на Windows со сложностью при монтировании.

В моем случаи для доступа к частным репозиториям compose не учитывал ssh ключи, к которым имели все полный доступ.

Могли бы вы предложить лучшее решение для доступа к репозиториям vcs из php-compose в контейнере с использованием ключей ssh?

Ответить
Дмитрий Елисеев

В dev-окружении можно примонтировать ключ через том:

api-php-cli:
    volumes:
        - /.ssh/id_rsa:/root/.ssh/id_rsa:ro

А для продакшена при сборке через docker build передавать ключ через --build-arg как здесь.

Ответить
Евгений

Была 403 ошибка при старте localhost:8080

Понял что нет прав к директории у Ngix внутри контейнера:

sudo docker ps -a
sudo docker logs 6d1d9c827f37

Расшарил права на директорию:

sudo chown -R home:www-data /home/home/PhpstormProjects/001pr
sudo chmod -R 755 /home/home/PhpstormProjects/001pr

Заработало

Ответить
Роман

3 часа долбался, заработало по вашему рецепту. Храни Вас Господь!

Ответить
slo_nik

Добрый вечер.

Дмитрий, подскажите, а можно настроить gateway на два разных домена?

В видео вы используете api и frontend как два разных домена, правильно?

Если у меня на одном ip два разных домена, domain.ru и domain2.ru, первый предполагается использовать как тестовый, второй как рабочий.

Как в этом случае настраивать gateway?

Ответить
Дмитрий Елисеев

Да, у нас два домена прописаны в server_name в файлы gateway/docker/production/nginx

Ответить
slo_nik

Я видел, но не совсем понимаю, как настроить для тестового и рабочего домена.

Ответить
Дмитрий Елисеев

Можно указывать несколько доменов:

server_name  example.com test.example.com;
Ответить
slo_nik

Дело в том, что домены совершенно разные, даже в разных доменных зонах.

И с директориями не совсем понятно.

Сейчас у Вас созданы две директории, api и frontend. Это, как я понимаю, совершенно разные приложения, между ними мало общего.

Допустим, я создам две директории - test и production. Вот не пойму, что в них копировать, а что можно оставить общим для обеих директорий?

Ответить
Дмитрий Елисеев

Если надо одно и то же приложение развернуть на два домена, то укажите их в production:

server_name  domain1.com domain2.com;

Если же нужно просто на одной машине поднять через Docker два разных никак не связанных сайта, то тогда используют отдельно поднятый traefik.

Ответить
slo_nik

Да, приложение одно и тоже.

Но на domain1.com я хочу расположить приложение для разработки, а на domain2.com уже рабочее приложение.

Как в этом случае делать deploy?

Ответить
Дмитрий Елисеев

Сделать два деплоя на две виртуалки.

Ответить
slo_nik

Сейчас у меня в production конфигурации nginx так настроен домен

listen 80;
server_name _;
index index.php index.html;
root /app/public;
charset utf-8;

Вы имеете ввиду в sercer_name прописать два домена? Но тогда изменения для разработки будут видны и на рабочем домене?

Ответить
Дмитрий Елисеев

Тогда так и оставьте.

Ответить
slo_nik

Но если оставить так, то тогда второй домен не будет работать?

Ответить
Дмитрий Елисеев

Деплойте на две виртуалки, привязанные каждая к своему домену. Не совмещайте в одной.

Ответить
slo_nik

Пока понял то, что надо ещё раз пересмотреть урок)))

Как это деплоить на две виртуалки?

Ответить
Дмитрий Елисеев

Вызывать два раза make deploy с разными значениями HOST.

Ответить
slo_nik

Сейчас в ${PRODUCTION_HOST} у меня записан ip, как два домена в этом случае разделить?

Попробовал в server_name записать два домена - второй не работает.

Ответить
Дмитрий Елисеев

Привязать на хостинге два домена к двум виртуалкам:

domain1.com 1.2.3.4
domain2.com 5.6.7.8

И запускать два деплоя на эти ip-адреса:

HOST=1.2.3.4 make deploy
HOST=5.6.7.8 make deploy
Ответить
slo_nik

Подождите, но в PRODUCTION_HOST записан реальный ip.

Вы имеете ввиду, что для второго домена завести другой ip?

Ответить
Дмитрий Елисеев

Да, для второго домена создать вторую виртуалку со вторым ip. И деплоить на эти две виртуалки.

И в Jenkins или Github Actions можно прописать эти два адреса как PRODUCTION_HOST и TESTING_HOST.

Ответить
slo_nik

Дошло, наконец-то)))

Ответить
slo_nik

Сейчас структура проекта выглядит так

project
project-redis
docker-compose-dev
docker-compose-prod
Makefile

В директории project создать две директории, test.domain.info и domain2.ru? В этих директориях буде одинаковое содержимое, то, что сейчас находится в project?

Ответить
Дмитрий Елисеев

Лучше оба домена настроить на одну и ту же папку project и просто деплоить проект на две разные виртуалки.

Ответить
Дмитрий

как использовать утилиту make под windows ?

Ответить
Дядя Женя

Выше были инструкции. Я выбрал использование wsl2 с убунтой.

Ответить
Дядя Женя

Появилась такая проблема. Сперва настраивал проект под виндой. Даже умудрялся утилиту make запускать под виндой без использования "сторонних" инструментов. Потом дошел до переменных в файле Makefile и все таки решил настроить wsl2. Запустил контейнер убунты, привязал к докеру и стало работать все без вопросов. В какой-то момент вдруг заметил, что вместо названия построенного образа докер пишет типа Successfully built 8f0dc32907e399a277d1316232293130f8326f54258e958cacf831ced27bb99a вместо "привычного" названия проекта с приставкой индекса. Стал откатываться пошагово и дошел до начала проекта. Не подскажите, что это может быть? Оно вроде как и не мешает, ведь работает, но во-первых, не как по вашим инструкциям, во-вторых, мало ли где всплывет необходимость использовать название проекта и индексы. Ну и в-третьих, самому понятней и приятней, когда понимаешь, чего оно там построило.

Ответить
Дмитрий Елисеев

Увы, но на Windows не работаю. Так что по ним ничего не подскажу.

Ответить
Дядя Женя

И если можно, то подскажите причину и решение ещё одной проявившейся проблемы. Папка idea была раньше в гитигноре, но сейчас почему-то не игнорируется. Постоянно в ней какие-то изменения и приходится добавлять в комиты. Тоже не заметил когда и почему такое произошло, но видимо одновременно с первым багом, где вместо понятного имени созданного образа стали писаться айдишники.

Ответить
Дмитрий Елисеев

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

Ответить
Дядя Женя

Везде вносил, не помогает. А так у меня только один пользователь на единственном компе. Ладно, буду пробовать дальше разбираться. И конечно не досмотрел до конца курс, но я как то интересовался у вас мультисайтовостью. Это в друпале хорошо реализовано. Вот аналогичный механизм хотелось увидеть в курсе.

Ответить
Роман

Здравствуйте, Дмитрий и остальные коллеги. Прошу помощи

Ubuntu 20.04

При открытии localhost:8080 на странице:

403 Forbidden nginx

В контейнеры сами захожу, все работает. На этой же системе есть другой проект на докере, все работает локально хорошо. А ваш проект локально не запускается. Что-то с правами, видимо. localhost:8087 (и любой другой порт 80xx, кроме 8081 и 8082) например, выдаст НЕ 403 Forbidden, а Unable to connect.

В параллельном моем проекте, который нормально работает с докером (хотя там пробрасываю 80-й порт, а не 8080) установлено в docker-compose файле: user: "1000:1000". В аукционе пытался это же прописать - вообще не завелось.

Заранее благодарен всем за помощь.

Ответить
Роман

Изменил проброс портов. Сделал 80:80. Появилась приветственная страница nginx

Welcome to nginx!
If you see this page, the nginx web server is successfully installed and working. Further configuration is required.
Ответить
Роман

Итак, проблема возникает при перенаправлении с сервиса gateway на fronend. Проблема с правами (403 Forbidden nginx).

Ответить
Роман

Заработало, сделал согласно комментарию от Евгений 2021-02-07 13:10.

Дмитрий Елисеев, проясните, пожалуйста, вашему подписчику, если можно, этот нюанс. С правами www-data и докером. Или где можно копнуть глубже этот вопрос.

Ответить
Роман

Постараюсь ответить сам на свой вопрос: гуру, если есть, поправьте.

Так как nginx по умолчанию входит в группу www-data, а папка frontend/public имела права drwxr--r-- , то есть для остальных нельзя было читать эту папку, то и изменение прав на 755 привело к тому, что теперь www-data может читать эту папку. (точнее, добавилось право Х, что для папки означает читать файлы в папке)

Ответить
Дмитрий Елисеев

Да, проблема в доступах и решается через chmod. Также она у многих возникает в PHP-FPM-контейнерах при попытке открытия index.php.

Ответить
Serhii

Получил ошибку по Certbot:

TASK [certbot : Add Certbot repository] ********************************************************************************************************************************************************************
fatal: [server]: FAILED! => {"changed": false, "msg": "Failed to update apt cache: W:GPG error: http://ftp.debian.org/debian buster-backports InRelease: The following signatures couldn't be verified because the public key is not available: NO_PUBKEY 04EE7237B7D453EC NO_PUBKEY 648ACFD622F3D138, E:The repository 'http://ftp.debian.org/debian buster-backports InRelease' is not signed."}

куда копать?

Ответить
Serhii

Все, вопрос отпал, я сервер НЕ дебиан поднял =))

Ответить
Артем Сновида

07:05 - у меня по localhost:8080 выдает "Welcome to nginx! If you see this page, the nginx web server is successfully installed and working. Further configuration is required." Все сделал, как в видео. Перепроверял. Подскажите плиз в чем может быть проблема :(

Ответить
Дмитрий Елисеев

Чтобы отображало результат работы PHP нужно в конфигурациию добавить location с fastcgi_pass, пересобрать образ и перезапустить контейнер.

Ответить
Артем Сновида

Дмитрий, спасибо. Но там пока index.html в начале видео. Такое ощущение, что настройки для nginx'а, которые прописаны в начале видео в файле default.config не срабатывают при запуске командой 'docker-compose up -d', и nginx смотрит не туда, куда нужно

/frontend/docker/development/nginx/conf.d/default.config

server {
  listen 80;
  charset utf-8;
  index index.html;
  root /app/public;
  add_header X-Frame-Options "SAMEORIGIN";
}

Или не создалась копия с образа nginx'а

/frontend/docker/development/nginx/Dockerfile

FROM nginx:1.21
COPY ./conf.d /etc/nginx/conf.d
WORKDIR /app

docker-compose.yml

version: "3.7"
services:
  frontend:
    build:
      context: frontend/docker/development/nginx
    ports:
      - "8080:80"
    volumes: 
      - ./frontend:/app
Ответить
Дмитрий Елисеев

Для перезапуска с пересборкой запускайте команду:

docker-compose up --build -d
Ответить
Артем Сновида

Это помогло. Ура! Спасибо! :)

Ответить
slo_nik

Добрый вечер, Дмитрий.

Возникла проблема с gateway.

Для локальной разработки всё сделал по уроку - работает.

Для production сервера везде получаю ответ 404.

В логе контейнера gateway появляются записи

 2021/06/06 20:19:03 [error] 30#30: *1 "/etc/nginx/html/index.html" is not found (2: No such file or directory), client: 111.222.333.444, server: site.ru , request: "GET / HTTP/1.1", host: "site.ru"

В чём может быть причина?

gateway.conf

server {
  listen 80 default_server;
  server_tokens off;

}

domain.conf

server {
  listen 80;
  server_name site.ru www.site.ru;
  server_tokens off;
}

server {
   location / {
     set $upstream http://domain-nginx;
     proxy_set_header Host $host;
     proxy_set_header X-Real-IP $remote_addr;
     proxy_set_header X-Forwarded-Proto http;
     proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
     proxy_set_header X-Forwarded-Host $remote_addr;
     proxy_set_header X-NginX-Proxy true;
     proxy_pass $upstream;
     proxy_ssl_session_reuse off;
     proxy_redirect off;
   }
}

subdomain.conf

    server {
       listen 80;
       server_name subdomain.site.ru
       server_tokens off;
    }
    
    server {
       location / {
          set $upstream http://subdomain-nginx;
          proxy_set_header Host $host;
          proxy_set_header X-Real-IP $remote_addr;
          proxy_set_header X-Forwarded-Proto http;
          proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
          proxy_set_header X-Forwarded-Host $remote_addr;
          proxy_set_header X-NginX-Proxy true;
          proxy_pass $upstream;
          proxy_ssl_session_reuse off;
          proxy_redirect off;
       }
    }
Ответить
Дмитрий Елисеев

Вы вместо одной секции server:

server {
    listen 80;
    server_name subdomain.site.ru
    server_tokens off;

    location / {
        ...
    }
}

почему-то вписываете две:

server {
    listen 80;
    server_name subdomain.site.ru
    server_tokens off;
}

server {
    location / {
        ...
    }
}

из которых срабатывает первая пустая.

Ответить
slo_nik

Да, вроде понял свою ошибку.

В gateway, в конфигах для api и frontend, используются две секции server потому, что Вы используете https? Или я ошибаюсь?

В общем убрал я вторую секцию server, но пришлось добавить

resolver 127.0.0.11 ipv6=off;

Теперь заработало, правда я ещё не полностью проверил, но по нескольким переходам - работает.

Ещё такой вопрос.

Resolver у Вас используется в конфигурациях и для gateway и для api и frontend.

Это принципиально или достаточно только в конфигурации для gateway указать resolver?

Ответить
Дмитрий Елисеев

В gateway, в конфигах для api и frontend, используются две секции server потому, что Вы используете https? Или я ошибаюсь?

Да, чтобы из секции 80 для http редиректить на секцию 443 с https.

Это принципиально или достаточно только в конфигурации для gateway указать resolver?

Resolver нужен везде, где есть переменная $upstream

Ответить
slo_nik

Добрый вечер.

Дмитрий, подскажите, как разделение на разные подпроекты может повлиять на functional тестирование.

У меня получается такая ситуация.

На localhost:8080 был прокт на symfony, были написаны тесты.

Сейчас этот проект перенёс на localhost:8083, а на localhost:8080 новый проект.

Запускаю тесты для старого подпроекта, который сейчас на localhost:8083, и все тесты проходят успешно.

Как я понимаю это неправильно.

Почему проходят тесты, должны ли они проходить?

Как в этом случае тестировать разные подпроекты, находящиеся на разных портах?

Ответить
Дмитрий Елисеев

Functional-тесты не делают реальные запросы на хост и порт. Они создают new Kernel() и просто выполняют метод запуска приложения прямо в консоли. Так что смена портов на них не влияет.

Ответить
slo_nik

А как в таком случае тестировать проекты, которые находятся на поддоменах?

Ответить
Дмитрий Елисеев

В Symfony по документации так:

$client->request('GET', '/', [], [], [
    'HTTP_HOST' => 'en.example.com',
]);
Ответить
slo_nik

Благодарю, что-то пропустил этот момент.

Значит, чтобы протестировать поддомен на локалке надо указать, например, 'HTTP_HOST' => 'localhost:8083'?

Ответить
Дмитрий Елисеев

В localhost:8083 поддомена нет.

Кастомный адрес с поддоменом нужно указывать ести хочется протестировать как из поддомена парсится язык en как в примере выше.

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

Ответить
slo_nik

Ну а как тогда протестировать страницы на localhost:8083?

Ответить
Дмитрий Елисеев

Они у вас уже и так протестированы старыми функциональными тестами.

Функциональные тесты запускаются в консоли как юнит-тесты без использования сервера и файла public/index.php

Поэтому им всё равно, на каком домене и сервере запущен сайт.

Ответить
slo_nik

Вы не поняли. Или я не понимаю Вас)))

На localhost:8080 один проект, для него есть functional тесты.

На localhost:8083 другой проект, как его протестировать?

Структура почти такая же как и в этом уроке.

project
    gateway
    domain (localhost:8080)
        public
           index.php
    subdomain (localhost:8083)
        public 
            index.php

Если взять простой тест для главной страницы

    public function testMain(): void
    {
       $client = static::createClient();
       $crawler = $client->request('GET', '/');

       $this->assertSame(200, $client->getResponse()->getStatusCode());
       $this->assertContains('Заголовок для localhost:8080', $crawler->filter('title')->text());
       $this->assertContains('Текст к h1 для localhost:8080', $crawler->filter('.banner-form h1')->text());
    }

То этот тест протестирует главную страницу на localhost:8080, но если надо протестировать главную страницу на

localhost:8083, возможно такое сделать? Ведь для localhost:8080 и localhost:8083 адрес главной страницы будет одинаковым.

Ответить
Дмитрий Елисеев

Если это два разных проекта, то в каждом делать свои тесты:

project
    gateway
    domain
        public
        src
        tests
        composer.json
    subdomain
        public
        src
        tests
        composer.json
Ответить
slo_nik

Понял. Буду пробовать.

Ответить
slo_nik

Естественно, что для главных страниц localhost:8080 и localhost:8083 будет разное содержание.

Ответить
slo_nik

Добрый вечер, Дмитрий.

Возникла очередная проблема.

После добавления в проект gateway, перехода на https никак не могу настроить загрузку файлов более 2М.

При попытке загрузить файл получаю ошибку

413 Request Entity Too Large

Структура проекта повторяет структуру показанную Вами.

gateway
   docker
       production
          nginx
            conf.d
               default.conf
               domain.conf
               subdomain.conf
domain
    docker
        common
           nginx
              conf.d
                default.conf
subdomain
    docker
        common
           nginx
              conf.d
                default.conf // Тут пытаюсь настроить лимит размара файла.

В конфигурацию nginx, в секцию server, для subdomain добавил директиву

client_max_body_size 0; // значения подставлял разные, превышающие 2М

В конфигурацию php-fpm для subdomain добавил директивы:

[global]
upload_max_filesize = 20M
post_max_size = 20M
max_execution_time = 300

Ничего не заработало, хотя значения настроек php изменились, как проверить изменились ли настройки nginx не знаю.

Пытался перенести настройки для subdomain в конфигурацию gateway -> subdomain.conf - результат "0".

Естественно, при обновлении файлов на сервере перезапускал весь docker со всеми контейнерами.

Как решить данную проблему?

Ответить
slo_nik

Вопрос закрыт.

Что-то я напутал с параметром client_max_body_size. Ещё раз проверил, указал этот парамет для всех секций server в настройках для поддомена и файлы стали грузиться.

Ответить
Зарегистрируйтесь или войдите чтобы оставить комментарий

Или войти через:

Google
GitHub
Yandex
MailRu