Перейти к содержанию

Публичное развёртывание

Эта страница владеет исполняемой public-direct Compose-процедурой, квотами, health verification и rollback. Обязательная policy-грань находится в политике безопасности.

Продвинутый операторский путь

Public-direct — не продолжение loopback quick start. Нужны real TLS, file-backed authentication, конечная capacity, firewall policy, proxy-side controls, monitoring и проверенный rollback.

Предварительные условия

  • публичное DNS-имя или sslip.io IPv4 и доступные TCP 80/443;
  • immutable ghcr.io/kgmnotes/xferry@sha256:<digest>;
  • сильные Basic Auth credentials в secret file;
  • конечные upload limits или независимо enforced hard quota;
  • внешний HTTPS-monitor без отключения certificate validation;
  • предыдущий verified digest и подходящий backup data/ACME.

Приложение доверяет прямому TCP peer, а не forwarded client-IP headers. Reverse proxy обязан применить per-client throttling и request/header/body caps до передачи трафика.

Подготовка

cd deploy/docker
cp -n xferry.ini.example xferry.ini
sudo install -d -o 10001 -g 10001 -m 0700 secrets
sudo install -o 10001 -g 10001 -m 0400 \
  /secure/path/xferry_auth secrets/xferry_auth

Secret содержит ровно одну строку user:password. Не помещайте password в process arguments и не коммитьте live INI или secret.

export XFERRY_IMAGE='ghcr.io/kgmnotes/xferry@sha256:<verified-manifest-digest>'
export XFERRY_HEALTH_HOST='203.0.113.10.sslip.io'

docker buildx imagetools inspect "$XFERRY_IMAGE"
gh attestation verify "oci://${XFERRY_IMAGE}" --repo kgmnotes/xferry
docker compose -f docker-compose.public-direct.yml config

XFERRY_HEALTH_HOST должен точно совпадать с DNS name сертификата.

Capacity и configuration gate

Пример задаёт body budget 512 MiB, container memory 768 MiB, 1 CPU, 256 PIDs, 4096 MiB upload storage, 4096 files и 1024 MiB free-space reserve. Root filesystem read-only, capabilities сброшены, включён no-new-privileges.

Public-direct validation fails closed без real TLS, auth_file, memory budget, timeouts и владельца upload capacity. Флаг upload_quota_externally_managed = true допустим только при реально настроенной и проверенной внешней hard quota; сам флаг квоту не создаёт.

Запуск и проверка

docker compose -f docker-compose.public-direct.yml up -d
docker compose -f docker-compose.public-direct.yml ps

Container healthcheck читает /run/secrets/xferry_auth, выполняет authenticated HTTPS PING и требует HTTP 200 с X-Ping-Response: pong. Он не доказывает работоспособность публичных DNS/NAT/firewall. Проверьте их из другой сети:

export XFERRY_PROBE_AUTH_FILE='/secure/path/xferry_auth'
printf 'user = "%s"\n' "$(tr -d '\r\n' < "$XFERRY_PROBE_AUTH_FILE")" |
  curl --config - --fail --silent --show-error --request PING \
    --dump-header - --output /dev/null "https://${XFERRY_HEALTH_HOST}/" |
  tr -d '\r' |
  grep -Fx 'X-Ping-Response: pong'

Следите за TLS failure, non-200, отсутствующим pong, unhealthy container, quota denials, storage-scan latency и resource exhaustion.

Rollback

  1. Остановите новый traffic на firewall/reverse proxy.
  2. Сохраните /data и ACME state.
  3. Укажите предыдущий provenance-verified digest в XFERRY_IMAGE.
  4. Проверьте rendered Compose и запустите replacement.
  5. Верните traffic только после container и external authenticated HTTPS PING.

Не откатывайтесь на floating tag. Активные transfers могут прерваться; используйте draining, если они должны завершиться.