Публичное развёртывание¶
Эта страница владеет исполняемой 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.ioIPv4 и доступные 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¶
- Остановите новый traffic на firewall/reverse proxy.
- Сохраните
/dataи ACME state. - Укажите предыдущий provenance-verified digest в
XFERRY_IMAGE. - Проверьте rendered Compose и запустите replacement.
- Верните traffic только после container и external authenticated HTTPS PING.
Не откатывайтесь на floating tag. Активные transfers могут прерваться; используйте draining, если они должны завершиться.