20 Commits
Author SHA1 Message Date
flan 620980b730 Lint: scope the private-infra guard to the build and source
The guard exists so a stranger's install is never pointed at the
maintainer's forge — a property of what an install executes and ships
(bootstrap.sh, firstboot.sh, configs/, iso/), not of documentation.
Grep only those paths, so README/docs may link to the canonical forge
(fixes the red master from the build-status badge).
2026-08-04 02:55:29 +00:00
flan b7b64e9c72 Add Build status badge to README 2026-08-04 02:45:25 +00:00
flan 11a17f9d82 Remove README badge wall; add NOTICE 2026-08-03 23:43:00 +00:00
flan 1b6d559863 build-iso: extract the ISO with docker cp, not a bind mount
build-iso / build (push) Successful in 7m10s
2026-08-03 22:47:11 +00:00
flan a893942906 build-iso: run on the host label and own the privileged container
build-iso / build (push) Failing after 6m51s
2026-08-03 22:35:30 +00:00
flan 9bda6a144f build-iso: pin the job container to a dated archlinux tag
build-iso / build (push) Failing after 27s
The runner never re-pulls a cached mutable tag, so :latest rotted until its
glibc was too old for the runner's injected node (checkout failed on
GLIBC_2.44 — every red build since Jul 13). A dated tag forces a fresh pull
and makes the build base reproducible.
2026-08-03 21:09:33 +00:00
flan 5cac2266a8 build-iso: document the real runner requirement
build-iso / build (push) Failing after 10s
mkarchiso's chroot phase needs devtmpfs mounts (init-userns CAP_SYS_ADMIN),
which rules out any LXC-nested runner; the job belongs to the gitea-runner VM.
The old comment pointed at the retired tendrildev builder.
2026-08-03 20:25:30 +00:00
flan 7e0349834c Badge: point CI at the public GitHub lint workflow
The Gitea build-iso badge URL tripped this repo's own private-infrastructure
leak check (lint.yml), which is exactly what that check exists to catch.
2026-08-03 19:48:38 +00:00
flan 643f606426 Add project badges 2026-08-03 19:28:37 +00:00
flan 4abfcf579e Add sponsor badges to README 2026-08-03 19:09:42 +00:00
flan e33de2102b Add donation links (GitHub Sponsors, Ko-fi) 2026-08-03 18:45:40 +00:00
flan 67d6e9154d bootstrap: verify fetched archinstall.json before running it
The config's custom-commands run as root during install, so a config poisoned
by a compromised mirror was root RCE — TLS covers the transport, not the
upstream. Verify it before the @@BASE@@ substitution:

- default: SHA-256 pinned in the script (kept in lockstep with the config);
  ARCH_TURNKEY_CONFIG_SHA256 overrides it, =skip opts out. Catches drift,
  truncation, and a mirror poisoning only the config.
- ARCH_TURNKEY_PUBKEY: require + verify a detached GPG signature
  (configs/archinstall.json.sig) against an out-of-band key — the only mode
  that resists a fully compromised upstream.

Document both knobs in the README and CHANGELOG.
2026-07-19 19:50:50 +00:00
flan c1a81da6e6 Silence SC2024 on the nmtui redirect, with the reason recorded
shellcheck flags 'sudo doesn't affect redirects', which matters when redirecting into a
root-owned file. /dev/tty is the invoking user's own controlling terminal and the redirect
is what gives nmtui a terminal at all, so the warning does not apply here.

Also drop a stale message referencing a forge that a generic install has no knowledge of.
2026-07-13 17:14:08 +00:00
flan a8080cb43b Make it honest and usable for someone who is not the author
build-iso / build (push) Failing after 12s
The README promised ISO downloads from a Releases page that does not and cannot exist here —
the ISO was only ever built by a runner on the author's own forge. Say plainly that you build
it yourself, and why no prebuilt image is published.

Remove the last references to private infrastructure: the entry-point script's usage comment,
the CI runner registration, the nginx template, the install doc's hardcoded user and its
pointer to a private recovery doc, and the ISO publisher metadata.

