Compare commits
45 commits
dependabot
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
ed55583fb2 | ||
|
|
e2ccc907c4 | ||
|
|
f6b7be239d | ||
|
|
f65c6846f7 | ||
|
|
8e33e4fa3f | ||
|
|
c2eb4e0bf6 | ||
|
|
29beb6408f | ||
|
|
1e7553948e | ||
|
|
febe1ed1c0 | ||
|
|
e216813d56 | ||
|
|
f194d54d2d | ||
|
|
fb7a13908d | ||
|
|
ccb558b597 | ||
|
|
7a9e31f66d | ||
|
|
ddac14ae8a | ||
|
|
963b5e7415 | ||
|
|
550ee4e2dc | ||
|
|
2d6f6e3691 | ||
|
|
c40c60e820 | ||
|
|
4918d3297e | ||
|
|
ea4ed7a25c | ||
|
|
67a413bce8 | ||
|
|
4274d2db55 | ||
|
|
5afecd67c5 | ||
|
|
c8830fc50a | ||
|
|
6d7cb97cc0 | ||
|
|
03d376d931 | ||
|
|
f9a4599c9f | ||
|
|
fa529b0b9a | ||
|
|
bfd48449c7 | ||
|
|
ea79ed24f4 | ||
|
|
c171b01829 | ||
|
|
4695571654 | ||
|
|
83e657e74b | ||
|
|
9d5b4ddecd | ||
|
|
9e859af388 | ||
|
|
4de510d1f9 | ||
|
|
d4e84b0e41 | ||
|
|
8d362d13b2 | ||
|
|
7a9bf4eb0d | ||
|
|
57c18ac902 | ||
|
|
2ac7aebcb0 | ||
|
|
df6bc8c3b4 | ||
|
|
3a66d036dc | ||
|
|
f48f0615b6 |
11 changed files with 204 additions and 47 deletions
1
.gitignore
vendored
1
.gitignore
vendored
|
|
@ -1,3 +1,4 @@
|
||||||
cosign.key
|
cosign.key
|
||||||
cosign.private
|
cosign.private
|
||||||
/Containerfile
|
/Containerfile
|
||||||
|
/.bluebuild-scripts_*
|
||||||
|
|
|
||||||
66
README.md
66
README.md
|
|
@ -1,43 +1,37 @@
|
||||||
# randofin-os [](https://github.com/randogoth/randofin-os/actions/workflows/build.yml)
|
# Deinonyxus [](https://github.com/randogoth/deinonyxus/actions/workflows/build.yml)
|
||||||
|
|
||||||
See the [BlueBuild docs](https://blue-build.org/how-to/setup/) for quick setup instructions for setting up your own repository based on this template.
|
*Deinonyxus* is a personal spin of the UBlue Bluefin DX image with the 🍦[Lix](https://lix.systems/) flavored Nix package manager baked in.
|
||||||
|
|
||||||
After setup, it is recommended you update this README to describe your custom image.
|
## What’s inside
|
||||||
|
- Base: `ghcr.io/ublue-os/bluefin-dx:latest` without Cockpit, Docker, Firefox, VS Code
|
||||||
|
- System packages added: `syncthing`, `uv`, `vscodium`, `waydroid`;
|
||||||
|
- System flatpaks added: Telegram Desktop, Waterfox browser
|
||||||
|
|
||||||
## Installation
|
## Just Recipes
|
||||||
|
- `upgrade-nix`: upgrades to the latest version of Lix via the user profile. Replaces `nix upgrade-nix` which does not work with an immutable lowerdir `/nix/store` folder
|
||||||
|
- `install-nix-software-center`: installs a graphical app store for Nix packages
|
||||||
|
|
||||||
> [!WARNING]
|
## Install / Rebase
|
||||||
> [This is an experimental feature](https://www.fedoraproject.org/wiki/Changes/OstreeNativeContainerStable), try at your own discretion.
|
|
||||||
|
|
||||||
To rebase an existing atomic Fedora installation to the latest build:
|
|
||||||
|
|
||||||
- First rebase to the unsigned image, to get the proper signing keys and policies installed:
|
|
||||||
```
|
|
||||||
rpm-ostree rebase ostree-unverified-registry:ghcr.io/randogoth/randofin-os:latest
|
|
||||||
```
|
|
||||||
- Reboot to complete the rebase:
|
|
||||||
```
|
|
||||||
systemctl reboot
|
|
||||||
```
|
|
||||||
- Then rebase to the signed image, like so:
|
|
||||||
```
|
|
||||||
rpm-ostree rebase ostree-image-signed:docker://ghcr.io/randogoth/randofin-os:latest
|
|
||||||
```
|
|
||||||
- Reboot again to complete the installation
|
|
||||||
```
|
|
||||||
systemctl reboot
|
|
||||||
```
|
|
||||||
|
|
||||||
The `latest` tag will automatically point to the latest build. That build will still always use the Fedora version specified in `recipe.yml`, so you won't get accidentally updated to the next major version.
|
|
||||||
|
|
||||||
## ISO
|
|
||||||
|
|
||||||
If build on Fedora Atomic, you can generate an offline ISO with the instructions available [here](https://blue-build.org/learn/universal-blue/#fresh-install-from-an-iso). These ISOs cannot unfortunately be distributed on GitHub for free due to large sizes, so for public projects something else has to be used for hosting.
|
|
||||||
|
|
||||||
## Verification
|
|
||||||
|
|
||||||
These images are signed with [Sigstore](https://www.sigstore.dev/)'s [cosign](https://github.com/sigstore/cosign). You can verify the signature by downloading the `cosign.pub` file from this repo and running the following command:
|
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
cosign verify --key cosign.pub ghcr.io/randogoth/randofin-os
|
# First pull unsigned to get signing policy
|
||||||
|
rpm-ostree rebase ostree-unverified-registry:ghcr.io/randogoth/deinonyxus:latest
|
||||||
|
systemctl reboot
|
||||||
|
|
||||||
|
# Then move to the signed image
|
||||||
|
rpm-ostree rebase ostree-image-signed:docker://ghcr.io/randogoth/deinonyxus:latest
|
||||||
|
systemctl reboot
|
||||||
|
```
|
||||||
|
|
||||||
|
The `latest` tag always tracks the latest build for the Fedora base set in `recipes/recipe.yml`.
|
||||||
|
|
||||||
|
## Building locally
|
||||||
|
```bash
|
||||||
|
bluebuild build
|
||||||
|
```
|
||||||
|
|
||||||
|
## Signature verification
|
||||||
|
Images are signed with Sigstore/cosign. Verify with the repo's `cosign.pub`:
|
||||||
|
```bash
|
||||||
|
cosign verify --key cosign.pub ghcr.io/randogoth/deinonyxus
|
||||||
```
|
```
|
||||||
|
|
|
||||||
7
files/justfiles/nixpkgs.just
Normal file
7
files/justfiles/nixpkgs.just
Normal file
|
|
@ -0,0 +1,7 @@
|
||||||
|
upgrade-nix:
|
||||||
|
echo 'Installing latest Lix package'
|
||||||
|
nix profile install nixpkgs#lix && nix upgrade-nix
|
||||||
|
|
||||||
|
install-nix-software-center:
|
||||||
|
echo 'Installing Nix Software Center'
|
||||||
|
nix profile install github:snowfallorg/nix-software-center
|
||||||
|
|
@ -1,6 +0,0 @@
|
||||||
#!/usr/bin/env bash
|
|
||||||
|
|
||||||
# Tell this script to exit if there are any errors.
|
|
||||||
# You should have this in every custom script, to ensure that your completed
|
|
||||||
# builds actually ran successfully without any errors!
|
|
||||||
set -oue pipefail
|
|
||||||
48
files/scripts/install-lix.sh
Executable file
48
files/scripts/install-lix.sh
Executable file
|
|
@ -0,0 +1,48 @@
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
# === INSTALL LIX FROM RPM ===
|
||||||
|
|
||||||
|
rpm_url="https://nix-community.github.io/nix-installers/lix/x86_64/lix-multi-user-2.91.1.rpm"
|
||||||
|
|
||||||
|
install -d /usr/share/nix-store /var/lib/nix-store /nix /etc/nix
|
||||||
|
|
||||||
|
# Avoid systemd calls during RPM %post in the image build environment.
|
||||||
|
export SYSTEMD_OFFLINE=1
|
||||||
|
|
||||||
|
# Install the RPM; allow missing GPG key since we fetch directly by URL.
|
||||||
|
dnf install -y --nogpgcheck "$rpm_url"
|
||||||
|
|
||||||
|
|
||||||
|
# === ADD MISSING LIX CACHE ACCESS PUBKEY ===
|
||||||
|
|
||||||
|
nix_conf=/etc/nix/nix.conf
|
||||||
|
lix_cache_url="https://cache.lix.systems/"
|
||||||
|
lix_cache_key="cache.lix.systems:aBnZUw8zA7H35Cz2RyKFVs3H4PlGTLawyY5KRbvJR8o="
|
||||||
|
|
||||||
|
ensure_list_value() {
|
||||||
|
local key="$1" value="$2" escaped_value
|
||||||
|
escaped_value=$(printf '%s' "$value" | sed 's/[\\&]/\\&/g')
|
||||||
|
|
||||||
|
touch "$nix_conf"
|
||||||
|
|
||||||
|
if grep -Eq "^${key}[[:space:]]*=.*${escaped_value}" "$nix_conf"; then
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
|
||||||
|
if grep -Eq "^${key}[[:space:]]*=" "$nix_conf"; then
|
||||||
|
sed -i "s|^${key}[[:space:]]*= *\\(.*\\)|${key} = \\1 ${escaped_value}|" "$nix_conf"
|
||||||
|
else
|
||||||
|
echo "${key} = ${value}" >>"$nix_conf"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
ensure_list_value "substituters" "$lix_cache_url"
|
||||||
|
ensure_list_value "trusted-public-keys" "$lix_cache_key"
|
||||||
|
|
||||||
|
# === SEED STORE FOR FIRST BOOT (copied into /var on boot) ===
|
||||||
|
|
||||||
|
if compgen -G "/nix/*" >/dev/null; then
|
||||||
|
rsync -aH --delete /nix/ /usr/share/nix-store/
|
||||||
|
rm -rf /nix/*
|
||||||
|
fi
|
||||||
|
|
@ -0,0 +1,2 @@
|
||||||
|
/nix(/.*)? system_u:object_r:bin_t:s0
|
||||||
|
/var/lib/nix-store(/.*)? system_u:object_r:bin_t:s0
|
||||||
|
|
@ -0,0 +1,5 @@
|
||||||
|
[Service]
|
||||||
|
# Run the daemon unconfined to avoid SELinux denials on the Nix store binaries.
|
||||||
|
SELinuxContext=system_u:system_r:unconfined_service_t:s0
|
||||||
|
ExecStart=
|
||||||
|
ExecStart=/usr/bin/nix-daemon-wrapper.sh --daemon
|
||||||
58
files/system/usr/bin/mount-nix.sh
Executable file
58
files/system/usr/bin/mount-nix.sh
Executable file
|
|
@ -0,0 +1,58 @@
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
# Bind-mount /var/lib/nix-store to /nix.
|
||||||
|
# If /var/lib/nix-store is empty, seed it from the baked store in /usr/share/nix-store.
|
||||||
|
|
||||||
|
mkdir -p /usr/share/nix-store /var/lib/nix-store /nix
|
||||||
|
|
||||||
|
copy_seed_store() {
|
||||||
|
if command -v rsync >/dev/null 2>&1; then
|
||||||
|
rsync -aH --delete /usr/share/nix-store/ /var/lib/nix-store/
|
||||||
|
else
|
||||||
|
cp -a /usr/share/nix-store/. /var/lib/nix-store/
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
sync_missing_store() {
|
||||||
|
# Ensure any baked store paths exist in /var without clobbering user additions.
|
||||||
|
if command -v rsync >/dev/null 2>&1; then
|
||||||
|
rsync -aH --ignore-existing /usr/share/nix-store/store/ /var/lib/nix-store/store/
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
ensure_system_profile() {
|
||||||
|
local seed_profile="/usr/share/nix-store/var/nix/profiles/system"
|
||||||
|
local target_profile="/var/lib/nix-store/var/nix/profiles/system"
|
||||||
|
|
||||||
|
mkdir -p /var/lib/nix-store/var/nix/profiles
|
||||||
|
|
||||||
|
if { [ ! -e "$target_profile" ] || [ -L "$target_profile" ] && [ ! -e "$(readlink -f "$target_profile")" ]; } \
|
||||||
|
&& { [ -e "$seed_profile" ] || [ -L "$seed_profile" ]; }; then
|
||||||
|
cp -a "$seed_profile" "$target_profile"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
if ! mountpoint -q /nix; then
|
||||||
|
if [ -z "$(ls -A /var/lib/nix-store 2>/dev/null)" ] && compgen -G "/usr/share/nix-store/*" >/dev/null; then
|
||||||
|
copy_seed_store
|
||||||
|
fi
|
||||||
|
|
||||||
|
ensure_system_profile
|
||||||
|
sync_missing_store
|
||||||
|
|
||||||
|
mount --bind /var/lib/nix-store /nix
|
||||||
|
# Force an executable SELinux context on the bind mount so systemd can exec nix-daemon.
|
||||||
|
# Use a permissive fallback if the label option is rejected.
|
||||||
|
if ! mount -o remount,bind,exec,context=system_u:object_r:bin_t:s0 /nix 2>/dev/null; then
|
||||||
|
mount -o remount,bind,exec /nix
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Ensure daemon paths exist and labels are sane.
|
||||||
|
if command -v systemd-tmpfiles >/dev/null 2>&1; then
|
||||||
|
systemd-tmpfiles --create /usr/lib/tmpfiles.d/nix-daemon.conf
|
||||||
|
fi
|
||||||
|
if command -v restorecon >/dev/null 2>&1; then
|
||||||
|
restorecon -RF /var/lib/nix-store /nix || true
|
||||||
|
fi
|
||||||
|
fi
|
||||||
2
files/system/usr/bin/nix-daemon-wrapper.sh
Normal file
2
files/system/usr/bin/nix-daemon-wrapper.sh
Normal file
|
|
@ -0,0 +1,2 @@
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
exec /nix/var/nix/profiles/system/bin/nix-daemon "$@"
|
||||||
15
files/system/usr/lib/systemd/system/nix-overlay.service
Normal file
15
files/system/usr/lib/systemd/system/nix-overlay.service
Normal file
|
|
@ -0,0 +1,15 @@
|
||||||
|
[Unit]
|
||||||
|
Description=Bind-mount /var/lib/nix-store to /nix
|
||||||
|
DefaultDependencies=no
|
||||||
|
After=local-fs.target
|
||||||
|
RequiresMountsFor=/var /var/lib/nix-store
|
||||||
|
Before=nix-daemon.service nix-daemon.socket
|
||||||
|
ConditionPathExists=/usr/bin/mount-nix.sh
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=oneshot
|
||||||
|
ExecStart=/usr/bin/mount-nix.sh
|
||||||
|
RemainAfterExit=yes
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=sysinit.target
|
||||||
|
|
@ -1,9 +1,9 @@
|
||||||
---
|
---
|
||||||
# yaml-language-server: $schema=https://schema.blue-build.org/recipe-v1.json
|
# yaml-language-server: $schema=https://schema.blue-build.org/recipe-v1.json
|
||||||
# image will be published to ghcr.io/<user>/<name>
|
# image will be published to ghcr.io/<user>/<name>
|
||||||
name: randofin-os
|
name: deinonyxus
|
||||||
# description will be included in the image's metadata
|
# description will be included in the image's metadata
|
||||||
description: This is my personal spin based on the latest bluefin image.
|
description: Bluefin DX with Nix and sprinkles.
|
||||||
|
|
||||||
# the base image to build on top of (FROM) and the version tag to use
|
# the base image to build on top of (FROM) and the version tag to use
|
||||||
base-image: ghcr.io/ublue-os/bluefin-dx
|
base-image: ghcr.io/ublue-os/bluefin-dx
|
||||||
|
|
@ -12,15 +12,45 @@ image-version: latest # latest is also supported if you want new updates ASAP
|
||||||
# module configuration, executed in order
|
# module configuration, executed in order
|
||||||
# you can include multiple instances of the same module
|
# you can include multiple instances of the same module
|
||||||
modules:
|
modules:
|
||||||
|
|
||||||
|
- type: os-release
|
||||||
|
properties:
|
||||||
|
ID: deinonyxus
|
||||||
|
NAME: Deinonyxus
|
||||||
|
PRETTY_NAME: Deinonyxus (Bluefin DX)
|
||||||
|
DEFAULT_HOSTNAME: deinonyxus
|
||||||
|
HOME_URL: https://codeberg.org/randogoth/deinonyxus
|
||||||
|
SUPPORT_URL: https://codeberg.org/randogoth/deinonyxus/issues
|
||||||
|
BUG_REPORT_URL: https://codeberg.org/randogoth/deinonyxus/issues
|
||||||
|
|
||||||
- type: files
|
- type: files
|
||||||
files:
|
files:
|
||||||
- source: system
|
- source: system
|
||||||
destination: / # copies files/system/* (* means everything inside it) into your image's root folder /
|
destination: / # copies files/system/* (* means everything inside it) into your image's root folder /
|
||||||
|
|
||||||
|
- type: script
|
||||||
|
scripts:
|
||||||
|
- install-lix.sh
|
||||||
|
|
||||||
|
- type: systemd
|
||||||
|
system:
|
||||||
|
enabled:
|
||||||
|
- nix-overlay.service
|
||||||
|
- nix-daemon.service
|
||||||
|
- nix-daemon.socket
|
||||||
|
|
||||||
- type: dnf
|
- type: dnf
|
||||||
|
repos:
|
||||||
|
files:
|
||||||
|
add:
|
||||||
|
- https://repo.vscodium.dev/vscodium.repo
|
||||||
install:
|
install:
|
||||||
packages:
|
packages:
|
||||||
|
- repo: vscodium
|
||||||
|
packages:
|
||||||
|
- codium
|
||||||
- syncthing
|
- syncthing
|
||||||
|
- uv
|
||||||
- waydroid
|
- waydroid
|
||||||
remove:
|
remove:
|
||||||
packages:
|
packages:
|
||||||
|
|
@ -39,8 +69,10 @@ modules:
|
||||||
- docker-ce-rootless-extras
|
- docker-ce-rootless-extras
|
||||||
- docker-compose-plugin
|
- docker-compose-plugin
|
||||||
- docker-model-plugin
|
- docker-model-plugin
|
||||||
- containerd
|
|
||||||
- moby-engine
|
- type: justfiles
|
||||||
|
include:
|
||||||
|
- nixpkgs.just
|
||||||
|
|
||||||
- type: default-flatpaks
|
- type: default-flatpaks
|
||||||
configurations:
|
configurations:
|
||||||
|
|
@ -49,7 +81,6 @@ modules:
|
||||||
# If no repo information is specified, Flathub will be used by default
|
# If no repo information is specified, Flathub will be used by default
|
||||||
install: # system flatpaks we want all users to have and not remove
|
install: # system flatpaks we want all users to have and not remove
|
||||||
- net.waterfox.waterfox
|
- net.waterfox.waterfox
|
||||||
- com.vscodium.codium
|
|
||||||
- org.telegram.desktop
|
- org.telegram.desktop
|
||||||
remove: # replace default Firefox with Waterfox
|
remove: # replace default Firefox with Waterfox
|
||||||
- org.mozilla.firefox
|
- org.mozilla.firefox
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue