Compare commits
No commits in common. "e6935d81e1a91fbf35c1ba5009b06e2c7dbdb703" and "3a6ead976f94b9838328bab859e32bf4afda80ea" have entirely different histories.
e6935d81e1
...
3a6ead976f
@ -4,9 +4,22 @@ version: "3.4"
|
|||||||
services:
|
services:
|
||||||
|
|
||||||
platform-nginx:
|
platform-nginx:
|
||||||
|
image: mathwave/sprint-repo:platform-nginx
|
||||||
|
networks:
|
||||||
|
- net
|
||||||
|
- common-infra-nginx
|
||||||
|
deploy:
|
||||||
|
mode: replicated
|
||||||
|
restart_policy:
|
||||||
|
condition: any
|
||||||
|
update_config:
|
||||||
|
parallelism: 1
|
||||||
|
order: start-first
|
||||||
|
|
||||||
|
app:
|
||||||
image: mathwave/sprint-repo:platform
|
image: mathwave/sprint-repo:platform
|
||||||
networks:
|
networks:
|
||||||
- common-infra-nginx
|
- net
|
||||||
environment:
|
environment:
|
||||||
DB_HOST: "pg.develop.sprinthub.ru"
|
DB_HOST: "pg.develop.sprinthub.ru"
|
||||||
DB_PASSWORD: $DB_PASSWORD_DEV
|
DB_PASSWORD: $DB_PASSWORD_DEV
|
||||||
@ -19,9 +32,9 @@ services:
|
|||||||
VK_SERVICE_TOKEN: $VK_SERVICE_TOKEN
|
VK_SERVICE_TOKEN: $VK_SERVICE_TOKEN
|
||||||
YANDEX_SERVICE_TOKEN: $YANDEX_SERVICE_TOKEN
|
YANDEX_SERVICE_TOKEN: $YANDEX_SERVICE_TOKEN
|
||||||
PLATFORM_SECURITY_TOKEN: $PLATFORM_SECURITY_TOKEN
|
PLATFORM_SECURITY_TOKEN: $PLATFORM_SECURITY_TOKEN
|
||||||
command: runserver 0.0.0.0:1238
|
command: runserver 0.0.0.0:8000
|
||||||
healthcheck:
|
healthcheck:
|
||||||
test: curl --fail http://0.0.0.0:1238/ping || exit 1
|
test: curl --fail http://0.0.0.0:8000/ping || exit 1
|
||||||
interval: 60s
|
interval: 60s
|
||||||
retries: 5
|
retries: 5
|
||||||
start_period: 10s
|
start_period: 10s
|
||||||
@ -36,6 +49,8 @@ services:
|
|||||||
|
|
||||||
fetch_stats:
|
fetch_stats:
|
||||||
image: mathwave/sprint-repo:platform
|
image: mathwave/sprint-repo:platform
|
||||||
|
networks:
|
||||||
|
- net
|
||||||
environment:
|
environment:
|
||||||
DB_HOST: "pg.develop.sprinthub.ru"
|
DB_HOST: "pg.develop.sprinthub.ru"
|
||||||
DB_PASSWORD: $DB_PASSWORD_DEV
|
DB_PASSWORD: $DB_PASSWORD_DEV
|
||||||
@ -74,5 +89,7 @@ services:
|
|||||||
order: start-first
|
order: start-first
|
||||||
|
|
||||||
networks:
|
networks:
|
||||||
|
net:
|
||||||
|
driver: overlay
|
||||||
common-infra-nginx:
|
common-infra-nginx:
|
||||||
external: true
|
external: true
|
@ -4,9 +4,26 @@ version: "3.4"
|
|||||||
services:
|
services:
|
||||||
|
|
||||||
platform-nginx:
|
platform-nginx:
|
||||||
|
image: mathwave/sprint-repo:platform-nginx
|
||||||
|
networks:
|
||||||
|
- net
|
||||||
|
- common-infra-nginx
|
||||||
|
deploy:
|
||||||
|
mode: replicated
|
||||||
|
restart_policy:
|
||||||
|
condition: any
|
||||||
|
placement:
|
||||||
|
constraints:
|
||||||
|
# - node.role == worker
|
||||||
|
- node.labels.zone == ru
|
||||||
|
update_config:
|
||||||
|
parallelism: 1
|
||||||
|
order: start-first
|
||||||
|
|
||||||
|
app:
|
||||||
image: mathwave/sprint-repo:platform
|
image: mathwave/sprint-repo:platform
|
||||||
networks:
|
networks:
|
||||||
- common-infra-nginx
|
- net
|
||||||
environment:
|
environment:
|
||||||
DB_HOST: "pg.sprinthub.ru"
|
DB_HOST: "pg.sprinthub.ru"
|
||||||
DB_PASSWORD: $DB_PASSWORD_PROD
|
DB_PASSWORD: $DB_PASSWORD_PROD
|
||||||
@ -20,9 +37,9 @@ services:
|
|||||||
YANDEX_SERVICE_TOKEN: $YANDEX_SERVICE_TOKEN
|
YANDEX_SERVICE_TOKEN: $YANDEX_SERVICE_TOKEN
|
||||||
TELEGRAM_TOKEN: $TELEGRAM_TOKEN
|
TELEGRAM_TOKEN: $TELEGRAM_TOKEN
|
||||||
PLATFORM_SECURITY_TOKEN: $PLATFORM_SECURITY_TOKEN
|
PLATFORM_SECURITY_TOKEN: $PLATFORM_SECURITY_TOKEN
|
||||||
command: runserver 0.0.0.0:1238
|
command: runserver 0.0.0.0:8000
|
||||||
healthcheck:
|
healthcheck:
|
||||||
test: curl --fail http://0.0.0.0:1238/ping || exit 1
|
test: curl --fail http://0.0.0.0:8000/ping || exit 1
|
||||||
interval: 60s
|
interval: 60s
|
||||||
retries: 5
|
retries: 5
|
||||||
start_period: 10s
|
start_period: 10s
|
||||||
@ -33,7 +50,7 @@ services:
|
|||||||
condition: any
|
condition: any
|
||||||
placement:
|
placement:
|
||||||
constraints:
|
constraints:
|
||||||
- node.role == worker
|
# - node.role == worker
|
||||||
- node.labels.zone == ru
|
- node.labels.zone == ru
|
||||||
update_config:
|
update_config:
|
||||||
parallelism: 1
|
parallelism: 1
|
||||||
@ -41,6 +58,8 @@ services:
|
|||||||
|
|
||||||
fetch_stats:
|
fetch_stats:
|
||||||
image: mathwave/sprint-repo:platform
|
image: mathwave/sprint-repo:platform
|
||||||
|
networks:
|
||||||
|
- net
|
||||||
environment:
|
environment:
|
||||||
DB_HOST: "pg.sprinthub.ru"
|
DB_HOST: "pg.sprinthub.ru"
|
||||||
DB_PASSWORD: $DB_PASSWORD_PROD
|
DB_PASSWORD: $DB_PASSWORD_PROD
|
||||||
@ -75,10 +94,16 @@ services:
|
|||||||
mode: replicated
|
mode: replicated
|
||||||
restart_policy:
|
restart_policy:
|
||||||
condition: on-failure
|
condition: on-failure
|
||||||
|
placement:
|
||||||
|
constraints:
|
||||||
|
# - node.role == worker
|
||||||
|
- node.labels.zone == ru
|
||||||
update_config:
|
update_config:
|
||||||
parallelism: 1
|
parallelism: 1
|
||||||
order: start-first
|
order: start-first
|
||||||
|
|
||||||
networks:
|
networks:
|
||||||
|
net:
|
||||||
|
driver: overlay
|
||||||
common-infra-nginx:
|
common-infra-nginx:
|
||||||
external: true
|
external: true
|
||||||
|
@ -15,7 +15,9 @@ build:
|
|||||||
- .deploy
|
- .deploy
|
||||||
script:
|
script:
|
||||||
- docker build -t mathwave/sprint-repo:platform .
|
- docker build -t mathwave/sprint-repo:platform .
|
||||||
|
- docker build -t mathwave/sprint-repo:platform-nginx nginx
|
||||||
- docker push mathwave/sprint-repo:platform
|
- docker push mathwave/sprint-repo:platform
|
||||||
|
- docker push mathwave/sprint-repo:platform-nginx
|
||||||
|
|
||||||
deploy-dev:
|
deploy-dev:
|
||||||
extends:
|
extends:
|
||||||
|
@ -20,8 +20,10 @@ class ConfigsView(BaseView):
|
|||||||
return '/configs/?stage=production'
|
return '/configs/?stage=production'
|
||||||
self.stage = self.request.GET['stage']
|
self.stage = self.request.GET['stage']
|
||||||
self.context['stage'] = self.stage
|
self.context['stage'] = self.stage
|
||||||
self.context['configs'] = Config.objects.filter(project=self.request.user.selected_project,
|
|
||||||
stage=self.stage).order_by('name')
|
def get(self):
|
||||||
|
self.context['configs'] = Config.objects.filter(project=self.request.user.selected_project, stage=self.stage).order_by('name')
|
||||||
|
self.context['error'] = 'error' in self.request.GET
|
||||||
|
|
||||||
def post_create_config(self):
|
def post_create_config(self):
|
||||||
Config.objects.create(name=self.request.POST['name'], project=self.request.user.selected_project, stage=self.stage)
|
Config.objects.create(name=self.request.POST['name'], project=self.request.user.selected_project, stage=self.stage)
|
||||||
@ -34,14 +36,11 @@ class ConfigsView(BaseView):
|
|||||||
|
|
||||||
def post_save(self):
|
def post_save(self):
|
||||||
data = self.request.POST['data']
|
data = self.request.POST['data']
|
||||||
config = Config.objects.get(id=self.request.POST['config'])
|
|
||||||
try:
|
try:
|
||||||
data = loads(data)
|
data = loads(data)
|
||||||
except:
|
except:
|
||||||
self.context['incorrect_config'] = config
|
return '/configs?error=config_is_not_json'
|
||||||
self.context['incorrect_data'] = data
|
config = Config.objects.get(id=self.request.POST['config'])
|
||||||
self.context['error'] = True
|
|
||||||
return
|
|
||||||
config.data = data
|
config.data = data
|
||||||
config.save()
|
config.save()
|
||||||
return '/configs/?stage=' + config.stage
|
return '/configs/?stage=' + config.stage
|
||||||
|
2
nginx/Dockerfile
Normal file
2
nginx/Dockerfile
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
FROM nginx
|
||||||
|
COPY nginx.conf /etc/nginx/nginx.conf
|
11
nginx/nginx.conf
Normal file
11
nginx/nginx.conf
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
events {}
|
||||||
|
|
||||||
|
http {
|
||||||
|
client_max_body_size 150m;
|
||||||
|
server {
|
||||||
|
listen 1238;
|
||||||
|
location / {
|
||||||
|
proxy_pass http://app:8000/;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -28,7 +28,7 @@
|
|||||||
</div>
|
</div>
|
||||||
{% if error %}
|
{% if error %}
|
||||||
<div class="alert alert-danger" role="alert">
|
<div class="alert alert-danger" role="alert">
|
||||||
Конфиг {{ incorrect_config.name }} не имеет вид JSON!
|
Конфиг не имеет вид JSON!
|
||||||
</div>
|
</div>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
<table class="table">
|
<table class="table">
|
||||||
@ -52,11 +52,11 @@
|
|||||||
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
|
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
|
||||||
</div>
|
</div>
|
||||||
<div class="modal-body">
|
<div class="modal-body">
|
||||||
<textarea style="width: 100%; height: 800px;{% if config.id == incorrect_config.id %}border: 1px solid #f00;{% endif %}" name="data">{% if config.id == incorrect_config.id %}{{ incorrect_data }}{% else %}{{ config.data_pretty }}{% endif %}</textarea>
|
<textarea style="width: 100%; height: 800px;" name="data">{{ config.data_pretty }}</textarea>
|
||||||
</div>
|
</div>
|
||||||
<div class="modal-footer">
|
<div class="modal-footer">
|
||||||
<button type="submit" name="action" value="save" class="btn btn-secondary">Сохранить</button>
|
<button type="submit" name="action" value="save" class="btn btn-secondary">Сохранить</button>
|
||||||
<button type="submit" name="action" value="delete" class="btn btn-danger" onclick="return confirm('Подтверди удаление. Это действие необратимо.');">Удалить</button>
|
<button type="submit" name="action" value="delete" class="btn btn-danger">Удалить</button>
|
||||||
<button type="button" class="btn btn-link text-gray-600 ms-auto" data-bs-dismiss="modal">Закрыть</button>
|
<button type="button" class="btn btn-link text-gray-600 ms-auto" data-bs-dismiss="modal">Закрыть</button>
|
||||||
</div>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
|
@ -3,7 +3,6 @@ from django.http import HttpResponse, JsonResponse
|
|||||||
from Platform import settings
|
from Platform import settings
|
||||||
from configs.models import Config
|
from configs.models import Config
|
||||||
from experiments.models import Experiment
|
from experiments.models import Experiment
|
||||||
from web.models import CustomUser
|
|
||||||
|
|
||||||
|
|
||||||
def fetch(request):
|
def fetch(request):
|
||||||
@ -15,26 +14,10 @@ def fetch(request):
|
|||||||
return HttpResponse('', status=400)
|
return HttpResponse('', status=400)
|
||||||
configs = Config.objects.filter(stage=stage, project__name=project)
|
configs = Config.objects.filter(stage=stage, project__name=project)
|
||||||
experiments = Experiment.objects.filter(stage=stage, project__name=project)
|
experiments = Experiment.objects.filter(stage=stage, project__name=project)
|
||||||
platform_staff = {
|
|
||||||
'vk_id': [],
|
|
||||||
'yandex_id': [],
|
|
||||||
'telegram_id': [],
|
|
||||||
'email': [],
|
|
||||||
}
|
|
||||||
for user in CustomUser.objects.filter(is_active=True):
|
|
||||||
if user.vk_id:
|
|
||||||
platform_staff['vk_id'].append(user.vk_id)
|
|
||||||
if user.yandex_id:
|
|
||||||
platform_staff['yandex_id'].append(user.yandex_id)
|
|
||||||
if user.telegram_id:
|
|
||||||
platform_staff['telegram_id'].append(user.telegram_id)
|
|
||||||
if user.email:
|
|
||||||
platform_staff['email'].append(user.email)
|
|
||||||
return JsonResponse(
|
return JsonResponse(
|
||||||
data={
|
data={
|
||||||
'configs': {config.name: config.data for config in configs},
|
'configs': {config.name: config.data for config in configs},
|
||||||
'experiments': {experiment.name: {'enabled': experiment.enabled, 'condition': experiment.condition} for experiment in experiments},
|
'experiments': {experiment.name: {'enabled': experiment.enabled, 'condition': experiment.condition} for experiment in experiments}
|
||||||
'platform_staff': platform_staff,
|
|
||||||
},
|
},
|
||||||
safe=False,
|
safe=False,
|
||||||
)
|
)
|
||||||
|
Loading…
Reference in New Issue
Block a user