Pull to refresh
6
0
Дмитрий Вапельник @dvapelnik

Back-end Web Development

Send message
кто-нибудь подскажет как решить проблему с docker?
  1. запускаю контейнер с --privileged — в контейнере не запускается mysql-server
    результат
    root@b1d8a93c420a:/# service mysql start
    /usr/sbin/mysqld: error while loading shared libraries: libaio.so.1: cannot open shared object file: Permission denied
    


  2. запускаю контейнер без --privileged — не работает sshfs
    результат
    root@5d61518c125f:/# sshfs dvapelnik@172.17.42.1:/home/dvapelnik/tmp /mnt -o uid=33,gid=33
    fuse: failed to open /dev/fuse: Operation not permitted
    



sshfs нужен для корректного монтирования папки с хост-машины — при прокидывании папки с помощью run -v не совсем корректно идет работа с правами на содержимое этой папки
как вариант — не запуска mysql-server в контейнере, а использовать mysq-server на хост-машине, но тогда для прозрачности работы с ним через localhost было бы неплохо сфорвардить порт 3306 с контейнера в хост-машину, а это не удается
да, плохие и хорошие проекты есть, но речь сейчас не об этом
Не представляете? Наверное, мало работали в процедурном стиле?

как извратиться придумать можно. но зачем если можно сделать все красиво в ООП-стиле?
Хорошего способа — нет. Т.е. можно сделать ООП код без ООП конструкций языка (суть ООП не в ключевых словах, а в полиморфизме, наследовании), но с ними проще и понятнее.

для чего тогда спорить? мы говорим об одном и том же
костылей нет. я не говорю, что это какой-либо костыль
дело в том, что если дальше раширять приложение, то гораздо уробнее и приятнее расширять его если приложение было грамотно спроектировано
в моем опыте было два php-фреймвока (второй yii). даже два фремворка, реализующие MVC очень разнятся в удобстве работы сним. к примеру, в первом работа с БД реализована примерно так, как Вы описали выше:
load('user', $userId);
load('category', $categoryId);
load('foo', $fooId);

тоесть, там есть один класс Модель, который в конструктор принимает имя таблицы и потом от него танцуем. Да, получить данные с таблицы мы можем, но мы не забываем о принципе «Fat model, skinny controller», следуя которому, бизнес-логику следует вкладывать в модель для повторного использования, а не в контроллер. чтобы это сделать я допилил следующим образом: я расширил этот базовый класс Model и имею классы UserModel, PostModel и т.д… в них же реализую бизнес-логику. если же подходить к вопросу в процедурном стиле, то я не представляю как реализовать это.
речь шла о конкретном примере и это в YiiFramework
да ничего не мешает. просто код читабельнее и я сомневаюсь, что в функцию user_load вы нормально воткнете все плюшка AR. ну разве что, использовав её как враппер, но мы же говорим о читабельности и поддерживаемости кода
данный кусок кода взят из YiiFramework
статический метод model — это некая статическая фабрика
результате мы получим не просто данные из таблицы user, а AR-объект с другими плюшками, которые могут пригодиться далее: поиск по связанным таблицам, если такие есть, мы можем изменить данные и вызвать метод save объекта $user и сохранить запись в таблице, можем провести вализацию
используя Ваш неООП подход, мы не сможем такого сделать, а будем городить костыли или писать велосипеды
кому как, а мне вступление понравилось больше примеров
а как посоветуете бороться со спаммерами, которые спамят через php-шный mail()?
в свое время для >=php5.3 я начал использовать лог вызовов
mail.add_x_header = On
mail.log = /var/log/sendmail-php.log

