- 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