diff --git a/.dockerignore b/.dockerignore index f95a9d8..3d38865 100644 --- a/.dockerignore +++ b/.dockerignore @@ -3,10 +3,9 @@ # vendor будет заполнен уже внутри контейнера vendor -# node_modules для этого контейнера не нужны +# Всё, что динамично на фронте frontend/node_modules -frontend/webpack/node_modules -frontend/scripts/node_modules +frontend/dist # Все временные файлы */runtime diff --git a/.gitignore b/.gitignore index 8ce4e28..441d98f 100644 --- a/.gitignore +++ b/.gitignore @@ -1,37 +1,22 @@ # phpstorm project files .idea -# netbeans project files -nbproject - -# zend studio for eclipse project files -.buildpath -.project -.settings - -# windows thumbnail cache -Thumbs.db - -# composer vendor dir +# Composer /vendor - -# composer itself is not needed -/composer.phar /composer.lock # Mac DS_Store Files .DS_Store -# phpunit itself is not needed -phpunit.phar -# local phpunit config -/phpunit.xml - # npm debug npm-debug* -# Docker override file -docker-compose.override.yml +# Docker и его override файлы +/docker-compose.yml +/docker-compose.override.yml # Локальный .env /.env + +# id_rsa +/id_rsa diff --git a/Dockerfile b/Dockerfile index cb36528..69be73d 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,8 +1,8 @@ -FROM php:7.1-fpm +FROM php:7.0-fpm ENV PATH $PATH:/root/.composer/vendor/bin -# PHP extensions come first, as they are less likely to change between Yii releases +# Сначала настраиваем всё, что нам нужно на системном уровне RUN apt-get update \ && apt-get -y install \ git \ @@ -10,46 +10,53 @@ RUN apt-get update \ libicu-dev \ libmcrypt-dev \ zlib1g-dev \ + bzip2 \ + libbz2-dev \ + liblzma-dev \ + xz-utils \ openssh-server \ + supervisor \ --no-install-recommends \ + --force-yes \ - # Install PHP extensions + # PHP расширения && docker-php-ext-install intl \ && docker-php-ext-install pdo_mysql \ && docker-php-ext-install mbstring \ && docker-php-ext-install mcrypt \ && docker-php-ext-install zip \ && docker-php-ext-install bcmath \ + && docker-php-ext-install opcache \ && apt-get purge -y g++ \ && apt-get autoremove -y \ && rm -r /var/lib/apt/lists/* \ - # Don't clear our valuable environment vars in PHP + # Отключаем сброс глобальных env переменных внутри PHP && echo "\nclear_env = no" >> /usr/local/etc/php-fpm.conf \ - # Fix write permissions with shared folders + # Фикс прав на запись для расшаренных папок && usermod -u 1000 www-data -# copy-paste from https://github.com/nodejs/docker-node/blob/910443c39c80291f0bf24712d8d94279cf15b7b5/6.5/wheezy/Dockerfile +# Копипаста из https://github.com/nodejs/docker-node/blob/50b56d39a236fd519eda2231757aa2173e270807/5.12/Dockerfile # gpg keys listed at https://github.com/nodejs/node RUN set -ex \ - && for key in \ - 9554F04D7259F04124DE6B476D5A82AC7E37093B \ - 94AE36675C464D64BAFA68DD7434390BDBE9B9C5 \ - 0034A06D9D9B0064CE8ADF6BF1747F4AD2306D93 \ - FD3A5288F042B6850C66B31F09FE44734EB7990E \ - 71DCFD284A79C3B38668286BC97EC7A07EDE3FC1 \ - DD8F2338BAE7501E3DD5AC78C273792F7D83545D \ - B9AE9905FFD7803F25714661B63B535A4C206CA9 \ - C4F0DFFF4E8C1A8236409D08E73BC641CC11F4C8 \ - ; do \ - gpg --keyserver ha.pool.sks-keyservers.net --recv-keys "$key"; \ - done + && for key in \ + 9554F04D7259F04124DE6B476D5A82AC7E37093B \ + 94AE36675C464D64BAFA68DD7434390BDBE9B9C5 \ + 0034A06D9D9B0064CE8ADF6BF1747F4AD2306D93 \ + FD3A5288F042B6850C66B31F09FE44734EB7990E \ + 71DCFD284A79C3B38668286BC97EC7A07EDE3FC1 \ + DD8F2338BAE7501E3DD5AC78C273792F7D83545D \ + B9AE9905FFD7803F25714661B63B535A4C206CA9 \ + C4F0DFFF4E8C1A8236409D08E73BC641CC11F4C8 \ + ; do \ + gpg --keyserver ha.pool.sks-keyservers.net --recv-keys "$key"; \ + done ENV NPM_CONFIG_LOGLEVEL info -ENV NODE_VERSION 6.5.0 +ENV NODE_VERSION 5.12.0 RUN curl -SLO "https://nodejs.org/dist/v$NODE_VERSION/node-v$NODE_VERSION-linux-x64.tar.xz" \ && curl -SLO "https://nodejs.org/dist/v$NODE_VERSION/SHASUMS256.txt.asc" \ @@ -59,44 +66,84 @@ RUN curl -SLO "https://nodejs.org/dist/v$NODE_VERSION/node-v$NODE_VERSION-linux- && rm "node-v$NODE_VERSION-linux-x64.tar.xz" SHASUMS256.txt.asc SHASUMS256.txt \ && ln -s /usr/local/bin/node /usr/local/bin/nodejs -# Поставим xdebug отдельно, т.к. потом его потенциально придётся отсюда убирать -# фиксируем версию, т.к. 2.4.1 не собирается под 7.1 -RUN yes | pecl install xdebug-2.4.0 \ - && echo "zend_extension=$(find /usr/local/lib/php/extensions/ -name xdebug.so)" > /usr/local/etc/php/conf.d/xdebug.ini \ - && echo "xdebug.default_enable=1" >> /usr/local/etc/php/conf.d/xdebug.ini \ - && echo "xdebug.remote_enable=1" >> /usr/local/etc/php/conf.d/xdebug.ini \ - && echo "xdebug.remote_handler=dbgp" >> /usr/local/etc/php/conf.d/xdebug.ini \ - && echo "xdebug.remote_mode=req" >> /usr/local/etc/php/conf.d/xdebug.ini \ - && echo "xdebug.remote_autostart=1" >> /usr/local/etc/php/conf.d/xdebug.ini \ - && echo "xdebug.remote_port=9000" >> /usr/local/etc/php/conf.d/xdebug.ini \ - && echo "xdebug.remote_connect_back=1" >> /usr/local/etc/php/conf.d/xdebug.ini \ - && echo "xdebug.cli_color=1" >> /usr/local/etc/php/conf.d/xdebug.ini \ - && echo "xdebug.var_display_max_depth=10" >> /usr/local/etc/php/conf.d/xdebug.ini - ENV COMPOSER_NO_INTERACTION 1 +ENV COMPOSER_ALLOW_SUPERUSER 1 +ENV COMPOSER_DISCARD_CHANGES true -# Next composer and global composer package, as their versions may change from time to time +# Composer и его глобальные зависимости RUN curl -sS https://getcomposer.org/installer | php \ && mv composer.phar /usr/local/bin/composer.phar \ && echo '{"github-oauth": {"github.com": "***REMOVED***"}}' > ~/.composer/auth.json \ - && composer.phar global require --no-progress "hirak/prestissimo:>=0.3.1" + && composer.phar global require --no-progress "hirak/prestissimo:>=0.3.4" COPY ./docker/php/composer.sh /usr/local/bin/composer -RUN chmod a+x /usr/local/bin/composer + +# Конфиг для php +COPY ./docker/php/php.ini /usr/local/etc/php/ + +# Конфиг для supervisor +COPY ./docker/php/supervisord.conf /etc/supervisord.conf + +# wait-for-it +COPY ./docker/wait-for-it.sh /usr/local/bin/wait-for-it + +# Наша кавайная точка входа +COPY ./docker/php/entrypoint.sh /usr/local/bin/ + +RUN chmod a+x /usr/local/bin/composer \ + && chmod a+x /usr/local/bin/entrypoint.sh \ + && chmod a+x /usr/local/bin/wait-for-it \ + && ln -s /usr/local/bin/entrypoint.sh / \ + && mkdir /root/.ssh + +COPY id_rsa /root/.ssh + +# Включаем поддержку ssh +RUN eval $(ssh-agent -s) \ + && ssh-add /root/.ssh/id_rsa \ + && touch /root/.ssh/known_hosts \ + && ssh-keyscan gitlab.com >> /root/.ssh/known_hosts WORKDIR /var/www/html -# Custorm php configuration -COPY ./docker/php/php.ini /usr/local/etc/php/ +# Копируем composer.json в родительскую директорию, которая не будет синкатся с хостом через +# volume на dev окружении. В entrypoint эта папка будет скопирована обратно. +COPY ./composer.json /var/www/composer.json -# Copy the working dir to the image's web root +# Устанавливаем зависимости PHP +RUN cd .. \ + && composer install --no-interaction --no-suggest --no-dev --optimize-autoloader \ + && cd - + +# Устанавливаем зависимости для Node.js +# Делаем это отдельно, чтобы можно было воспользоваться кэшем, если от предыдущего билда +# ничего не менялось в зависимостях +RUN mkdir -p /var/www/frontend + +COPY ./frontend/package.json /var/www/frontend/ +COPY ./frontend/scripts /var/www/frontend/scripts +COPY ./frontend/webpack-utils /var/www/frontend/webpack-utils + +RUN cd ../frontend \ + && npm install \ + && cd - + +# Наконец переносим все сорцы внутрь контейнера COPY . /var/www/html -# The following directories are .dockerignored to not pollute the docker images -# with local logs and published assets from development. So we need to create -# empty dirs and set right permissions inside the container. RUN mkdir -p api/runtime api/web/assets console/runtime \ - && chown www-data:www-data api/runtime api/web/assets console/runtime + && chown www-data:www-data api/runtime api/web/assets console/runtime \ + # Билдим фронт + && cd frontend \ + && ln -s /var/www/frontend/node_modules $PWD/node_modules \ + && npm run build \ + && rm node_modules \ + # Копируем билд наружу, чтобы его не затёрло volume в dev режиме + && cp -r ./dist /var/www/dist \ + && cd - -# Expose everything under /var/www (vendor + html) -VOLUME ["/var/www"] +# Экспозим всё под /var/www/html для дальнейшей связки с nginx +VOLUME ["/var/www/html"] + +ENTRYPOINT ["entrypoint.sh"] +CMD ["/usr/bin/supervisord", "-n", "-c", "/etc/supervisord.conf"] diff --git a/Dockerfile-dev b/Dockerfile-dev new file mode 100644 index 0000000..fa42b98 --- /dev/null +++ b/Dockerfile-dev @@ -0,0 +1,162 @@ +FROM php:7.0-fpm + +ENV PATH $PATH:/root/.composer/vendor/bin + +# Сначала настраиваем всё, что нам нужно на системном уровне +RUN apt-get update \ + && apt-get -y install \ + git \ + g++ \ + libicu-dev \ + libmcrypt-dev \ + zlib1g-dev \ + bzip2 \ + libbz2-dev \ + liblzma-dev \ + xz-utils \ + openssh-server \ + supervisor \ + --no-install-recommends \ + --force-yes \ + + # PHP расширения + && docker-php-ext-install intl \ + && docker-php-ext-install pdo_mysql \ + && docker-php-ext-install mbstring \ + && docker-php-ext-install mcrypt \ + && docker-php-ext-install zip \ + && docker-php-ext-install bcmath \ + && docker-php-ext-install opcache \ + + && apt-get purge -y g++ \ + && apt-get autoremove -y \ + && rm -r /var/lib/apt/lists/* \ + + # Отключаем сброс глобальных env переменных внутри PHP + && echo "\nclear_env = no" >> /usr/local/etc/php-fpm.conf \ + + # Фикс прав на запись для расшаренных папок + && usermod -u 1000 www-data + +# Копипаста из https://github.com/nodejs/docker-node/blob/50b56d39a236fd519eda2231757aa2173e270807/5.12/Dockerfile + +# gpg keys listed at https://github.com/nodejs/node +RUN set -ex \ + && for key in \ + 9554F04D7259F04124DE6B476D5A82AC7E37093B \ + 94AE36675C464D64BAFA68DD7434390BDBE9B9C5 \ + 0034A06D9D9B0064CE8ADF6BF1747F4AD2306D93 \ + FD3A5288F042B6850C66B31F09FE44734EB7990E \ + 71DCFD284A79C3B38668286BC97EC7A07EDE3FC1 \ + DD8F2338BAE7501E3DD5AC78C273792F7D83545D \ + B9AE9905FFD7803F25714661B63B535A4C206CA9 \ + C4F0DFFF4E8C1A8236409D08E73BC641CC11F4C8 \ + ; do \ + gpg --keyserver ha.pool.sks-keyservers.net --recv-keys "$key"; \ + done + +ENV NPM_CONFIG_LOGLEVEL info +ENV NODE_VERSION 5.12.0 + +RUN curl -SLO "https://nodejs.org/dist/v$NODE_VERSION/node-v$NODE_VERSION-linux-x64.tar.xz" \ + && curl -SLO "https://nodejs.org/dist/v$NODE_VERSION/SHASUMS256.txt.asc" \ + && gpg --batch --decrypt --output SHASUMS256.txt SHASUMS256.txt.asc \ + && grep " node-v$NODE_VERSION-linux-x64.tar.xz\$" SHASUMS256.txt | sha256sum -c - \ + && tar -xJf "node-v$NODE_VERSION-linux-x64.tar.xz" -C /usr/local --strip-components=1 \ + && rm "node-v$NODE_VERSION-linux-x64.tar.xz" SHASUMS256.txt.asc SHASUMS256.txt \ + && ln -s /usr/local/bin/node /usr/local/bin/nodejs + +# Поставим xdebug отдельно, т.к. потом его потенциально придётся отсюда убирать +RUN yes | pecl install xdebug \ + && echo "zend_extension=$(find /usr/local/lib/php/extensions/ -name xdebug.so)" > /usr/local/etc/php/conf.d/xdebug.ini \ + && echo "xdebug.default_enable=1" >> /usr/local/etc/php/conf.d/xdebug.ini \ + && echo "xdebug.remote_enable=1" >> /usr/local/etc/php/conf.d/xdebug.ini \ + && echo "xdebug.remote_handler=dbgp" >> /usr/local/etc/php/conf.d/xdebug.ini \ + && echo "xdebug.remote_mode=req" >> /usr/local/etc/php/conf.d/xdebug.ini \ + && echo "xdebug.remote_autostart=1" >> /usr/local/etc/php/conf.d/xdebug.ini \ + && echo "xdebug.remote_port=9000" >> /usr/local/etc/php/conf.d/xdebug.ini \ + && echo "xdebug.remote_connect_back=1" >> /usr/local/etc/php/conf.d/xdebug.ini \ + && echo "xdebug.cli_color=1" >> /usr/local/etc/php/conf.d/xdebug.ini \ + && echo "xdebug.var_display_max_depth=10" >> /usr/local/etc/php/conf.d/xdebug.ini + +ENV COMPOSER_NO_INTERACTION 1 +ENV COMPOSER_ALLOW_SUPERUSER 1 +ENV COMPOSER_DISCARD_CHANGES true + +# Composer и его глобальные зависимости +RUN curl -sS https://getcomposer.org/installer | php \ + && mv composer.phar /usr/local/bin/composer.phar \ + && echo '{"github-oauth": {"github.com": "***REMOVED***"}}' > ~/.composer/auth.json \ + && composer.phar global require --no-progress "hirak/prestissimo:>=0.3.4" + +COPY ./docker/php/composer.sh /usr/local/bin/composer + +# Конфиг для php +COPY ./docker/php/php.ini /usr/local/etc/php/ + +# Конфиг для supervisor +COPY ./docker/php/supervisord.conf /etc/supervisord.conf + +# wait-for-it +COPY ./docker/wait-for-it.sh /usr/local/bin/wait-for-it + +# Наша кавайная точка входа +COPY ./docker/php/entrypoint.sh /usr/local/bin/ + +RUN chmod a+x /usr/local/bin/composer \ + && chmod a+x /usr/local/bin/entrypoint.sh \ + && chmod a+x /usr/local/bin/wait-for-it \ + && ln -s /usr/local/bin/entrypoint.sh / \ + && mkdir /root/.ssh + +COPY id_rsa /root/.ssh + +# Включаем поддержку ssh +RUN eval $(ssh-agent -s) \ + && ssh-add /root/.ssh/id_rsa \ + && touch /root/.ssh/known_hosts \ + && ssh-keyscan gitlab.com >> /root/.ssh/known_hosts + +WORKDIR /var/www/html + +# Копируем composer.json в родительскую директорию, которая не будет синкатся с хостом через +# volume на dev окружении. В entrypoint эта папка будет скопирована обратно. +COPY ./composer.json /var/www/composer.json + +# Устанавливаем зависимости PHP +RUN cd .. \ + && composer install --no-interaction --no-suggest \ + && cd - + +# Устанавливаем зависимости для Node.js +# Делаем это отдельно, чтобы можно было воспользоваться кэшем, если от предыдущего билда +# ничего не менялось в зависимостях +RUN mkdir -p /var/www/frontend + +COPY ./frontend/package.json /var/www/frontend/ +COPY ./frontend/scripts /var/www/frontend/scripts +COPY ./frontend/webpack-utils /var/www/frontend/webpack-utils + +RUN cd ../frontend \ + && npm install \ + && cd - + +# Наконец переносим все сорцы внутрь контейнера +COPY . /var/www/html + +RUN mkdir -p api/runtime api/web/assets console/runtime \ + && chown www-data:www-data api/runtime api/web/assets console/runtime \ + # Билдим фронт + && cd frontend \ + && ln -s /var/www/frontend/node_modules $PWD/node_modules \ + && npm run build \ + && rm node_modules \ + # Копируем билд наружу, чтобы его не затёрло volume в dev режиме + && cp -r ./dist /var/www/dist \ + && cd - + +# Экспозим всё под /var/www/html для дальнейшей связки с nginx +VOLUME ["/var/www/html"] + +ENTRYPOINT ["entrypoint.sh"] +CMD ["/usr/bin/supervisord", "-n", "-c", "/etc/supervisord.conf"] diff --git a/README.md b/README.md index 4c3cd23..fb019f3 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# Account Ely.by +# Accounts Ely.by ## Развёртывание dev @@ -6,61 +6,49 @@ [docker](https://docs.docker.com/engine/installation/) и его [docker-compose](https://docs.docker.com/compose/install/). -Сливаем репозиторий: +Кроме того, нужно установить, настроить и запустить [nginx-proxy](https://gitlab.com/elyby/nginx-proxy) +контейнер. Это делается один раз в рамках системы и в дальнейшем используется и для других проектов. + +За тем сливаем репозиторий: ```sh -git clone git@bitbucket.org:ErickSkrauch/ely.by-account.git account.ely.by.local +git clone git@gitlab.com:elyby/account.git account.ely.by cd account.ely.by.local ``` -Выполняем первый запуск контейнеров: +Далее нужно создать `.env`, `docker-compose.yml` и `id_rsa` файлы: + +```sh +cp .env-dist .env +cp docker-compose.dev.yml docker-compose.yml +cp ~/.ssh/id_rsa id_rsa # Использовать ссылку нельзя +``` + +Касательно файла id_rsa: часть зависимостей находятся в наших приватных репозиториях, получить +доступ куда можно только в том случае, если в контейнере окажется ключ, который имеет доступ к этим +репозиториям. + +Все вышеперечисленные файла находятся под gitignore, так что с полученными файлами можно произвести +все необходимые манипуляции под конкретный кейс использования. **В файле `.env` обязательно следует +задать `JWT_USER_SECRET`, иначе авторизация на бекенде не заработает.** + +После этого просто выполняем старт всех контейнеров: ```sh docker-compose up -d ``` -Далее нужно влезть в работающие контейнеры и сделать что-нибудь, что их настроит. +Они автоматически сбилдятся и начнут свою работу. ### Как влезть в работающий контейнер -Сперва, с помощью команды `docker ps` мы увидим все запущенные контейнеры. Нас интересуют значения из первой колонки -CONTAINER ID. Узнать, чему они соответствуют можно прочитав название IMAGE из 2 колонки. Чтобы выполнить команду -внутри работабщего контейнера, нужно выполнить: +Сперва, с помощью команды `docker ps` мы увидим все запущенные контейнеры. Нас интересуют значения +из первой колонки CONTAINER ID или NAMES. Узнать, чему они соответствуют можно прочитав название IMAGE +из 2 колонки. Чтобы выполнить команду внутри работабщего контейнера, нужно выполнить: ``` -docker exec -it a7c267b27f49 /bin/bash +docker exec -it accountelyby_app_1 bash ``` -Где `a7c267b27f49` - одно из значений из первой колонки. Для выхода из контейнера используем `exit`. - -------------------------- - -Так вот, нам нужно выполнить ряд команд. Здесь и далее я буду писать имена контейнеров в их соответствии с compose -файлом, но в реалиях их нужно будет заменить на реальные значения: - -```sh -# Настройка php контейнера -docker exec -it app php init --env=Docker -docker exec -it app php composer install -docker exec -it app php ./yii migrate --interactive=0 - -# Настройка node контейнера -docker exec -it node-dev-server npm i -docker exec -it node-dev-server npm --prefix ./webpack i ./webpack -docker exec -it node-dev-server npm --prefix ./scripts i ./scripts - -# Настройка rabbitmq контейнера -docker exec -it rabbitmq /init.sh -``` - -После этого перезапускаем все контейнеры командой: - -```sh -docker-compose restart -``` - -## Тестирование php бэкэнда - -```sh -./tests/run-tests.sh -``` +Где `accountelyby_app_1` - одно из значений CONTAINER ID или NAMES. Для выхода из контейнера +используем `exit`. diff --git a/common/config/ConfigLoader.php b/common/config/ConfigLoader.php index c94c4e1..d4683ec 100644 --- a/common/config/ConfigLoader.php +++ b/common/config/ConfigLoader.php @@ -44,7 +44,7 @@ class ConfigLoader { } // Настройки конкретного приложения для действующего окружения - $path = self::ROOT_PATH . '/' . $this->application . '/config/main-' . YII_ENV . '.php'; + $path = self::ROOT_PATH . '/' . $this->application . '/config/config-' . YII_ENV . '.php'; if (file_exists($path)) { $toMerge[] = require $path; } diff --git a/composer.json b/composer.json index a9de380..429f227 100644 --- a/composer.json +++ b/composer.json @@ -25,7 +25,7 @@ "ely/yii2-tempmail-validator": "~1.0.0", "emarref/jwt": "~1.0.3", "ely/amqp-controller": "^0.1.0", - "ely/email-renderer": "dev-master#10e77d7a60403e87ca6e8c7d9e62a36fc5e08565" + "ely/email-renderer": "dev-master#4a751652b5a325d44d3bc79a464dda9232486cbc" }, "require-dev": { "yiisoft/yii2-codeception": "*", diff --git a/data/mysql/.gitignore b/data/mysql/.gitignore new file mode 100644 index 0000000..d6b7ef3 --- /dev/null +++ b/data/mysql/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore diff --git a/data/redis/.gitignore b/data/redis/.gitignore new file mode 100644 index 0000000..d6b7ef3 --- /dev/null +++ b/data/redis/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore diff --git a/docker-compose.dev.yml b/docker-compose.dev.yml new file mode 100644 index 0000000..9dce11c --- /dev/null +++ b/docker-compose.dev.yml @@ -0,0 +1,74 @@ +version: '2' +services: + app: + build: + dockerfile: Dockerfile-dev + context: . + depends_on: + - db + - redis + - rabbitmq + volumes: + - ./:/var/www/html/ + env_file: .env + + web: + build: ./docker/nginx + volumes_from: + - app + links: + - app:php + env_file: .env + networks: + - default + - nginx-proxy + + db: + build: ./docker/mariadb + env_file: .env + volumes: + - ./data/mysql:/var/lib/mysql + + redis: + image: redis:3.0-alpine + volumes: + - ./data/redis:/data + + rabbitmq: + image: rabbitmq:3.6-management + env_file: .env + environment: + - VIRTUAL_HOST=rabbitmq.account.ely.by.local + - VIRTUAL_PORT=15672 + networks: + - default + - nginx-proxy + + phpmyadmin: + build: ./docker/phpmyadmin + environment: + - PMA_ARBITRARY=1 + - PMA_USER=root + - PMA_PASSWORD= + - VIRTUAL_HOST=pma.account.ely.by.local + depends_on: + - db + networks: + - default + - nginx-proxy + + # Эта штука работает дико медленно, грузит процессор и т.д. и т.п. + # Раскоментировать только в случае лютой надобности + #node-dev-server: + # build: ./frontend + # ports: + # - "8080:8080" + # volumes: + # - ./frontend/:/usr/src/app/ + # environment: + # DOCKERIZED: "true" + +networks: + nginx-proxy: + external: + name: nginx-proxy diff --git a/docker-compose.prod.yml b/docker-compose.prod.yml new file mode 100644 index 0000000..01589ad --- /dev/null +++ b/docker-compose.prod.yml @@ -0,0 +1,40 @@ +version: '2' +services: + app: + build: . + depends_on: + - db + - redis + - rabbitmq + env_file: .env + + web: + build: ./docker/nginx + volumes_from: + - app + links: + - app:php + env_file: .env + networks: + - default + - nginx-proxy + + db: + build: ./docker/mariadb + env_file: .env + volumes: + - ./data/mysql:/var/lib/mysql + + redis: + image: redis:3.0-alpine + volumes: + - ./data/redis:/data + + rabbitmq: + image: rabbitmq:3.6 + env_file: .env + +networks: + nginx-proxy: + external: + name: nginx-proxy diff --git a/docker-compose.yml b/docker-compose.yml index 991b9bc..0298f6d 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,7 +1,9 @@ version: '2' services: app: - build: . + build: + dockerfile: Dockerfile-dev + context: . depends_on: - db - redis @@ -21,37 +23,26 @@ services: - default - nginx-proxy - node-dev-server: - build: ./frontend - ports: - - "8080:8080" - volumes: - - ./frontend/:/usr/src/app/ - environment: - DOCKERIZED: "true" - - app-console-account-queue: - build: . - volumes: - - ./:/var/www/html/ - command: ["docker/wait-for-it.sh", "rabbitmq:5672", "--", "php", "yii", "account-queue"] - links: - - db - - redis - - rabbitmq - db: build: ./docker/mariadb env_file: .env + volumes: + - ./data/mysql:/var/lib/mysql redis: - image: redis:3.0 + image: redis:3.0-alpine + volumes: + - ./data/redis:/data rabbitmq: - build: ./docker/rabbitmq + image: rabbitmq:3.6-management env_file: .env - ports: - - "15672:15672" # Manager interface + environment: + - VIRTUAL_HOST=rabbitmq.account.ely.by.local + - VIRTUAL_PORT=15672 + networks: + - default + - nginx-proxy phpmyadmin: build: ./docker/phpmyadmin @@ -59,10 +50,12 @@ services: - PMA_ARBITRARY=1 - PMA_USER=root - PMA_PASSWORD= - ports: - - "8181:80" + - VIRTUAL_HOST=pma.account.ely.by.local depends_on: - db + networks: + - default + - nginx-proxy networks: nginx-proxy: diff --git a/docker/nginx/Dockerfile b/docker/nginx/Dockerfile index d524401..3c47e59 100644 --- a/docker/nginx/Dockerfile +++ b/docker/nginx/Dockerfile @@ -1,4 +1,4 @@ -FROM nginx:1.11 +FROM nginx:1.11-alpine COPY nginx.conf /etc/nginx/nginx.conf COPY account.ely.by.conf.template /etc/nginx/conf.d/account.ely.by.conf.template diff --git a/docker/nginx/run.sh b/docker/nginx/run.sh index 2c2bfa8..7365afe 100644 --- a/docker/nginx/run.sh +++ b/docker/nginx/run.sh @@ -1,4 +1,4 @@ -#!/usr/bin/env bash +#!/usr/bin/env sh envsubst '$AUTHSERVER_HOST' < /etc/nginx/conf.d/account.ely.by.conf.template > /etc/nginx/conf.d/default.conf diff --git a/docker/php/entrypoint.sh b/docker/php/entrypoint.sh new file mode 100644 index 0000000..a001700 --- /dev/null +++ b/docker/php/entrypoint.sh @@ -0,0 +1,33 @@ +#!/bin/bash + +cd /var/www/html + +if [ "$1" = 'bash' ] +then + exec "$@" + exit 0 +fi + +# Переносим vendor, если его нету или он изменился (или затёрся силами volume) +if ! cmp -s ./../vendor/autoload.php ./vendor/autoload.php +then + echo "vendor have diffs..." + echo "removing exists vendor" + rm -rf ./vendor + echo "copying new one" + cp -r ./../vendor ./vendor +fi + +# Переносим dist, если его нету или он изменился (или затёрся силами volume) +if ! cmp -s ./../dist/index.html ./frontend/dist/index.html +then + echo "frontend dist have diffs..." + echo "removing exists dist" + rm -rf ./frontend/dist + echo "copying new one" + cp -r ./../dist ./frontend/dist +fi + +wait-for-it db:3306 -- "./yii migrate/up --interactive=0" + +exec "$@" diff --git a/docker/php/supervisord.conf b/docker/php/supervisord.conf new file mode 100644 index 0000000..22c385c --- /dev/null +++ b/docker/php/supervisord.conf @@ -0,0 +1,36 @@ +[supervisord] +logfile=/tmp/supervisord.log ; (main log file;default $CWD/supervisord.log) +logfile_maxbytes=50MB ; (max main logfile bytes b4 rotation;default 50MB) +logfile_backups=10 ; (num of main logfile rotation backups;default 10) +loglevel=info ; (log level;default info; others: debug,warn,trace) +pidfile=/tmp/supervisord.pid ; (supervisord pidfile;default supervisord.pid) +nodaemon=false ; (start in foreground if true;default false) +minfds=1024 ; (min. avail startup file descriptors;default 1024) +minprocs=200 ; (min. avail process descriptors;default 200) +user=root + +; the below section must remain in the config file for RPC +; (supervisorctl/web interface) to work, additional interfaces may be +; added by defining them in separate rpcinterface: sections +[rpcinterface:supervisor] +supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface + +[supervisorctl] +serverurl=unix:///dev/shm/supervisor.sock ; use a unix:// URL for a unix socket + +[program:php-fpm] +command=php-fpm +autostart=true +autorestart=true +priority=5 +stdout_logfile=/dev/stdout +stdout_logfile_maxbytes=0 +stderr_logfile=/dev/stderr +stderr_logfile_maxbytes=0 + +[program:account-queue-worker] +directory=/var/www/html +command=wait-for-it rabbitmq:5672 -- php yii account-queue +autostart=true +autorestart=true +priority=10 diff --git a/docker/rabbitmq/Dockerfile b/docker/rabbitmq/Dockerfile deleted file mode 100644 index 8e27027..0000000 --- a/docker/rabbitmq/Dockerfile +++ /dev/null @@ -1,8 +0,0 @@ -FROM rabbitmq:3.6 - -RUN rabbitmq-plugins enable rabbitmq_management \ - && rabbitmq-plugins enable rabbitmq_web_stomp \ - && rabbitmq-plugins enable rabbitmq_mqtt - -ENTRYPOINT ["docker-entrypoint.sh"] -CMD ["rabbitmq-server"] diff --git a/tests/docker-compose.yml b/tests/docker-compose.yml index 3b01b9e..e2faa61 100644 --- a/tests/docker-compose.yml +++ b/tests/docker-compose.yml @@ -1,17 +1,17 @@ version: '2' services: testphp: - build: ./.. - links: - - testdb - - testredis - - testrabbit + extends: + file: ../docker-compose.dev.yml + service: app volumes: - ./../:/var/www/html/ env_file: ./../.env testdb: - build: ./../docker/mariadb + extends: + file: ../docker-compose.dev.yml + service: db environment: MYSQL_ROOT_PASSWORD: "" MYSQL_ALLOW_EMPTY_PASSWORD: "yes" @@ -20,10 +20,14 @@ services: MYSQL_PASSWORD: "ely_accounts_tester_password" testredis: - image: redis:3.0 + extends: + file: ../docker-compose.dev.yml + service: redis testrabbit: - build: ./../docker/rabbitmq + extends: + file: ../docker-compose.dev.yml + service: rabbitmq environment: RABBITMQ_DEFAULT_USER: "ely-accounts-tester" RABBITMQ_DEFAULT_PASS: "tester-password"