Hugo
Hugo is one of the most popular open-source static site generators.
The easiest way to use Hugo on NixOS is to install Hugo and git from nixpkgs:
{ pkgs, ... }: { environment.systemPackages = [ pkgs.git pkgs.hugo ]; }
You can now follow the Hugo Quick start tutorial and not much is different from running Hugo on other Linux distributions.
A dev shell
You may, however, want to limit the installation to your Hugo-specific projects. This makes it possible for you or others to download your repository and work with its dependencies, since they are fully specified within the project.
{ pkgs ? import <nixpkgs> {} }: pkgs.mkShellNoCC { packages = [ pkgs.git pkgs.hugo pkgs.just ]; }
To avoid having to type nix-shell
or nix develop
to access the dev shell, consider enabling nix-direnv.
A theme
To make the site look nice, find a theme and pin it:
{ pkgs ? import <nixpkgs> {} }: let hugo-theme = builtins.fetchTarball { name = "hugo-theme-m10c"; url = "https://github.com/vaga/hugo-theme-m10c/archive/8295ee808a8166a7302b781895f018d9cba20157.tar.gz"; sha256 = "12jvbikznzqjj9vjd1hiisb5lhw4hra6f0gkq1q84s0yq7axjgaw"; }; in pkgs.mkShellNoCC { packages = [ pkgs.git pkgs.hugo pkgs.just ]; shellHook = mkdir -p themes ln -snf "${hugo-theme}" themes/m10c ; }
To activate the theme, after running hugo new site . --force
, a hugo.toml file with something like:
baseURL = 'https://nix.tools/' languageCode = 'en-us' title = 'nix.tools' theme = 'm10c'
and a justfile with something like:
# See available `just` subcommands list: @just --list # Create scaffolding and hugo.toml init: hugo new site . --force # Serve website on http://127.0.0.1:1313/ serve: hugo serve -D # Create new post in content/posts/ post MDFILE: mkdir -p content/posts hugo new content 'content/posts/Template:MDFILE' || true
and a .gitignore like:
# Hugo output public/ # Misc. .hugo_build.lock .direnv/
the justfile serves to remind what commands are useful to operate the static site.
Simplified deployment via SSH/SCP
Deployment with Nix gets a little complicated, so let’s just rehash how one might do it without:
# Generate static assets in public/ $ hugo # Compress and upload static assets $ tar cfz public.tgz public/ $ scp public.tgz server:/var/www/website $ ssh server 'cd /var/www/website && tar xfz public.tgz'
This can be summarized as a justfile action:
# Deploy to DIR on SERVER using tar/ssh/scp deploy SERVER='nix.tools' DIR='/var/www/nix.tools': hugo tar cfz public.tgz public/ scp public.tgz https://nixos.wiki:Template:DIR ssh https://nixos.wiki 'cd Template:DIR && tar xfz public.tgz'
and running e.g. just deploy
or just deploy nix.tools /var/www/nix.tools
.
Deploying a static website like this is enough for a lot of people.