потом, посредством ротации, я получаю на почту количество писем (вызовов mail()) каждым из скриптов
cat /var/log/sendmail-php.log | egrep -o '\/.+\.php'| sort | uniq -c | mail -s "sendmail-php log" my.mail.fetcher@domain.com
спасибо за подсказки и информацию
я поковырял ваш контейнер, ваши скрипты start/stop и разобрался как у вас оно работает. на сколько я понял, то вы пробрасываете папку проекта в контейнер (-v). я только вот не совсем разобрался как вы решили следующую проблему: папку с расшариваю (-v /path/to/src:/path/to/dst), но апач, запущенный под apache:apache не может использовать и писать в файлы, которые были расшарены в контейнер. Владелец и группа папки/файлов — 1000. на сколько я понимаю, то это UID и GID с хост-машины. Далее, если я изменю владельца: группу на файлы с контейнера, то изменятся эти данные и в на хост-машине, но на UID:GID пользователя с контейнера.
Можно ли это как-либо причесать чтобы при расшаривании в контейнере файлы принадлежали определенному пользователю (например, апачу для удобной работы с ними) и новые файлы, залитые в контейнер посредством апача (аплоад файла например) на хост машине принадлежали текущему пользователю на хост-машине?
разбираюсь и приходят новые мысли как мне это все расширить и реализовать
да, еще раз спасибо за наводку на docker. я его уже поковырял немного и полностью согласен, что на нем это намного удобнее делать и пилю скрипты уже в сторону docker. в конце концов, он меньше ресурсов выедает. но есть несколько камней, которые я опишу, но сначала вопрос:
в процессе однакомления с docker я выкачал образ CentOS (в пачке я получил три образа: centos5, centos6, centos7 — остановился на шестом)
# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
centos              centos5             5a1ebaa356ff        5 days ago          484 MB
centos              centos7             70214e5d0a90        9 days ago          224 MB
centos              latest              70214e5d0a90        9 days ago          224 MB
centos              centos6             68eb857ffb51        9 days ago          212.7 MB

далее я запускаю контейнер и вижу следующее:
# docker ps
CONTAINER ID        IMAGE               COMMAND ....
e8e254b40b74        centos:centos6      "/bin/bash" ....

я что-то там установлю, сделаю в этом контейнере. выключу-включу его же незакоммиченный через start и вижу все то, что я устанавливал и изменял. это плохой тон использовать незакоммиченные контейнеры для работы? нужно для при очерезной потребности запускать (run) контейнер для работы с ним?.. хотя да, если мы пробрасываем в него разные проекты, то должны и перезапускать контейнер (stop, rm, run) с новым проектом. хотя, может, я до конца ещё не вникся философией docker
но все же мне хотелось бы иметь следующее:
  1. Запустить контейнер (start)
  2. Выполнить скрипт с одним-двумя-тремя параметрометрами (папка с хост-машины прокидывается в docker, разворачивается БД)
  3. Работаем с проектом
  4. Выполнить скрипт с одним-двумя-тремя параметрометрами (БД дампится обратно и дизмаунтится папка)

итак, камни:
  1. Пока не встретил нигде возможности удаленно с хост-машины выполнить скрипт в контейнере (да, можно выполнять его при запуске контейнера (run), но пока не связал все в единый скрипт, чтобы его выполнить)
  2. Можно в контейнере поднимать sshd и с хост-машины выполняться скрипт в контейнере
    # ssh root@container 'service httpd restart'
    

    но мне кажется это неправильным идеологически в разрезе docker. К тому же, постоянно изменятся IP контейнера — как минимум, будет спрашивать прием server fingerprint — что тоже не особо удобно. Прописывать нужные IP и относить их к конкретному домену в dnsmasq.conf я уже научился.

