• Как правильно сделать связку в Docker: php + cron?

    Tyranron
    @Tyranron
    Andrey Chursin,

    нахрена создавать конфигу, которая запускает какой-либо сервис


    Казалось бы, причём здесь Docker Compose?
  • Rust - ещё один убийца c/c++?

    Tyranron
    @Tyranron
    Просто оставлю это здесь:
    Я использую actix практически без actix-web и просто кайфую от того удобства которую предоставляет мне actix в сочетании с гарантиями надежности, удобства кроссплатформенноcти, удобства разработки которую представляем сам rust! Поверх actix запилил уже достаточно много небольших приложений, компонентов, tcp/udp сервисов.. все это работает на дохлых камерах видеонаблюдения, а так же в облаке и не падает! никогда! аптайм уже более полугода на тестовой уличной камере видеонаблюдения. Только с нее за это время почти 300'000 фото actix загрузил в телеграм, 6Тб видео записал, периодически стримит видео по p2p, каждый день наблюдает закаты и рассветы!) Я уже потерял всякую надежду на то что оно упадет и я найду новую багу в моем софте! Единственное где я пока не смог использовать актикс это wasm в браузере на стороне клиента, но возможно я что-то упустил, буду надеяться что и там смогу когда-нибудь! После такого переворота в технологиях мне уже страшно писать на Си и даже Golang) я относительно слабый программист, но раст и актикс позволяют даже мне создавать продукт и работать по большей части над функционалом. Скорее всего без этих вещей я бы не достиг моих текущих результатов! Это просто офигенное чувство когда написание кода доставляет удовольствие и ты кайфуешь каждый день от кода, от его работы и от работы над ним, от надежности и качества продукта!
  • Как решаете проблему отсутствия локального smtp сервера в docker?

    Tyranron
    @Tyranron
    А, забыл ещё... В php.ini указываем:
    sendmail_path = /usr/sbin/ssmtp -t
  • Как решаете проблему отсутствия локального smtp сервера в docker?

    Tyranron
    @Tyranron
    Akondr, собственно, как всё и сказали выше:

    1. В контейнер Nginx + php-fpm устанавливаем ssmtp.

    2. Пробрасываем ему конфиг через переменные окружения в entrypoint (из-коробки не умеет).
    sed -ri '/^(Mailhub|AuthUser|AuthPass|Hostname|UseTLS|UseSTARTTLS)/d' \
        /etc/ssmtp/ssmtp.conf
    echo "Mailhub=$SMTP_SERVER"     >> /etc/ssmtp/ssmtp.conf
    echo "AuthUser=$SMTP_USER"      >> /etc/ssmtp/ssmtp.conf
    echo "AuthPass=$SMTP_PASSWORD"  >> /etc/ssmtp/ssmtp.conf
    if [ "$SMTP_HOSTNAME" != "" ]; then
      echo "Hostname=$SMTP_HOSTNAME"         >> /etc/ssmtp/ssmtp.conf
    fi
    if [ "$SMTP_SECURED" == "1" ]; then
      echo -e "UseTLS=Yes\nUseSTARTTLS=Yes"  >> /etc/ssmtp/ssmtp.conf
    fi


    3. Изначальный ssmtp.conf выглядит вот так:
    #
    # /etc/ssmtp.conf -- a config file for sSMTP sendmail.
    #
    # For details, see: https://linux.die.net/man/5/ssmtp.conf.
    Root=
    FromLineOverride=yes


    4. Указываем параметры mailserver через переменные окружения:
    environment:
          - SMTP_SERVER=mailserver:587
          - SMTP_USER=testing@moderation.test
          - SMTP_PASSWORD=qweqweqwe
  • Должен ли разработчик заниматься ручным тестированием?

    Tyranron
    @Tyranron
    nApoBo3,

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


    Зависит от законодательства. В ряде стран Вы вполне можете легализироваться как физ. лицо и вести законную деятельность с уплатой соответствующих налогов.

    то есть акты приемки, есть ТЗ, есть ограниченные гарантии


    Это всё всего лишь юридические инструменты. Они при правильном подходе помогают и дают гарантии, а при неправильном только мешают и являются причиной конфликтов и споров.

    Суть же именно во внятном и взрослом отношении и подходе к совместному делу. Локальная разработка, заказная разработка - не имеет значения. Требования качества есть что там, что сям.

    Выполняешь работу качественно и получаешь за этого справедливую оплату - это хорошо и правильно.

    Выпускаешь в прод продукт не озаботившись обеспечением качества - это плохо. Собственник не соблюдает финансовые обязательства (в том числе и лепит штрафы не предусмотренные сотрудничеством) - это плохо.
  • Должен ли разработчик заниматься ручным тестированием?

    Tyranron
    @Tyranron
    rustler2000,

    Но в суд вы подадите на юр лицо.


    В суд подадим на Исполнителя с которым заключен Договор. Юр лицо он или нет - зависит. Соль не в этом. Есть много разработчиков, которые предоставляют услуги как физ. лицо. В том числе, между прочим, и я. Это бывает удобнее.

    А у юр лица есть страховка.


    Тоже ведь не суть. Ну есть - хорошо. Ну нету - какая разница для Заказчика?

    Это какойто адовийше совковый менталитет перекладывать риски на исполнителя на окладе, но забирать себе всю прибыль.


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

    В любой нормально стране риски несет собственник бизнеса


    Он как бы в любом случае их несёт.

    И чтобы ее получить он заботится о компании.


    Если Заказчик не заботится о своём бизнесе, то он просто загниёт и сдохнет. Это очевидно.

    А не "доит" и если что "опускает" наемного сотрудника (на часть ЗП).


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

    P.S. Я всё это написал не для того, чтобы оправдывать плохой тон бизнеса и заказчиков-козлов. Такие есть, без спору. Я это написал для того, чтобы была ясность во взаимоотношения Заказчик - Исполнитель. По взрослому всё именно так, как Вы и описали. Заказчик несёт риски и получает основную прибыль, а Исполнитель качественно выполняет работу и получает свой Гонорар. Чтобы не было перекосов - нужно внятное взаимоотношение.
  • Rust, как вернуть struct?

    Tyranron
    @Tyranron
    Тут бы ошибку компилятора. Тяжело быть оракулом и угадывать.
  • Как правильно сделать связку в Docker: php + cron?

    Tyranron
    @Tyranron
    Михаил Братеньков,

    Один из основных принципов докера


    Независимость Docker от окружения - это не принцип, а всего лишь следствие изоляции, которую предоставляют контейнеры. К тому же, "независимость" здесь достаточно мнимая. Это не виртуталки, и Вы, как минимум, зависите от ядра и ФС, которые могут очень разниться от машины к машине.

    Потому-что мы выносим логику (каждые X минут запускать скрипт) за пределы контейнера.


    А оно не должно этого делать без веской причины.


    Ну а в Kubernetes этой логикой тоже занимается не контейнер. Каковы причины "не достаточно веские" для среднестатистического пользователя Kubernetes?
    Или возьмите CoreOS и посмотрите манифесты systemd, которые гоняют контейнеры через docker run по своей логике.

    Одно из основных достоинств докера - портативность, можно перенести файлы на любой сервер, написать одну команду
    docker-compose up -d
    и завершить разворачивание приложения без плясок с бубном.

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


    Docker и Docker Compose все же разные вещи, во-первых. А во-вторых, почему приложение должно разворачиваться через docker composer? Почему не через kubectl apply или helm install, либо даже ansible deploy.yml?

    Я это всё к тому, что имея опыт работы с Docker Compose, не нужно его особенности обобщать на всю контейнерную индустрию как единый и однозначный best practise. Контейнер - это всего лишь процесс с в меру изолированным окружением, не более. А вариантов использования процессов - тьма, и Docker Compose там далеко не первый кандидат, особенно для продакшена.
  • Как получить значения высшего по уровню range в template golang?

    Tyranron
    @Tyranron
    ajlhimik, пометьте тогда как ответ, дабы закрыть вопрос
  • Как правильно сделать связку в Docker: php + cron?

    Tyranron
    @Tyranron
    yevgen_sh, что за принцип? И почему это он нарушается? Окружение оперирует Docker, как это обычно и происходит. В данном случае просто через cron, который, к слову, с лёгкостью заменяется теми же systemd timers, если душе угодно. Отличий от запуска обычного долгоживущего сервиса никаких.
  • Как строить и деплоить Go-приложения?

    Tyranron
    @Tyranron
    Николай Прогрессов, а ещё на горутинах можно построить акторов, а потом поверх дерево супервизиров на манер эрланга, а потом шаринг/миграцию акторов по сети между нодами, и много чего ещё... Но суть то вопроса стояла не в самих горутинах а в local in-memory state vs external shared state. И что в случае с шарингом акторов, что в случае "по сети получает признак", эта внешняя шина должна быть. Будь то хоть внешняя очередь сообщения, хоть БД, хоть p2p связи.
  • Как правильно обработать rusqlite mappedrows?

    Tyranron
    @Tyranron
    Johnny Lowhunter, кстати, крайне рекомендую взять за привычку прогонять cargo clippy, особенно с pedantic уровнём. Он учит многому хорошему, особенно в части комбинаторов. Например, из моей практики недавно: вместо .map(f1).unwrap_or_else(f2) удобнее использовать сразу .map_or_else(f2, f1).
  • Как правильно обработать rusqlite mappedrows?

    Tyranron
    @Tyranron
    Johnny Lowhunter, ага, не заметил что там итератор по резалтам вместо айтемов.

    Ваш последний вариант лучше всего, но его ещё можно улучшить убрав unnecessary function wrapping:
    ?.map(Result::unwrap).collect();

    По поводу скорости не парьтесь, --release вообще всё меняет. А если Вам действительно нужна скорость, то подобные микро-оптимизации имеют смысл если профайлер показывает что они действительно нужны.
  • Почему минимальный размер приложения такой большой?

    Tyranron
    @Tyranron
    Nikolay Petyukh, во всяких embedded часто бывает как ограничен ресурс по памяти, так и по вычислениям. Есть классическая байка на эту тему: История одного байта.

    Помимо embedded, тот же фронт-энд в браузере. Чем меньше размер бандла на скачивание/запуск, тем лучше и производительнее приложение. Тот же wee_alloc именно под эту цель и запилили, хоть он в рантайме и медленнее стандартных аллокаторов.
  • Автоматическое копирование вольюмов Docker?

    Tyranron
    @Tyranron
    Илья Родионов, NFS - то же самое что и с GlusterFS/CephFS. Просто другая сетевая FS. Нормальное ли решение, повторюсь, зависит от гарантий которые Вам нужны. Если Вам не критичен перфоманc на read-операции, то вполне себе норм.

    Kubernetes - это просто фичастый кластеризированый рантайм контейнеров. Сам по себе из-коробки он никак проблему хранения персистентных данных магическим образом не решает. И способы там, по сути, те же, что я описал, просто что для них есть "сахарок" в виде API/spec самого Kubernetes, и это дело можно красиво автоматизировать.
  • Перестал работать Websocket после перехода на HTTPS. Чего менять?

    Tyranron
    @Tyranron
    lexbond13 да, либо если Go прикрыт спереди каким-то прокси (тем же Nginx), то делать терминацию TLS на этой проксе, тогда не нужно будет тянуть сертификат в Go.
  • Есть ли разница между горутинами и await в C#?

    Tyranron
    @Tyranron
    Евгений, потому что паника - не исключение. Идеологически панику следует использовать тогда, когда уже "всё, приехали" и приложение не может дальше продолжать своё выполнение (например, ООМ). На практике же, как видим, это правило часто нарушается, да и с паник часто пытаются вылепить те же самые исключения. Мир не идеален =)
  • Есть ли разница между горутинами и await в C#?

    Tyranron
    @Tyranron
    Евгений, да, Вы правы. Это никак не противоречит написанному мною.

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

    При этом Вы не можете recover'нуть (перехватить размотку стека) панику из другой горутины, потому что стеки у них разные.
  • Python/Django/Docker/Docker-Compose, почему не могу подцепиться к контейнеру из pytest'a?

    Tyranron
    @Tyranron
    Значит у Вас pytest запускается не в сети Docker Compose, соотвественно он и не может отрезолвить postgres домен.
    Если Вы pytest запускаете в контейнере, то Вас нужно указать ключик --network=default_<compose_name>, чтобы подключить контейнер к созданной сети Docker Compose.
    Если же просто локально запускаете pytest на хосте, то в БД нужно стучаться по 127.0.0.1, никакой postgres не отрезолвится.
  • Memcached кластер в docker?

    Tyranron
    @Tyranron
    Значит у Вас consistent hashing таки уже есть из-коробки в приложении.