mirror of
https://github.com/elyby/accounts.git
synced 2025-02-28 05:32:53 +05:30
Merge branch 'access_tokens_auto_cleanup' into develop
This commit is contained in:
commit
e0c6787e16
@ -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
|
COPY id_rsa /root/.ssh/id_rsa
|
||||||
|
|
||||||
|
@ -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
|
COPY id_rsa /root/.ssh/id_rsa
|
||||||
|
|
||||||
|
54
README.md
54
README.md
@ -1,6 +1,6 @@
|
|||||||
# Accounts Ely.by
|
# Accounts Ely.by
|
||||||
|
|
||||||
## Развёртывание dev
|
## Развёртывание dev [backend]
|
||||||
|
|
||||||
Предварительно нужно установить [git](https://git-scm.com/downloads),
|
Предварительно нужно установить [git](https://git-scm.com/downloads),
|
||||||
[docker](https://docs.docker.com/engine/installation/) и его
|
[docker](https://docs.docker.com/engine/installation/) и его
|
||||||
@ -15,8 +15,8 @@
|
|||||||
За тем сливаем репозиторий:
|
За тем сливаем репозиторий:
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
git clone git@gitlab.com:elyby/account.git account.ely.by
|
git clone git@gitlab.ely.by:elyby/accounts.git account.ely.by
|
||||||
cd account.ely.by.local
|
cd account.ely.by
|
||||||
```
|
```
|
||||||
|
|
||||||
Далее нужно создать `.env`, `docker-compose.yml` и `id_rsa` файлы:
|
Далее нужно создать `.env`, `docker-compose.yml` и `id_rsa` файлы:
|
||||||
@ -27,12 +27,12 @@ cp docker-compose.dev.yml docker-compose.yml
|
|||||||
cp ~/.ssh/id_rsa id_rsa # Использовать ссылку нельзя
|
cp ~/.ssh/id_rsa id_rsa # Использовать ссылку нельзя
|
||||||
```
|
```
|
||||||
|
|
||||||
Касательно файла id_rsa: часть зависимостей находятся в наших приватных репозиториях, получить
|
**Касательно файла id_rsa**: часть зависимостей находятся в наших приватных репозиториях, получить
|
||||||
доступ куда можно только в том случае, если в контейнере окажется ключ, который имеет доступ к этим
|
доступ куда можно только в том случае, если в контейнере окажется ключ, который имеет доступ к этим
|
||||||
репозиториям.
|
репозиториям.
|
||||||
|
|
||||||
Все вышеперечисленные файла находятся под gitignore, так что с полученными файлами можно произвести
|
Все вышеперечисленные файлы находятся под gitignore, так что с конечными файлами можно произвести
|
||||||
все необходимые манипуляции под конкретный кейс использования. **В файле `.env` обязательно следует
|
все необходимые манипуляции под конкретную задачу разработки. **В файле `.env` обязательно следует
|
||||||
задать `JWT_USER_SECRET`, иначе авторизация на бекенде не заработает.**
|
задать `JWT_USER_SECRET`, иначе авторизация на бекенде не заработает.**
|
||||||
|
|
||||||
После этого просто выполняем старт всех контейнеров:
|
После этого просто выполняем старт всех контейнеров:
|
||||||
@ -41,10 +41,50 @@ cp ~/.ssh/id_rsa id_rsa # Использовать ссылку нельзя
|
|||||||
docker-compose up -d
|
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` мы увидим все запущенные контейнеры. Нас интересуют значения
|
Сперва, с помощью команды `docker ps` мы увидим все запущенные контейнеры. Нас интересуют значения
|
||||||
из первой колонки CONTAINER ID или NAMES. Узнать, чему они соответствуют можно прочитав название IMAGE
|
из первой колонки CONTAINER ID или NAMES. Узнать, чему они соответствуют можно прочитав название IMAGE
|
||||||
из 2 колонки. Чтобы выполнить команду внутри работабщего контейнера, нужно выполнить:
|
из 2 колонки. Чтобы выполнить команду внутри работабщего контейнера, нужно выполнить:
|
||||||
|
22
console/controllers/CleanupController.php
Normal file
22
console/controllers/CleanupController.php
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
<?php
|
||||||
|
namespace console\controllers;
|
||||||
|
|
||||||
|
use common\models\OauthAccessToken;
|
||||||
|
use yii\console\Controller;
|
||||||
|
|
||||||
|
class CleanupController extends Controller {
|
||||||
|
|
||||||
|
public function actionAccessTokens() {
|
||||||
|
$accessTokens = OauthAccessToken::find()
|
||||||
|
->andWhere(['<', 'expire_time', time()])
|
||||||
|
->each(1000);
|
||||||
|
|
||||||
|
foreach($accessTokens as $token) {
|
||||||
|
/** @var OauthAccessToken $token */
|
||||||
|
$token->delete();
|
||||||
|
}
|
||||||
|
|
||||||
|
return self::EXIT_CODE_NORMAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
2
docker/cron/cleanup
Normal file
2
docker/cron/cleanup
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
# https://crontab.guru/every-hour
|
||||||
|
0 * * * * php /var/www/html/yii cleanup/access-tokens >/dev/null 2>&1
|
@ -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 "$@"
|
|
@ -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 "$@"
|
|
@ -1,2 +0,0 @@
|
|||||||
error_reporting = E_ALL;
|
|
||||||
display_errors = On;
|
|
@ -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
|
|
6
docker/supervisor/account-queue-worker.conf
Normal file
6
docker/supervisor/account-queue-worker.conf
Normal file
@ -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
|
@ -0,0 +1,17 @@
|
|||||||
|
<?php
|
||||||
|
namespace tests\codeception\common\fixtures;
|
||||||
|
|
||||||
|
use common\models\OauthAccessToken;
|
||||||
|
use yii\test\ActiveFixture;
|
||||||
|
|
||||||
|
class OauthAccessTokenFixture extends ActiveFixture {
|
||||||
|
|
||||||
|
public $modelClass = OauthAccessToken::class;
|
||||||
|
|
||||||
|
public $dataFile = '@tests/codeception/common/fixtures/data/oauth-access-tokens.php';
|
||||||
|
|
||||||
|
public $depends = [
|
||||||
|
OauthSessionFixture::class,
|
||||||
|
];
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,13 @@
|
|||||||
|
<?php
|
||||||
|
return [
|
||||||
|
'admin-ely' => [
|
||||||
|
'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,
|
||||||
|
],
|
||||||
|
];
|
@ -6,7 +6,7 @@ return [
|
|||||||
'name' => 'Ely.by',
|
'name' => 'Ely.by',
|
||||||
'description' => 'Всем знакомое елуби',
|
'description' => 'Всем знакомое елуби',
|
||||||
'redirect_uri' => 'http://ely.by',
|
'redirect_uri' => 'http://ely.by',
|
||||||
'account_id' => NULL,
|
'account_id' => null,
|
||||||
'is_trusted' => 0,
|
'is_trusted' => 0,
|
||||||
'created_at' => 1455309271,
|
'created_at' => 1455309271,
|
||||||
],
|
],
|
||||||
@ -16,7 +16,7 @@ return [
|
|||||||
'name' => 'TLauncher',
|
'name' => 'TLauncher',
|
||||||
'description' => 'Лучший альтернативный лаунчер для Minecraft с большим количеством версий и их модификаций, а также возмоностью входа как с лицензионным аккаунтом, так и без него.',
|
'description' => 'Лучший альтернативный лаунчер для Minecraft с большим количеством версий и их модификаций, а также возмоностью входа как с лицензионным аккаунтом, так и без него.',
|
||||||
'redirect_uri' => '',
|
'redirect_uri' => '',
|
||||||
'account_id' => NULL,
|
'account_id' => null,
|
||||||
'is_trusted' => 0,
|
'is_trusted' => 0,
|
||||||
'created_at' => 1455318468,
|
'created_at' => 1455318468,
|
||||||
],
|
],
|
||||||
|
@ -1,3 +1,10 @@
|
|||||||
<?php
|
<?php
|
||||||
return [
|
return [
|
||||||
|
'admin-ely' => [
|
||||||
|
'id' => 1,
|
||||||
|
'owner_type' => 'user',
|
||||||
|
'owner_id' => 1,
|
||||||
|
'client_id' => 'ely',
|
||||||
|
'client_redirect_uri' => 'http://ely.by/authorization/oauth',
|
||||||
|
],
|
||||||
];
|
];
|
||||||
|
@ -0,0 +1,31 @@
|
|||||||
|
<?php
|
||||||
|
namespace codeception\console\unit\controllers;
|
||||||
|
|
||||||
|
use common\models\OauthAccessToken;
|
||||||
|
use console\controllers\CleanupController;
|
||||||
|
use tests\codeception\common\fixtures\OauthAccessTokenFixture;
|
||||||
|
use tests\codeception\console\unit\TestCase;
|
||||||
|
use Yii;
|
||||||
|
|
||||||
|
class CleanupControllerTest extends TestCase {
|
||||||
|
|
||||||
|
public function _fixtures() {
|
||||||
|
return [
|
||||||
|
'accessTokens' => 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]);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user