Compare commits

..

15 Commits
0.0.2 ... main

Author SHA1 Message Date
Sebastian Fischer
929fa13ef5 Merge branch 'release/0.0.3' 2026-03-06 19:49:54 +01:00
Sebastian Fischer
fc6425d3f6 [TASK] Override hostname in VM 2026-02-15 17:13:29 +01:00
Sebastian Fischer
a777bd1e89 [TASK] Add background image 2026-02-15 10:00:04 +01:00
Sebastian Fischer
bb8b83274a [TASK] Improve scripts 2026-02-13 22:31:54 +01:00
Sebastian Fischer
38bb65f0e3 [TASK] Improve scripts 2026-02-13 22:02:11 +01:00
Sebastian Fischer
cdb63d1114 [TASK] Allow different hdds for installation 2026-02-13 21:25:37 +01:00
Sebastian Fischer
88929f83e6 [TASK] Improve readme 2026-02-13 21:21:28 +01:00
Sebastian Fischer
4e3207dbc0 [TASK] Add keybinding 2026-02-13 21:03:30 +01:00
Sebastian Fischer
4094619455 [TASK] Disable beep 2026-02-13 20:30:23 +01:00
Sebastian Fischer
56d916efa8 [TASK] Configure Dash-to-Dock to not show drives or trashbin 2026-02-13 19:59:14 +01:00
Sebastian Fischer
70a10c6b73 [TASK] Improve install with flakes 2026-02-11 20:48:28 +01:00
Sebastian Fischer
b38ee2c8d6 [TASK] Refactor autostart 2026-02-11 20:38:22 +01:00
Sebastian Fischer
0518c9b34a [TASK] Add hytale launcher as flake 2026-02-11 07:59:24 +01:00
Sebastian Fischer
7a4283ba3a [TASK] Improve documentation 2026-02-10 20:07:06 +01:00
Sebastian Fischer
dcf7ee4a09 Merge tag '0.0.2' into develop
Release install script
2026-02-10 19:03:15 +01:00
9 changed files with 242 additions and 74 deletions

61
CLAUDE.md Normal file
View File

@ -0,0 +1,61 @@
# CLAUDE.md
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
## What This Is
Personal NixOS system configuration for host `cesium` — a QEMU/KVM-virtualized x86_64 desktop workstation. Uses NixOS with Home Manager (channel-based, no Flakes). NixOS version is locked to 25.11.
## Commands
```bash
# Rebuild and apply configuration (aliased as 'rebuild')
sudo nixos-rebuild switch
# Rebuild with package upgrades (aliased as 'update')
sudo nixos-rebuild switch --upgrade
# Test configuration without persisting (loads into current session only)
sudo nixos-rebuild test
# Build without applying (useful to check for errors)
sudo nixos-rebuild build
# Optimize store and garbage collect (aliased as 'ngc')
sudo nix-store --optimise && sudo nix-collect-garbage -d
# After first install: setup SMB credentials
sudo /etc/nixos/setup-smb-credentials.sh
```
## Architecture
Entry point is `config/configuration.nix`, which imports all other modules:
```
config/configuration.nix # Top-level: imports all modules, enables Home Manager
├── hardware-configuration.nix # Auto-generated (gitignored), QEMU guest hardware
├── common.nix # System-wide: bootloader, locale, GNOME, PipeWire, packages
├── mounts.nix # CIFS/SMB mounts to TrueNAS (automount with systemd)
├── services.nix # Docker (custom data root /home/docker), ddev
├── users/sebastian.nix # User account, groups, SSH askpass
│ └── imports home.nix # Home Manager config for this user
├── home.nix # User environment: apps, shell, git, scripts, Flatpak
├── scripts.nix # Custom shell scripts (composer, lazydocker, gclb)
├── vm-guest.nix # Optional: SPICE agent for VM clipboard/file sharing
└── vm-host.nix # Optional: KVM/QEMU host with libvirtd, virt-manager
```
Key design patterns:
- `common.nix` handles all system-level config (boot, locale, desktop, audio, auto-updates, garbage collection)
- `home.nix` handles all user-level config via Home Manager (applications, shell aliases, git, vim, GTK theme, GNOME extensions, Flatpak activation scripts)
- `scripts.nix` defines Docker-wrapped CLI tools (composer, lazydocker) and git helpers using `writeShellScriptBin`
- `mounts.nix` uses systemd automount with 60s idle timeout for TrueNAS SMB shares
- `vm-guest.nix` and `vm-host.nix` are optional modules (not imported by default in configuration.nix)
## Conventions
- **Commit messages** use `[TASK]` prefix (e.g., `[TASK] Add filemounts`)
- **Formatting**: 2-space indentation for `.nix` files, 4-space for everything else (see `.editorconfig`)
- **Unfree packages** are allowed (`nixpkgs.config.allowUnfree = true`)
- `hardware-configuration.nix` is gitignored — it's auto-generated per machine

