Compare commits

..

1 Commits

Author SHA1 Message Date
Tom Alexander
ce44cc5522 Add a blog post about decluttering NixOS EFI system partition.
All checks were successful
build-staging Build build-staging has succeeded
2025-11-08 22:12:54 -05:00
11 changed files with 212 additions and 409 deletions

View File

@@ -1,5 +1,2 @@
**/.git **/.git
**/.gitignore **/.gitignore
/.webhook_bridge
/result
**/Dockerfile

1
.gitignore vendored
View File

@@ -1,2 +1 @@
output/ output/
/result

View File

@@ -2,8 +2,6 @@ apiVersion: tekton.dev/v1
kind: PipelineRun kind: PipelineRun
metadata: metadata:
name: build-homepage-staging name: build-homepage-staging
labels:
pdb: protect
spec: spec:
timeouts: timeouts:
pipeline: "2h0m0s" pipeline: "2h0m0s"
@@ -46,51 +44,6 @@ spec:
#!/usr/bin/env sh #!/usr/bin/env sh
set -euo pipefail set -euo pipefail
echo -n "$(date +%s)" | tee $(results.unix-time.path) echo -n "$(date +%s)" | tee $(results.unix-time.path)
- name: report-pending
taskRef:
resolver: git
params:
- name: url
value: https://code.fizz.buzz/mirror/catalog.git # mirror of https://github.com/tektoncd/catalog.git
- name: revision
value: f914437a46978b95f325f68d791dcf1a35738f60
- name: pathInRepo
value: task/gitea-set-status/0.1/gitea-set-status.yaml
params:
- name: CONTEXT
value: "$(params.JOB_NAME)"
- name: REPO_FULL_NAME
value: "$(params.REPO_OWNER)/$(params.REPO_NAME)"
- name: GITEA_HOST_URL
value: code.fizz.buzz
- name: SHA
value: "$(tasks.fetch-repository.results.commit)"
- name: DESCRIPTION
value: "Build $(params.JOB_NAME) has started"
- name: STATE
value: pending
- name: TARGET_URL
value: "https://tekton.fizz.buzz/#/namespaces/$(context.pipelineRun.namespace)/pipelineruns/$(context.pipelineRun.name)"
- name: fetch-repository
params:
- name: url
value: $(params.REPO_URL)
- name: revision
value: $(params.PULL_BASE_SHA)
- name: deleteExisting
value: "true"
taskRef:
params:
- name: url
value: https://code.fizz.buzz/talexander/personal_tekton_catalog.git
- name: revision
value: "dda7b690195b43e8b9859d1caf5dcbf48588ade1"
- name: pathInRepo
value: task/git-clone/0.1/git-clone.yaml
resolver: git
workspaces:
- name: output
workspace: git-source
- name: get-git-commit-time - name: get-git-commit-time
taskSpec: taskSpec:
metadata: {} metadata: {}
@@ -116,6 +69,53 @@ spec:
workspace: git-source workspace: git-source
runAfter: runAfter:
- fetch-repository - fetch-repository
- name: report-pending
taskRef:
resolver: git
params:
- name: url
value: https://code.fizz.buzz/mirror/catalog.git # mirror of https://github.com/tektoncd/catalog.git
- name: revision
value: df36b3853a5657fd883015cdbf07ad6466918acf
- name: pathInRepo
value: task/gitea-set-status/0.1/gitea-set-status.yaml
runAfter:
- fetch-repository
params:
- name: CONTEXT
value: "$(params.JOB_NAME)"
- name: REPO_FULL_NAME
value: "$(params.REPO_OWNER)/$(params.REPO_NAME)"
- name: GITEA_HOST_URL
value: code.fizz.buzz
- name: SHA
value: "$(tasks.fetch-repository.results.commit)"
- name: DESCRIPTION
value: "Build $(params.JOB_NAME) has started"
- name: STATE
value: pending
- name: TARGET_URL
value: "https://tekton.fizz.buzz/#/namespaces/$(context.pipelineRun.namespace)/pipelineruns/$(context.pipelineRun.name)"
- name: fetch-repository
taskRef:
resolver: git
params:
- name: url
value: https://code.fizz.buzz/mirror/catalog.git # mirror of https://github.com/tektoncd/catalog.git
- name: revision
value: df36b3853a5657fd883015cdbf07ad6466918acf
- name: pathInRepo
value: task/git-clone/0.9/git-clone.yaml
workspaces:
- name: output
workspace: git-source
params:
- name: url
value: $(params.REPO_URL)
- name: revision
value: $(params.PULL_BASE_SHA)
- name: deleteExisting
value: "true"
- name: build-image - name: build-image
taskRef: taskRef:
resolver: git resolver: git
@@ -123,7 +123,7 @@ spec:
- name: url - name: url
value: https://code.fizz.buzz/talexander/personal_tekton_catalog.git value: https://code.fizz.buzz/talexander/personal_tekton_catalog.git
- name: revision - name: revision
value: dda7b690195b43e8b9859d1caf5dcbf48588ade1 value: 7ee31a185243ee6da13dcd26a592c585b64c80e5
- name: pathInRepo - name: pathInRepo
value: task/buildkit-rootless-daemonless/0.1/buildkit-rootless-daemonless.yaml value: task/buildkit-rootless-daemonless/0.1/buildkit-rootless-daemonless.yaml
params: params:
@@ -144,8 +144,6 @@ spec:
- "type=registry,ref=$(params.image-name):buildcache,mode=max,compression=zstd,compression-level=22,rewrite-timestamp=true,image-manifest=true,oci-mediatypes=true" - "type=registry,ref=$(params.image-name):buildcache,mode=max,compression=zstd,compression-level=22,rewrite-timestamp=true,image-manifest=true,oci-mediatypes=true"
- --opt - --opt
- build-arg:SOURCE_DATE_EPOCH=$(tasks.get-git-commit-time.results.unix-time) - build-arg:SOURCE_DATE_EPOCH=$(tasks.get-git-commit-time.results.unix-time)
- --opt
- "build-arg:NIX_SUBSTITUTERS=http://ncps.nix-pull-through-cache.svc.cluster.local:80 https://cache.nixos.org"
- name: BUILDKITD_TOML - name: BUILDKITD_TOML
value: | value: |
debug = true debug = true
@@ -173,7 +171,7 @@ spec:
- name: url - name: url
value: https://code.fizz.buzz/mirror/catalog.git # mirror of https://github.com/tektoncd/catalog.git value: https://code.fizz.buzz/mirror/catalog.git # mirror of https://github.com/tektoncd/catalog.git
- name: revision - name: revision
value: f914437a46978b95f325f68d791dcf1a35738f60 value: df36b3853a5657fd883015cdbf07ad6466918acf
- name: pathInRepo - name: pathInRepo
value: task/gitea-set-status/0.1/gitea-set-status.yaml value: task/gitea-set-status/0.1/gitea-set-status.yaml
params: params:
@@ -202,7 +200,7 @@ spec:
- name: url - name: url
value: https://code.fizz.buzz/mirror/catalog.git # mirror of https://github.com/tektoncd/catalog.git value: https://code.fizz.buzz/mirror/catalog.git # mirror of https://github.com/tektoncd/catalog.git
- name: revision - name: revision
value: f914437a46978b95f325f68d791dcf1a35738f60 value: df36b3853a5657fd883015cdbf07ad6466918acf
- name: pathInRepo - name: pathInRepo
value: task/gitea-set-status/0.1/gitea-set-status.yaml value: task/gitea-set-status/0.1/gitea-set-status.yaml
params: params:

View File

@@ -2,8 +2,6 @@ apiVersion: tekton.dev/v1
kind: PipelineRun kind: PipelineRun
metadata: metadata:
name: build-homepage name: build-homepage
labels:
pdb: protect
spec: spec:
timeouts: timeouts:
pipeline: "2h0m0s" pipeline: "2h0m0s"
@@ -90,7 +88,7 @@ spec:
- name: url - name: url
value: https://code.fizz.buzz/mirror/catalog.git # mirror of https://github.com/tektoncd/catalog.git value: https://code.fizz.buzz/mirror/catalog.git # mirror of https://github.com/tektoncd/catalog.git
- name: revision - name: revision
value: f914437a46978b95f325f68d791dcf1a35738f60 value: df36b3853a5657fd883015cdbf07ad6466918acf
- name: pathInRepo - name: pathInRepo
value: task/gitea-set-status/0.1/gitea-set-status.yaml value: task/gitea-set-status/0.1/gitea-set-status.yaml
runAfter: runAfter:
@@ -117,7 +115,7 @@ spec:
- name: url - name: url
value: https://code.fizz.buzz/mirror/catalog.git # mirror of https://github.com/tektoncd/catalog.git value: https://code.fizz.buzz/mirror/catalog.git # mirror of https://github.com/tektoncd/catalog.git
- name: revision - name: revision
value: f914437a46978b95f325f68d791dcf1a35738f60 value: df36b3853a5657fd883015cdbf07ad6466918acf
- name: pathInRepo - name: pathInRepo
value: task/git-clone/0.9/git-clone.yaml value: task/git-clone/0.9/git-clone.yaml
workspaces: workspaces:
@@ -137,7 +135,7 @@ spec:
- name: url - name: url
value: https://code.fizz.buzz/talexander/personal_tekton_catalog.git value: https://code.fizz.buzz/talexander/personal_tekton_catalog.git
- name: revision - name: revision
value: dda7b690195b43e8b9859d1caf5dcbf48588ade1 value: 7ee31a185243ee6da13dcd26a592c585b64c80e5
- name: pathInRepo - name: pathInRepo
value: task/buildkit-rootless-daemonless/0.1/buildkit-rootless-daemonless.yaml value: task/buildkit-rootless-daemonless/0.1/buildkit-rootless-daemonless.yaml
params: params:
@@ -158,8 +156,6 @@ spec:
- "type=registry,ref=$(params.image-name):buildcache,mode=max,compression=zstd,compression-level=22,rewrite-timestamp=true,image-manifest=true,oci-mediatypes=true" - "type=registry,ref=$(params.image-name):buildcache,mode=max,compression=zstd,compression-level=22,rewrite-timestamp=true,image-manifest=true,oci-mediatypes=true"
- --opt - --opt
- build-arg:SOURCE_DATE_EPOCH=$(tasks.get-git-commit-time.results.unix-time) - build-arg:SOURCE_DATE_EPOCH=$(tasks.get-git-commit-time.results.unix-time)
- --opt
- "build-arg:NIX_SUBSTITUTERS=http://ncps.nix-pull-through-cache.svc.cluster.local:80 https://cache.nixos.org"
- name: BUILDKITD_TOML - name: BUILDKITD_TOML
value: | value: |
debug = true debug = true
@@ -187,7 +183,7 @@ spec:
- name: url - name: url
value: https://code.fizz.buzz/mirror/catalog.git # mirror of https://github.com/tektoncd/catalog.git value: https://code.fizz.buzz/mirror/catalog.git # mirror of https://github.com/tektoncd/catalog.git
- name: revision - name: revision
value: f914437a46978b95f325f68d791dcf1a35738f60 value: df36b3853a5657fd883015cdbf07ad6466918acf
- name: pathInRepo - name: pathInRepo
value: task/gitea-set-status/0.1/gitea-set-status.yaml value: task/gitea-set-status/0.1/gitea-set-status.yaml
params: params:
@@ -216,7 +212,7 @@ spec:
- name: url - name: url
value: https://code.fizz.buzz/mirror/catalog.git # mirror of https://github.com/tektoncd/catalog.git value: https://code.fizz.buzz/mirror/catalog.git # mirror of https://github.com/tektoncd/catalog.git
- name: revision - name: revision
value: f914437a46978b95f325f68d791dcf1a35738f60 value: df36b3853a5657fd883015cdbf07ad6466918acf
- name: pathInRepo - name: pathInRepo
value: task/gitea-set-status/0.1/gitea-set-status.yaml value: task/gitea-set-status/0.1/gitea-set-status.yaml
params: params:

