From 3a66a152e78f2ac657e5e3c7d62bae9687c9f676 Mon Sep 17 00:00:00 2001 From: spy4x <2spy4x@gmail.com> Date: Wed, 6 Mar 2024 22:17:11 +0800 Subject: [PATCH] feat: add NixOS configuration.nix file and shell script to rebuild it --- .editorconfig | 18 ++++++ .gitignore | 3 + Makefile | 7 +++ README.md | 17 +++--- build-nix.sh | 25 ++++++++ configuration.nix | 129 +++++++++++++++++++++++++++++++++++++++++ ssh-config.nix.example | 12 ++++ 7 files changed, 204 insertions(+), 7 deletions(-) create mode 100644 .editorconfig create mode 100644 Makefile create mode 100755 build-nix.sh create mode 100644 configuration.nix create mode 100644 ssh-config.nix.example diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..521359e --- /dev/null +++ b/.editorconfig @@ -0,0 +1,18 @@ +# EditorConfig is awesome: https://editorconfig.org + +# top-most .editorconfig file +root = true + +# All files +[*] +indent_style = space # Use spaces for indentation +indent_size = 2 # Number of spaces used per indentation level + + +# Override for Makefile +[Makefile] +indent_style = tab + +# Markdown files (md) +[*.md] +trim_trailing_whitespace = false # Markdown can use trailing whitespace for line breaks \ No newline at end of file diff --git a/.gitignore b/.gitignore index e55ae50..317688c 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,6 @@ # IDEs .idea/ + +# Ignore private configurations +ssh-config.nix \ No newline at end of file diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..c5d5f99 --- /dev/null +++ b/Makefile @@ -0,0 +1,7 @@ +# Makefile for updating NixOS configuration + +.PHONY: all + +# Default target +all: + ./build-nix.sh \ No newline at end of file diff --git a/README.md b/README.md index 8e9792d..236c750 100644 --- a/README.md +++ b/README.md @@ -1,19 +1,22 @@ # Dotfiles -This repository is my setup for a new MacOS computer. +In this repo I store my config files. +- `Brewfile` for macOS (I'm about to drop it). +- `configuration.nix` for NixOS (a new linux distro for me, that I'm exploring as a replacement for macOS). It helps me to install quickly all software I need for work and fun. -Feel free to check & alter the list of software to be installed - [Brewfile](Brewfile). - -Additionally I install next software, that is not (yet) presented in Brew: - -- Upwork -- Toggl Track +Feel free to check & alter the list of software to be installed in these files. ## Installation +### macOS/Brew 1. Install Brew from here: https://brew.sh/ 2. Copy Brewfile to your computer and run `brew bundle` from the same folder where you copied the file. 3. Run `chmod +x ./cron-adjust-microphone-gain-to-100.sh` and `./cron-adjust-microphone-gain-to-100.sh` [to change microphone gain to 100% on macOS](https://apple.stackexchange.com/questions/97810/mac-osx-microphone-input-volume-level-auto-adjusts-can-it-be-disabled). Note: Brew will ask you for the root password and other apps inside Brewfile might ask you for your password as well. Usually installation takes 10-20 min, so make sure to brew a cup of tea or coffee :) + +### NixOS +1. `chmod +x ./build-nix.sh` +2. [Optionally] SSH Config `cp ./ssh-config.nix.example ./ssh-config.nix` and fill with your values. +3. [First run] `./build-nix.sh` or [then] just `make` \ No newline at end of file diff --git a/build-nix.sh b/build-nix.sh new file mode 100755 index 0000000..798b151 --- /dev/null +++ b/build-nix.sh @@ -0,0 +1,25 @@ +#!/bin/sh + +# Make sure that the script exits if any command returns a non-zero exit code +set -e + +# Define the path to the system configuration file +NIXOS_CONFIG_PATH="/etc/nixos/configuration.nix" + +echo "Checking for sudo access..." +# Ensure the script is being run with superuser privileges +sudo -v + +echo "Backing up current configuration..." +# Create a backup of the current configuration file with a timestamp +sudo cp "${NIXOS_CONFIG_PATH}" "${NIXOS_CONFIG_PATH}-backup-$(date +%F-%H-%M-%S)" + +echo "Copying new configuration..." +# Copy the local configuration.nix to the system configuration location +sudo cp ./configuration.nix "${NIXOS_CONFIG_PATH}" + +echo "Rebuilding NixOS configuration..." +# Rebuild the NixOS configuration and make the changes effective +sudo nixos-rebuild switch + +echo "NixOS configuration updated successfully." \ No newline at end of file diff --git a/configuration.nix b/configuration.nix new file mode 100644 index 0000000..c8c1da5 --- /dev/null +++ b/configuration.nix @@ -0,0 +1,129 @@ +# Edit this configuration file to define what should be installed on +# your system. Help is available in the configuration.nix(5) man page +# and in the NixOS manual (accessible by running ‘nixos-help’). + +{ config, pkgs, lib, ... }: + +let + sshConfigPath = ./ssh-config.nix; +in +{ + imports = + [ # Include the results of the hardware scan. + ./hardware-configuration.nix + ] ++ lib.optional (builtins.pathExists sshConfigPath) sshConfigPath; + + # Bootloader. + boot.loader.grub.enable = true; + boot.loader.grub.device = "/dev/nvme0n1"; + boot.loader.grub.useOSProber = true; + + networking.hostName = "spy4x-pc"; + networking.networkmanager.enable = true; + + # Allow install "unfree" apps, like Google Chrome or WebStorm + nixpkgs.config.allowUnfree = true; + + time.timeZone = "Asia/Singapore"; + + i18n.defaultLocale = "en_SG.UTF-8"; + i18n.extraLocaleSettings = { + LC_ADDRESS = "en_SG.UTF-8"; + LC_IDENTIFICATION = "en_SG.UTF-8"; + LC_MEASUREMENT = "en_SG.UTF-8"; + LC_MONETARY = "en_SG.UTF-8"; + LC_NAME = "en_SG.UTF-8"; + LC_NUMERIC = "en_SG.UTF-8"; + LC_PAPER = "en_SG.UTF-8"; + LC_TELEPHONE = "en_SG.UTF-8"; + LC_TIME = "en_SG.UTF-8"; + }; + + # Enable the X11 windowing system. + services.xserver.enable = true; + + # Enable the GNOME Desktop Environment. + services.xserver.displayManager.gdm.enable = true; + services.xserver.desktopManager.gnome.enable = true; + + # Configure keymap in X11 + services.xserver = { + layout = "us"; + xkbVariant = ""; + }; + + # Activate and configure Docker + virtualisation.docker.enable = true; + virtualisation.docker.autoPrune.enable = true; + # virtualisation.docker.enableNvidia = true; # experiment for Roley? + + # Enable sound with pipewire. + sound.enable = true; + hardware.pulseaudio.enable = false; + security.rtkit.enable = true; + services.pipewire = { + enable = true; + alsa.enable = true; + alsa.support32Bit = true; + pulse.enable = true; + }; + + # Define a user account. Don't forget to set a password with ‘passwd’. + users.users.spy4x = { + isNormalUser = true; + description = "Anton Shubin"; + extraGroups = [ + "networkmanager" + "wheel" + "bluetooth" + "docker" + ]; + packages = with pkgs; [ + # Shell tools + git + gnumake # Source for "make" command + htop # System monitor viewer + unzip + killall # Kill processes by name instead of PID + ncdu # Disk space usage stats, per folder, nested + libwebp # Convert images into .webp format + speedtest-rs # Internet speed test + wl-clipboard # Wayland's clipboard copy/paste cli tools + tree + + # Work + nodejs_21 + nodePackages.pnpm + vscode-fhs # Wrapped variant of vscode which launches in a FHS compatible environment. Should allow for easy usage of extensions without nix-specific modifications. + jetbrains.webstorm + upwork + slack + ffmpeg # for Roley project + awscli + + # Other + google-chrome + bitwarden # Password manager client + vlc + obs-studio # Video recorder and stream software + solaar # Logitech devices GUI. Strictly use with sudo, otherwise it doesn't see devices. + ]; + }; + programs.steam.enable = true; # Install Steam for games management + + # Shell aliases and other init + environment.interactiveShellInit = '' + alias copy='wl-copy <' + alias build='sudo nixos-rebuild switch' + ''; + + # Enable automatic login for the user. + services.xserver.displayManager.autoLogin.enable = true; + services.xserver.displayManager.autoLogin.user = "spy4x"; + + # Workaround for GNOME autologin: https://github.com/NixOS/nixpkgs/issues/103746#issuecomment-945091229 + systemd.services."getty@tty1".enable = false; + systemd.services."autovt@tty1".enable = false; + + system.stateVersion = "23.11"; +} \ No newline at end of file diff --git a/ssh-config.nix.example b/ssh-config.nix.example new file mode 100644 index 0000000..cb2824d --- /dev/null +++ b/ssh-config.nix.example @@ -0,0 +1,12 @@ +# Part of config, to remote machine aliases for SSH + +{ ... }: { + programs.ssh.extraConfig = '' + + Host my-remote-machine # alias to do "ssh my remote-machine" + HostName 192.192.192.192 # ip/hostname + User my-user # username + + # ... other hosts + ''; +} \ No newline at end of file