Initial implementation: aptly container image, Compose stacks, Helm chart, and Gitea Actions pipelines
CI / lint (push) Failing after 24s
CI / smoke-test (push) Failing after 2m4s
Release image / release (push) Successful in 23m18s
Release chart / release (push) Successful in 7s

Provides a self-contained, containerized aptly (Debian repo manager)
stack with independently releasable image and Helm chart versions.

- images/: aptly-server (aptly built from source, cross-compiled) and
  aptly-deb-builder (nfpm + dpkg-buildpackage) container images
- rootfs/: shared aptly-init/aptly-reconcile/aptly-push/aptly-pack
  scripts consumed identically by Compose and the Helm chart, driven
  by one declarative state.yaml contract
- compose/: test (ephemeral, open) and production docker-compose
  stacks with an nginx read/auth sidecar
- charts/aptly/: aptly-native Helm chart covering every security
  posture from fully open to authenticated read+write, Ingress and
  Gateway API support (usable in parallel for migration scenarios),
  metrics, and declarative repo/mirror/publish reconciliation via a
  Helm hook
- .gitea/workflows/: CI (lint, template, kubeconform, E2E smoke test)
  plus separately tagged image (image/v*) and chart (chart/v*)
  releases, weekly rebuilds, and a preflight workflow validating the
  runner's Docker/Helm-OCI capabilities