View File

@@ -2,8 +2,6 @@ apiVersion: tekton.dev/v1
kind: PipelineRun kind: PipelineRun
metadata: metadata:
name: semver name: semver
labels:
pdb: protect
spec: spec:
timeouts: timeouts:
pipeline: "2h0m0s" pipeline: "2h0m0s"
@@ -76,7 +74,7 @@ spec:
- name: url - name: url
value: https://code.fizz.buzz/mirror/catalog.git # mirror of https://github.com/tektoncd/catalog.git value: https://code.fizz.buzz/mirror/catalog.git # mirror of https://github.com/tektoncd/catalog.git
- name: revision - name: revision
value: f914437a46978b95f325f68d791dcf1a35738f60 value: df36b3853a5657fd883015cdbf07ad6466918acf
- name: pathInRepo - name: pathInRepo
value: task/gitea-set-status/0.1/gitea-set-status.yaml value: task/gitea-set-status/0.1/gitea-set-status.yaml
params: params:
@@ -101,7 +99,7 @@ spec:
- name: url - name: url
value: https://code.fizz.buzz/mirror/catalog.git # mirror of https://github.com/tektoncd/catalog.git value: https://code.fizz.buzz/mirror/catalog.git # mirror of https://github.com/tektoncd/catalog.git
- name: revision - name: revision
value: f914437a46978b95f325f68d791dcf1a35738f60 value: df36b3853a5657fd883015cdbf07ad6466918acf
- name: pathInRepo - name: pathInRepo
value: task/git-clone/0.9/git-clone.yaml value: task/git-clone/0.9/git-clone.yaml
workspaces: workspaces:
@@ -126,7 +124,7 @@ spec:
- name: url - name: url
value: https://code.fizz.buzz/mirror/catalog.git # mirror of https://github.com/tektoncd/catalog.git value: https://code.fizz.buzz/mirror/catalog.git # mirror of https://github.com/tektoncd/catalog.git
- name: revision - name: revision
value: f914437a46978b95f325f68d791dcf1a35738f60 value: df36b3853a5657fd883015cdbf07ad6466918acf
- name: pathInRepo - name: pathInRepo
value: task/gitea-set-status/0.1/gitea-set-status.yaml value: task/gitea-set-status/0.1/gitea-set-status.yaml
params: params:
@@ -155,7 +153,7 @@ spec:
- name: url - name: url
value: https://code.fizz.buzz/mirror/catalog.git # mirror of https://github.com/tektoncd/catalog.git value: https://code.fizz.buzz/mirror/catalog.git # mirror of https://github.com/tektoncd/catalog.git
- name: revision - name: revision
value: f914437a46978b95f325f68d791dcf1a35738f60 value: df36b3853a5657fd883015cdbf07ad6466918acf
- name: pathInRepo - name: pathInRepo
value: task/gitea-set-status/0.1/gitea-set-status.yaml value: task/gitea-set-status/0.1/gitea-set-status.yaml
params: params:

