Warning
THIS IS AI GENERATED CHECK AND USE WITH CAUTION
A Dhall library for generating FluxCD GitOps application manifests.
This library provides type-safe Dhall functions to generate Kubernetes manifests for FluxCD-managed applications, including:
- Namespaces - Kubernetes namespace definitions
- HelmRepositories - FluxCD source definitions for Helm charts
- OCIRepositories - FluxCD source definitions for OCI artifacts
- HelmReleases - FluxCD Helm release configurations
- Ingresses - Tailscale-based ingress resources
- CloudNativePG Clusters - PostgreSQL database clusters
- Kustomizations - Kustomize configuration files
- dhall - Dhall interpreter
- dhall-to-yaml - YAML generator
Install via Nix:
nix-env -i dhall dhall-jsonOr via Homebrew:
brew install dhall dhall-jsonImport the library in your Dhall files:
let Lib = https://raw.githubusercontent.com/YOUR_USERNAME/dhall-flux-apps/main/dhall/package.dhall
-- Or use a local copy
let Lib = ./dhall/package.dhalllet Lib = ./dhall/package.dhall
let name = "my-app"
let namespace = name
-- Create namespace
let ns = Lib.mkNamespace name
-- Create HelmRepository
let helmRepo =
Lib.mkDefaultHelmRepository
"bitnami"
namespace
"https://charts.bitnami.com/bitnami"
-- Create Tailscale ingress
let ingress = Lib.mkTailscaleIngress name namespace 8080
-- Create HelmRelease
let helmRelease =
Lib.mkSimpleHelmRelease name namespace "nginx" "15.0.0" "bitnami"
in { namespace = ns, helmRepository = helmRepo, helmRelease, ingress }let Lib = ./dhall/package.dhall
let name = "my-app"
let namespace = name
let ns = Lib.mkNamespace name
let cnpgCluster = Lib.mkDefaultCNPGCluster name namespace "20Gi"
in { namespace = ns, cnpgCluster }let Lib = ./dhall/package.dhall
let JSON = Lib.JSON
let helmRelease =
Lib.mkHelmRelease
{ name = "my-app"
, namespace = "my-app"
, chart = "nginx"
, version = Some "15.0.0"
, sourceRef = { kind = "HelmRepository", name = "bitnami", namespace = "my-app" }
, interval = "30m"
, valuesFrom = None (List { kind : Text, name : Text, valuesKey : Optional Text })
, values = Some
( JSON.object
[ { mapKey = "replicaCount"
, mapValue = JSON.natural 3
}
, { mapKey = "service"
, mapValue =
JSON.object
[ { mapKey = "type", mapValue = JSON.string "ClusterIP" }
]
}
]
)
}
in helmReleasedhall-flux-apps/
├── dhall/
│ ├── package.dhall # Main entry point
│ ├── types/ # Type definitions
│ │ ├── package.dhall
│ │ ├── App.dhall
│ │ ├── Annotations.dhall
│ │ ├── Database.dhall
│ │ ├── HelmSource.dhall
│ │ ├── Ingress.dhall
│ │ ├── Labels.dhall
│ │ ├── NodeSelector.dhall
│ │ ├── Persistence.dhall
│ │ ├── Toleration.dhall
│ │ └── ValuesFrom.dhall
│ ├── generators/ # YAML generators
│ │ ├── package.dhall
│ │ ├── mkNamespace.dhall
│ │ ├── mkIngress.dhall
│ │ ├── mkHelmRepository.dhall
│ │ ├── mkOCIRepository.dhall
│ │ ├── mkHelmRelease.dhall
│ │ ├── mkCNPGCluster.dhall
│ │ └── mkKustomization.dhall
│ └── presets/ # Default configurations
│ ├── package.dhall
│ └── defaults.dhall
├── examples/ # Example app definitions
│ ├── freshrss.dhall
│ └── simple-app.dhall
├── scripts/
│ └── generate.sh # YAML generation script
├── LICENSE
└── README.md
| Function | Description |
|---|---|
mkNamespace |
Create a Kubernetes Namespace |
mkIngress |
Create a custom Ingress |
mkTailscaleIngress |
Create a Tailscale-based Ingress |
mkHelmRepository |
Create a FluxCD HelmRepository |
mkDefaultHelmRepository |
Create a HelmRepository with defaults |
mkOCIHelmRepository |
Create an OCI-type HelmRepository |
mkOCIRepository |
Create a FluxCD OCIRepository |
mkDefaultOCIRepository |
Create an OCIRepository with defaults |
mkHelmRelease |
Create a FluxCD HelmRelease |
mkSimpleHelmRelease |
Create a minimal HelmRelease |
mkCNPGCluster |
Create a CloudNativePG Cluster |
mkDefaultCNPGCluster |
Create a CNPG Cluster with defaults |
mkKustomization |
Create a Kustomization file |
Configurable in dhall/presets/defaults.dhall:
| Setting | Default |
|---|---|
defaultDomain |
example.com |
defaultStorageClass |
longhorn |
defaultHelmInterval |
30m |
defaultOCIInterval |
10m |
defaultIngressClass |
tailscale |
defaultCNPGInstances |
3 |
Use the provided script to generate YAML from Dhall definitions:
# Generate all apps in examples/
./scripts/generate.sh
# Generate a specific app
./scripts/generate.sh simple-app
# Use custom directories
APPS_DIR=./my-apps GENERATED_DIR=./output ./scripts/generate.shOr use dhall-to-yaml directly:
dhall-to-yaml <<< '(./examples/simple-app.dhall).namespace'
dhall-to-yaml <<< '(./examples/simple-app.dhall).helmRelease'Create your own presets file:
let defaults = ./dhall/presets/defaults.dhall
in defaults // { defaultDomain = "my-domain.com", defaultStorageClass = "ceph" }The library is designed to be extensible. Import individual modules and compose them as needed:
let Types = ./dhall/types/package.dhall
let Generators = ./dhall/generators/package.dhall
-- Use types and generators directlyApache License 2.0 - See LICENSE for details.
Contributions are welcome! Please feel free to submit issues and pull requests.