- pubkeys/: RSA chart-signing key for Helm --sign / Artifact Hub's
  signKey annotation (Helm can't verify Ed25519 keys)
- docs/, README.md, charts/aptly/README.md: usage, security, and
  versioning documentation
This commit is contained in:
2026-08-12 12:21:08 +02:00
commit 103ad311b7
71 changed files with 4843 additions and 0 deletions
+421
View File
@@ -0,0 +1,421 @@
{
"$schema": "http://json-schema.org/draft-07/schema#",
"title": "aptly",
"type": "object",
"additionalProperties": false,
"properties": {
"nameOverride": { "type": "string" },
"fullnameOverride": { "type": "string" },
"image": {
"type": "object",
"additionalProperties": false,
"properties": {
"repository": { "type": "string" },
"tag": { "type": "string" },
"pullPolicy": { "type": "string", "enum": ["Always", "IfNotPresent", "Never"] },
"pullSecrets": { "type": "array" }
}
},
"nginx": {
"type": "object",
"additionalProperties": false,
"properties": {
"image": {
"type": "object",
"additionalProperties": false,
"properties": {
"repository": { "type": "string" },
"tag": { "type": "string" },
"pullPolicy": { "type": "string", "enum": ["Always", "IfNotPresent", "Never"] }
}
},
"resources": { "type": "object" },
"securityContext": { "type": "object" }
}
},
"aptly": {
"type": "object",
"additionalProperties": false,
"properties": {
"architectures": { "type": "array", "items": { "type": "string" } },
"logLevel": { "type": "string", "enum": ["debug", "info", "warn", "error"] },
"logFormat": { "type": "string", "enum": ["default", "json"] },
"download": {
"type": "object",
"additionalProperties": false,
"properties": {
"concurrency": { "type": "integer", "minimum": 1 },
"limit": { "type": "integer", "minimum": 0 },
"retries": { "type": "integer", "minimum": 0 },
"sourcePackages": { "type": "boolean" }
}
},
"publishing": {
"type": "object",
"additionalProperties": false,
"properties": {
"skipContents": { "type": "boolean" },
"skipBz2": { "type": "boolean" }
}
},
"metrics": {
"type": "object",
"additionalProperties": false,
"properties": { "enabled": { "type": "boolean" } }
},
"swagger": {
"type": "object",
"additionalProperties": false,
"properties": { "enabled": { "type": "boolean" } }
},
"gpg": {
"type": "object",
"additionalProperties": false,
"properties": {
"enabled": { "type": "boolean" },
"verify": { "type": "boolean" },
"provider": { "type": "string", "enum": ["gpg", "internal"] },
"signingKey": {
"type": "object",
"additionalProperties": false,
"properties": {
"existingSecret": { "type": "string" },
"privateKey": { "type": "string" },
"passphrase": { "type": "string" }
}
},
"publishPublicKey": {
"type": "object",
"additionalProperties": false,
"properties": {
"enabled": { "type": "boolean" },
"path": { "type": "string" }
}
}
}
},
"gpgKeys": {
"type": "array",
"items": {
"type": "object",
"required": ["name", "armored"],
"properties": {
"name": { "type": "string" },
"armored": { "type": "string" }
}
}
},
"localRepos": {
"type": "array",
"items": {
"type": "object",
"required": ["name"],
"properties": {
"name": { "type": "string" },
"comment": { "type": "string" },
"defaultDistribution": { "type": "string" },
"defaultComponent": { "type": "string" }
}
}
},
"mirrors": {
"type": "array",
"items": {
"type": "object",
"required": ["name", "archiveURL", "distribution"],
"properties": {
"name": { "type": "string" },
"archiveURL": { "type": "string" },
"distribution": { "type": "string" },
"components": { "type": "array", "items": { "type": "string" } },
"architectures": { "type": "array", "items": { "type": "string" } },
"filter": { "type": "string" },
"filterWithDeps": { "type": "boolean" },
"downloadSources": { "type": "boolean" },
"downloadUdebs": { "type": "boolean" },
"downloadInstaller": { "type": "boolean" },
"downloadAppStream": { "type": "boolean" },
"ignoreSignatures": { "type": "boolean" },
"keyrings": { "type": "array", "items": { "type": "string" } }
}
}
},
"publish": {
"type": "array",
"items": {
"type": "object",
"required": ["name", "distribution"],
"properties": {
"name": { "type": "string" },
"prefix": { "type": "string" },
"distribution": { "type": "string" },
"sourceKind": { "type": "string", "enum": ["local", "snapshot"] },
"sources": {
"type": "array",
"items": {
"type": "object",
"required": ["name", "component"],
"properties": {
"name": { "type": "string" },
"component": { "type": "string" }
}
}
},
"architectures": { "type": "array", "items": { "type": "string" } },
"acquireByHash": { "type": "boolean" },
"skipContents": { "type": "boolean" },
"skipBz2": { "type": "boolean" }
}
}
},
"configOverrides": { "type": "object", "additionalProperties": true },
"existingSecretEnv": { "type": "array", "items": { "type": "string" } }
}
},
"security": {
"type": "object",
"additionalProperties": false,
"properties": {
"preset": { "type": "string", "enum": ["open", "publicRead", "authenticated", "readOnly"] },
"auth": {
"type": "object",
"additionalProperties": false,
"properties": {
"users": { "type": "object", "additionalProperties": { "type": "string" } },
"existingSecret": { "type": "string" },
"internalUser": {
"type": "object",
"additionalProperties": false,
"properties": {
"enabled": { "type": "boolean" },
"username": { "type": "string" }
}
}
}
},
"trustedProxies": { "type": "array", "items": { "type": "string" } },
"read": {
"type": "object",
"additionalProperties": false,
"properties": {
"enabled": { "type": "boolean" },
"requireAuth": { "type": ["boolean", "null"] },
"allowCIDRs": { "type": "array", "items": { "type": "string" } }
}
},
"write": {
"type": "object",
"additionalProperties": false,
"properties": {
"enabled": { "type": "boolean" },
"requireAuth": { "type": ["boolean", "null"] },
"allowCIDRs": { "type": "array", "items": { "type": "string" } },
"inClusterOnly": { "type": "boolean" }
}
}
}
},
"proxy": {
"type": "object",
"additionalProperties": false,
"properties": {
"enabled": { "type": "boolean" },
"compatPaths": { "type": "boolean" },
"maxUploadSize": { "type": "string" },
"readTimeout": { "type": "string" },
"publishEndpointName": { "type": "string" }
}
},
"persistence": {
"type": "object",
"additionalProperties": false,
"properties": {
"enabled": { "type": "boolean" },
"existingClaim": { "type": "string" },
"storageClass": { "type": "string" },
"accessMode": { "type": "string", "enum": ["ReadWriteOnce", "ReadWriteOncePod"] },
"size": { "type": "string" },
"annotations": { "type": "object" }
}
},
"workload": {
"type": "object",
"additionalProperties": false,
"properties": {
"updateStrategy": {
"type": "object",
"additionalProperties": false,
"properties": { "type": { "type": "string", "enum": ["RollingUpdate", "OnDelete"] } }
},
"podManagementPolicy": { "type": "string", "enum": ["OrderedReady", "Parallel"] },
"revisionHistoryLimit": { "type": "integer", "minimum": 0 },
"terminationGracePeriodSeconds": { "type": "integer", "minimum": 0 },
"annotations": { "type": "object" },
"podAnnotations": { "type": "object" },
"podLabels": { "type": "object" }
}
},
"podSecurityContext": { "type": "object" },
"containerSecurityContext": { "type": "object" },
"resources": { "type": "object" },
"probes": {
"type": "object",
"additionalProperties": false,
"properties": {
"startup": { "type": "object" },
"readiness": { "type": "object" },
"liveness": { "type": "object" }
}
},
"service": {
"type": "object",
"additionalProperties": false,
"properties": {
"type": { "type": "string", "enum": ["ClusterIP", "NodePort", "LoadBalancer"] },
"port": { "type": "integer" },
"annotations": { "type": "object" }
}
},
"ingress": {
"type": "object",
"additionalProperties": false,
"properties": {
"enabled": { "type": "boolean" },
"mode": { "type": "string", "enum": ["single", "split"] },
"className": { "type": "string" },
"annotations": { "type": "object", "additionalProperties": true },
"repo": {
"type": "object",
"additionalProperties": false,
"properties": {
"host": { "type": "string" },
"path": { "type": "string" },
"pathType": { "type": "string", "enum": ["Prefix", "Exact", "ImplementationSpecific"] },
"tls": { "type": "array" }
}
},
"api": {
"type": "object",
"additionalProperties": false,
"properties": {
"enabled": { "type": "boolean" },
"host": { "type": "string" },
"className": { "type": "string" },
"annotations": { "type": "object", "additionalProperties": true },
"tls": { "type": "array" }
}
}
}
},
"gateway": {
"type": "object",
"additionalProperties": false,
"properties": {
"enabled": { "type": "boolean" },
"apiVersion": { "type": "string" },
"mode": { "type": "string", "enum": ["single", "split"] },
"parentRefs": { "type": "array" },
"repo": {
"type": "object",
"additionalProperties": false,
"properties": {
"hostnames": { "type": "array", "items": { "type": "string" } },
"path": { "type": "string" },
"pathType": { "type": "string", "enum": ["PathPrefix", "Exact", "RegularExpression"] }
}
},
"api": {
"type": "object",
"additionalProperties": false,
"properties": {
"enabled": { "type": "boolean" },
"hostnames": { "type": "array", "items": { "type": "string" } },
"parentRefs": { "type": "array" }
}
}
}
},
"metrics": {
"type": "object",
"additionalProperties": false,
"properties": {
"service": {
"type": "object",
"additionalProperties": false,
"properties": {
"enabled": { "type": "boolean" },
"port": { "type": "integer" },
"annotations": { "type": "object" }
}
},
"serviceMonitor": {
"type": "object",
"additionalProperties": false,
"properties": {
"enabled": { "type": "boolean" },
"interval": { "type": "string" },
"labels": { "type": "object" },
"relabelings": { "type": "array" }
}
}
}
},
"reconcile": {
"type": "object",
"additionalProperties": false,
"properties": {
"enabled": { "type": "boolean" },
"mode": { "type": "string", "enum": ["hook", "job", "manual"] },
"failOnError": { "type": "boolean" },
"timeoutSeconds": { "type": "integer", "minimum": 1 },
"image": { "type": "object" },
"resources": { "type": "object" }
}
},
"podDisruptionBudget": {
"type": "object",
"additionalProperties": false,
"properties": {
"enabled": { "type": "boolean" },
"maxUnavailable": { "type": "integer", "minimum": 0 }
}
},
"networkPolicy": {
"type": "object",
"additionalProperties": false,
"properties": {
"enabled": { "type": "boolean" },
"allowedNamespaces": { "type": "array", "items": { "type": "string" } },
"extraIngress": { "type": "array" },
"egress": {
"type": "object",
"additionalProperties": false,
"properties": {
"allowAll": { "type": "boolean" },
"extra": { "type": "array" }
}
}
}
},
"extraEnv": { "type": "array" },
"extraEnvFrom": { "type": "array" },
"extraVolumes": { "type": "array" },
"extraVolumeMounts": { "type": "array" },
"extraInitContainers": { "type": "array" },
"extraContainers": { "type": "array" },
"nodeSelector": { "type": "object" },
"tolerations": { "type": "array" },
"affinity": { "type": "object" },
"topologySpreadConstraints": { "type": "array" },
"priorityClassName": { "type": "string" },
"global": {
"type": "object",
"additionalProperties": false,
"properties": {
"imageRegistry": { "type": "string" },
"imagePullSecrets": { "type": "array" },
"defaultStorageClass": { "type": "string" }
}
}
}
}