View File

@@ -1,63 +1,69 @@
# syntax=docker/dockerfile:1 # syntax=docker/dockerfile:1
# ARG ALPINE_VERSION="3.20"
# Builder
#
ARG NIX_SUBSTITUTERS=https://cache.nixos.org
FROM nixos/nix:2.31.3 AS builder
ARG NIX_SUBSTITUTERS
RUN tee -a /etc/nix/nix.conf <<EOF
extra-experimental-features = nix-command flakes
filter-syscalls = false
substituters = $NIX_SUBSTITUTERS
EOF
RUN cp "$(nix build nixpkgs#cacert --print-out-paths)/etc/ssl/certs/ca-bundle.crt" /tmp/ca-bundle.crt FROM scratch AS private
ADD git@code.fizz.buzz:talexander/homepage_private.git /homepage_private
COPY . /tmp/build
WORKDIR /tmp/build
RUN --mount=type=ssh GIT_SSH_COMMAND="ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null" nix build '.#docker_env'
# Export the built closure to a folder FROM scratch AS explorer
RUN mkdir /tmp/nix-store-closure ADD https://code.fizz.buzz/talexander/organic_ast_explorer.git /organic_ast_explorer
RUN cp -R $(nix-store -qR result/) /tmp/nix-store-closure
# Create a folder which will be copied to /tmp in the final image
RUN install -d -o root -g root -m 0777 will_be_tmp
# Create a folder which will be copied to /nginx in the final image
RUN install -d -o 1000 -g 1000 -m 0755 will_be_slash_nginx
# FROM scratch AS organic
# Runner ADD git@code.fizz.buzz:talexander/organic.git /organic
#
FROM scratch
WORKDIR /app
ENV PATH="$PATH:/app/bin" FROM rustlang/rust:nightly-alpine$ALPINE_VERSION AS organic-build
RUN apk add --no-cache musl-dev make bash
RUN rustup target add wasm32-unknown-unknown
RUN --mount=type=tmpfs,target=/tmp --mount=type=cache,target=/usr/local/cargo/registry,sharing=locked cargo install wasm-bindgen-cli
COPY --link --from=organic /organic /organic
WORKDIR /organic
RUN --mount=type=tmpfs,target=/tmp --mount=type=cache,target=/usr/local/cargo/registry,sharing=locked make wasm
COPY --chmod=0644 --chown=0:0 <<EOF /etc/group
root:x:0:root
web:x:1000:web
EOF
COPY --chmod=0644 --chown=0:0 <<EOF /etc/passwd
root:x:0:0:root:/root:/bin/sh
web:x:1000:1000::/home/web:/bin/sh
EOF
ENV SSL_CERT_FILE=/etc/ssl/certs/ca-bundle.crt FROM node:lts-alpine$ALPINE_VERSION AS explorer-build
ENV NIX_SSL_CERT_FILE=/etc/ssl/certs/ca-bundle.crt COPY --link --from=explorer /organic_ast_explorer /organic_ast_explorer
COPY --from=builder /tmp/ca-bundle.crt /etc/ssl/certs/ca-bundle.crt COPY --link --from=organic-build /organic /organic
WORKDIR /organic_ast_explorer
RUN --mount=type=tmpfs,target=/tmp --mount=type=cache,target=/npmcache,sharing=locked npm set cache /npmcache && npm install
RUN npm run release
COPY --from=builder /tmp/nix-store-closure /nix/store
COPY --from=builder /tmp/build/result /app
COPY --from=builder /tmp/build/will_be_tmp /tmp
COPY --from=builder /tmp/build/will_be_slash_nginx /nginx
EXPOSE 8080
CMD ["/app/nginx", "-c", "/app/nginx.conf", "-e", "stderr", "-g", "daemon off;"]
FROM rustlang/rust:nightly-alpine$ALPINE_VERSION AS natter-build
RUN apk add --no-cache musl-dev
ADD git@code.fizz.buzz:talexander/natter.git /natter
WORKDIR /natter
RUN --mount=type=tmpfs,target=/tmp --mount=type=cache,target=/usr/local/cargo/registry,sharing=locked CARGO_TARGET_DIR=/target cargo build --profile release-lto
FROM alpine:$ALPINE_VERSION AS natter
COPY --link --from=natter-build /target/release-lto/natter /usr/bin/
COPY --link . /source
COPY --link --from=private /homepage_private/static /source/static/
COPY --link --from=explorer-build /organic_ast_explorer/dist /source/static/organic/ast_explorer/
RUN --network=none --mount=type=tmpfs,target=/tmp natter build --config /source/natter.toml
FROM alpine:$ALPINE_VERSION AS server
RUN apk add --no-cache bash nginx
RUN addgroup web && adduser -D -G web web && install -d -D -o web -g web -m 700 /srv/http/public
RUN ln -sf /dev/stdout /var/log/nginx/access.log && ln -sf /dev/stderr /var/log/nginx/error.log
COPY --chown=web:web docker/server/nginx.conf /srv/http
COPY --chown=web:web docker/server/headers.include /srv/http
COPY --from=natter --chown=web:web /source/output/ /srv/http/public/
ENTRYPOINT ["/usr/sbin/nginx", "-c", "/srv/http/nginx.conf", "-e", "stderr", "-g", "daemon off;"]

View File

@@ -4,8 +4,7 @@ worker_processes 4;
# Speed up regular expressions. # Speed up regular expressions.
pcre_jit on; pcre_jit on;
error_log /dev/stderr debug; error_log stderr debug;
pid /nginx/nginx.pid;
events { events {
# Connections per worker process. # Connections per worker process.
@@ -13,9 +12,7 @@ events {
} }
http { http {
access_log /dev/stdout; include /etc/nginx/mime.types;
include @mime_types@;
default_type application/octet-stream; default_type application/octet-stream;
types { types {
@@ -27,11 +24,11 @@ http {
sendfile on; sendfile on;
tcp_nopush on; tcp_nopush on;
include @headers_include@; include headers.include;
server { server {
listen 8080; listen 8080;
root @web_root@; root /srv/http/public;
location / { location / {
try_files $uri $uri/ =404; try_files $uri $uri/ =404;
@@ -50,24 +47,24 @@ http {
} }
location /.well-known/ { location /.well-known/ {
alias @web_root@/well-known/; alias /srv/http/public/well-known/;
default_type text/plain; default_type text/plain;
} }
location /.well-known/openpgpkey/hu/ { location /.well-known/openpgpkey/hu/ {
alias @web_root@/well-known/openpgpkey/fizz.buzz/hu/; alias /srv/http/public/well-known/openpgpkey/fizz.buzz/hu/;
default_type "application/octet-stream"; default_type "application/octet-stream";
add_header Access-Control-Allow-Origin * always; add_header Access-Control-Allow-Origin * always;
} }
location /.well-known/openpgpkey/policy { location /.well-known/openpgpkey/policy {
alias @web_root@/well-known/openpgpkey/fizz.buzz/policy; alias /srv/http/public/well-known/openpgpkey/fizz.buzz/policy;
default_type "application/octet-stream"; default_type "application/octet-stream";
add_header Access-Control-Allow-Origin * always; add_header Access-Control-Allow-Origin * always;
} }
location ~ /\.well-known/(?<path>openpgpkey/[^/]+/hu/.*) { location ~ /\.well-known/(?<path>openpgpkey/[^/]+/hu/.*) {
alias @web_root@/well-known/$path; alias /srv/http/public/well-known/$path;
default_type "application/octet-stream"; default_type "application/octet-stream";
add_header Access-Control-Allow-Origin * always; add_header Access-Control-Allow-Origin * always;
} }

136
flake.lock generated
View File

@@ -1,136 +0,0 @@
{
"nodes": {
"natter": {
"inputs": {
"nixpkgs": [
"nixpkgs"
],
"rust-overlay": "rust-overlay"
},
"locked": {
"lastModified": 1784333070,
"narHash": "sha256-3WkxaHOS13vFBtQFBmGIPScQZDNLk5bqCAY9qBJASl0=",
"ref": "refs/heads/main",
"rev": "faf279292ad20783775d909b96815f7ca2843b85",
"revCount": 327,
"type": "git",
"url": "https://code.fizz.buzz/talexander/natter.git"
},
"original": {
"type": "git",
"url": "https://code.fizz.buzz/talexander/natter.git"
}
},
"nixpkgs": {
"locked": {
"lastModified": 1780749050,
"narHash": "sha256-3av0pIjlOWQ6rDbNOmpUSvbNnJkGORQKKjb4LtCZsIY=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "a799d3e3886da994fa307f817a6bc705ae538eeb",
"type": "github"
},
"original": {
"owner": "NixOS",
"ref": "nixos-unstable",
"repo": "nixpkgs",
"type": "github"
}
},
"organic": {
"inputs": {
"nixpkgs": [
"organic_ast_explorer",
"nixpkgs"
],
"rust-overlay": "rust-overlay_2"
},
"locked": {
"lastModified": 1784327891,
"narHash": "sha256-kGmXbmpkkiD2FtX7vKNdbL6/p/fvQ9OT2iS/ve55V5I=",
"ref": "refs/heads/main",
"rev": "336b5d3d5444ad847cd5fbf1490055e733911b57",
"revCount": 2010,
"type": "git",
"url": "https://code.fizz.buzz/talexander/organic.git"
},
"original": {
"type": "git",
"url": "https://code.fizz.buzz/talexander/organic.git"
}
},
"organic_ast_explorer": {
"inputs": {
"nixpkgs": [
"nixpkgs"
],
"organic": "organic"
},
"locked": {
"lastModified": 1784331571,
"narHash": "sha256-0AeEsziAEjL/lgrlTu7RvOoylV1hSozo04rfc3Y7q6M=",
"ref": "refs/heads/main",
"rev": "55b239a3fe0b7a3b70f392be36b9efd49848be03",
"revCount": 75,
"type": "git",
"url": "https://code.fizz.buzz/talexander/organic_ast_explorer.git"
},
"original": {
"type": "git",
"url": "https://code.fizz.buzz/talexander/organic_ast_explorer.git"
}
},
"root": {
"inputs": {
"natter": "natter",
"nixpkgs": "nixpkgs",
"organic_ast_explorer": "organic_ast_explorer"
}
},
"rust-overlay": {
"inputs": {
"nixpkgs": [
"natter",
"nixpkgs"
]
},
"locked": {
"lastModified": 1781407245,
"narHash": "sha256-VzJq4MmD0uyNDAceudSe1hHqcQMe9Tau0U4S+5iRGh0=",
"owner": "oxalica",
"repo": "rust-overlay",
"rev": "d5f483210eb016d66102eef22baa128b3b3233fc",
"type": "github"
},
"original": {
"owner": "oxalica",
"repo": "rust-overlay",
"type": "github"
}
},
"rust-overlay_2": {
"inputs": {
"nixpkgs": [
"organic_ast_explorer",
"organic",
"nixpkgs"
]
},
"locked": {
"lastModified": 1781407245,
"narHash": "sha256-VzJq4MmD0uyNDAceudSe1hHqcQMe9Tau0U4S+5iRGh0=",
"owner": "oxalica",
"repo": "rust-overlay",
"rev": "d5f483210eb016d66102eef22baa128b3b3233fc",
"type": "github"
},
"original": {
"owner": "oxalica",
"repo": "rust-overlay",
"type": "github"
}
}
},
"root": "root",
"version": 7
}

115
flake.nix
View File

@@ -1,115 +0,0 @@
{
description = "Fizz.buzz homepage";
inputs = {
nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
natter = {
url = "git+https://code.fizz.buzz/talexander/natter.git";
inputs.nixpkgs.follows = "nixpkgs";
};
organic_ast_explorer = {
url = "git+https://code.fizz.buzz/talexander/organic_ast_explorer.git";
inputs.nixpkgs.follows = "nixpkgs";
};
};
outputs =
{
self,
nixpkgs,
natter,
organic_ast_explorer,
}:
let
forAllSystems =
func:
builtins.listToAttrs (
map (system: {
name = system;
value = func system;
}) nixpkgs.lib.systems.flakeExposed
);
in
{
devShells = forAllSystems (
system:
let
overlays = [
natter.overlays.default
organic_ast_explorer.overlays.default
];
pkgs = import nixpkgs {
inherit system overlays;
};
in
{
default = pkgs.mkShell {
nativeBuildInputs = [
];
buildInputs = with pkgs; [
pkgs.natter.release
];
};
}
);
packages = forAllSystems (
system:
let
overlays = [
natter.overlays.default
organic_ast_explorer.overlays.default
];
pkgs = import nixpkgs {
inherit system overlays;
};
appliedOverlay = self.overlays.default pkgs pkgs;
nginx_conf = pkgs.replaceVars "${./docker/server/nginx.conf}" {
web_root = appliedOverlay.homepage.release;
mime_types = "${pkgs.nginx}/conf/mime.types";
headers_include = "${./docker/server/headers.include}";
};
in
rec {
default = release;
inherit (appliedOverlay.homepage)
release
;
docker_env = pkgs.stdenv.mkDerivation {
pname = "homepage-docker-env";
version = "0.0.0";
dontUnpack = true;
installPhase = ''
mkdir -p $out
cp ${nginx_conf} $out/nginx.conf
ln -sf ${pkgs.nginx}/bin/nginx $out/nginx
'';
};
}
);
overlays.default = final: prev: {
homepage = final.lib.makeScope final.newScope (
homepageScope:
let
homepage_private = fetchGit {
url = "git@code.fizz.buzz:talexander/homepage_private.git";
ref = "main";
rev = "89ba9628bf3e596345bc83f59cef5a2943584894";
};
natter' = (natter.overlays.default final final).natter.release;
organic_ast_explorer' =
(organic_ast_explorer.overlays.default final final).organic_ast_explorer.release;
release = homepageScope.callPackage ./nix/package.nix {
natter = natter';
organic_ast_explorer = organic_ast_explorer';
inherit homepage_private;
};
in
{
inherit release;
}
);
};
};
}

View File

@@ -1,31 +0,0 @@
{
lib,
pkgs,
natter,
organic_ast_explorer,
homepage_private,
}:
let
in
pkgs.stdenv.mkDerivation rec {
pname = "homepage";
version = "0.0.0";
src = lib.cleanSource ../.;
configurePhase = "";
buildPhase = ''
mkdir -p static/organic/ast_explorer
cp ${organic_ast_explorer}/* static/organic/ast_explorer/
cp -r ${homepage_private}/static/* static/
${natter}/bin/natter build --config natter.toml
'';
installPhase = ''
mkdir -p $out
mv output/* $out/
'';
}

View File

@@ -0,0 +1,94 @@
#+OPTIONS: html-postamble:nil
#+title: Declutter NixOS EFI System Partition
#+date: <2025-11-08 Sat>
#+author: Tom Alexander
#+email:
#+language: en
#+select_tags: export
#+exclude_tags: noexport
What does the EFI system partition look like on a NixOS system look like?
#+begin_src text
/boot
├── EFI
│   ├── BOOT
│   │   └── BOOTX64.EFI
│   ├── memtest86
│   │   └── memtest.efi
│   ├── nixos
│   │   ├── 0p4jsn66rw6gm6rc2wnzpmzhd5aldpab-initrd-linux-6.16.12-initrd.efi
│   │   └── 7zhgbsmhsch25y51ry39di8s7d5aa3b1-linux-6.16.12-bzImage.efi
│   └── systemd
│   └── systemd-bootx64.efi
└── loader
├── entries
│   ├── memtest86.conf
│   ├── nixos-generation-1.conf
│   └── nixos-generation-2.conf
├── entries.srel
├── keys
├── loader.conf
└── random-seed
#+end_src
Or maybe [[https://github.com/nix-community/lanzaboote][you care about security]], in which case your EFI system partition might look like:
#+begin_src text
/boot
└── EFI
    ├── BOOT
    │   └── BOOTX64.EFI
    ├── Linux
    │   ├── nixos-generation-819-4rahvvcu2fvsjfwgnfzu4hp5sm6pjir7ivy65unygrzlmnt2wmfa.efi
    │   ├── nixos-generation-820-hfu7owhqplrumyvkudyxuiem6ocrgb5z7ujqncl6aoemj4ekktkq.efi
    │   └── nixos-generation-821-g2l3xmw6w5c26n3ixl53jejzslttdmvs3wajnb7aittwsfttwypq.efi
    └── systemd
    └── systemd-bootx64.efi
#+end_src
Regardless, they both have the same problem: they are storing information that is specific to my system and necessary for booting in the EFI system partition.
What does *my* NixOS EFI system partition look like?
#+begin_src text
/efi
└── EFI
└── BOOT
└── BOOTX64.EFI
#+end_src
That src_text[:exports code]{BOOTX64.EFI} contains no information specific to my system. It does not change when I make new generations of my system config. If I ever lost it, I could copy it off another one of my machines or build it again from publicly-available sources.
* Why
** Backups
One of the best features of ZFS is [[https://klarasystems.com/articles/introduction-to-zfs-replication/][ZFS send/recv]]. But with the old way of booting, I couldn't simply use ZFS send/recv to make a functional backup of my system: I also needed the information in the EFI system partition. Now, all of the information about my system is stored on ZFS, so I can use ZFS send/recv to make full, functional backups.
** Dual Booting
I like to boot multiple different systems off the same ZFS pool. For example, you might want to have a NixOS system for productive work encrypted with one password, and another NixOS system encrypted with a different password for running video games to keep your data safe from the closed-source +spyware+ anti-cheat bundled in games. I wouldn't want the two NixOS systems overwriting each other's entries in the shared EFI system partition. Since 100% of the data about my system is stored on ZFS, I can have as many separate NixOS systems as I want, all on the same ZFS pool, without fighting each other. On top of that, I can also seamless boot other Linux distros, also sharing the same pool.
** Not filling up the EFI system partition
This is an issue many new NixOS users encounter. They get their system configuration written, and start happily using their system, until [[https://discourse.nixos.org/t/what-to-do-with-a-full-boot-partition/2049][one day it suddenly breaks]]. Avoiding the problem is easy (if you know to do it) through limiting the number of generations that are kept, but recovering from it after it breaks is less fun.
With my system, I can store as many generations as I want, since all of my kernels and ramdisks are stored on my main ZFS partition instead of my EFI system partition.
* What this is not
** More secure
If you set up your NixOS system with [[https://github.com/nix-community/lanzaboote][Lanzaboote]], your EFI system partition files are cryptographically signed so they cannot be modified without your consent. While your kernel and init ramdisk won't be encrypted (and therefore won't be private), those two files seldom contain any private information. I do not think my new method of booting NixOS is any more private or secure than Lanzaboote.
* How
* Why aren't you upstreaming this?
I would love for this functionality to make it into upstream ZFSBootMenu. The reasons I am not sending this patch upstream are:
1. I am not confident in the quality of my changes. ZFSBootMenu is implemented in bash. Bash doesn't have data structures, so structured data is passed around by writing tabular data to files in the tmpfs filesystem. Bash likes to keep running, even after encountering errors, unless you use [[http://redsymbol.net/articles/unofficial-bash-strict-mode/][Unofficial Bash Strict Mode]] (which ZFSBootMenu did not). Returning data from functions is handled by writing to stdout. Variables are global by default. Some impressive scripters have demonstrably been able to create large complex projects with shell scripting (for example, ZFSBootMenu or poudriere) but my bash skills are not at their level, and I have no interest in reaching that level in bash.
2. My extlinux.conf parsing code is incredibly crude, largely because I am parsing it in bash.
3. I haven't tested my changes on the vast combinations of ZFSBootMenu environments. ZFSBootMenu can be run via bios or UEFI. It can be run as a kernel+ramdisk or as an EFI executable. It can be built with mkinitcpio or dracut. It can boot a multitude of Linux distros. All I know is this works on my system.
4. I don't know if the ZFSBootMenu maintainers are interested in maintaining this code. They already have so many environments to test, I can see them not wanting to add another to the pile, especially for something less mainstream like NixOS. My boot code currently only has 1 user, so it is hard to make an argument for the value of this code.