Add the MIT LICENSE the project needed to be reusable at all, a CHANGELOG, and GitHub CI —
shellcheck, syntax, config validation, and a guard that fails the build if private
infrastructure is ever referenced from this public repo again.
2026-07-13 17:12:34 +00:00
flan bd7f46a260 Separate personal provisioning from the generic installer
build-iso / build (push) Failing after 25s
The install hardcoded one specific forge: bootstrap and the archinstall custom-commands
fetched from a private Gitea, and firstboot cloned a private dotfiles repo from it. Anyone
else cloning this got an installer that could not work and that pointed at a repo they
cannot read.

Split the two phases. The base install (LUKS + btrfs + snapper + yay) is now generic and
runs from a fresh clone with no configuration. The personal phase (vault unlock, forge key
registration, dotfiles, yadm bootstrap) reads a gitignored site.env; with none present
firstboot reports what it is skipping and leaves a complete system.

One fetch root, ARCH_TURNKEY_BASE, now feeds bootstrap, the archinstall custom-commands
(via an @@BASE@@ placeholder) and the ISO autorun, defaulting to the public mirror. iso/build.sh
bakes site.env into a custom ISO so an unattended personal install stays one boot.
2026-07-13 16:38:30 +00:00
flan 09ec9a1822 Refactor firstboot.sh into functions + main (behavior preserved)
Split the linear script into require_network/detect_class/install_yay/load_secrets/
register_ssh_key/pull_dotfiles orchestrated by main(). Also: report yay build
success/failure explicitly (was silently swallowed), DRY the Gitea SSH host/port into
vars, and read all interactive prompts from /dev/tty (robust past the tee logging
redirect). shellcheck-clean; external command set unchanged.
2026-07-08 13:53:51 -04:00
flan 85cb32e952 Fix audit findings + accurate docs
build-iso / build (push) Successful in 7m52s
- bootstrap.sh: detect target disk by lsblk TYPE=disk (excl. zram/loop/rom) instead
  of a loop|sr0 grep that could false-positive
- firstboot-once: grant the user a transient NOPASSWD sudoers drop-in for the firstboot
  run so setup is truly hands-off, removed as soon as firstboot returns
- archinstall.json: drop the '//' pseudo-comment keys (guarded against stricter schema
  validation; the guidance lives in the docs)
- iso/build.sh: compute the ISO label in bash and inject the literal, dropping the
  two-stage '$(date)'-in-profiledef eval
- README/INSTALL: firstboot AUTO-runs on first boot (was documented as a manual step);
  document the Vaultwarden unlock + API SSH-key auto-registration; fix stale line count
2026-07-08 13:48:24 -04:00
flan b1b6794df2 firstboot: pass archive passphrase via gpg --passphrase-fd, not argv; declare curl
- gpg no longer takes the archive passphrase on its command line (was briefly visible
  in /proc/<pid>/cmdline to other local users); piped via fd 0 instead
- archinstall.json: list curl explicitly — custom-commands + firstboot call it directly
  and today it only arrives transitively through git's dependencies
2026-07-08 13:43:22 -04:00
flan 86d3fc124a Use normal yay (not yay-bin) built from its AUR PKGBUILD
Build the standard yay package; makepkg -sir pulls the prebuilt go makedepend to
compile it, then removes go so the toolchain doesn't linger on the fresh install.
2026-07-08 13:37:55 -04:00
flan d15940522e Drop LVM fallback; bake repo pkgs into archinstall.json; use yay-bin
- Remove configs/provision-lvm.sh (LVM+ext4 diverged from the Btrfs+snapper path;
  archinstall handles the disk layout, and INSTALL.md documents the manual fallback)
- archinstall.json: add yadm + pinentry to base packages so firstboot doesn't
  runtime-install them (pacman -S --needed was already idempotent, the checks were noise)
- firstboot.sh: build yay-bin instead of yay (prebuilt binary; no Go toolchain to
  compile), drop the redundant command -v checks + pinentry/yadm pacman calls
2026-07-08 13:34:06 -04:00