This document explains the Nix structure used in this repository. The project uses flake-parts to split a flake.nix into specialized, maintainable modules.
!!! tip "Deep Dive" For a comprehensive explanation of how flake-parts works in this repository, including module scopes, evaluation order, and common patterns, see:
- **[Flake-Parts Architecture](./flake-parts-architecture.md)** - Module structure and patterns
- **[Flake-Parts and nixpkgs lib](./flake-parts-nixpkgs-lib.md)** - nixpkgs lib foundations
The root flake.nix serves only as an entry point that references specialized modules in the nix/ directory:
├── flake.nix # Root flake file only referencing modules
nix/
├── apps.nix # Application definitions
├── checks.nix # Build checks and tests
├── config.nix # Global configuration
├── devShells.nix # Development environment shell
├── fmt.nix # Code formatting configuration
├── hooks.nix # Git hooks and pre-commit
├── ext/ # PostgreSQL extensions
├── overlays/ # Nixpkgs overlays
├── packages/ # Custom packages
└── postgresql/ # PostgreSQL packages
The main flake file that:
- Declares inputs (nixpkgs, flake-parts, etc.)
- Sets up the systems to support (x86_64-linux, aarch64-linux, aarch64-darwin)
- Imports all module files using flake-parts
Lockfile containing exact versions of all flake inputs.
Global configuration and constants used throughout the flake:
- PostgreSQL default ports and users
- System-wide package configurations
- Shared constants and variables
Nixpkgs configuration:
- System-specific package imports
- Overlay applications
- Package configuration (allow unfree packages, etc.)
Development shell configurations:
- Default development environment
- Tool dependencies for development
- Environment variables and setup
Code formatting configuration using treefmt:
- nixfmt-rfc-style for Nix code formatting
- deadnix for removing unused nix code
More details in Code formatter.
Git hooks and pre-commit configuration:
- Integration with git-hooks.nix
- Automatic formatting on commit
- Code quality checks
More details in Pre-coommit hooks.
Application definitions accessible via nix run:
- Development tools and scripts
- Build and deployment utilities
- Testing and validation tools
Directory containing custom package definitions such as:
default.nix- Main package exports and basePackagesstart-client.nix- PostgreSQL client toolsstart-replica.nix- Replication toolsmigrate-tool.nix- Migration utilitiesdbmate-tool.nix- Database migration toolpostgres.nix- Postgres extension registry and ourExtensions list
Build checks and validation:
- Package build validation
- Integration tests
- Code quality checks
- Ensures all Postgres packages build correctly
PostgreSQL package definitions:
default.nix- Main PostgreSQL package exportsgeneric.nix- Generic PostgreSQL build functionssrc.nix- PostgreSQL source package generationpatches/- PostgreSQL-specific patches
PostgreSQL extensions:
- Individual
.nixfiles - Extension definitions like:pgvector.nix- Vector similarity searchpgsodium.nix- Encryption extensionpg_graphql.nix- GraphQL supporttimescaledb.nix- Time-series database- And 30+ other extensions
Nixpkgs overlays for package customization:
default.nix- Main overlay that imports all otherscargo-pgrx-0-11-3.nix- PGRX toolchain overlaypsql_16-oriole.nix- OrioleDB PostgreSQL variant
Rust-based PostgreSQL extension building:
default.nix- cargo-pgrx package definitionsbuildPgrxExtension.nix- Builder for Rust extensions
Test suites and expected outputs:
sql/- SQL test filesexpected/- Expected test outputsmigrations/- Migration test datasmoke/- Smoke tests for quick validation