# Пример: Traefik + traefik-selectel-dns на одной ВМ. # Перед запуском создайте файлы секретов (права 0400/0440, не в git): # mkdir -p secrets && umask 077 # printf '%s' 'service-user' > secrets/selectel_username # printf '%s' 'password' > secrets/selectel_password # printf '%s' '123456' > secrets/selectel_account_id # printf '%s' 'project-uuid' > secrets/selectel_project_id # Пользователь Selectel — сервисный, с минимальной ролью на DNS в нужном проекте. services: traefik: image: traefik:v3 # в проде закрепите конкретную версию/digest restart: unless-stopped command: ["--configFile=/etc/traefik/traefik.yml"] ports: # публикуются ТОЛЬКО 80/443; 8080 (API) не публикуется - "80:80" - "443:443" environment: # Имена переменных lego (selectelv2); суффикс _FILE — чтение значения из файла SELECTELV2_USERNAME_FILE: /run/secrets/selectel_username SELECTELV2_PASSWORD_FILE: /run/secrets/selectel_password SELECTELV2_ACCOUNT_ID_FILE: /run/secrets/selectel_account_id SELECTELV2_PROJECT_ID_FILE: /run/secrets/selectel_project_id secrets: - selectel_username - selectel_password - selectel_account_id - selectel_project_id volumes: - ./traefik.example.yml:/etc/traefik/traefik.yml:ro - ./dynamic:/etc/traefik/dynamic:ro - letsencrypt:/letsencrypt - /var/run/docker.sock:/var/run/docker.sock:ro networks: - proxy # сюда подключаются пользовательские контейнеры - control # только Traefik <-> демон docker-proxy: # Демону нужен только поток событий: даём ему read-only прокси вместо docker.sock. image: tecnativa/docker-socket-proxy:latest # закрепите версию restart: unless-stopped environment: EVENTS: 1 CONTAINERS: 0 POST: 0 volumes: - /var/run/docker.sock:/var/run/docker.sock:ro networks: - control traefik-selectel-dns: image: git.realmanual.ru/pub/traefik-selectel:latest # или build: .. # build: # context: .. restart: unless-stopped depends_on: - traefik environment: SELECTEL_USERNAME_FILE: /run/secrets/selectel_username SELECTEL_PASSWORD_FILE: /run/secrets/selectel_password SELECTEL_ACCOUNT_ID_FILE: /run/secrets/selectel_account_id SELECTEL_PROJECT_ID_FILE: /run/secrets/selectel_project_id secrets: - selectel_username - selectel_password - selectel_account_id - selectel_project_id volumes: - ./config.example.yaml:/etc/traefik-selectel-dns/config.yaml:ro read_only: true cap_drop: [ALL] security_opt: - no-new-privileges:true networks: - control # доступ к Traefik API и docker-proxy; исходящий интернет — к Selectel secrets: selectel_username: file: ./secrets/selectel_username selectel_password: file: ./secrets/selectel_password selectel_account_id: file: ./secrets/selectel_account_id selectel_project_id: file: ./secrets/selectel_project_id volumes: letsencrypt: networks: proxy: name: proxy control: name: traefik-control # НЕ подключайте к ней пользовательские контейнеры ipam: config: - subnet: 172.30.250.0/24 # должна совпадать с sourceRange в dynamic/api-internal.yml