больше камней не припомню — не натолкнулся ещё
в будущем хотелось бы это все дело поднять именно на docker — меня соблазнила скорость его работы и легковесность
к тому же на андроиде интерфейс видеоплеера отличается от интерфейса на ПК, по крайней мере в огнелисе
Vagrant у меня не завелся с конфигом от puphpet.com — валился httpd и ни в какую
Хост-машина тоже под Linux, но проблема в версиях ПО, прежде всего PHP. Изначально это делалось для того, чтобы иметь возможность разрабатывать на разных версиях PHP. Есть проект, который жестко требует php5.3 и переписывать его, как минимум, на php5.4 никто точно не будет, а допиливать его нужно. Остальные проекты требуют, как минимум, php5.4. php5.4 для тестирования и php5.6 для ознакомления. Поднять этот весь зоопарк на одной машине, на хосте, и настроить динамическую смену версий для каждого проекта и к тому же, чтобы одновременно один и тот же проект запустить на нескольких версиях php невозможно. Да, несколько версий php можно поднять и настроить, но это ещё те танцы с бубном. Лично мне не хочется загаживать рабочую ОС (да тот же Linux) левым софтом типа четырех версий php, установленным с танцами.
В качестве удаленного репозитория я использую связку Redmine+Gitolite на удаленном сервере.
Да, можно было бы использовать, но как я писал выше, это было бы не настолько юзабельно и пришлось бы вручную прописывать путь для каждого проекта (папки)
За FQDN спасибо
  1. Подразумевается, что локальная сеть с виртуальной машиной есть. Используется HostOnly виртуальная сетевая карта и через неё осуществляется доступ с основной машины (ноут) к виртуальной — в данном случае сеть 192.168.191.0/24. Это должно быть понятно ибо в любом случае нужно как-то к гостевой машине по ssh, http и/или использования удаленной работы с mysql сервером
  2. Я так понимаю, что Вы предлагаете иметь доступ с виртуальной машины на продакшн-хост сайта? Для чего? Деплой можно реализовать с машины, где ведется разработка (я не знаю как правильно её назвать в этом контексте — ноут). PhpStorm позволяет синхронизацию с удаленным сервером, выгрузку измененных файло после успешного коммита изменений в git, можно настроить деплой через хуки гита — деплой можно придумать какой-угодно. Я не вижу упрощения в данном случае
  3. Упросить путем использования sshfs? Если я Вас верно пониаю, то вы предлагаете с виртуальной машины стучаться в ноут, брать там нужную папочку и монтировать её по sshfs в вирутальную машину? Если верно, то нам придется под каждую папку руцями прописывать путь к требуемой папке. Папки проектов могут лежать на ноуте где-попало — нам ничего не запрещает один проект положить на декстопе, второй в /tmp, третий в ~/Downloads и так далее. Есть ли идея реализации универсального монтирования этих папочек в виртуальную машину? Мне в голову пока ничего не приходит. В моем случае все монтируемые папки лежат в одном месте /media/sf_*. Изначально я выбирал непустые папки из этой директории и монтировал. Но потом использовал непосредственно список подмонтированных папок, что я считаю более правильным. В таком случае нам вообще не нужно лгиниться в виртуальную машину чтобы настроить монтирование нужной папки. Мы просто кладем конфиг для веб-сервера в папку проекта, расшариваем папку в виртуальную машину и запускаем ей. Все! Больше мы ничего не делаем.
  4. Как правильно настроить сервер, я думаю, что имеемтся в виду веб-сервер, для быстрого разворачивания любого сайта? DocumentRoot может быть как в корне, так и в директории www/, могут быть специальные настройки окружения (на некоторых проектах я использую настройку через SetEnv для статуса приложения: дебаг или нет. Я считаю, что это удобно сделать в настройках виртуального хоста веб-сервера для каждого проета.
  5. Чем
    # mkdir -p /root/bin
    

    не угодил? после установки этой папки у рута дома нет. А может у кого и есть. В используемом мной дистрибутиве её не было.

Целью ставилось создание независимого скрипта, который бы дела все за нас, а от нас требовалось бы только подготовить конфиг для веб-сервера и положить дамп базы если это нужно.
12 ...
7

Information

Rating
Does not participate
Location
Винница, Винницкая обл., Украина
Date of birth
Registered
Activity