f70b1d3a1b
CI / commits (pull_request) Successful in 2m52s
CI / check (pull_request) Successful in 3m3s
CI / scan (pull_request) Successful in 3m11s
CI / a11y (pull_request) Successful in 3m5s
Docs site / build (pull_request) Successful in 3m10s
CI / perf (pull_request) Successful in 6m53s
New procedure in docs/setup/01-dev-debian-vm-setup.md targeting the new dev VM (10.100.201.21, Debian 13) that replaces the WSL workflow. The existing setup files are renumbered (01->02, 02->03, 03->04) to free prefix 01 for the default flow. 10 modular idempotent scripts under docs/setup/scripts/ install the stack: zsh + Oh My Zsh + Powerlevel10k + plugins, modern CLI tooling (bat, eza, fd-find, ripgrep, fzf, zoxide, ncdu, keychain + dev extras), nvm + Node from .nvmrc + corepack + pnpm, Docker CE + compose plugin, inotify watches + swap + hostname tuning, best-effort UFW + sshd hardening that probes-before-applying, and notes/aliases.zsh + notes/gitconfig.txt installation. A systemd template (apf-portal-infra@.service) auto-starts the local dev infra stack at boot per user. .devcontainer/ ships a VSCode Dev Container spec pinning Node 24 and attaching to the host's apf-portal-dev Compose network so postgres / redis / otel resolve by DNS from inside the container. initializeCommand fails fast if the infra hasn't been brought up yet. CLAUDE.md Environment conventions documents the two envs (local + development) plus the hybrid sub-mode (workstation IDE + VM infra via SSH LocalForward) and the two IDE flows (Remote-SSH + Devcontainer). Adjacent follow-ups (not in this PR): preview infra on the GitLab VM (10.100.201.10), GitLab Runner migration alongside the Gitea -> GitLab cutover, private dotfiles repo.
55 lines
1.8 KiB
Bash
Executable File
55 lines
1.8 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# System-level tuning for Node / Vite / Nx development on a Debian VM:
|
|
# - inotify watches limit (default 8K is too low for monorepos)
|
|
# - hostname (prompt only if generic)
|
|
# - swapfile (4 GB, only if none exists)
|
|
set -euo pipefail
|
|
# shellcheck source=./lib.sh
|
|
source "$(cd "$(dirname "$0")" && pwd)/lib.sh"
|
|
require_debian
|
|
require_not_root
|
|
|
|
# 1) inotify watches.
|
|
SYSCTL_FILE="/etc/sysctl.d/99-apf-portal.conf"
|
|
INOTIFY_LINE="fs.inotify.max_user_watches=524288"
|
|
if sudo grep -qxF "$INOTIFY_LINE" "$SYSCTL_FILE" 2>/dev/null; then
|
|
skip "inotify watches already configured in $SYSCTL_FILE."
|
|
else
|
|
echo "$INOTIFY_LINE" | sudo tee "$SYSCTL_FILE" >/dev/null
|
|
sudo sysctl --system >/dev/null
|
|
ok "fs.inotify.max_user_watches → 524288."
|
|
fi
|
|
|
|
# 2) Hostname — only prompt if it looks generic.
|
|
current_hostname="$(hostname)"
|
|
case "$current_hostname" in
|
|
debian|debian13|localhost|trixie|debian12)
|
|
read -r -p "Current hostname '$current_hostname' looks generic. New hostname (blank to keep): " new_hostname
|
|
if [[ -n "$new_hostname" ]]; then
|
|
sudo hostnamectl set-hostname "$new_hostname"
|
|
ok "Hostname set to '$new_hostname'. Will reflect on next login."
|
|
else
|
|
skip "Hostname kept as '$current_hostname'."
|
|
fi
|
|
;;
|
|
*)
|
|
skip "Hostname '$current_hostname' looks intentional — keeping."
|
|
;;
|
|
esac
|
|
|
|
# 3) Swap.
|
|
if swapon --show | grep -q .; then
|
|
skip "Swap already active: $(swapon --show --noheadings | head -1 | awk '{print $1, $3}')."
|
|
else
|
|
if confirm "No swap detected. Add a 4 GB swapfile at /swapfile?"; then
|
|
sudo fallocate -l 4G /swapfile
|
|
sudo chmod 600 /swapfile
|
|
sudo mkswap /swapfile
|
|
sudo swapon /swapfile
|
|
ensure_line_sudo "/swapfile none swap sw 0 0" /etc/fstab
|
|
ok "4 GB swapfile active."
|
|
else
|
|
skip "No swap configured (user choice)."
|
|
fi
|
|
fi
|