• Как в docker-compose расшарить файл из контейнера на хост?

    ivankomolin
    @ivankomolin
    Есть 2 варианта решить вашу проблему:
    1. Положить таки в директорию ./config/ все нужные файлы и каталоги.
    2. [более правильный] Примонтировать только директорию с конфигами
    - ./config:/etc/nginx/conf.d
    Таким образом во первых вы затрете дефолтный конфиг, который в ней лежит, во вторых nginx нормально запустится, т.к. его основной конфиг будет присутствовать.
    Ответ написан
  • Как использовать Nginx X-Accel-Redirect для проксирования удаленных файлов в Ruby on Rails приложение?

    ivankomolin
    @ivankomolin
    Рассмотрим на примере, без привязки к языку программирования:
    Есть урл https://res.cloudinary.com/demo/video/upload/dog.mp4
    Есть файл /var/www/files/dog.mp4
    Есть nginx который обрабатывает запросы клиента
    Есть некий бэкенд код

    В nginx
    1. Создать internal location в nginx, например:
    location /video/ {
      internal;
      root   /var/www/files/;
    }

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

    В коде
    1. Роутером отлавливаете запрос на урл https://res.cloudinary.com/demo/video/upload/dog.mp4
    2. Обрабатываете(в вашем случае сохраняете статистику, решаете отдавать контент пользователю или нет)
    3. Если файл нужно отдать, добавляете в заголовок
    X-Accel-Redirect https://res.cloudinary.com/video/dog.mp4


    После этого nginx отдает клиенту файл /var/www/files/dog.mp4
    А если обратиться напрямую к урл вида https://res.cloudinary.com/video/dog.mp4, получим 403 ошибку.
    Ответ написан
    Комментировать
  • Как организовать доступ к удаленной папке Linux?

    ivankomolin
    @ivankomolin
    Клиенты sshfs есть и под windows. Другое дело что они требуют либо шаманства, либо оплаты.
    Также никто не отменял ftp. Для обмена файлами это самый подходящий способ, совместимый с любыми платформами.
    Ответ написан
    Комментировать
  • Как правильно открывать соединение WebSocket?

    ivankomolin
    @ivankomolin
    Если вы используете сервер socket.io, то вам необходимо использовать клиентскую библиотеку socket.io, либо писать обертку для работы с сервером самому.

    Чтобы на клиенте заработало "new WebSocket("ws://127.0.0.1:3000");" необходимо на бэкенде запускать обычный Websocket сервер.

    Преимущества socket.io как раз в том, что если клиент не умеет работать с websocket(да такое бывает), то библиотека взаимодействует с сервером другими способами.
    Ответ написан
    3 комментария
  • Как использовать шаблоны проектирования в работе (php + laravel)?

    ivankomolin
    @ivankomolin
    Использование паттернов зависит не от используемого фреймворка или языка программирования, а в большей степени от задач.
    Паттерны позволяют написать более эффективный код того или иного функционала с точки зрения дальнейшей поддержки.
    Есть хороший ресурс, на котором можно ознакомиться с основными встречающимися паттернами, а также разобраться когда их следует применять, а когда нет.
    https://refactoring.guru/ru/design-patterns
    Ответ написан
    Комментировать
  • Можно ли сделать динамический location в nginx?

    ivankomolin
    @ivankomolin
    Можно, но в вашем случае не нужно.
    Разделите логику на 2 разных сервера.
    Плюсы:
    1. Nginx такое обработает быстрее
    2. Проще для восприятия при работе с конфигами

    server {
        listen                      8080;
    
        location / {
            proxy_pass              http://main;
            proxy_set_header        Host $http_host;
        }
    }
    
    server {
        listen                      8010;
    
        location / {
            proxy_pass              http://main;
            proxy_set_header        Host $http_host;
        }
    
        location /static {
            alias                   /home/www/static;
            access_log              off;
        }
    }
    Ответ написан
  • Как идут данные по WebSocket?

    ivankomolin
    @ivankomolin
    соединение ws - данные не шифруются
    соединение wss - данные шифруются

    А информация может быть прочитана конечно, как и в случае с https. Один из способов - подмена сертификата на клиенте.
    Ответ написан
    1 комментарий
  • Как отправить хедер в Websocket?

    ivankomolin
    @ivankomolin
    Отправить данные на сервер в header можно только в момент подключения к серверу.
    Т.к. после соединения начинается обмен фреймами, которые не содержат заголовков подобно http
    Ответ написан
  • Ошибка 1006 при закрытии websocket, почему?

    ivankomolin
    @ivankomolin
    1006 ошибка говорит о том, что соединение было закрыто ненормально(т. е. без отправки фрейма закрытия), когда ожидается код состояния.
    Ответ написан
  • Проект с нестандартной архитектурой. Как оптимизировать ajax сайт под SEO?

    ivankomolin
    @ivankomolin
    Если сайт нацелен и на пользователей и на seo, то именно таким он и должен быть - быстрым для пользователей, доступным для поисковых систем.
    Реализовал подобную систему и считаю это единственная возможность не создавать тормоза у пользователя из-за требований seo-специалистов.
    Но нужно понимать, что поисковые системы не стоят на месте и у них уже должен быть робот который умеет js. Поэтому главное правило, что в пределах одного урла и боту и браузеру с js должен отдаваться абсолютно одинаковый контент. Тогда проблем быть не должно.

    Особенности, которые были выработаны в ходе разработки:
    1. Перезагружать совсем уж мелкими кусками не стоит, т.к. это добавляет нагрузку на клиент в виде сложной логики. Чем проще js на клиенте тем лучше. В итоге от мелких кусков пришли к 2м кускам: Статическая часть и динамическая часть.
    2. Html формировать на сервере. Самый удобный вариант для клиента.
    3. Шаблон одной и той же части должен быть один как для бота так и для браузера с js. Легче поддерживать. А благодаря пункту 2 это становится проще простого.
    Ответ написан
    1 комментарий
  • Безопасны ли такие SQL-запросы?

    ivankomolin
    @ivankomolin
    1. Да, опасно. В вашем случае заэкранируются кавычки и что-то вроде такого \x00, \n, \r, \. А вот "; drop table ***" позволит написать с легкостью)
    2. В таком виде безопасен. Но завтра кто-нибудь уберет (int) без задней мысли и он снова опасен.

    Чем быстрее вы разберетесь с PDO и плейсхолдерами, тем быстрее начнете писать качественный код. Не стоит лениться для изучения основ. В будущем это очень поможет.
    Ответ написан
    7 комментариев
  • Будет ли работать транзакция?

    ivankomolin
    @ivankomolin
    1. Транзакция не блокирует таблицу на чтение и запись. Блокировки и транзакции - это два разных механизма.
    Транзакция отвечает за изоляцию операций(производимых внутри транзакции) от других операций.
    2. Необходимо разобраться какой уровень изоляции вам нужен и какой установлен сейчас для этой транзакции.

    По указанному коду непонятно сработает ли транзакция. Чтобы стало понятно, нужен код запросов внутри транзакции, а также знать текущий уровень изоляции.
    Ответ написан
    2 комментария
  • Как хранить несколько значений в 1 столбце?

    ivankomolin
    @ivankomolin
    1. Необходимо посмотреть код сохранения данных.
    Судя по всему он просто не предусмотрен для сохранения 2х и более категорий

    2. Необходимо подумать над структурой хранения данных и над выводом данных.
    Простым изменением html не получится присвоить материал нескольким категориям.
    Ответ написан
    Комментировать
  • Какой правильный способ считать динамическое значение?

    ivankomolin
    @ivankomolin
    Если нагрузка несущественная, это нормальный вариант, дабы не усложнять логику простого приложения.

    Обычно делают наоборот:
    Cначала делают динамически рассчитываемое, а когда уже такой рассчет становится затратной операцией, то переделывают в регистр.
    Ответ написан
    Комментировать
  • Php, почему filesize возвращает -1?

    ivankomolin
    @ivankomolin
    curl_getinfo($ch, CURLINFO_CONTENT_LENGTH_DOWNLOAD)
    Эта функция возвращает размер загруженного документа, прочитанный из заголовка Content-Length.
    Соответственно если в заголовке на сервере для robots.txt это не указано, то вернется -1
    Ответ написан
    Комментировать
  • Есть ли событие завершения конвертации в библиотеке php ffmpeg?

    ivankomolin
    @ivankomolin
    Если вам нужно именно событие завершения конвертации, то используйте особенности языка.
    Php выполняет код последовательно. Поэтому когда выполнится конвертация, он начнет выполнять следующую по ходу кода строчку)
    Ответ написан
    Комментировать
  • Как задать права для linux user и www-data?

    ivankomolin
    @ivankomolin
    Про пользователя user в группе www-data все верно.
    Теперь необходимо выставить правильный umask для пользователя user.
    Таким образом, чтобы при создании файла права выставлялись 0664.

    Базовые права для директорий, это 0777 (rwxrwxrwx) и для файлов 0666 (rw-rw-rw).
    umask позволяет формировать права при создании для каждого пользователя отдельно.

    Пример создания файла с маской 0022:
    Права по умолчанию: 0666
    Вычитаемое значение umask: 0022 (-)
    Итоговые права: 0644

    Чтобы получились правильные права, необходимо установить маску равной 0002

    Пример создания файла с маской 0002:
    Права по умолчанию: 0666
    Вычитаемое значение umask: 0002 (-)
    Итоговые права: 0664
    Ответ написан
    Комментировать
  • Как запустить выполнения скрипта с одного tty в другом?

    ivankomolin
    @ivankomolin
    Если я правильно понял, вы хотите отправить результат выполнения скрипта index.js отправить в виртуальную консоль /dev/tty6, а результат exec, который по ходу скрипта выполняется, отправить в текущую консоль.

    Вот возможные варианты:
    1. Передать результат выполнения exec в /dev/tty0 или /dev/console(т.е. в текущую активную консоль)
    2. В момент запуска скрипта index.js передать внутрь значение текущей консоли, это /dev/tty (если вы сами запускаете скрипт) и результат exec отправлять туда.

    Но какая-то странная задача перед вами стоит, если я все верно понял)
    Ответ написан
    Комментировать
  • Как с помощью php можно вставить текст в google презентацию?

    ivankomolin
    @ivankomolin
    В коде вы создали shape MyTextBox_01 и добавили в нее текст. И опубликовали все это на слайд.
    Вы все правильно сделали. Ваша задача решается именно так.
    Только необходимо shape создавать в нужном месте. Почитайте в документации про позиционирование фигур.
    Ответ написан
    Комментировать
  • Оптимальные параметры memcache на VPS?

    ivankomolin
    @ivankomolin
    Универсального правила настройки нет.
    Нужно просто понимать что это за числа:
    MAXCONN - это примерно количество одновременных коннектов, которые отработает сервер в шт.
    CACHESIZE - размер пространства в ОЗУ в МБ.

    Поэтому узнайте сколько у вас свободной ОЗУ, прикиньте сколько можете выделить для memcached и пишите.
    Почему-то я сомневаюсь что у вас на VPS 50Гб ОЗУ, поэтому прежде чем писать 50000 выясните этот момент.

    Просто установленный и настроенный сервер memcached сам по себе ничего не кеширует.
    Кеширование производится внутри приложения.
    Вот там и посмотрите(установили кеш, прочитали кеш) если работает, значит работает "нормально")
    Ответ написан
    Комментировать