• Какой стул для работы лучше?

    neatsoft
    @neatsoft
    Поддерживаю. За 20+ лет стажа это первое кресло, которое не вызывает нареканий. Надёжное - через два года выглядит и функционирует как новое, несмотря на внушительный вес пользователя. Удобное - спина не беспокоит даже после длительных рабочих сессий.
  • Как установить let's encrypt сертификат в docker совместно с nginx и certbot?

    neatsoft
    @neatsoft
    georgich, Это не моя поделка, а офигительный инструмент, который позволил многим разработчикам раз и навсегда избавиться от значительной части рутинных задач.
    Nginx по прежнему остаётся отличным http сервером для раздачи статики, но разработка современных приложений с его помощью - это всё равно что создание сайтов на голом php.
    Советую ознакомиться с двенадцатифакторной методологией - это базис DevOps-а. А после этого поставить Traefik, и перестать мучиться с конфигами Nginx.

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

    docker-compose.yml:
    version: '3'
    
    services:
      traefik:
        image: traefik:v1.7.12
        container_name: traefik
        restart: always
        ports:
          - "80:80"
          - "443:443"
        volumes:
          - /var/run/docker.sock:/var/run/docker.sock
          - ./traefik.toml:/traefik.toml
          - ./rules.toml:/rules.toml
          - ./acme.json:/acme.json
    
    networks:
      default:
        external:
          name: traefik


    rules.toml:
    [backends]
      [backends.traefik]
        [backends.traefik.servers.server1]
          url = "http://127.0.0.1:8080"
    
    [frontends]
      [frontends.traefik]
        backend = "traefik"
        [frontends.traefik.routes.test]
          rule = "Host:traefik.localhost"


    traefik.toml: # на dev серверах
    defaultEntryPoints = ["http", "https"]
    
    [entryPoints]
      [entryPoints.http]
      address = ":80"
        [entryPoints.http.redirect]
        entryPoint = "https"
      [entryPoints.https]
      address = ":443"
      [entryPoints.https.tls]
        [[entryPoints.https.tls.certificates]]
    
    [docker]
    exposedbydefault = false
    network = "traefik"
    
    [api]
      [api.statistics]
    
    [acme]
    email = "myemail@gmail.com"
    storage = "acme.json"
    entryPoint = "https"
    onHostRule = true
    [acme.httpChallenge]
    entryPoint = "http"
    
    [file]
      filename = "rules.toml"
      watch = true


    traefik.toml # на рабочей станции
    defaultEntryPoints = ["http", "https"]
    
    [entryPoints]
      [entryPoints.http]
      address = ":80"
    
    [docker]
    exposedbydefault = false
    network = "traefik"
    
    [api]
      [api.statistics]
    
    [file]
      filename = "rules.toml"
      watch = true


    Устанавливается и запускается с помощью
    docker network create traefik; docker-compose up -d
    и больше не требует никакой настройки или обслуживания. После этого для того чтобы захостить любой контейнер, достаточно добавить в docker-compose.yml проекта:
    networks:
      traefik:
        external: true

    и
    labels:
          - "traefik.enable=true"
          - "traefik.frontend.rule=Host:myhostname.mydomain"
          - "traefik.port=8000"


    Все необходимые сертификаты запросятся и подключатся автоматически. Через один контейнер с Traefik можно сервить неограниченное количество самых разных проектов - это очень удобно при разработке
  • Как установить let's encrypt сертификат в docker совместно с nginx и certbot?

    neatsoft
    @neatsoft
    Trahibidadido, Вторую версию пока не смотрел, использую контейнер с 1.7. Ничего кроме доки для настройки и не требуется - там всё отлично расписано
  • Как установить let's encrypt сертификат в docker совместно с nginx и certbot?

    neatsoft
    @neatsoft
    Trahibidadido,
    1. TLS прокси необходимо размещать над load balancer-ом / reverse proxy, иначе невозможно будет роутить запросы между сервисами на базе путей.
    2. Один из базовых принципов докеризации: один контейнер - один процесс. Масштабирование контейнеризованных приложений производится увеличением либо уменьшением количества экземляров каждого из сервисов, следовательно reverse proxy для докеризованных приложений должен уметь осуществлять Auto Discovery. Nginx на эту роль не годится.
    3. Хранение медиа файлов (user uploaded) - это задача сторонней службы (Backing Service), например, Amazon S3 или Minio. Статические файлы - это часть артефакта, следовательно они должны отдаваться самим приложением, например, с помощью WhiteNoise. Ни там ни там Nginx не нужен.
    4. Правильная настройка Traefik в разы проще, чем правильная настройка Nginx.
    5. Traefik даёт возможность хостить множество не связанных друг с другом проектов на одном IP адресе (крайне полезно для локальных окружений)
    6. Использование Traefik в процессе разработки позволяет интуитивно создавать приложения, готовые к оркестрации и масштабированию в production окружениях.

    Nginx - это отличный веб сервер, но как и Apache, он не подходит на роль tls proxy или reverse proxy для приложений внутри docker контейнеров. Традиционный подход к разработке стремительно вытесняется двенадцати факторной методологией (The Twelve-Factor App), и старые инструменты перестают быть универсальными. Я и сам довольно долго держался за Nginx, т.к. привык к нему, но настало время идти дальше. Traefik в 2019 - это как Nginx в 2009: словно глоток свежего воздуха!
  • Как сравнить два файла в python?

    neatsoft
    @neatsoft
    Если в конце file1 и file2 может отсутствовать символ перевода строки, то лучше так:
    INPUT_FILENAME = 'file1'
    BLACKLIST_FILENAME = 'file2'
    OUTPUT_FILENAME = 'file3'
    
    with open(BLACKLIST_FILENAME) as f:
        blacklist = [line.rstrip('\n') for line in f]
    
    prev_line = None
    with open(OUTPUT_FILENAME, 'w') as output_file:
        with open(INPUT_FILENAME) as input_file:
            for line in input_file:
                if line.rstrip('\n') in blacklist:
                    prev_line = None
                else:
                    if prev_line is not None:
                        output_file.write(prev_line)
                    prev_line = line
            if prev_line is not None:
                output_file.write(prev_line)
  • Django request.build_absolute_uri?

    neatsoft
    @neatsoft
    Нужно проверить, правильно ли Nginx устанавливает необходимые хэдеры, для этого в любой вьюшке нужно добавить следующие строки:
    for key, value in request.META.items():
        if key.startswith('HTTP_'):
            print('***', key, ':', value)

    а затем вызвать эту вьюшку обратившись к соответствующему адресу, и посмотреть логи.

    btw, что значит "В моделе" в исходном вопросе?
  • Какой самый быстрый Linux дистрибутив для Docker?

    neatsoft
    @neatsoft
    abbrakadabbra, NUC только на роль медиаплеера годится, т.к. у него слабая система охлаждения. Для создания полноценных компактных систем существуют материнские платы и корпуса формата Mini-ITX
  • Какой самый быстрый Linux дистрибутив для Docker?

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

    upd. Стационарный компьютер может быть абсолютно бесшумным даже при максимальной нагрузке благодаря массивным радиаторам и качественным вентиляторам большого диаметра
  • Какой самый быстрый Linux дистрибутив для Docker?

    neatsoft
    @neatsoft
    Андрей, Консольные утилиты писать - да, хватит и 2 ГБ. Но человек спрашивал про React, значит он не сможет обойтись без браузера в режиме отладки, следовательно даже 8 ГБ будет мало
  • Какой самый быстрый Linux дистрибутив для Docker?

    neatsoft
    @neatsoft
    btw, также настоятельно рекомендую использовать для разработки быстрый nvme накопитель (samsung 960 pro, samsung 970 pro) - это совершенно иной уровень комфорта
  • Какой самый быстрый Linux дистрибутив для Docker?

    neatsoft
    @neatsoft
    abbrakadabbra, Главный пожиратель памяти - браузер. Немало оперативки требуется виртуальным машинам, базам данных, контейнерам с находящимися в разработке проектами. С 8 ГБ работать невозможно - система слишком часто начинает свопиться, иногда наглухо зависает. У себя регулярно наблюдаю потребление более 20 ГБ, но до 30 ни разу не доходило. При этом ничто никуда не течет - аптайм десятками дней исчисляется
  • Какой самый быстрый Linux дистрибутив для Docker?

    neatsoft
    @neatsoft
    Минимальное количество оперативной памяти для комфортной разработки в настоящий момент - 16 ГБ, оптимальное - 32 ГБ. Оперативка не "пропадает в никуда", но ее должно быть достаточно
  • Не удается отправить файл на ftp сервер, в чем может быть причина?

    neatsoft
    @neatsoft
    kriminal_key, Глянул исходники ftplib, в частности функцию makepasv. Если нет возможности добиться от администратора правильной настройки ftp сервера, то можно решить проблему довольно простым манкипатчингом на клиентской стороне:
    from ftplib import FTP
    
    class MyFTP(FTP):
        def makepasv(self):
            __, port = super().makepasv()
            return self.host, port
    
    ftp = MyFTP()
    
    ...
  • Не удается отправить файл на ftp сервер, в чем может быть причина?

    neatsoft
    @neatsoft
    kriminal_key,
    со скрина с Fillezila:
    Сервер отправил пассивный ответ с неопределенным адресом. Использую существующий адрес

    вот и ответ - нужно указать публичный IP в настройках ftp сервера, либо настроить NAT таким образом, чтобы он подменял IP адрес на публичный
  • Не удается отправить файл на ftp сервер, в чем может быть причина?

    neatsoft
    @neatsoft
    kriminal_key,
    может ли быть проблема в том что сервер дает мне рабочий порт для передачи данных, а код использует порт указанный мной в переменной port

    Нет. Но если сервер настроен неправильно, он может возвращать неверный IP адрес, который клиент будет пытаться использовать
  • Не удается отправить файл на ftp сервер, в чем может быть причина?

    neatsoft
    @neatsoft
    kriminal_key,
    у нас рабочие порты от 30000 до 65000

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

    Есть ещё один момент: в пассивном режиме ftp сервер сообщает клиенту не только номер порта, но и IP адрес. Следовательно, если ftp сервер находится за NAT, адрес он будет возвращать неверный, и клиент подключиться не сможет. Корректных решений два:
    1. В настройках ftp сервера указать публичный IP. Для vsftpd, например, это параметр pasv_address
    2. Настроить файрвол таким образом, чтобы он подменял локальный IP на публичный

    "Умные" ftp клиенты могут игнорировать IP адрес, полученный от сервера в ответе на команду PASV, но это отступление от стандарта.
  • Не удается отправить файл на ftp сервер, в чем может быть причина?

    neatsoft
    @neatsoft
    kriminal_key, какой UDP, какой 2134?

    Принцип работы пассивного режима FTP на пальцах:
    1. клиент подключается к серверу по 21/TCP и авторизуется
    2. клиент сообщает о переключении в пассивный режим - команда PASV
    3. сервер выбирает случайный непривилегированный порт, биндится к нему, и передает номер порта клиенту
    4. клиент подключается к указанному порту по TCP, и использует это второе соединение для передачи данных

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

    Активный режим в большинстве случаев неприменим, т.к. для работы в активном режиме клиенту требуется публичный IP
  • Не удается отправить файл на ftp сервер, в чем может быть причина?

    neatsoft
    @neatsoft
    kriminal_key, не заметил эту фразу:
    но как я знаю, в целях защиты, команды которые выводят список файлов и т.д сервер не принимает.

    А что там за сервер? Какой-то стандартный, или что-то самописное? Просто "в целях защиты" к ftp никак не применимо - это текстовый протокол для локального использования, в котором даже пароли в открытом виде передаются
  • Не удается отправить файл на ftp сервер, в чем может быть причина?

    neatsoft
    @neatsoft
    kriminal_key, Кейсов, в которых может потребоваться storlines, не существует - это legacy. Во-первых, этот режим может приводить к изменению символов окончания строк, следовательно не гарантирует бинарную идентичность. Во-вторых, он будет тормозить и расходовать больше памяти при работе с файлами, в которых присутствуют длинные строки. В третьих, он может падать при наличии в файле непечатаемых символов.
    Вне зависимости от типа файлов, лучше всегда использовать бинарный режим