• Надо ли ставить на саму машину или можно в Docker?

    @MadridianFox
    Web-программист, многостаночник
    Важно понимать, что докер демон - это сервер, и он работает по сети, т.е. может быть доступен с другой машины или из контейнера.
    Самому дженкинсу докер не нужен (если не используется docker plugin для динамисеского создания агентов в контейнерах). Докер нужен агенту, потому что скорее всего вы хотите в итоге собрать докер образ.
    Однако, и агенту сам докер не нужен, нужен только клиент докера, а докер-демон может быть в другом месте.
    Кроме того, использовать мастер-ноду дженкинса это моветон. Это может помешать работе дженкинса. Лучше выделять отдельных агентов.
    В вашем случае нужно сделать следующее: собрать докер образ агента, в котором помимо самого агента будет докер(клиент) и необходимые вам инструменты.
    Далее запускаете этот образ с монтирования в него сокета докера, тогда докер-клиент внутри контейнера будет работать с докер-демоном на хосте.
    Ну и далее подключаете этот агент к дженкинсу. Сам дженкинс тут может быть вообще без дополнительных инструментов, без докера и даже на другой машине, хотя проще его поднять тут же в докере.
    Это не самая безопасная схема, есть недостатки.

    Другой вариант - собрать образ можно через podman. Это "докер" без демона. Его легче запустить в контейнере. Опять же его надо установить в образ агента.

    Ну или полноценный dind, да. Опять же в агенте.

    Если не хотите а отдельный агент, то да, вам нужно сделать всё это с образом дженкинса и использовать мастер-ноду.
    Ответ написан
    3 комментария
  • Как настроить сервер для правильного обновления веб-приложения React?

    @MadridianFox
    Web-программист, многостаночник
    Кэшируйте отдаваемые ассеты. Тогда nginx сможет ответить на запрос старого файла даже после того как вы обновили содержимое папки.
    Ответ написан
    Комментировать
  • Как запустить php и nginx в одном контейнере?

    @MadridianFox
    Web-программист, многостаночник
    1) Запуск нескольких процессов в одном контейнере противоречит концепции докера. Докер сделан так, чтобы запускать один процесс (не считая дочерних процессов)

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

    Проще всего с загружаемыми файлами. Они в любом случае не должны храниться в контейнере и скорее всего это будет volume, который монтируется в оба контейнера.
    Взаимодействие между контейнерами по сети тоже штука не сложная, но зависит от способа запуска контейнера.
    Если контейнеры запущены через docker run в одной сети (поведение по умолчанию), то они видят друг друга по сети и могут использовать имя контейнера как dns имя.
    Если два контейнера запущены в рамках одного docker-compose.yml файла (это ещё называется docker compose project), то они тоже друг друга видят, но уже не по имени контейнера, а по имени сервиса (ключ под которым контейнер указан в секции services).
    Если приложение запускается в kubernetes, то там по умолчанию все контейнера pod'a имеют общий локалхост и могут обращаться к друг другу через 127.0.0.1.

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

    Важно: nginx работает с dns в обход стандартных инструментов операционной системы. Если вы используете в директивах proxy_pass, fastcgi_pass доменное имя, а не ip адрес, вам нужно дополнительно указать в конфиге директиву resolver <dns-ip>;, где в качестве нужно указать ip адрес dns сервера.
    Для докера это обычно 127.0.0.11, для кубера это адрес внутреннего dns сервера.

    Раздавать статику можно по разному. Два концептуально разных способа:
    - собрать образ nginx в котором есть статика, тут можно либо наследовать образ как сделали это вы, либо копировать статику в чистый образ nginx, что несколько чище и красивее
    - убрать статику из образа вообще, выделив её в volume или cdn, но тут придётся при отгрузке сервиса актуализировать статику во внешнем хранилище

    2) если очень хочется запустить несколько процессов в контейнере, то нужно запустить один процесс, который запустит остальные. Есть такие программы - менеджеры процессов. Это может быть supervosord, pm2, runit и т.п.
    Это такая программа, основной задачей которой является запуск других программ. Обычно у неё есть свой файл конфигурации, в котором вы описываете какие программы запустить и как это сделать.
    Ещё раз повторю - докер придуман не для этого. Не стоит делать этот приём основным при работе с докером.
    Это костыль. Он иногда нужен, но очень редко.

    3) То что nginx отдаёт код index.php, это проблема не настройки контейнеров, а конфигурации nginx. Если бы проблема была только в контейнерах, то вы бы получили не код скрипта, а 502.
    Первое что бросается в глаза в вашем конфиге - это регулярка в локейшене для обработки php скриптов.
    Попробуйте сделать как здесь.
    Ответ написан
    Комментировать
  • Как максимально ограничить права приложения в контейнере?

    @MadridianFox
    Web-программист, многостаночник
    Попробуйте использовать distorless образ - в нем нет ничего кроме рантайма необходимого вам ЯП. Этот вариант более универсальный.

    Другой вариант - использовать AppArmor. Здесь уже образ не совсем самодостаточный и надо ещё запустить контейнер с особыми флагами. Зато получается именно то что вам нужно - явный запрет на конкретные действия.
    Ответ написан
    Комментировать
  • Запуск проекта django с белого ip?

    @MadridianFox
    Web-программист, многостаночник
    Белый ip назначен вашему роутеру. У вашего компьютера другой ip адрес - адрес приватной сети, обычно начинается на 192.168 или на 10.
    Когда вы запускаете программу с адресом 0.0.0.0, вы говорите ей слушать все сетевые интерфейсы вашего компьютера. Но только вашего компьютера.
    Чтобы настроить доступ к вашему серверу через белый ip, вам нужно настроить на вашем роутере проброс порта. Это может называться иначе. Суть такая: вы говорите роутеру, что если пришло соединение на <адрес-роутера>:<порт-роутера>, то проксировать его на <адрес-компьютера>:<порт-компьютера>.
    Ответ написан
    Комментировать
  • Как сделать так, что бы Jenkis (в docker) запускал jenkins-agent (в docker)?

    @MadridianFox
    Web-программист, многостаночник
    Есть плагин Docker plugin. Он добавляет в дженкинс cloud типа docker. Cloud - это как раз способ запускать и останавливать агенты по требованию.

    При настройке клауда вам потребуется указать адрес докер-демона. Это может быть как tcp host:port, так и unix socket, если вы примонтировали его в контейнер дженкинса.

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

    Далее уже можно в пайплайне как напрямую через bash вызывать docker run/build, так и с помощью плагина Docker pipeline plugin
    Ответ написан
    Комментировать
  • Почему возникает ошибка?

    @MadridianFox
    Web-программист, многостаночник
    Как уже было отмечено в комментарии ку вопросу, этот пакет использует установленный в системе dig.
    В контейнере dig не установлен.
    Добавьте установку соответствующего пакета в Dockerfile и код будет работать и внутри контейнера.
    Ответ написан
    Комментировать
  • Почему я не могу переназначить адрес nginx location?

    @MadridianFox
    Web-программист, многостаночник
    Nginx принимает запрос и проксирует его дальше на основании каких-то правил. Ответ он не преобразует. За ссылки отвечает приложение, т.е. tomcat. Вам нужно так написать код сайта, чтобы в нем была возможность настроить т.н. корень, от которого строятся ссылки.
    Ответ написан
    Комментировать
  • Возможно ли на сервере установить ограничения на определенный каталог или пользователя на скачивание и загрузку?

    @MadridianFox
    Web-программист, многостаночник
    Здесь есть логическое противоречие. Чтобы выполнить задачу, разработчику нужен доступ к файлам и бд. Любое ограничение скажется на скорости выполнения задачи и на качестве результата.
    Если ограничите доступ к коду, например выдав доступ по rdp, то разраб не сможет пользоваться привычными инструментами. Если ограничите скорость соединения, то превратите работу в цирк.

    Как вариант - сделать специальный бэкап БД для разработчика, в котором не будет секретных данных, а вместо них случайный текст. Однако для этого может потребоваться помощь другого фрилансера.

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

    Если это настолько важно, то заключайте соответствующий договор с исполнителем.
    Ответ написан
    2 комментария
  • Как создать автозапуск команды в linux?

    @MadridianFox
    Web-программист, многостаночник
    1) зачем вам оборачивать soketi в screen? Лучше напрямую запускать сам soketi
    2) вероятно мешает опция screen -d, потому что type=simple ожидает что программа запустится и продолжит работать
    Ответ написан
    8 комментариев
  • Как использовать istio virtualservice внутри кластера вне mesh сети?

    @MadridianFox
    Web-программист, многостаночник
    Istio не влияет на работу класткрного dns. Обращаясь к нему вы получаете ip подов и всё работает по старому.
    Чтобы трафик шёл через меш, istio добавляет в под init контейнер, который через iptables захватывает весь исходящий трафик и направляет его в сайдкар.

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

    Другой вариант - поднять на стороне внешнего сервиса агент istio - тот же сервис, который работает в сайдкар. Вот официальная документация как раз для такого случая https://istio.io/latest/docs/setup/install/virtual...
    Ответ написан
  • Как организовать связь между контейнерами?

    @MadridianFox
    Web-программист, многостаночник
    Если контейнеры запущены через docker run без указания сети, то они уже в одной сети и могут обращаться друг к другу используя имя контейнера в качестве имени хоста.

    Если контейнеры запускаются через docker-compose, то, по умолчанию, на каждый docker-compose.yml файл создаётся отдельная сеть. Это надо учитывать если сервисы запускаются через разные файлы. В этом случае сеть стоит создать вручную и прописать её использование во всех docker-compose.yml файлах.

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

    В обоих случаях имя хоста можно переопределить через опцию hostname. В обоих случаях порты пробрасывать не надо.
    Ответ написан
    Комментировать
  • Laravel. Как тестировать кэширование?

    @MadridianFox
    Web-программист, многостаночник
    Многие фасады в ларавеле позволяют получить мок или задавать ожидания прямо через фасад.
    В документации пример как раз с кешем.
    https://laravel.com/docs/10.x/mocking#mocking-facades
    Ответ написан
    Комментировать
  • Как ограничить доступ к порту на докер контейнере?

    @MadridianFox
    Web-программист, многостаночник
    Чтобы не было доступа к контейнеру можно изначально его не открывать.
    Например не публиковать порт, если это приложение нужно другому контейнеру. Или публиковать порт на локалхост, а не на все интерфейсы.
    Ответ написан
    Комментировать
  • Как автоматически выдавать регион и id?

    @MadridianFox
    Web-программист, многостаночник
    Кубернетис нужен как раз для того чтобы приложения не знали ничего о машинах. Это платформа, которая скрывает детали реализации и даёт вам абстрактные рычаги управления.
    Если вам важно запускать приложение на особенных машинах, то надо пометить машины тэгом и настроить правила выбора машины через affinity/tolerations/nodeSelector.
    Например так можно настроить чтобы приложение запускалось только на машинах с gpu, или только на машинах в конкретном ДЦ.
    Здесь важно что вы не выясняете подходит ли вам текущая машина, а требуете чтобы приложение было запущено на подходящей.

    Есть, однако, и возможность передать в под информацию о нем самом в виде env переменных. Это называется downward api - при объявлении env переменной в манифесте пода можно указать что значением будет характеристика самого пода, например значение указанного лейбла, название неймспейса, или, как вариант, название ноды, на которой запущен под.
    Ответ написан
    Комментировать
  • Почему при старте docker контейнера sh скрипт запускается как node приложение?

    @MadridianFox
    Web-программист, многостаночник
    Скорее всего в базовом образе, который вы используете, настроен ENTRYPOINT, который превращает вашe src/start.sh в node src/start.sh или типа того.

    Посмотрите что именно прописано в ENTRYPOIN и подстройтесь или замените его.
    Ответ написан
  • Kubernetes: не получается добавить custom service-monitor?

    @MadridianFox
    Web-программист, многостаночник
    Prometheus-operator следит за созданием сервисмониторов в определённых неймспейсах, и фильтрует сервисмониторы по лейблам.
    Соответственно, вам необходимо посмотреть в манифесте прометеуса, какие значения там выставлены, и создать свой сервисмонитор с соответсвующем неймспейсе с необходимыми лейблами.
    Ответ написан
    2 комментария
  • Почему не работает внутреняя авторизация на nginx ларавел?

    @MadridianFox
    Web-программист, многостаночник
    Не работает потому что nginx и веб-приложение используют один и тот же http заголовок для передачи данных авторизации. Универсального решения нет.
    Как вариант, если приложение и так закрыто своей авторизацией, то basic можно и не делать. Или можно изменить заголовок авторизации в веб-приложении. Или попытаться разнести бэк и фронт на разные домены, чтобы одно было закрыто бейсиком, а другое собственной авторизацией.
    Ответ написан
  • Как сделать readinessProbe по тексту файла?

    @MadridianFox
    Web-программист, многостаночник
    Как уже написали в соседнем ответе вы можете обойтись одним только grep, однако ваша ошибка в другом.
    Во-первых, вы используете возможности shell, там где его нет. Пайп это специальная команда, которая есть в sh и bash. А хелсчек exec вызывает программы напрямую.
    Во-вторых, command это массив аргументов запуска. Каждая опция, каждый аргумент должен быть отдельным элементом массива, а вы просто дописали всё во второй элемент и оно распознаётся как один большой аргумент cat.

    Делайте греп и помещайте каждую опцию в отдельный элемент списка.
    Ответ написан
    Комментировать
  • Как отдавать docker container с сервера по адресу домена?

    @MadridianFox
    Web-программист, многостаночник
    Домен привязывается не к контейнеру, а к ip адресу.
    Вы не уточнили где именно поднята эта виртуальная машина и с какой целью.

    Если у вас на компьютере для личного использования, то проще всего использовать nip.io или прописать соотвествие домена и ip адреса виртуальной машины в файле hosts.

    Если вы арендовали виртуальную машину у какого-то провайдера и хотите сделать её доступной для всех по домену, то нужно купить домен и в его настройках указать ip адрес виртуальной машины.
    Ну или использовать всё тот же nip.io если это общий сервис для малого круга лиц.

    UPD:

    чтобы по разным доменам открывались разные веб-приложения, вам необходим http прокси, который на основании домена, указанного в http запросе, будет проксировать этот запрос на тот или иной внутренний адрес.
    Обычно для этого устанавливают nginx, который сам слушает 80 и 443 порты.
    Все домены настраивают так, чтобы вели на адрес этого сервера.
    В конфиге nginx описывают какое приложение должно отвечать по определённому домену, примерно вот так:

    server {
        listen 80;
        server_name site-1.domain.com;
        location / {
            proxy_pass http://127.0.0.1:27073;
        }
    }
    server {
        listen 80;
        server_name site-2.domain.com;
        location / {
            proxy_pass http://127.0.0.1:12345;
        }
    }
    Ответ написан
    8 комментариев