diff --git a/Dockerfile b/Dockerfile index ef80df9..f750e08 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,8 @@ -FROM registry.ely.by/elyby/accounts-php:1.0.0 +FROM registry.ely.by/elyby/accounts-php:1.1.0 + +# Вносим конфигурации для крона и воркеров +COPY docker/cron/* /etc/cron.d/ +COPY docker/supervisor/* /etc/supervisor/conf.d/ COPY id_rsa /root/.ssh/id_rsa diff --git a/Dockerfile-dev b/Dockerfile-dev index e3e5ebb..86bee41 100644 --- a/Dockerfile-dev +++ b/Dockerfile-dev @@ -1,4 +1,8 @@ -FROM registry.ely.by/elyby/accounts-php:1.0.0-dev +FROM registry.ely.by/elyby/accounts-php:1.1.0-dev + +# Вносим конфигурации для крона и воркеров +COPY docker/cron/* /etc/cron.d/ +COPY docker/supervisor/* /etc/supervisor/conf.d/ COPY id_rsa /root/.ssh/id_rsa diff --git a/README.md b/README.md index f96d4ad..1f0aeab 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # Accounts Ely.by -## Развёртывание dev +## Развёртывание dev [backend] Предварительно нужно установить [git](https://git-scm.com/downloads), [docker](https://docs.docker.com/engine/installation/) и его @@ -15,8 +15,8 @@ За тем сливаем репозиторий: ```sh -git clone git@gitlab.com:elyby/account.git account.ely.by -cd account.ely.by.local +git clone git@gitlab.ely.by:elyby/accounts.git account.ely.by +cd account.ely.by ``` Далее нужно создать `.env`, `docker-compose.yml` и `id_rsa` файлы: @@ -27,12 +27,12 @@ cp docker-compose.dev.yml docker-compose.yml cp ~/.ssh/id_rsa id_rsa # Использовать ссылку нельзя ``` -Касательно файла id_rsa: часть зависимостей находятся в наших приватных репозиториях, получить +**Касательно файла id_rsa**: часть зависимостей находятся в наших приватных репозиториях, получить доступ куда можно только в том случае, если в контейнере окажется ключ, который имеет доступ к этим репозиториям. -Все вышеперечисленные файла находятся под gitignore, так что с полученными файлами можно произвести -все необходимые манипуляции под конкретный кейс использования. **В файле `.env` обязательно следует +Все вышеперечисленные файлы находятся под gitignore, так что с конечными файлами можно произвести +все необходимые манипуляции под конкретную задачу разработки. **В файле `.env` обязательно следует задать `JWT_USER_SECRET`, иначе авторизация на бекенде не заработает.** После этого просто выполняем старт всех контейнеров: @@ -41,10 +41,50 @@ cp ~/.ssh/id_rsa id_rsa # Использовать ссылку нельзя docker-compose up -d ``` -Они автоматически сбилдятся и начнут свою работу. +Контейнеры автоматически сбилдятся и начнут свою работу. + +## Развёртывание dev [frontend] + +Чтобы поднять сборку frontend приложения, необходимо иметь установленный в системе [Node.js](https://nodejs.org) +версии 5.x или 6.x, а так же npm 3-ей версии (`npm i -g npm` для обновления). + +За тем переходим в папку `frontend` и устанавливаем зависимости: + +```sh +cd frontend +npm i +``` + +После того, как все зависимости будут установлены, можно поднять dev-сервер. Здесь есть 2 пути: можно, следуя +инструкции выше, поднять backend на своей машине через Docker. Если же разработка не привязывается к специфичной +версии backend, то более быстрым и удобным способ будет использовать наш dev-сервер, расположенный под адресу +https://dev.account.ely.by. + +В любом из случаев необходимо в папке `frontend/config` скопировать файл `template.env.js` в `env.js` (находится +под .gitignore) и указать в параметре `apiHost` или свой локальный сервер (тот хост, что был указан в .env +как `VIRTUAL_HOST`), или указав просто `https://dev.account.ely.by`. + +После того, как это будет сделано, запускаем dev-сервер (находясь в папке frontend): + +``` +npm start +``` + +dev-сервер поднимется на 8080 порту и будет доступен по адресу http://localhost:8080. ### Как влезть в работающий контейнер +Начиная с версии docker-compose 1.9.0, появилась команда `docker-compose exec`, которая позволяет выполнить +на работающем контейнере произвольную команду, основываясь на имени сервиса в compose файле. + +``` +docker-compose exec app bash +``` + +------------------------ + +_// Старый вариант_ + Сперва, с помощью команды `docker ps` мы увидим все запущенные контейнеры. Нас интересуют значения из первой колонки CONTAINER ID или NAMES. Узнать, чему они соответствуют можно прочитав название IMAGE из 2 колонки. Чтобы выполнить команду внутри работабщего контейнера, нужно выполнить: diff --git a/console/controllers/CleanupController.php b/console/controllers/CleanupController.php new file mode 100644 index 0000000..f08985b --- /dev/null +++ b/console/controllers/CleanupController.php @@ -0,0 +1,22 @@ +andWhere(['<', 'expire_time', time()]) + ->each(1000); + + foreach($accessTokens as $token) { + /** @var OauthAccessToken $token */ + $token->delete(); + } + + return self::EXIT_CODE_NORMAL; + } + +} diff --git a/docker/cron/cleanup b/docker/cron/cleanup new file mode 100644 index 0000000..4c056e7 --- /dev/null +++ b/docker/cron/cleanup @@ -0,0 +1,2 @@ +# https://crontab.guru/every-hour +0 * * * * php /var/www/html/yii cleanup/access-tokens >/dev/null 2>&1 diff --git a/docker/php/composer.sh b/docker/php/composer.sh deleted file mode 100644 index 517b5d0..0000000 --- a/docker/php/composer.sh +++ /dev/null @@ -1,8 +0,0 @@ -#!/bin/bash - -if [ -n "$API_TOKEN" ] -then - php /usr/local/bin/composer.phar config -g github-oauth.github.com $API_TOKEN -fi - -exec php /usr/local/bin/composer.phar "$@" diff --git a/docker/php/entrypoint.sh b/docker/php/entrypoint.sh deleted file mode 100644 index f6723cb..0000000 --- a/docker/php/entrypoint.sh +++ /dev/null @@ -1,38 +0,0 @@ -#!/bin/bash - -cd /var/www/html - -if [ "$1" = "bash" ] || [ "$1" = "composer" ] -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 - -if [ "$YII_ENV" != "test" ] -then - wait-for-it db:3306 -s -- "php /var/www/html/yii migrate/up --interactive=0" -else - wait-for-it testdb:3306 -s -- "php /var/www/html/tests/codeception/bin/yii migrate/up --interactive=0" -fi - -exec "$@" diff --git a/docker/php/php.ini b/docker/php/php.ini deleted file mode 100644 index a9c3fab..0000000 --- a/docker/php/php.ini +++ /dev/null @@ -1,2 +0,0 @@ -error_reporting = E_ALL; -display_errors = On; diff --git a/docker/php/supervisord.conf b/docker/php/supervisord.conf deleted file mode 100644 index 22c385c..0000000 --- a/docker/php/supervisord.conf +++ /dev/null @@ -1,36 +0,0 @@ -[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/supervisor/account-queue-worker.conf b/docker/supervisor/account-queue-worker.conf new file mode 100644 index 0000000..aed1af3 --- /dev/null +++ b/docker/supervisor/account-queue-worker.conf @@ -0,0 +1,6 @@ +[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/tests/codeception/common/fixtures/OauthAccessTokenFixture.php b/tests/codeception/common/fixtures/OauthAccessTokenFixture.php new file mode 100644 index 0000000..d51f14f --- /dev/null +++ b/tests/codeception/common/fixtures/OauthAccessTokenFixture.php @@ -0,0 +1,17 @@ + [ + 'access_token' => '07541285-831e-1e47-e314-b950309a6fca', + 'session_id' => 1, + 'expire_time' => time() + 3600, + ], + 'admin-ely-expired' => [ + 'access_token' => '2977ec21-3022-96f8-544db-2e1df936908', + 'session_id' => 1, + 'expire_time' => time() - 3600, + ], +]; diff --git a/tests/codeception/common/fixtures/data/oauth-clients.php b/tests/codeception/common/fixtures/data/oauth-clients.php index c7b11a9..2ca68b2 100644 --- a/tests/codeception/common/fixtures/data/oauth-clients.php +++ b/tests/codeception/common/fixtures/data/oauth-clients.php @@ -6,7 +6,7 @@ return [ 'name' => 'Ely.by', 'description' => 'Всем знакомое елуби', 'redirect_uri' => 'http://ely.by', - 'account_id' => NULL, + 'account_id' => null, 'is_trusted' => 0, 'created_at' => 1455309271, ], @@ -16,7 +16,7 @@ return [ 'name' => 'TLauncher', 'description' => 'Лучший альтернативный лаунчер для Minecraft с большим количеством версий и их модификаций, а также возмоностью входа как с лицензионным аккаунтом, так и без него.', 'redirect_uri' => '', - 'account_id' => NULL, + 'account_id' => null, 'is_trusted' => 0, 'created_at' => 1455318468, ], diff --git a/tests/codeception/common/fixtures/data/oauth-sessions.php b/tests/codeception/common/fixtures/data/oauth-sessions.php index d0b9c34..42d2ea2 100644 --- a/tests/codeception/common/fixtures/data/oauth-sessions.php +++ b/tests/codeception/common/fixtures/data/oauth-sessions.php @@ -1,3 +1,10 @@ [ + 'id' => 1, + 'owner_type' => 'user', + 'owner_id' => 1, + 'client_id' => 'ely', + 'client_redirect_uri' => 'http://ely.by/authorization/oauth', + ], ]; diff --git a/tests/codeception/console/unit/controllers/CleanupControllerTest.php b/tests/codeception/console/unit/controllers/CleanupControllerTest.php new file mode 100644 index 0000000..ddae0ee --- /dev/null +++ b/tests/codeception/console/unit/controllers/CleanupControllerTest.php @@ -0,0 +1,31 @@ + OauthAccessTokenFixture::class, + ]; + } + + public function testActionAccessTokens() { + /** @var OauthAccessToken $validAccessToken */ + $validAccessToken = $this->tester->grabFixture('accessTokens', 'admin-ely'); + /** @var OauthAccessToken $expiredAccessToken */ + $expiredAccessToken = $this->tester->grabFixture('accessTokens', 'admin-ely-expired'); + + $controller = new CleanupController('cleanup', Yii::$app); + $this->assertEquals(0, $controller->actionAccessTokens()); + + $this->tester->canSeeRecord(OauthAccessToken::class, ['access_token' => $validAccessToken->access_token]); + $this->tester->cantSeeRecord(OauthAccessToken::class, ['access_token' => $expiredAccessToken->access_token]); + } + +}