Как Я Могу Разрешить Администраторам Запускать Команды Django Admin Cli Для Приложения Django, Развернутого В Реальном Времени Как Часть Кластера Docker Swarm?

  • Автор темы Schubernel
  • Обновлено
  • 22, Oct 2024
  • #1

В частности, я хочу, чтобы они выполнили следующее: https://django-q.readthedocs.io/en/latest/monitor.html

Я хочу написать минимальный скрипт-оболочку, который бы просто позволял им запускать одну команду, например:

 version: "3.8"

networks:

traefik:

external: true

name: traefik

database:

external: true

name: database

secrets:

DJANGO_SECRETS_FILE:

external: true

HASURA_SECRETS_FILE:

external: true

POSTGRES_PASSWORD_FILE:

external: true

CF_API_EMAIL_FILE:

external: true

CF_API_KEY_FILE:

external: true

volumes:

staticfiles: {}

database: {}

services:

django:

command: gunicorn config.wsgi:app -w 4 -b 0.0.0.0:8000

depends_on:

- postgres

deploy:

labels:

traefik.enable: "true"

traefik.http.routers.django.entrypoints: http

traefik.http.routers.django.rule: Host(`admin.myproject.***.dev`)

traefik.http.routers.django-secure.entrypoints: https

traefik.http.routers.django-secure.rule: Host(`admin.myproject.***.dev`)

traefik.http.routers.django-secure.tls.certresolver: dns

traefik.http.services.django.loadbalancer.server.port: 8000

restart_policy:

condition: on-failure

environment:

ALLOWED_HOSTS: admin.myproject.***.dev

DEBUG: "true"

DJANGO_CONFIGURATION: Staging

DJANGO_SECRETS_FILE: /run/secrets/DJANGO_SECRETS_FILE

image: django_image:2020-05-29

networks:

- traefik

- database

secrets:

- DJANGO_SECRETS_FILE

volumes:

- staticfiles:/static

working_dir: /app

hasura:

command:

- graphql-engine

- serve

- --server-port=5000

depends_on:

- postgres

deploy:

labels:

traefik.enable: "true"

traefik.http.routers.hasura.entrypoints: http

traefik.http.routers.hasura.rule: Host(`api.myproject.***.dev`)

traefik.http.routers.hasura-secure.entrypoints: https

traefik.http.routers.hasura-secure.rule: Host(`api.myproject.***.dev`)

traefik.http.routers.hasura-secure.tls.certresolver: dns

traefik.http.services.hasura.loadbalancer.server.port: 5000

restart_policy:

condition: on-failure

entrypoint:

- sh

- /hasura-entrypoint.sh

environment:

HASURA_GRAPHQL_ENABLE_CONSOLE: "true"

HASURA_SECRETS_FILE: /run/secrets/HASURA_SECRETS_FILE

image: hasura/graphql-engine:v1.2.1

networks:

- traefik

- database

secrets:

- HASURA_SECRETS_FILE

volumes:

- ./scripts/hasura-entrypoint.sh:/hasura-entrypoint.sh

postgres:

deploy:

restart_policy:

condition: on-failure

environment:

POSTGRES_PASSWORD_FILE: /run/secrets/POSTGRES_PASSWORD_FILE

POSTGRES_USER: staging

POSTGRES_DB: staging

image: postgres:12.3-alpine

networks:

- database

volumes:

- database:/var/lib/postgresql/data

secrets:

- POSTGRES_PASSWORD_FILE

traefik:

command:

- --api.insecure=true

- --api.dashboard=true

- --api.debug=true

- --certificatesResolvers.dns.acme.dnsChallenge.delayBeforeCheck=0

- --certificatesResolvers.dns.acme.dnsChallenge.provider=cloudflare

- --entrypoints.http.address=:80

- --entrypoints.https.address=:443

- --log.level=DEBUG

- --providers.docker=true

- --providers.docker.endpoint=unix:///var/run/docker.sock

- --providers.docker.exposedbydefault=false

- --providers.docker.network=traefik

- --providers.docker.swarmMode=true

deploy:

labels:

traefik.enable: "true"

traefik.http.middlewares.traefik-https-redirect.redirectscheme.scheme: https

traefik.http.routers.traefik.entrypoints: http

traefik.http.routers.traefik.middlewares: traefik-https-redirect

traefik.http.routers.traefik.rule: Host(`dash.myproject.***.dev`)

traefik.http.routers.traefik-secure.entrypoints: https

traefik.http.routers.traefik-secure.rule: Host(`dash.myproject.***.dev`)

traefik.http.routers.traefik-secure.service: api@internal

traefik.http.routers.traefik-secure.tls: "true"

traefik.http.routers.traefik-secure.tls.certresolver: dns

traefik.http.services.traefik.loadbalancer.server.port: 8080

placement:

constraints:

- node.role == manager

restart_policy:

condition: on-failure

environment:

CF_API_EMAIL_FILE: /run/secrets/CF_API_EMAIL_FILE

CF_API_KEY_FILE: /run/secrets/CF_API_KEY_FILE

image: traefik:v2.2.1

networks:

- traefik

ports:

- 80:80

- 443:443

secrets:

- CF_API_EMAIL_FILE

- CF_API_KEY_FILE

volumes:

- /var/run/docker.sock:/var/run/docker.sock

- ./acme.json:/acme.json
 
from their own machines (connecting to live Docker swarm as necessary) and returning the output they need to their machines.

В настоящее время созданные мной сети не могут быть присоединены к контейнерам, не являющимся роевыми.

Существует ли угроза безопасности, если позволить сетям Docker Swarm стать подключаемыми?

Решение, о котором я могу подумать, состоит в том, чтобы перенастроить сеть для подключения, чтобы сценарий-оболочка мог через ssh выполнить docker network create -d overlay --scope swarm traefik

Есть ли другой способ доступа к базе данных без изменения сети для подключения?

Я знаю, что могу работать с работающим веб-сервером, но не является ли это плохой практикой?

В будущем, если этот проект принесет доход, база данных будет переведена на Amazon RDS или аналогичный вариант. В целях безопасности я бы хотел ограничить доступ к базе данных рою Docker. docker network create -d overlay --scope swarm database network as well so that the database is not accessible via the host (is that possible? If so, the scenario I laid out here still reflects the nature of the problem)

Другое возможное решение, о котором я подумал, — это создать временную сетевую ссылку на базу данных через переадресацию портов ssh (или другим способом), а затем заставить администраторов запускать команду локально (докер-контейнер Django запускается локально), но обмениваться данными с базой данных. Это предпочтительнее, потому что это позволит разработчикам использовать свои собственные системные ресурсы (но может быть не идеальным, если пропускная способность станет ограничением).

Буду также признателен за любые альтернативные предложения по моей архитектуре, позволяющие обойти эту проблему. В настоящее время это мой любимый проект для развития моих навыков. Docker Swarm, вероятно, пока не требуется, но мне нужен работающий проект для отработки своих навыков, поэтому в данном случае он используется.


Для контекста вот мой рабочий файл docker-compose, который я использую для проекта (слегка измененный):

Единственные команды, выполняемые в качестве предварительного условия, — это docker secrets create ... , database и docker run -it --rm --network database --name task-name_2020-05-29_12-51-00 django_image:2020-05-29 /app/manage.py qmonitor

myproject-admin manage qmonitor

#docker #docker-compose #docker-swarm #sysadmin

Schubernel


Рег
01 Aug, 2006

Тем
58

Постов
189

Баллов
499
Похожие темы Дата
Похожие темы
Облако. Является Ли Openstack Тем Же Типом Программного Обеспечения, Что И Azure, Aws И Т. Д.?
Масштабируемость. Как Можно Масштабировать Непрерывную Интеграцию Для Очень Крупных Проектов/Команд?
Задание Dsl - Jenkins - Gitparam Jobdsl - Branchfilter
Докер — Дженкинс, Похоже, Не Работает Внутри Контейнера
Культура. Какие Ключевые Показатели Эффективности (Kpi) Используются Для Измерения Devops?
Как Выполнить Скрипт Python В Конвейере Дженкинса В Качестве Этапа И Использовать Выходные Данные Скрипта Python Для Объявления Дальнейших Этапов Конвейера Как Следующего Этапа
Можно Ли Сохранить Все Конфигурации Dsc В Системе Управления Версиями И Заставить Службу Автоматизации Azure Автоматически Получать Их Оттуда?
Docker – Как Обновить Модули, Если Версия Не Изменилась?
Git — Можно Ли Использовать Модель Запроса На Извлечение Github Для Реализации Утверждений Публикаций?
Веб-Сервисы Amazon – Как Узнать, Когда Роль Aws Iam Использовалась В Последний Раз?
Тем
403,760
Комментарии
400,028
Опыт
2,418,908

Интересно