Public Access
initialize quickstart guide
+125
@@ -0,0 +1,125 @@
|
||||
# Quickstart: Docker Compose
|
||||
|
||||
## Test (completely open, one command)
|
||||
|
||||
```bash
|
||||
git clone https://git.morlana.online/f.weber/aptly-containerized.git
|
||||
cd aptly-containerized
|
||||
docker compose -f compose/docker-compose.test.yaml up -d --build
|
||||
```
|
||||
|
||||
That's it. No auth, no GPG, ephemeral volumes. After a few seconds:
|
||||
|
||||
```bash
|
||||
curl http://localhost:8080/ # repo index (empty until you push something)
|
||||
curl http://localhost:8080/api/ready # {"Status":"Aptly is ready"}
|
||||
```
|
||||
|
||||
A demo repo `demo` (distribution `stable`, component `main`) is already created and
|
||||
published (`compose/config/state.test.yaml`) — it just doesn't have any packages yet.
|
||||
|
||||
Build and push your own package (see [packaging](packaging) for details):
|
||||
|
||||
```bash
|
||||
docker build -f images/aptly-deb-builder/Dockerfile -t aptly-deb-builder .
|
||||
docker run --rm -v "$PWD/my-project:/work" -w /work aptly-deb-builder \
|
||||
aptly-release --config nfpm.yaml -- \
|
||||
--repo demo --distribution stable --no-sign
|
||||
|
||||
curl http://localhost:8080/dists/stable/main/binary-amd64/Packages
|
||||
```
|
||||
|
||||
Tear down: `docker compose -f compose/docker-compose.test.yaml down -v`.
|
||||
|
||||
## Production
|
||||
|
||||
```bash
|
||||
cd compose
|
||||
cp .env.example .env # edit: at minimum set APTLY_INTERNAL_PASSWORD
|
||||
cp config/users.example config/users # edit: real credentials for write access
|
||||
mkdir -p config/gpg # optional: drop private.asc (+ passphrase) in here
|
||||
docker compose up -d
|
||||
docker compose logs -f aptly-init # check: users hashed correctly? GPG key found?
|
||||
```
|
||||
|
||||
The default security mode is `publicRead`: reading (apt clients) is open, writing
|
||||
(`/api/`) needs Basic Auth. Other modes and the pitfalls around
|
||||
`security.write.allowCIDRs` behind a reverse proxy are covered in
|
||||
[security](security).
|
||||
|
||||
Declare your own repos/mirrors/publish targets in `compose/config/state.yaml` (a
|
||||
starter template is already there) — the `reconcile` service in `docker-compose.yaml`
|
||||
converges towards it on every start, without touching existing packages.
|
||||
|
||||
**Storage resizing, backup/restore, GPG key rotation:** see [operations](operations).
|
||||
|
||||
# Quickstart: Helm
|
||||
|
||||
## Installation
|
||||
|
||||
```bash
|
||||
helm registry login git.morlana.online # if the chart stays private
|
||||
helm install aptly oci://git.morlana.online/f.weber/aptly --version <chart-version> \
|
||||
--set security.preset=publicRead \
|
||||
--set ingress.enabled=true \
|
||||
--set ingress.repo.host=apt.example.com
|
||||
```
|
||||
|
||||
Without `ingress.enabled` you immediately get a `kubectl port-forward` hint printed
|
||||
in the Helm NOTES — nothing needs to be configured up front to try the chart locally
|
||||
(e.g. in kind/k3d).
|
||||
|
||||
## Configuring it especially easily — the three axes
|
||||
|
||||
1. **Security — one switch:**
|
||||
```yaml
|
||||
security:
|
||||
preset: open # | publicRead (default) | authenticated | readOnly
|
||||
```
|
||||
Full matrix including the Ingress `split` variant and the
|
||||
`trustedProxies`/`allowCIDRs` pitfalls: [security.md](security.md).
|
||||
|
||||
2. **aptly configuration — curated keys + passthrough:**
|
||||
```yaml
|
||||
aptly:
|
||||
architectures: [amd64, arm64]
|
||||
metrics:
|
||||
enabled: true
|
||||
configOverrides: # any aptly config key, 1:1, always wins
|
||||
s3_publish_endpoints:
|
||||
cdn: { region: eu-central-1, bucket: apt-morlana }
|
||||
```
|
||||
`configOverrides` is merged over the generated config last — nothing in aptly's
|
||||
own configuration is ever unreachable through this chart.
|
||||
|
||||
3. **Declarative state — repos/mirrors/publish in `values.yaml`:**
|
||||
```yaml
|
||||
aptly:
|
||||
localRepos:
|
||||
- { name: stable, defaultDistribution: stable, defaultComponent: main }
|
||||
publish:
|
||||
- name: stable-root
|
||||
prefix: ""
|
||||
distribution: stable
|
||||
sourceKind: local
|
||||
sources: [{ name: stable, component: main }]
|
||||
architectures: [amd64, arm64]
|
||||
```
|
||||
A Helm hook Job reconciles this against the running instance after every
|
||||
`helm install`/`helm upgrade` — see [packaging.md](packaging.md) for the exact
|
||||
semantics (idempotency, what can NOT be changed after the fact, prefix escaping).
|
||||
|
||||
## Health check
|
||||
|
||||
```bash
|
||||
kubectl exec <release>-aptly-0 -c aptly -- curl -fsS http://127.0.0.1:8080/api/ready
|
||||
kubectl logs job/<release>-aptly-reconcile # only visible right after install/upgrade
|
||||
```
|
||||
|
||||
## Storage resizing
|
||||
|
||||
`persistence.size` on an already-installed StatefulSet is **immutable** — see
|
||||
[operations](operations) for the recovery procedure, and set
|
||||
`persistence.existingClaim` from the start in production instead of the
|
||||
chart-generated `volumeClaimTemplate`.
|
||||
|
||||
Reference in New Issue
Block a user