Skip to content

Latest commit

 

History

1 Commit

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Warning

THIS IS AI GENERATED CHECK AND USE WITH CAUTION

dhall-flux-apps

A Dhall library for generating FluxCD GitOps application manifests.

Overview

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

Installation

Prerequisites

Install via Nix:

nix-env -i dhall dhall-json

Or via Homebrew:

brew install dhall dhall-json

Usage

Import 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.dhall

Quick Start

Simple Application

let 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 }

With PostgreSQL Database

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 }

With Custom Helm Values

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 helmRelease

Project Structure

dhall-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

API Reference

Generators

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

Default Values

Configurable in dhall/presets/defaults.dhall:

Setting Default
defaultDomain example.com
defaultStorageClass longhorn
defaultHelmInterval 30m
defaultOCIInterval 10m
defaultIngressClass tailscale
defaultCNPGInstances 3

Generating YAML

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.sh

Or use dhall-to-yaml directly:

dhall-to-yaml <<< '(./examples/simple-app.dhall).namespace'
dhall-to-yaml <<< '(./examples/simple-app.dhall).helmRelease'

Customization

Override Defaults

Create your own presets file:

let defaults = ./dhall/presets/defaults.dhall

in defaults // { defaultDomain = "my-domain.com", defaultStorageClass = "ceph" }

Extend Types

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 directly

License

Apache License 2.0 - See LICENSE for details.

Contributing

Contributions are welcome! Please feel free to submit issues and pull requests.

About

generate flux code using dhall, this is AI GENERATED

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages