From 6b426eaa55b0d22f83b5e79ad85d3c2c2ee49c4e Mon Sep 17 00:00:00 2001 From: oqyude Date: Thu, 6 Aug 2026 17:53:11 +0300 Subject: [PATCH] add termux device type with shared home-manager userspace module --- droid/epral.nix | 46 ++++++-- flake.nix | 2 +- home/shared/strict.nix | 218 +++++++++++++++++++++++++++++++++++++ modules/default.nix | 40 ++++--- modules/options.nix | 1 + modules/termux/default.nix | 9 ++ test/flake.lock | 187 ------------------------------- test/flake.nix | 21 ---- test/nix-on-droid.nix | 48 -------- 9 files changed, 293 insertions(+), 279 deletions(-) create mode 100644 home/shared/strict.nix create mode 100644 modules/termux/default.nix delete mode 100644 test/flake.lock delete mode 100644 test/flake.nix delete mode 100644 test/nix-on-droid.nix diff --git a/droid/epral.nix b/droid/epral.nix index 7a07d9d..f71e7db 100644 --- a/droid/epral.nix +++ b/droid/epral.nix @@ -1,19 +1,34 @@ -{ inputs, ... }@flakeContext: +{ + inputs, + ... +}@flakeContext: let # Host: epral (Android device via nix-on-droid, aarch64-linux) - # Adapted from test/nix-on-droid.nix — the config that works on the device. - # NOTE: nix-on-droid uses its own module system (class = "nixOnDroid"). - # Only nix-on-droid options exist here: environment.*, nix.*, time.*, - # networking.hosts, user.*, home-manager.*, system.stateVersion, android-integration.* - # NixOS-only options (boot.*, services.*, hardware.*, fileSystems.*, ...) do NOT exist. + # Integrates with the base defaultModule (imports.self.nixosModules.default), + # which is trimmed for the "termux" device type: NixOS-only modules + # (essentials, users.nix, home-manager, sops-nix, disko, grub2-themes) + # and nixpkgs.overlays are skipped so it evaluates under nix-on-droid's + # module system (class = "nixOnDroid"). nixOnDroidModule = { - config, lib, pkgs, + xlib, ... }: { + imports = [ + inputs.self.nixosModules.default # base defaultModule (termux-trimmed) + ]; + + xlib.device = { + type = "termux"; + hostname = "epral"; + }; + + # Minimal termux settings (nix-on-droid options only: + # environment.*, nix.*, time.*, user.*, system.*, android-integration.*) + # user.userName defaults to "nix-on-droid"; set it to override. # user.home is read-only: /data/data/com.termux.nix/files/home @@ -48,6 +63,20 @@ let # Backup etc files instead of failing to activate generation if a file already exists in /etc environment.etcBackupExtension = ".bak"; + # Shared userspace home-manager config (same cozy shell as on NixOS hosts). + # nix-on-droid forces home.username / home.homeDirectory from user.*, + # so the strict module must not set them. + home-manager = { + useGlobalPkgs = true; + backupFileExtension = "hm-bak"; + config = { ... }: { + imports = [ + ../home/shared/strict.nix + ]; + home.stateVersion = "24.05"; + }; + }; + # Read the changelog before changing this value system.stateVersion = "24.05"; @@ -69,4 +98,7 @@ inputs.nix-on-droid.lib.nixOnDroidConfiguration { modules = [ nixOnDroidModule ]; + extraSpecialArgs = { + deviceType = "termux"; + }; } diff --git a/flake.nix b/flake.nix index fd53011..315cdb1 100644 --- a/flake.nix +++ b/flake.nix @@ -25,7 +25,7 @@ }; }; nix-on-droid = { - url = "github:nix-community/nix-on-droid/testing"; # same branch as test/ on the device + url = "github:nix-community/nix-on-droid/testing"; # testing branch, used on the device inputs = { nixpkgs.follows = "nixpkgs"; home-manager.follows = "home-manager"; diff --git a/home/shared/strict.nix b/home/shared/strict.nix new file mode 100644 index 0000000..baa261a --- /dev/null +++ b/home/shared/strict.nix @@ -0,0 +1,218 @@ +{ + config, + lib, + pkgs, + ... +}: +# Shared "strict" home-manager module. +# Works in BOTH contexts: +# - NixOS hosts (via home-manager.sharedModules or homeConfigurations) +# - nix-on-droid (via home-manager.config in droid/epral.nix) +# Only home-manager options are used here — no systemd.*, no services.*, +# no users.*, no environment.systemPackages. All paths are parameterized +# through config.home.homeDirectory so /home/oqyude (NixOS) and +# /data/data/com.termux.nix/files/home (termux) both work. +# +# NOTE: intentionally duplicates parts of modules/essentials/{shell,packages}.nix +# (which stay NixOS-only for now). When this module is wired into NixOS hosts +# via sharedModules, deduplicate those files. +{ + home.packages = with pkgs; [ + # Lazy (alias lc) + lazycli + + # IDE + fresh-editor # EDITOR + + # Base utils + curl + wget + fd + tree + dust + gdu + mc + rsync + jq + unzip + zip + zstd + + # Net diagnostic + mtr + dnsutils + + # Monitoring + htop + ]; + + home.sessionVariables = { + TUCKR_HOME = "$HOME/Storage/dotfiles"; + EDITOR = "fresh"; + }; + + home.file.".nanorc".text = '' + set nowrap + set tabstospaces + set tabsize 2 + ''; + + programs = { + # ---- Shell: zsh ---- + zsh = { + enable = true; + enableCompletion = true; + syntaxHighlighting.enable = true; + history.size = 10000; + oh-my-zsh = { + enable = true; + theme = "robbyrussell"; + }; + loginExtra = "clear && fastfetch"; + initContent = '' + beet-p() { + local base="${config.home.homeDirectory}/.config/beets/My" + local rel + rel=$(realpath --relative-to="$base" "$PWD") + beet mod "path:$rel" playlist="$*" + } + beet-ims() { + beet im ./ -S $* + } + beet-path() { + realpath --relative-to="${config.home.homeDirectory}/.config/beets/My" "$1" + } + ''; + shellAliases = { + # shell + ff = "clear && fastfetch"; + l = "ls -l"; + lg = "lazygit"; + lc = "lazycli"; + gp = "git pull"; + gp-ns = "gp && ns"; + gc = "git add . && git commit -m 'dev: автокоммит $(date +'%Y-%m-%d %H:%M:%S')'"; + y = "yazi"; + nix-shellp = "nix-shell --run $SHELL -p"; + beet-path-library = "realpath --relative-to='${config.home.homeDirectory}/.config/beets/My' ."; + z-proxy = "export ALL_PROXY=socks5://localhost:10808"; + zh-proxy = "export HTTPS_PROXY=http://localhost:10808 && export HTTP_PROXY=http://localhost:10808"; + + # beets + beet-ima = "beet im ./ -A"; + + # ssh + z-s = "ssh sapphira"; + z-st = "ssh sapphira-tailscale"; + z-o = "ssh otreca"; + z-ot = "ssh otreca-tailscale"; + z-l = "ssh lamet"; + z-lt = "ssh lamet-tailscale"; + z-p-1 = "ssh pubray-1"; + z-map-local-proxy = "ssh -R 10808:localhost:10808"; + + # Extras + plasma-manager = "nix run github:nix-community/plasma-manager"; + pip2nix = "nix run github:nix-community/pip2nix --"; # https://github.com/nix-community/pip2nix + pip2nix-g = "nix run github:nix-community/pip2nix -- generate -r"; + json2nix = "nix run github:sempruijs/json2nix"; + }; + }; + + # ---- Editor ---- + # NOTE: programs.nano is a NixOS-only module (does not exist in + # home-manager); write ~/.nanorc directly instead. + # ---- TUI tools ---- + bat.enable = true; + lazygit.enable = true; + fzf.enable = true; + + btop.enable = true; + broot.enable = true; + bottom.enable = true; + fastfetch.enable = true; + + yazi = { + enable = true; + # explicit: shared module must behave identically on NixOS (26.05, "y") + # and nix-on-droid (24.05, legacy "yy") + shellWrapperName = "y"; + plugins = { + inherit (pkgs.yaziPlugins) + gitui + git + sudo + ouch + rsync + diff + mount + chmod + dupes + lazygit + toggle-pane + rich-preview + smart-filter + full-border + recycle-bin + ; + }; + flavors = { + nord = pkgs.yaziPlugins.nord; + }; + theme = { + flavor = { + light = "nord"; + dark = "nord"; + }; + }; + keymap = { + mgr.prepend_keymap = [ + { + on = [ + "M" + ]; + run = "plugin mount"; + desc = "Mount manager"; + } + { + on = [ + "g" + "i" + ]; + run = "plugin lazygit"; + desc = "run lazygit"; + } + { + run = "plugin ouch --args=zip"; + on = [ + "g" + "C" + ]; + desc = "Compress with ouch"; + } + ]; + }; + settings = { + mgr.ratio = [ + 1 + 1 + 4 + ]; + }; + }; + + # ---- VCS ---- + git = { + enable = true; + settings = { + user = { + name = "oqyude"; + email = "oqyude@gmail.com"; + }; + pull = { + rebase = true; + }; + }; + }; + }; +} diff --git a/modules/default.nix b/modules/default.nix index dcd49fb..2b58e78 100644 --- a/modules/default.nix +++ b/modules/default.nix @@ -9,22 +9,32 @@ let ... }: { - imports = with inputs; [ - ./essentials - ./users.nix - ./options.nix - (./. + "/${deviceType}") # specific modules + # NixOS-only modules. termux runs nix-on-droid (its own module system, + # class = "nixOnDroid"): options like services.*, users.*, sops.*, disko.* + # and nixpkgs.overlays (flake assertion) do not exist there. + imports = + with inputs; + [ + ./options.nix + (./. + "/${deviceType}") # specific modules + ] + ++ lib.optionals (deviceType != "termux") [ + ./essentials + ./users.nix - home-manager.nixosModules.home-manager # home-manager module - # nix-index-database.nixosModules.nix-index # nix-index module - grub2-themes.nixosModules.default # grub2 themes module - sops-nix.nixosModules.sops # sops module - self.homeConfigurations.default.nixosModule # default homeConfigurations - disko.nixosModules.disko # disko module - ]; - nixpkgs.overlays = with inputs; [ - self.nixosOverlays.default - ]; + home-manager.nixosModules.home-manager # home-manager module + # nix-index-database.nixosModules.nix-index # nix-index module + grub2-themes.nixosModules.default # grub2 themes module + sops-nix.nixosModules.sops # sops module + self.homeConfigurations.default.nixosModule # default homeConfigurations + disko.nixosModules.disko # disko module + ]; + # nix-on-droid asserts that nixpkgs.* stays unset in flake mode. + nixpkgs.overlays = lib.mkIf (deviceType != "termux") ( + with inputs; [ + self.nixosOverlays.default + ] + ); _module.args = { inputs = inputs; xlib = config.xlib; diff --git a/modules/options.nix b/modules/options.nix index 91ded17..ec34c7e 100644 --- a/modules/options.nix +++ b/modules/options.nix @@ -16,6 +16,7 @@ "vds" "vds-new" "wsl" + "termux" ]; default = "minimal"; description = "Type of device for this host."; diff --git a/modules/termux/default.nix b/modules/termux/default.nix new file mode 100644 index 0000000..79b8d1e --- /dev/null +++ b/modules/termux/default.nix @@ -0,0 +1,9 @@ +{ + lib, + pkgs, + ... +}: +{ + # imports = [ + # ]; +} diff --git a/test/flake.lock b/test/flake.lock deleted file mode 100644 index 5c4b499..0000000 --- a/test/flake.lock +++ /dev/null @@ -1,187 +0,0 @@ -{ - "nodes": { - "home-manager": { - "inputs": { - "nixpkgs": [ - "nix-on-droid", - "nixpkgs" - ] - }, - "locked": { - "lastModified": 1709445365, - "narHash": "sha256-DVv6nd9FQBbMWbOmhq0KVqmlc3y3FMSYl49UXmMcO+0=", - "owner": "nix-community", - "repo": "home-manager", - "rev": "4de84265d7ec7634a69ba75028696d74de9a44a7", - "type": "github" - }, - "original": { - "owner": "nix-community", - "repo": "home-manager", - "type": "github" - } - }, - "nix-formatter-pack": { - "inputs": { - "nixpkgs": [ - "nix-on-droid", - "nixpkgs" - ], - "nmd": [ - "nix-on-droid", - "nmd" - ], - "nmt": "nmt" - }, - "locked": { - "lastModified": 1705252799, - "narHash": "sha256-HgSTREh7VoXjGgNDwKQUYcYo13rPkltW7IitHrTPA5c=", - "owner": "Gerschtli", - "repo": "nix-formatter-pack", - "rev": "2de39dedd79aab14c01b9e2934842051a160ffa5", - "type": "github" - }, - "original": { - "owner": "Gerschtli", - "repo": "nix-formatter-pack", - "type": "github" - } - }, - "nix-on-droid": { - "inputs": { - "home-manager": "home-manager", - "nix-formatter-pack": "nix-formatter-pack", - "nixpkgs": [ - "nixpkgs" - ], - "nixpkgs-docs": "nixpkgs-docs", - "nixpkgs-for-bootstrap": "nixpkgs-for-bootstrap", - "nmd": "nmd" - }, - "locked": { - "lastModified": 1772387862, - "narHash": "sha256-o7q9flWMCsFW2mkz8TQhvPUcwFczO7VX9I6U2u2vN4o=", - "owner": "nix-community", - "repo": "nix-on-droid", - "rev": "67b105336cb06b764366bfe241afa2352de6a926", - "type": "github" - }, - "original": { - "owner": "nix-community", - "ref": "testing", - "repo": "nix-on-droid", - "type": "github" - } - }, - "nixpkgs": { - "locked": { - "lastModified": 1785967620, - "narHash": "sha256-IItrdb7Puk05RqOBWZYFC5X6Wl1sJmCfh5MWVHw5iMM=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "b7c2ada94fe99c15b0dbcf4d11fd7850b957a436", - "type": "github" - }, - "original": { - "owner": "NixOS", - "ref": "nixos-unstable", - "repo": "nixpkgs", - "type": "github" - } - }, - "nixpkgs-docs": { - "locked": { - "lastModified": 1705957679, - "narHash": "sha256-Q8LJaVZGJ9wo33wBafvZSzapYsjOaNjP/pOnSiKVGHY=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "9a333eaa80901efe01df07eade2c16d183761fa3", - "type": "github" - }, - "original": { - "owner": "NixOS", - "ref": "release-23.05", - "repo": "nixpkgs", - "type": "github" - } - }, - "nixpkgs-for-bootstrap": { - "locked": { - "lastModified": 1772047000, - "narHash": "sha256-7DaQVv4R97cii/Qdfy4tmDZMB2xxtyIvNGSwXBBhSmo=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "1267bb4920d0fc06ea916734c11b0bf004bbe17e", - "type": "github" - }, - "original": { - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "1267bb4920d0fc06ea916734c11b0bf004bbe17e", - "type": "github" - } - }, - "nmd": { - "inputs": { - "nixpkgs": [ - "nix-on-droid", - "nixpkgs-docs" - ], - "scss-reset": "scss-reset" - }, - "locked": { - "lastModified": 1705050560, - "narHash": "sha256-x3zzcdvhJpodsmdjqB4t5mkVW22V3wqHLOun0KRBzUI=", - "owner": "~rycee", - "repo": "nmd", - "rev": "66d9334933119c36f91a78d565c152a4fdc8d3d3", - "type": "sourcehut" - }, - "original": { - "owner": "~rycee", - "repo": "nmd", - "type": "sourcehut" - } - }, - "nmt": { - "flake": false, - "locked": { - "lastModified": 1648075362, - "narHash": "sha256-u36WgzoA84dMVsGXzml4wZ5ckGgfnvS0ryzo/3zn/Pc=", - "owner": "rycee", - "repo": "nmt", - "rev": "d83601002c99b78c89ea80e5e6ba21addcfe12ae", - "type": "gitlab" - }, - "original": { - "owner": "rycee", - "repo": "nmt", - "type": "gitlab" - } - }, - "root": { - "inputs": { - "nix-on-droid": "nix-on-droid", - "nixpkgs": "nixpkgs" - } - }, - "scss-reset": { - "flake": false, - "locked": { - "lastModified": 1631450058, - "narHash": "sha256-muDlZJPtXDIGevSEWkicPP0HQ6VtucbkMNygpGlBEUM=", - "owner": "andreymatin", - "repo": "scss-reset", - "rev": "0cf50e27a4e95e9bb5b1715eedf9c54dee1a5a91", - "type": "github" - }, - "original": { - "owner": "andreymatin", - "repo": "scss-reset", - "type": "github" - } - } - }, - "root": "root", - "version": 7 -} diff --git a/test/flake.nix b/test/flake.nix deleted file mode 100644 index bbdb13a..0000000 --- a/test/flake.nix +++ /dev/null @@ -1,21 +0,0 @@ -{ - description = "Basic example of Nix-on-Droid system config."; - - inputs = { - nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable"; - - nix-on-droid = { - url = "github:nix-community/nix-on-droid/testing"; - inputs.nixpkgs.follows = "nixpkgs"; - }; - }; - - outputs = { self, nixpkgs, nix-on-droid }: { - - nixOnDroidConfigurations.default = nix-on-droid.lib.nixOnDroidConfiguration { - pkgs = import nixpkgs { system = "aarch64-linux"; }; - modules = [ ./nix-on-droid.nix ]; - }; - - }; -} diff --git a/test/nix-on-droid.nix b/test/nix-on-droid.nix deleted file mode 100644 index 254faa9..0000000 --- a/test/nix-on-droid.nix +++ /dev/null @@ -1,48 +0,0 @@ -{ config, lib, pkgs, ... }: - -{ - # Simply install just the packages - environment.packages = with pkgs; [ - # User-facing stuff that you really really want to have - vim # or some other editor, e.g. nano or neovim - - # Some common stuff that people expect to have -openssh -treefmt -git -procps - killall - diffutils - findutils - utillinux - tzdata - hostname - man - gnugrep - gnupg - gnused - gnutar - bzip2 - gzip - #xz - zip - unzip - nano - ]; - - # Backup etc files instead of failing to activate generation if a file already exists in /etc - environment.etcBackupExtension = ".bak"; - - # Read the changelog before changing this value - system.stateVersion = "24.05"; - - # Set up nix for flakes - nix.extraOptions = '' - experimental-features = nix-command flakes - ''; - - # Set your time zone - time.timeZone = "Europe/Moscow"; - - android-integration.termux-setup-storage.enable = true; -}