Commit graph

833 commits

Author SHA1 Message Date
9fb72e762b
docs(age): improve readability with structured comments
Add section headers and explanatory comments to clarify the purpose of each configuration block, with emphasis on the critical persistent path requirement for early boot secret decryption.
2025-10-12 10:19:42 +08:00
4389500ccc
fix(borgbackup): add network dependencies to onsite services
Fixes DNS resolution failures when persistent timers trigger backups
after system wake.

The NixOS borgbackup module adds network-online.target dependencies
to the timer when persistentTimer=true, but systemd timers don't pass
their dependencies to the services they trigger. This caused onsite
backups to start before the network was ready, resulting in "Could not
resolve hostname" errors.

Adding after/wants network-online.target directly to the service
ensures the backup waits for network availability regardless of how
it's triggered (timer or offsite's Wants= dependency).

Example failure (Oct 11, 07:43):
- Backup started at 07:43:43 (persistent timer caught up)
- DNS lookup failed: "Could not resolve hostname viridian.home.arpa"
- WiFi connected at 07:43:47 (4 seconds too late)

Applied to both fuchsia and viridian onsite backups.
2025-10-11 08:06:00 +08:00
a276fdf53a
fix(borgbackup): prevent race conditions and improve reliability
Fixes multiple issues with borgbackup service coordination:

1. Race condition between onsite/offsite backups
   - Set Type=oneshot to ensure services wait for completion
   - Added Wants= dependency to trigger onsite when offsite runs
   - Prevents snapshot path collision at /btrfs-subvolumes

2. Network unavailability after sleep/wake
   - Added persistentTimer=true to onsite backups
   - NixOS module now auto-adds network-online.target dependencies
   - Fixes DNS resolution failures for SSH repos

3. Data loss risk from missed backups
   - Persistent timers ensure backups run on wake if missed
   - Protects work done before sleep from being unbackored

4. Duplicate onsite runs at midnight
   - Removed 15-minute stagger (00:15 -> 00:00)
   - Systemd deduplicates services in same transaction
   - Onsite now runs once, not twice

Applied to both fuchsia and viridian for consistency.
2025-10-09 11:30:00 +08:00
15b4851e8e
refactor(borgbackup): implement shared staging with defense-in-depth
Major improvements to borgbackup configuration for better reliability and
maintainability:

**Shared staging directory:**
- Use single /btrfs-subvolumes directory (was /subvolumes-{onsite,offsite})
- Eliminates redundant path suffixes in archive structure
- Archive paths now semantic: /btrfs-subvolumes/srv-forgejo clearly indicates
  BTRFS subvolume content without redundant backup job metadata

**Defense-in-depth protection:**
- Layer 1: Systemd ordering - offsite waits for onsite completion
- Layer 2: Self-healing preHook - auto-cleanup orphaned snapshots from
  crashes/power loss
- Prevents cascading failures from race conditions or abnormal terminations

**Code quality improvements:**
- Extract subvolume lists to reduce duplication (DRY principle)
- Add /* sh */ syntax hints for proper editor highlighting
- Silent operation for consistency with existing hooks
- Improved readability with clearer comments and formatting
- All lines ≤ 100 characters