View File

@ -7,8 +7,7 @@ sudo apt install qemu-kvm libvirt-daemon-system libvirt-clients bridge-utils vir
``` ```
- Video: QXL - Video: QXL
- In `configuration.nix`: `services.spice-vdagentd.enable = true;` - If the HDD for the VM is too small: `qemu-img resize nixos.qcow2 +20G`
- Falls die HDD zu klein ist: `qemu-img resize nixos.qcow2 +20G`
## Manuelle Installation (UEFI) ## Manuelle Installation (UEFI)
@ -20,15 +19,19 @@ sudo -i
# Use german keyboard layout # Use german keyboard layout
loadkeys de loadkeys de
# Short for all the stuff below !!! ONLY ON EMPTY DRIVES !!! # Short for all the stuff below !!! TAKE CARE OF THE USERDATA !!!
curl -L https://www.fischer.im/nixos/minimal-install --output install.sh curl -L https://www.fischer.im/nixos/minimal-install --output install.sh
chmod 744 ./install.sh chmod 744 ./install.sh
./install.sh ./install.sh
reboot
``` ```
If you don't use the installation script, you need to follow the steps 2-8
### 2. Partitionierung ### 2. Partitionierung
Das folgende Schema erstellt fuenf Partitionen auf `/dev/sda`: The following schema creates four partitions on `/dev/sda`:
| Partition | Typ | Groesse | Mountpoint | | Partition | Typ | Groesse | Mountpoint |
|-------------|----------------|-------------------|------------| |-------------|----------------|-------------------|------------|
@ -37,26 +40,26 @@ Das folgende Schema erstellt fuenf Partitionen auf `/dev/sda`:
| `/dev/sda3` | ext4 (Root) | Rest minus Home | `/` | | `/dev/sda3` | ext4 (Root) | Rest minus Home | `/` |
| `/dev/sda4` | ext4 (Home) | 50% des Rests | `/home` | | `/dev/sda4` | ext4 (Home) | 50% des Rests | `/home` |
**Hinweis:** Die Groessen muessen an die eigene Festplatte angepasst werden. Im Beispiel wird eine 100 GB Festplatte verwendet. **HINT:** The sizes must be adapted to your hard drive. In the example it's assumed that a 100GB drive is in use.
```bash ```bash
# GPT-Partitionstabelle erstellen # GPT-partition table
parted /dev/sda -- mklabel gpt parted /dev/sda -- mklabel gpt
# EFI-Partition (512 MB) # EFI-partition (512 MB)
parted /dev/sda -- mkpart esp fat32 1MB 512MB parted /dev/sda -- mkpart esp fat32 1MB 512MB
parted /dev/sda -- set 1 esp on parted /dev/sda -- set 1 esp on
# Swap-Partition (8 GB) # Swap-partition (8 GB)
parted /dev/sda -- mkpart swap linux-swap 512MB 8626MB parted /dev/sda -- mkpart swap linux-swap 512MB 8626MB
# Root-Partition (ca. 45 GB) # Root-partition (ca. 45 GB)
parted /dev/sda -- mkpart root ext4 8636MB 40000MB parted /dev/sda -- mkpart root ext4 8636MB 40000MB
# Home-Partition (Rest) # Home-partition (Rest)
parted /dev/sda -- mkpart home ext4 40000MB 100% parted /dev/sda -- mkpart home ext4 40000MB 100%
# Ergebnis pruefen # Check result
parted /dev/sda -- print parted /dev/sda -- print
``` ```
@ -96,55 +99,76 @@ mount /dev/disk/by-label/home /mnt/home
swapon /dev/disk/by-label/swap swapon /dev/disk/by-label/swap
``` ```
### 6. Konfiguration generieren ### 6. Generate configuration
```bash ```bash
nixos-generate-config --root /mnt nixos-generate-config --root /mnt
``` ```
Dies erzeugt zwei Dateien: This creates two files:
- `/mnt/etc/nixos/hardware-configuration.nix`erkannte Hardware und Mountpoints - `/mnt/etc/nixos/hardware-configuration.nix`detected hardware and mountpoints
- `/mnt/etc/nixos/configuration.nix`Grundkonfiguration - `/mnt/etc/nixos/configuration.nix`Base configuration
### 7. Bootloader konfigurieren ### 7. Check the detected bootloader
In `/mnt/etc/nixos/configuration.nix` sicherstellen, dass der Bootloader korrekt eingerichtet ist: Check in `/mnt/etc/nixos/configuration.nix`, that the bootloader is configured like this:
```nix ```nix
boot.loader = { {
systemd-boot.enable = true; boot.loader = {
efi.canTouchEfiVariables = true; systemd-boot.enable = true;
}; efi.canTouchEfiVariables = true;
};
}
``` ```
### 8. System installieren ### 8. Install system
```bash ```bash
nixos-install nixos-install
```
Nach der Installation wird ein Root-Passwort abgefragt. Danach: # After the installation the script sets your root password. (Test1)
```bash
reboot reboot
``` ```
### 9. Nach dem ersten Start ### 9. After the first reboot
```bash ```bash
curl --output release.tar.gz https://gitea.fischer.im/sebastian/nixos-cesium/archive/[0.0.2].tar.gz
tar xzf release.tar.gz
chmod 744 nixos-cesium/script/post-install.sh
./nixos-cesium/script/post-install.sh
```
If you don't use the post-installation script, follow the next step
```bash
cp -r ~/nixos-cesium/config/* /etc/nixos/
# Remember to activate vm-guest.nix or vm-host.nix in configuration.nix
nix-channel --add https://github.com/nix-community/home-manager/archive/release-25.11.tar.gz home-manager nix-channel --add https://github.com/nix-community/home-manager/archive/release-25.11.tar.gz home-manager
nix-channel --update nix-channel --update
# Konfiguration anwenden # Konfiguration anwenden
sudo nixos-rebuild switch nixos-rebuild switch --option experimental-features "nix-command flakes"
# SMB-Zugangsdaten einrichten (falls Netzlaufwerke genutzt werden) reboot
```
### 10. Post Installation
Generate SMB-credentials (if network mounts are used)
```bash
sudo /etc/nixos/setup-smb-credentials.sh sudo /etc/nixos/setup-smb-credentials.sh
``` ```
## Wartung ## Wartung
Optimise Nix Store and remove old generations
```bash ```bash
# Nix Store optimieren und alte Generationen entfernen
sudo nix-store --optimise && sudo nix-collect-garbage -d sudo nix-store --optimise && sudo nix-collect-garbage -d
``` ```

Binary file not shown.

After

Width:  |  Height:  |  Size: 968 KiB

View File

@ -1,7 +1,8 @@
{ config, pkgs, ... }: { config, pkgs, ... }:
{ {
imports = [ # Include the results of the hardware scan. imports = [
# Include the results of the hardware scan.
./hardware-configuration.nix ./hardware-configuration.nix
./common.nix ./common.nix
./mounts.nix ./mounts.nix
@ -11,13 +12,14 @@
<home-manager/nixos> <home-manager/nixos>
]; ];
# Home Manager Konfiguration # Home Manager configuration
home-manager.useGlobalPkgs = true; home-manager.useGlobalPkgs = true;
home-manager.useUserPackages = true; home-manager.useUserPackages = true;
home-manager.backupFileExtension = "backup"; home-manager.backupFileExtension = "backup";
# NixOS Version (nicht ändern nach Erstinstallation) # NixOS Version (don't change after first installation)
system.stateVersion = "25.11"; system.stateVersion = "25.11";
nixpkgs.config.allowUnfree = true; nixpkgs.config.allowUnfree = true;
nix.settings.experimental-features = [ "nix-command" "flakes" ];
} }

5
config/flakes.nix Normal file
View File

@ -0,0 +1,5 @@
{ system ? "x86_64-linux" }:
{
hytale-launcher = (builtins.getFlake "github:TNAZEP/HytaleLauncherFlake").packages.${system}.default;
}

View File

@ -3,6 +3,7 @@
let let
localScripts = import ./scripts.nix { inherit pkgs; }; localScripts = import ./scripts.nix { inherit pkgs; };
flakePackages = import ./flakes.nix {};
in in
{ {
home.stateVersion = "25.11"; home.stateVersion = "25.11";
@ -37,6 +38,7 @@ in
lutris lutris
steam steam
prismlauncher prismlauncher
flakePackages.hytale-launcher
# Entwicklung # Entwicklung
jetbrains-toolbox jetbrains-toolbox
@ -90,6 +92,10 @@ in
}; };
dconf.settings = { dconf.settings = {
"org/gnome/desktop/interface" = {
color-scheme = "prefer-dark";
accent-color = "green";
};
"org/gnome/desktop/wm/preferences" = { "org/gnome/desktop/wm/preferences" = {
button-layout = "appmenu:minimize,maximize,close"; button-layout = "appmenu:minimize,maximize,close";
focus-mode = "sloppy"; focus-mode = "sloppy";
@ -103,6 +109,19 @@ in
dash-to-dock.extensionUuid dash-to-dock.extensionUuid
]; ];
}; };
"org/gnome/desktop/background" = {
picture-uri = "file:///etc/nixos/config/crest_iv_black-cut.jpg";
picture-uri-dark = "file:///etc/nixos/config/crest_iv_black-cut.jpg";
picture-options = "centered";
primary-color = "#000000";
};
"org/gnome/shell/extensions/dash-to-dock" = {
show-mounts = false;
show-trash = false;
};
"org/gnome/shell/keybindings" = {
show-screenshot-ui = ["<Shift><Alt>5"];
};
}; };
programs.git = { programs.git = {
@ -203,7 +222,6 @@ in
]; ];
}; };
# Vim Konfiguration
programs.vim = { programs.vim = {
enable = true; enable = true;
defaultEditor = true; defaultEditor = true;
@ -224,7 +242,6 @@ in
''; '';
}; };
# Zsh mit Oh-My-Zsh und Powerlevel10k
programs.zsh = { programs.zsh = {
enable = true; enable = true;
enableCompletion = true; enableCompletion = true;
@ -252,6 +269,9 @@ in
}; };
initContent = '' initContent = ''
# Bell deaktivieren
unsetopt BEEP
# Powerlevel10k Konfiguration laden (falls vorhanden) # Powerlevel10k Konfiguration laden (falls vorhanden)
[[ -f ~/.p10k.zsh ]] && source ~/.p10k.zsh [[ -f ~/.p10k.zsh ]] && source ~/.p10k.zsh
''; '';

View File

@ -1,10 +1,24 @@
{ pkgs, ... }: { pkgs, lib, ... }:
let
spice-vdagent-desktop = pkgs.makeDesktopItem {
name = "spice-vdagent-custom";
desktopName = "Spice vdagent Custom";
comment = "Startet das Clipboard für QEMU/Spice";
exec = "${pkgs.spice-vdagent}/bin/spice-vdagent";
terminal = false;
type = "Application";
categories = [ "Network" ];
extraConfig.StartupNotify = "false";
extraConfig."X-GNOME-Autostart-enabled" = "true";
};
in
{ {
environment.systemPackages = with pkgs; [ environment.systemPackages = with pkgs; [
spice-vdagent spice-vdagent
phodav phodav
wl-clipboard wl-clipboard
spice-vdagent-desktop
]; ];
# List services that you want to enable: # List services that you want to enable:
@ -13,20 +27,18 @@
services.gvfs.enable = true; services.gvfs.enable = true;
services.qemuGuest.enable = true; services.qemuGuest.enable = true;
networking.hostName = lib.mkForce "cesium-vm";
# Open ports in the firewall. # Open ports in the firewall.
networking.firewall.allowedTCPPorts = [ 9843 22 ]; networking.firewall.allowedTCPPorts = [ 9843 22 ];
# Enable the OpenSSH daemon. # Enable the OpenSSH daemon.
services.openssh.enable = true; services.openssh.enable = true;
environment.etc."xdg/autostart/spice-vdagent-custom.desktop".text = '' users.users.sebastian.openssh.authorizedKeys.keys = [
[Desktop Entry] "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIL/i/b9o5LKRr+h7vwq1dLCQ+vz9DTf4EvaLeCRUxtIZ sebastian@cesium"
Name=Spice vdagent Custom ];
Comment=Startet das Clipboard für QEMU/Spice
Exec=${pkgs.spice-vdagent}/bin/spice-vdagent # Symlink für Autostart
Terminal=false environment.etc."xdg/autostart/spice-vdagent-custom.desktop".source =
Type=Application "${spice-vdagent-desktop}/share/applications/spice-vdagent-custom.desktop";
Categories=Network;
StartupNotify=false
X-GNOME-Autostart-enabled=true
'';
} }

67
scripts/minimal-install.sh Normal file → Executable file
View File

@ -4,46 +4,51 @@ sudo -i
loadkeys de loadkeys de
lsbkl lsblk
# Disk selection
DEFAULT_DISK="/dev/sda"
read -p "Disk to install to [${DEFAULT_DISK}]: " DISK
DISK="${DISK:-$DEFAULT_DISK}"
if [ ! -b "${DISK}" ]; then
echo "Error: ${DISK} is not a valid block device."
exit 1
fi
echo "Using disk: ${DISK}"
# Partitioning # Partitioning
read -p "Create partitions table? DELETES ALL DATA! (j/N): " answer read -p "Create partitions table? DELETES ALL DATA! (j/N): " ANSWER
if [ "$answer" = "j" ] || [ "$answer" = "J" ]; then if [ "${ANSWER}" = "j" ] || [ "${ANSWER}" = "J" ]; then
# GPT-partition table creation # GPT-partition table
parted /dev/sda -- mklabel gpt parted "${DISK}" -- mklabel gpt
# EFI-partition (512 MB) # EFI-partition (512 MB)
parted /dev/sda -- mkpart esp fat32 1MB 512MB parted "${DISK}" -- mkpart esp fat32 1MB 512MB
parted /dev/sda -- set 1 esp on parted "${DISK}" -- set 1 esp on
# Swap-partition (8 GB) # Swap-partition (8 GB)
parted /dev/sda -- mkpart swap linux-swap 512MB 8626MB parted "${DISK}" -- mkpart swap linux-swap 512MB 8626MB
# Root-partition (ca. 45 GB) # Root-partition (ca. 45 GB)
parted /dev/sda -- mkpart root ext4 8636MB 40000MB parted "${DISK}" -- mkpart root ext4 8636MB 40000MB
# Home-partition (Rest) # Home-partition (Rest)
parted /dev/sda -- mkpart home ext4 40000MB 100% parted "${DISK}" -- mkpart home ext4 40000MB 100%
fi fi
# Check results # Check results
parted /dev/sda -- print parted "${DISK}" -- print
mkfs.fat -F 32 -n boot ${DISK}1
mkswap -L swap ${DISK}2
mkfs.ext4 -L nixos ${DISK}3
# Format EFI-partition read -p "Format Home-partition? Deletes all userdata! (j/N): " ANSWER
mkfs.fat -F 32 -n boot /dev/sda1 if [ "${ANSWER}" = "j" ] || [ "${ANSWER}" = "J" ]; then
# Format swap-partition
mkswap -L swap /dev/sda2
# Format root-partition
mkfs.ext4 -L nixos /dev/sda3
read -p "Home-Partition formatieren? LOESCHT BENUTZERDATEN! (j/N): " answer
if [ "$answer" = "j" ] || [ "$answer" = "J" ]; then
# Format home-partition # Format home-partition
mkfs.ext4 -L home /dev/sda4 mkfs.ext4 -L home ${DISK}4
fi fi
@ -53,19 +58,25 @@ mount /dev/disk/by-label/nixos /mnt
mkdir /mnt/boot mkdir /mnt/boot
mount -o umask=077 /dev/disk/by-label/boot /mnt/boot mount -o umask=077 /dev/disk/by-label/boot /mnt/boot
mkdir -p /mnt/home
mount /dev/disk/by-label/home /mnt/home
# Activate swap # Activate swap
swapon /dev/disk/by-label/swap swapon /dev/disk/by-label/swap
mkdir -p /mnt/home
mount /dev/disk/by-label/home /mnt/home
echo "If you want to configure additional partitions, this is the right moment."
echo "Switch to console with [Ctrl + Z] and return with [fg] continue after that."
read -p "Continue?"
nixos-generate-config --root /mnt nixos-generate-config --root /mnt
nixos-install
# If root password wasn't set because the installation needed to be restarted. # If root password wasn't set because the installation needed to be restarted.
read -p "Root-Passwort mit nixos-enter setzen? (j/N): " answer read -p "Set Root-password with nixos-enter? (j/N): " ANSWER
if [ "$answer" = "j" ] || [ "$answer" = "J" ]; then if [ "${ANSWER}" = "j" ] || [ "${ANSWER}" = "J" ]; then
nixos-enter --root '/mnt' nixos-enter --root '/mnt'
passwd passwd
fi fi

33
scripts/post-install.sh Executable file
View File

@ -0,0 +1,33 @@
#!/usr/bin/env sh
sudo -i
cp -r ~/nixos-cesium/config/* /etc/nixos/
# VM module activation
echo ""
echo "Select what configuration to include?"
echo " 1) vm-guest.nix (VM runs inside a hypervisor)"
echo " 2) vm-host.nix (System runs VMs via libvirtd)"
echo " n) None"
read -p "Selection [n]: " VM_CHOICE
VM_CHOICE="${VM_CHOICE:-n}"
case "${VM_CHOICE}" in
1)
sed -i 's|# ./vm-guest.nix|./vm-guest.nix|' /etc/nixos/configuration.nix
echo "vm-guest.nix activated."
;;
2)
sed -i 's|# ./vm-guest.nix|./vm-host.nix|' /etc/nixos/configuration.nix
echo "vm-host.nix activated."
;;
*)
echo "No VM module activated."
;;
esac
nix-channel --add https://github.com/nix-community/home-manager/archive/release-25.11.tar.gz home-manager
nix-channel --update
nixos-rebuild switch --option experimental-features "nix-command flakes"