Pulp 3 — свой репозиторий пакетов: синхронизируете upstream RPM (Alma, EPEL, Docker CE, Kubernetes) на диск стенда и раздаёте клиентам по HTTPS. Удобно, когда внешние зеркала тормозят или недоступны, а узлам нужен предсказуемый baseurl.
Нужны рабочий Traefik, сеть traefik_network и запас места под пакеты.
.envmkdir -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
docker-compose.ymlservices:
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.
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
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 оставляйте включённым.
./repos быстро растёт — следите за диском RAID.settings, pgsql и при необходимости манифесты; сами RPM при необходимости пересинхронизируются..env поднимайте аккуратно: на слабом железе достаточно 1.Итог: локальное RPM-зеркало за HTTPS для Alma/EPEL/Docker/K8s на том же Docker + Traefik стеке.