Self-hosted Composer repository (Satis) with Nginx, Auth-Proxy and Webhook support.
.
├── src/ # Docker image source files
│ ├── Dockerfile
│ ├── nginx.conf
│ ├── default.conf
│ ├── webhook.py
│ └── start.sh
├── satis/ # Helm chart
│ ├── Chart.yaml
│ ├── values.yaml
│ └── templates/
├── README.md # This file
└── helmfile.yaml.example # Helmfile example
The Docker image is built from files in the src/ directory and automatically published to GitHub Container Registry on push.
- Kubernetes cluster (1.19+)
- Helm 3.8+ (for OCI registry support)
- Access to GitHub Container Registry (ghcr.io)
If using a private repository, authenticate with GitHub Container Registry:
helm registry login ghcr.io -u YOUR_GITHUB_USERNAMEhelm install my-satis oci://ghcr.io/splintnet/satis/satis --version 0.1.0helm install my-satis oci://ghcr.io/splintnet/satis/satis \
--version 0.1.0 \
-f values.yamlhelm upgrade my-satis oci://ghcr.io/splintnet/satis/satis --version 0.2.0At minimum, configure the Docker image and Satis configuration:
image:
repository: ghcr.io/splintnet/satis/satis
tag: "latest"
satis:
configJson: |
{
"name": "my/composer-repository",
"description": "My Composer Repository",
"homepage": "https://repo.example.com",
"repositories": [
{ "type": "vcs", "url": "https://github.com/myorg/myrepo.git" }
],
"require-all": true
}To protect packages with authentication:
ingress:
enabled: true
authUrl: "https://auth.example.com" # Base URL (without /api/auth)
hosts:
- host: repo.example.com
paths:
- path: /
pathType: Prefix
tls:
- secretName: repo-tls
hosts:
- repo.example.comEnable webhook for manual rebuild triggers:
webhook:
enabled: true
authSecret: "your-secret-here" # MUST be set if enabled
rebuildCommand: "/satis/bin/satis build /build/config/satis.json /build/output"For private repositories:
github:
oauth:
enabled: true
token: "ghp_YOUR_TOKEN_HERE"Persistent storage for Satis output:
persistence:
enabled: true
size: 2Gi
storageClass: "" # Use default storage classSee helmfile.yaml.example for a complete configuration example.
| Parameter | Description | Default |
|---|---|---|
image.repository |
Docker image repository | ghcr.io/splintnet/satis/satis |
image.tag |
Docker image tag | latest |
satis.configPath |
Path to Satis config.json | /build/config/satis.json |
satis.outputPath |
Path for Satis output | /build/output |
satis.forceBuildOnStartup |
Force build on container startup | true |
satis.configJson |
Satis configuration JSON | See values.yaml |
ingress.enabled |
Enable ingress | false |
ingress.authUrl |
Auth API base URL | "" |
webhook.enabled |
Enable webhook service | false |
webhook.authSecret |
Webhook auth secret | CHANGE_ME |
persistence.enabled |
Enable persistent storage | true |
persistence.size |
Storage size | 2Gi |
helm uninstall my-satiskubectl get pods -l app.kubernetes.io/name=satiskubectl logs -l app.kubernetes.io/name=satiskubectl get configmap my-satis-config -o yamlcurl -X POST https://repo.example.com/webhook \
-H "X-Satis-Auth-Secret: your-secret"See LICENSE file in the repository.