diff --git a/mkdocs.yml b/mkdocs.yml index 4a3ec96..d1de6c1 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -21,6 +21,7 @@ nav: - via OS: - 'installing/os/index.md' - 'Ubuntu (Recommended)': 'installing/os/ubuntu.md' + - 'NixOS (very easy)': 'installing/os/nixos.md' - 'Arch Linux': 'installing/os/arch.md' - 'CentOS': 'installing/os/centos.md' - 'installing/os/debian.md' diff --git a/shell.nix b/shell.nix new file mode 100644 index 0000000..e6790be --- /dev/null +++ b/shell.nix @@ -0,0 +1,42 @@ +{pkgs ? import {}}: +pkgs.mkShell { + buildInputs = [ + pkgs.git + pkgs.nodejs_20 # Node.js for npm and compile.js + (pkgs.python3.withPackages (ps: + with ps; [ + mkdocs + mkdocs-material + pillow # Required for mkdocs-material[imaging] + cairosvg # Required for mkdocs-material[imaging] + ])) + ]; + + shellHook = '' + echo "Setting up environment for NodeBB documentation..." + + # Create symbolic link only if it doesn't exist + if [ ! -e docs ]; then + ln -sf ./src/docs docs + echo "Created symbolic link: docs -> src/docs" + else + echo "Symbolic link 'docs' already exists or is not needed, skipping" + fi + + # Run npm install if node_modules is missing + if [ ! -d node_modules ]; then + npm install + echo "Node.js dependencies installed" + else + echo "Node.js dependencies already installed, skipping" + fi + + # Run the compile script + node src/compile.js && echo "Compilation completed successfully" || { + echo "Error: Compilation failed" + exit 1 + } + + echo "Environment ready. Run 'mkdocs serve' to preview the documentation or 'mkdocs build' to generate the static site." + ''; +} diff --git a/src/docs/installing/os/nixos.md b/src/docs/installing/os/nixos.md new file mode 100644 index 0000000..f9b8230 --- /dev/null +++ b/src/docs/installing/os/nixos.md @@ -0,0 +1,259 @@ +NixOS +===== + +MySQL +----- + +Create file `shell.nix` with the following content (adjust the variables as needed): +```nix +{ + pkgs ? import { }, +}: +let + # adjust the following variables as needed + # Define NodeBB version and repository + nodebbRepo = "https://github.com/MBanucu/NodeBB.git"; + nodebbBranch = "mysql-backup2"; # MySQL branch + + # Define NodeBB admin credentials + nodebbAdminUsername = "admin"; # Set your admin username + nodebbAdminPassword = "admin_password"; # Set your admin password + nodebbAdminEmail = "your_nodebb_admin_email_here@gmail.com"; # Set your admin email + + # Define MySQL database credentials + mysqlUsername = "nodebb_user"; # MySQL username for NodeBB + mysqlPassword = "nodebb_user_password"; # MySQL password for NodeBB + mysqlDatabase = "nodebb"; # MySQL database for NodeBB + + development = true; # Set to false for non-development mode + + MYSQL_HOME = "${builtins.getEnv "PWD"}/mysql"; + MYSQL_DATADIR = "${MYSQL_HOME}/data"; + MYSQL_UNIX_PORT = "${MYSQL_HOME}/mysql.sock"; + MYSQL_PID_FILE = "${MYSQL_HOME}/mysql.pid"; + + JSON_CONFIG_TEST = '' + { + "test_database": { + "socketPath": "${MYSQL_UNIX_PORT}", + "username": "${mysqlUsername}_test", + "password": "${mysqlPassword}", + "database": "${mysqlDatabase}_test" + } + } + ''; + + UUID_SECRET = builtins.replaceStrings [ "\n" ] [ "" ] ( + builtins.readFile ( + pkgs.runCommand "generate-uuid" { } '' + ${pkgs.util-linux}/bin/uuidgen > $out + '' + ) + ); + + JSON_CONFIG = '' + { + "url": "http://localhost:4567", + "port": "4567", + "secret": "${UUID_SECRET}", + "database": "mysql", + "mysql:host": "127.0.0.1", + "mysql:port": "3306", + "mysql:socketPath": "${MYSQL_UNIX_PORT}", + "mysql:username": "${mysqlUsername}", + "mysql:password": "${mysqlPassword}", + "mysql:database": "${mysqlDatabase}", + "admin:username": "${nodebbAdminUsername}", + "admin:password": "${nodebbAdminPassword}", + "admin:password:confirm": "${nodebbAdminPassword}", + "admin:email": "${nodebbAdminEmail}" + } + ''; + + JSON_VSCODE_TASKS = '' + { + "version": "2.0.0", + "tasks": [ + { + "label": "Run grunt", + "type": "shell", + "command": "node ./node_modules/.bin/grunt", + "runOptions": { + "runOn": "folderOpen" + } + } + ] + } + ''; + + JSON_VSCODE_SETTINGS = '' + { + "mochaExplorer.env": { + "CI": "true" + } + } + ''; + + masterOverlays = [ + ( + self: super: + let + nix-vscode-extensions = import ( + fetchTarball "https://github.com/nix-community/nix-vscode-extensions/archive/master.tar.gz" + ); + nixpkgsMaster = + import + (builtins.fetchTarball { + url = "https://github.com/NixOS/nixpkgs/archive/master.tar.gz"; + }) + { + config.allowUnfree = true; + overlays = [ + nix-vscode-extensions.overlays.default + ]; + }; + in + { + # nodejs_20 version is 20.18 of NixOS 24.11 but we need 20.19 for require(ESM) + nodejs_20 = nixpkgsMaster.nodejs_20; + vscode = ( + nixpkgsMaster.vscode-with-extensions.override { + vscode = nixpkgsMaster.vscode; + vscodeExtensions = with nixpkgsMaster.vscode-marketplace; [ + ms-vscode.test-adapter-converter + hbenl.vscode-test-explorer + hbenl.vscode-mocha-test-adapter + + jnoortheen.nix-ide + ]; + } + ); + } + ) + ]; + pkgsMaster = import { overlays = masterOverlays; }; +in +pkgs.mkShell { + name = "nodebb-env"; + + buildInputs = + with pkgs; + [ + pkgsMaster.nodejs_20 # NodeBB recommends Node.js 20.19 or higher + git # For cloning NodeBB + mysql80 # MySQL 8.0, because MariaDB doesn't work right now + jq # For JSON manipulation + ] + ++ ( + if development then + [ + nodePackages.grunt-cli + nixfmt-rfc-style + pkgsMaster.vscode + ] + else + [ ] + ); + + shellHook = '' + # Set up environment variables + export MYSQL_HOME="${MYSQL_HOME}" + export MYSQL_DATADIR="${MYSQL_DATADIR}" + export MYSQL_UNIX_PORT="${MYSQL_UNIX_PORT}" + export MYSQL_PID_FILE="${MYSQL_PID_FILE}" + alias mysql='mysql -u root' + + # Set up MySQL 8.0 + if [ ! -d "${MYSQL_HOME}" ]; then + echo "Initializing MySQL 8.0..." + mkdir -p "${MYSQL_HOME}" + mysqld --initialize-insecure --datadir="${MYSQL_DATADIR}" --basedir="${pkgs.mysql80}" \ + --pid-file="${MYSQL_PID_FILE}" + fi + + # Start MySQL daemon + echo "Starting MySQL 8.0..." + mysqld --no-defaults --skip-networking --datadir="${MYSQL_DATADIR}" \ + --pid-file="${MYSQL_PID_FILE}" --socket="${MYSQL_UNIX_PORT}" \ + 2> "${MYSQL_HOME}/mysql.log" & + MYSQL_PID=$! + + # Wait for MySQL to start + echo "Waiting for MySQL to be ready..." + while ! mysqladmin ping --socket="${MYSQL_UNIX_PORT}" --silent; do + sleep 1 + done + + # Create NodeBB database and user + echo "Setting up NodeBB database..." + mysql --socket="${MYSQL_UNIX_PORT}" -u root < config.json + + echo "setting up grunt task for VSCode for development mode..." + mkdir -p .vscode + echo '${JSON_VSCODE_TASKS}' | jq . --indent 4 > .vscode/tasks.json + + echo "setting up Mocha Test Explorer plugin for VSCode for development mode..." + echo '${JSON_VSCODE_SETTINGS}' | jq . --indent 4 > .vscode/settings.json + fi + + node ./nodebb setup '${JSON_CONFIG}' + + if [ ${toString development} ]; then + echo "Running npm install for development mode..." + npm install + fi + fi + + if [ ${toString development} ]; then + code . + fi + + echo "NodeBB environment is set up!" + ''; +} +``` +Run +``` +nix-shell +``` +in the directory where `shell.nix` is located. +Leave the nix shell open or else everything closes.