**Timing:**
- Offsite: *-*-* 00:15:00 (daily at 12:15 AM, waits for onsite)
- Onsite: hourly (unchanged)
2025-10-08 18:46:50 +08:00
37924375a2
refactor(borgbackup): backup from /persist paths instead of bind mounts
Update backup paths to use actual persistent storage locations (/persist/*) rather than bind-mounted paths, making it clear where data truly resides and simplifying restore operations.
2025-10-08 15:58:23 +08:00
26c08000a0
refactor(borgbackup): use visible directories with semantic subvolume names
Changes staging directories from hidden to visible and aligns backup paths with actual BTRFS subvolume naming conventions for better clarity when browsing archives.
2025-10-08 15:53:15 +08:00
2c286d65fb
refactor(viridian): simplify home-manager config and enable tmux status
Remove unused packages (weechat, nixvim) and enable tmux status bar for better session visibility on the server.
2025-10-08 10:21:16 +08:00
6dc89a2097
feat(borgbackup): include Library directory in backup paths
Add ~/Library to both onsite and offsite backup configurations to preserve application state, preferences, and support files across system restores.
2025-10-08 10:14:13 +08:00
359d01c407
fix(borgbackup): enable persistent timers for offsite backups
Adds persistentTimer=true to both fuchsia and viridian offsite backup configurations to ensure backups run on next boot if the system was asleep at the scheduled time. Without this, daily backups would be skipped entirely until the next scheduled run.
2025-10-08 08:04:57 +08:00
8874c88fbc
fix(ssh): enable key-based root login and use FQDNs for system services
Fixes backup system authentication and hostname resolution issues.

Changes:
- Change PermitRootLogin from "no" to "prohibit-password" in global SSH config
  (allows key-based root login for host-to-host backups while blocking passwords)
- Update fuchsia onsite backup to use viridian.home.arpa FQDN instead of shortname
- Update SSH knownHosts to use FQDNs (fuchsia.home.arpa, viridian.home.arpa)
  (system-level config uses FQDNs, user shortcuts remain in home-manager)

This enables the complete 3-2-1 backup strategy with automated backups working
correctly between fuchsia and viridian, and fuchsia to BorgBase.
2025-10-07 23:11:31 +08:00
6723c0e0b6
chore(secrets): rekey agenix secrets for new configuration
- Add rekeyed borgbackup passphrase for fuchsia offsite backups
- Remove unused projectsend secret from viridian
2025-10-07 22:37:26 +08:00
85dc419349
refactor(ssh): decentralize SSH configuration to per-host services
Restructures SSH trust relationships from global to host-specific configuration
for better locality of concern and principle of least privilege.

Changes:
- Collapse nixos/common/global/ssh/ back to ssh.nix (single-file module)
- Move internal host trust (fuchsia/viridian) to per-host services/ssh/
- Split BorgBase known hosts by repository (li9kg944 for fuchsia, r7ag7x1w for viridian)
- Add viridian SSH server config to accept backup connections from fuchsia
- Add fuchsia borgbackup passphrase for offsite backups
- Configure viridian to create /srv/borg-repo/fuchsia for remote backups

This enables the 3-2-1 backup strategy with fuchsia backing up to both viridian
(onsite) and BorgBase (offsite) with proper SSH authentication.
2025-10-07 22:33:20 +08:00
acab920858
WIP: SSH configuration restructure
Backup of SSH reorganization changes for future reference.
2025-10-07 20:58:09 +08:00
a6fa8866ac
feat(fuchsia): implement backup strategy with explicit home paths
Add snapper and borgbackup for fuchsia home directory backups:

Snapper Configuration:
- Hourly snapshots of /home/sajenim
- Retention: 24 hourly, 7 daily, 4 weekly, 12 monthly
- Stored in nested .snapshots subvolume

Borgbackup Onsite:
- Backup to viridian over SSH (local network)
- Target: ssh://viridian/srv/borg-repo/fuchsia
- Hourly backups, unencrypted, deduplicated
- Same retention as snapper

Borgbackup Offsite:
- Backup to borgbase (internet)
- Target: li9kg944@li9kg944.repo.borgbase.com:repo
- Daily backups, encrypted (repokey-blake2), deduplicated
- Retention: 7 daily, 4 weekly, 12 monthly

Explicit Home Paths (valuable user data only):
- Documents, Pictures, Videos, Music, Downloads, Academics, Notes
- Dotfiles: .ssh, .gnupg

System Persist Data:
- SSH host keys, machine-id, nixos state
- Bluetooth, NetworkManager configurations

Intentionally Excluded:
- .config (managed declaratively via home-manager)
- .repositories (cloneable from GitHub)
- .cache and build artifacts

Treats viridian as central backup server, maintaining 3-2-1 strategy
(3 copies, 2 locations, 1 offsite).

chore(viridian): remove unused inputs parameter from borgbackup offsite
2025-10-07 19:14:11 +08:00
f24a7476a7
feat(viridian): add explicit persist data to backup strategy
Add critical system state from persist.nix to borgbackup jobs:
- SSH host keys (required for borg authentication)
- machine-id and nixos state
- Network and bluetooth configurations

Paths mirror persist.nix configuration for maintainability.
Service-specific persist data (traefik, crowdsec) excluded -
will create dedicated subvolumes if/when needed.
2025-10-07 17:06:45 +08:00
7833d89d86
fix(viridian): resolve backup system initialization issues
Fix snapper and borgbackup jobs to work with ephemeral-btrfs setup:

Snapper fixes:
- Remove global /.snapshots mount (use nested subvolumes instead)
- Remove unused hostname variable
- Snapshots now stored in .snapshots subvolumes within each service

Borgbackup fixes:
- Add systemd.tmpfiles.rules to create staging directories at boot
- Add readWritePaths for staging directories (systemd sandboxing)
- Staging directories survive ephemeral root wipes

Architecture notes:
- Nested .snapshots subvolumes don't require separate mounts
- systemd tmpfiles ensures directories exist before services start
- ProtectSystem=strict requires explicit ReadWritePaths allowlist
2025-10-07 09:38:07 +08:00
c05598d9e0
feat(viridian): implement comprehensive 3-2-1 backup strategy
Add automated snapshot and backup system with three independent tiers:

Snapper (hourly local snapshots):
- Configure snapper for all srv-* subvolumes
- Tiered retention: 24 hourly, 7 daily, 4 weekly, 12 monthly
- Snapshots stored at /.snapshots on viridian drive
- Provides fast operational rollback for user errors

Borgbackup onsite (hourly local backups):
- Independent staging snapshots at /.staging-onsite
- Repository on data drive at /srv/borg-repo
- Unencrypted (physical security assumed)
- Matches snapper retention policy
- Fast local disaster recovery

Borgbackup offsite (daily remote backups):
- Independent staging snapshots at /.staging-offsite
- Encrypted backups to borgbase repository
- Retention: 7 daily, 4 weekly, 12 monthly
- Remote disaster recovery with prune policy

Architecture decisions:
- Separate staging directories prevent job conflicts
- Staging snapshots decouple borg jobs from snapper
- Consistent zstd,9 compression across both borg jobs
- Special case handling for containers subvolume path
2025-10-06 20:59:26 +08:00
b0bfb37d3c
refactor(viridian): migrate service data to dedicated BTRFS subvolumes
Migrate from path-based persistence (/persist/var/lib/*) to dedicated
BTRFS subvolumes for better data isolation and snapshot capabilities.

- Move valuable user-facing services to /srv/* with srv-* subvolumes:
  - forgejo: git repositories and database
  - opengist: paste data
  - minecraft: game world data
  - lighttpd: static web content
  - containers: OCI container volumes

- Update home directory to use hm-sajenim subvolume on viridian disk
- Remove jupyterhub service (no longer in use)
- Update borgbackup paths to match new service locations
- Follow upstream service defaults where possible for maintainability

Services kept on /persist (disposable state):
- traefik, crowdsec, murmur
2025-10-06 13:07:46 +08:00
28ba8186bb
refactor(global): reorganize system packages by category
Restructured systemPackages list with alphabetically sorted categories to improve
maintainability and reduce vertical space. Added descriptive comments for all
environment configuration sections.
2025-10-05 22:37:48 +08:00
bc4321a3cc
refactor(desktop): remove discord import
Remove discord from desktop feature imports.
2025-10-05 16:45:25 +08:00
dda958a8fd
chore: update flake inputs
Updates agenix-rekey, claude-code-nix, nix-jetbrains-plugins,
and nixpkgs (stable/unstable) to latest versions.
2025-10-05 16:42:05 +08:00
341d8ecf45
docs: add explanatory comments to global configurations
Add comprehensive inline documentation to both NixOS and Home Manager
global configuration files, explaining the purpose of each section,
overlay usage, unfree package policy, and configuration settings.
2025-10-05 16:40:48 +08:00
94221dbb56
chore: update flake inputs
Update xmonad-config to latest revision (48) which includes resize functionality and directional window management improvements.
2025-10-05 10:57:00 +08:00
ee7141e74e
refactor(wezterm): remove unused pane rotation keybinds
Remove PageUp/PageDown pane rotation keybinds that don't align with wezterm workflow. The static pane layout approach (fixed splits + zoom toggle) doesn't benefit from rotation like dynamic window managers do.

Also update CLAUDE.md to clarify that Home Manager is a NixOS module, so just build/switch commands handle both system and user configurations together.
2025-10-05 10:53:54 +08:00
2e0a288a1a
Revert "chore: remove .mcp.json to enable on-demand only"
This reverts commit a0508da175.
2025-10-04 16:17:35 +08:00
a0508da175
chore: remove .mcp.json to enable on-demand only
The MCP server configuration will only be enabled when needed rather than being permanently configured.
2025-10-04 16:12:32 +08:00
d6e648595a
refactor(zsh): use nixpkgs packages for zsh plugins
Replace manual GitHub fetchFromGitHub with packaged versions of zsh plugins and consolidate plugin loading through the plugins list instead of manual sourcing.
2025-10-04 10:25:53 +08:00
9971d2d2a5
feat(wezterm): add Alt+Delete to focus master pane
Implements spatial "master pane" focusing that mirrors XMonad's master
window concept. Alt+Delete now focuses the largest pane in the current
tab, completing the unified Delete key semantic across all tools:

- Gui+Delete (XMonad): Focus master window (largest in layout)
- Alt+Delete (WezTerm): Focus master pane (largest, ties to lowest index)
- Delete (Neovim): Center cursor view

The implementation is spatially-aware rather than content-aware,
maintaining the navigation layer's positional abstraction. When panes
are equal-sized, the lowest-indexed pane is chosen for predictability.
2025-10-03 23:53:20 +08:00
3fe607d310
refactor(wezterm): organize keybindings with key table namespaces
Implemented key tables to create clean, organized namespaces for tab and
pane management. This refactoring improves keybinding discoverability and
reduces cognitive load by grouping related operations.

Key changes:
- LEADER + t enters tab mode (n/q/r for new/quit/rename)
- LEADER + p enters pane mode (s/v/q/m for split/vsplit/quit/maximize)
- LEADER + Escape enters copy mode (vim-like pseudo-normal mode)
- CTRL + SHIFT + v for paste (standard terminal convention)
- Removed smart-splits plugin in favor of simpler native navigation
- Navigation keys remain at top level for quick access
2025-10-03 16:33:17 +08:00
f7de9e3c05
feat(wezterm): unify navigation with XMonad keybindings
Add sequential pane navigation and rotation to match XMonad's window
management pattern. This creates consistent muscle memory across both
the window manager and terminal multiplexer.

Changes:
- Add Alt+PageUp/PageDown for sequential pane focus (mirrors XMonad's window cycling)
- Add Alt+Ctrl+PageUp/PageDown for pane rotation (mirrors XMonad's rotAll)
- Change Leader+Tab to Leader+t for new tab (free up 't' was for zoom, now 'm')
- Change zoom from Leader+t to Leader+m (matches XMonad's maximize mnemonic)

Keybinding philosophy:
- Base keys (Alt+PageUp/Down) = navigation/viewing
- Ctrl modifier = structural control (resize/rotate)
- Consistent with XMonad: Mod+PageUp/Down (focus), Mod+Ctrl+PageUp/Down (rotate)
2025-10-03 00:15:05 +08:00
83f23c3fd1
feat(wezterm): enhance tab management and simplify pane controls
Replace dynamic pane management with explicit keybindings for better
discoverability. Add dmenu-based tab renaming and direct tab navigation
by index for improved workflow efficiency.
2025-10-02 11:33:42 +08:00
591346600f
refactor: centralize unfree package allowlists
Move all allowUnfreePredicate declarations to global configs to prevent
the "last definition wins" merging issue. Unfree packages are now managed
in two central locations:
- NixOS system packages: nixos/common/global/default.nix
- Home Manager packages: home-manager/sajenim/global/default.nix
2025-10-01 10:23:20 +08:00
34b4705d46
feat: add Discord with BetterDiscord support 2025-10-01 10:13:46 +08:00
2ba755c7d1
chore: add MCP server configuration for NixOS integration 2025-09-30 16:36:57 +08:00
9353a5e50d
chore: add claude-code flake input
Include claude-code-nix overlay for AI-powered coding assistant
2025-09-30 16:11:13 +08:00
b4261d8a11
docs: clarify editor configuration comments
Add descriptive comments explaining overlay usage and package section purpose
2025-09-30 16:10:37 +08:00
696112f7cf
enlarge wezterm, this is the ideal size as we get 2x neovim panes at 100char + 5 char buffer 2025-09-29 20:23:58 +08:00
e5d1ba38d4
remove ollama service from fuchsia host
- Remove ollama service configuration and dependencies
- Clean up traefik routing for ollama web interface
- Comment out traefik service examples for clarity
2025-09-29 18:30:59 +08:00
5b4944696e
enhance wezterm: add intelligent development layout with Claude integration
- Create 3-pane layout automatically: editor (main), terminal (bottom 30%), Claude sidebar (left 25%)
- Implement smart focus management between editor and terminal panes
- Add zoom toggling for distraction-free editing sessions
- Launch Claude Code automatically in dedicated sidebar pane
2025-09-29 13:12:12 +08:00
abbf55046f
chore: bump inputs 2025-09-29 12:43:23 +08:00
24636c5081
unify splits with neovim 2025-09-29 11:05:21 +08:00
2a63eb381c
add Claude Code integration
- Add CLAUDE.md with comprehensive repository documentation
- Configure claude-code package in editors feature
- Add MCP nixos integration for better Nix ecosystem support
- Include Claude settings with co-authored-by disabled
- Update unfree predicate for proprietary AI tools
2025-09-29 09:13:00 +08:00
d25c4ad382
update flake inputs
- flake-parts: update for better module composition
- nixvim config: latest updates from upstream
- nixpkgs: fresh package versions
- ixx: bump to v0.1.1 for improved functionality
2025-09-29 09:11:56 +08:00
9c07f33ff8
we no longer use aider but lets keep this 2025-09-28 12:05:55 +08:00
f8e8c02a69
update context length 2025-09-27 21:29:15 +08:00
969075a5de
refactor traefik + add open-webui service 2025-09-27 10:16:18 +08:00
2f545a818f
update configuration of our ollama service 2025-09-26 23:28:15 +08:00
b0be0f9042
refactor 2025-09-26 19:04:48 +08:00
d414ff36ce
refactor 2025-09-26 18:07:05 +08:00
dc87a6ebe0
persiste /var/lib/private 2025-09-26 18:06:42 +08:00