45 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
iso-2026.08.03
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 c6508c7131 Merge pull request 'bootstrap: verify fetched archinstall.json before running it' (#1) from fix/verify-fetched-config into master 2026-07-19 16:07:37 -04: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.
iso-2026.07.08
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
flan 98481f080a firstboot: clear skel dotfiles before yadm clone so tracked bashrc/profile actually apply 2026-07-07 21:15:26 -04:00
flan 36748b9c5b workflow: fix stale runner-name comments; only rebuild ISO on iso/** changes (rest is pulled at runtime)
build-iso / build (push) Successful in 7m24s
2026-07-07 21:06:10 -04:00
flan 47704a1f5d fix unbootable LUKS config: encrypt hook needs cryptdevice= not rd.luks.name (provision-lvm.sh + INSTALL.md)
build-iso / build (push) Successful in 8m19s
2026-07-07 20:57:27 -04:00
flan 42fb2a63d1 installer robustness: conditional pacman -Sy, dedup known_hosts, robust primary-user detection
build-iso / build (push) Successful in 8m10s
2026-07-07 20:45:47 -04:00
flan e92b10f779 firstboot: fall back to manual decrypt if Vaultwarden passphrase is wrong (was aborting) 2026-07-07 20:35:59 -04:00
flan d9fabf7662 firstboot-once: on failure, retry next boot instead of rebooting half-configured
build-iso / build (push) Successful in 7m41s
2026-07-07 20:33:23 -04:00
flan d1226e1e6b firstboot: log to user-writable ~/firstboot.log (runs as user, not root) 2026-07-07 20:29:57 -04:00
flan 363dd10e1b firstboot: chassis vm/container no longer misdefaults to laptop — fall back to battery presence 2026-07-07 20:06:21 -04:00
flan 6b2b2fb953 iso: fix zsh read prompt in autorun (-rp is coprocess in zsh); portable printf+read
build-iso / build (push) Successful in 7m51s
iso-2026.07.07
2026-07-07 19:31:02 -04:00
flan 6ccb09955a installer: prompt for network if needed; auto-reboot after install and after firstboot
build-iso / build (push) Successful in 10m4s
2026-07-07 19:05:14 -04:00
flan 111062b943 iso: distinct branding (arch-turnkey-*.iso); idempotent same-day release
build-iso / build (push) Successful in 9m20s
2026-07-07 18:55:02 -04:00
flan ab17c03716 ci: gitignore ISO artifacts; trigger build on tendrildev runner
build-iso / build (push) Failing after 3m8s
2026-07-07 18:51:55 -04:00
flan b0de7427da ci: re-trigger build with privileged runner enabled
build-iso / build (push) Failing after 9s
2026-07-07 18:27:23 -04:00
flan ade63dda39 ci: trigger first ISO build (runner live on code)
build-iso / build (push) Failing after 9s
2026-07-07 18:23:25 -04:00
flan a5f34b5c87 Auto-run firstboot on first boot via one-shot tty1 service (self-removing)
build-iso / build (push) Failing after 9s
2026-07-07 18:17:24 -04:00
flan 18ba370822 firstboot: set terminal pinentry so rbw unlock works on a headless fresh install 2026-07-07 18:10:55 -04:00
flan 18a4e09083 CI: Gitea Actions to auto-build ISO monthly + publish as release
build-iso / build (push) Failing after 24s
2026-07-07 17:56:56 -04:00
flan 3dd78383fe Public-safe: scrub hardcoded email (prompt instead), proper public README 2026-07-07 17:51:38 -04:00
flan 1ac4fb8858 Set Vaultwarden URL to pass.onetick.ninja 2026-07-07 17:27:32 -04:00
flan bbfa9ea37c docs: README reflects one-liner + Vaultwarden + zero-touch ISO 2026-07-07 17:22:30 -04:00
flan e695790a19 Easier: Vaultwarden secret automation (auto-register key), zero-touch ISO profile, nginx short-URL, preflight+logging QoL 2026-07-07 17:21:58 -04:00
flan c9f99ec529 Add one-line ISO bootstrap entrypoint 2026-07-07 17:14:50 -04:00
flan b1c633127e docs: detailed INSTALL guide (Btrfs, class-aware, manual fallback) 2026-07-07 17:07:10 -04:00
flan ff32287ad3 Turnkey Arch installer: archinstall (LUKS+Btrfs) + class-aware firstboot launcher 2026-07-07 17:03:08 -04:00