Запуск Pulp (зеркало RPM) через Traefik с Docker Compose

Pulp 3 — свой репозиторий пакетов: синхронизируете upstream RPM (Alma, EPEL, Docker CE, Kubernetes) на диск стенда и раздаёте клиентам по HTTPS. Удобно, когда внешние зеркала тормозят или недоступны, а узлам нужен предсказуемый baseurl.

Нужны рабочий Traefik, сеть traefik_network и запас места под пакеты.

1. Каталог и .env

mkdir -p pulp/{settings,repos,pgsql,containers}
cd pulp
cat > .env <<'EOF'
PULP_HOST=pulp.(yourdomain)
CONTENT_ORIGIN=https://pulp.(yourdomain)
PULP_SECRET_KEY=(youpassword)
PULP_WORKERS=1
PULP_API_WORKERS=1
PULP_CONTENT_WORKERS=1
EOF

Минимальный settings/settings.py (читает env):

import os

CONTENT_ORIGIN = os.environ["CONTENT_ORIGIN"]
ANSIBLE_API_HOSTNAME = CONTENT_ORIGIN
ANSIBLE_CONTENT_HOSTNAME = f"{CONTENT_ORIGIN}/pulp/content"
SECRET_KEY = os.environ["PULP_SECRET_KEY"]
REDIS_URL = "redis://127.0.0.1:6379/0"
CACHE_ENABLED = True

2. docker-compose.yml

services:
  pulp:
    image: pulp/pulp:3.121.3
    container_name: pulp
    restart: unless-stopped
    devices:
      - /dev/fuse
    environment:
      CONTENT_ORIGIN: ${CONTENT_ORIGIN}
      PULP_SECRET_KEY: ${PULP_SECRET_KEY}
      PULP_UI: "true"
      PULP_WORKERS: ${PULP_WORKERS:-1}
      PULP_API_WORKERS: ${PULP_API_WORKERS:-1}
      PULP_CONTENT_WORKERS: ${PULP_CONTENT_WORKERS:-1}
    volumes:
      - ./settings:/etc/pulp
      - ./repos:/var/lib/pulp
      - ./pgsql:/var/lib/pgsql
      - ./containers:/var/lib/containers
    healthcheck:
      test: ["CMD-SHELL", "curl -sf http://127.0.0.1/pulp/api/v3/status/ >/dev/null"]
      interval: 30s
      timeout: 10s
      retries: 5
      start_period: 180s
    labels:
      - traefik.enable=true
      - traefik.http.middlewares.pulp_https.redirectscheme.scheme=https
      - traefik.http.routers.pulp.entrypoints=web
      - traefik.http.routers.pulp.middlewares=pulp_https@docker
      - traefik.http.routers.pulp.rule=Host(`pulp.(yourdomain)`)
      - traefik.http.routers.pulp_https.entrypoints=websecure
      - traefik.http.routers.pulp_https.rule=Host(`pulp.(yourdomain)`)
      - traefik.http.routers.pulp_https.tls=true
      - traefik.http.routers.pulp_https.tls.certresolver=le
      - traefik.http.services.pulp.loadbalancer.server.port=80
    networks:
      - traefik_network

networks:
  traefik_network:
    external: true

⚠️ Замените (yourdomain) и задайте длинный PULP_SECRET_KEY. Для внутреннего контура добавьте allowlist middleware в Traefik. /dev/fuse нужен образу Pulp.

3. Запуск

docker compose up -d
docker compose logs -f --tail=100
curl -sf https://pulp.(yourdomain)/pulp/api/v3/status/

UI: https://pulp.(yourdomain)/ui/. Пароль admin при первом запуске задайте сами:

docker exec -it pulp pulpcore-manager reset-admin-password

4. Зеркала и baseurl для dnf

Префикс контента: https://pulp.(yourdomain)/pulp/content/. Типичный набор для Alma 9 / x86_64 (пакеты в режиме immediate, по одной задаче sync):

Имя Путь контента
Alma 9 BaseOS almalinux/9/BaseOS/x86_64/os/
Alma 9 AppStream almalinux/9/AppStream/x86_64/os/
Alma 9 extras almalinux/9/extras/x86_64/os/
Alma 9 CRB almalinux/9/CRB/x86_64/os/
EPEL 9 epel/9/Everything/x86_64/
Docker CE (Alma 9) docker/alma/9/x86_64/stable/
Kubernetes kubernetes/v1.37/ (или v1.35 / v1.36)

Пример репо:

[almalinux-9-baseos]
name=AlmaLinux 9 BaseOS
baseurl=https://pulp.(yourdomain)/pulp/content/almalinux/9/BaseOS/x86_64/os/
gpgcheck=1
enabled=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-AlmaLinux-9

Docker CE:

[docker-ce-stable]
name=Docker CE Stable
baseurl=https://pulp.(yourdomain)/pulp/content/docker/alma/9/x86_64/stable/
enabled=1
gpgcheck=1
gpgkey=https://download.docker.com/linux/alma/gpg

Kubernetes (подставьте нужную minor-версию в baseurl и gpgkey):

[kubernetes]
name=Kubernetes
baseurl=https://pulp.(yourdomain)/pulp/content/kubernetes/v1.37/
enabled=1
gpgcheck=1
gpgkey=https://pkgs.k8s.io/core:/stable:/v1.37/rpm/repodata/repomd.xml.key

Подписи RPM сохраняются; gpgcheck=1 оставляйте включённым.

5. Замечания

  • ./repos быстро растёт — следите за диском RAID.
  • Бэкапьте settings, pgsql и при необходимости манифесты; сами RPM при необходимости пересинхронизируются.
  • Workers в .env поднимайте аккуратно: на слабом железе достаточно 1.
  • Не открывайте порт контейнера в NAT — только Traefik 80/443.

Итог: локальное RPM-зеркало за HTTPS для Alma/EPEL/Docker/K8s на том же Docker + Traefik стеке.