@@ -50,7 +50,7 @@ There are no tests, linters, or build steps in this repo — it is pure configur- **`dotfiles/host/`** — Host-side configs that don't belong in the container: Zed editor settings and Windows SSH config. These are NOT placed automatically by bootstrap.ps1; copy them manually on a fresh machine: - `dotfiles/host/zed-settings.json` -> `%APPDATA%\Zed\settings.json` - `dotfiles/host/ssh-config` -> `~\.ssh\config` (merge into existing entries if you have other Hosts already configured)- **`containers/webdev/`** — Ubuntu 24.04 dev container with Node 22, Python 3 (pip + uv), Bun, Rust (rustc + cargo from apt, for the axum projects), Docker CLI, Playwright Chromium (under `/opt/playwright-browsers`, for the Claude playwright MCP), and standard dev tools (neovim, tmux, git, rsync, htop, nmap, unzip, etc.). Stays alive via `sleep infinity`; entered through `docker exec -it ... tmux` for the TUI workflow or over SSH on host port 2222 for editor remote-dev. `entrypoint.sh` starts sshd before exec'ing CMD; host keys persist in the `bythewood-ssh` volume so fingerprints survive rebuilds. Started with `docker run --init` so PID 1 reaps zombies left behind when tmux/sshd children exit. Helper scripts (`restic-backup`, `restic-restore`, `restic-status`, `code-sync`, `server-health-check`) are baked in at `/home/dev/scripts/` and on PATH. Host setup is automated by `bootstrap.ps1`.- **`containers/webdev/`** — Ubuntu 24.04 dev container with Node 22, Python 3 (pip + uv), Bun, Rust (rustup-managed stable toolchain with rust-analyzer, clippy, rustfmt — for the axum projects and the Claude Code rust-analyzer LSP plugin), Docker CLI, Playwright Chromium (under `/opt/playwright-browsers`, for the Claude playwright MCP), and standard dev tools (neovim, tmux, git, rsync, htop, nmap, unzip, etc.). Stays alive via `sleep infinity`; entered through `docker exec -it ... tmux` for the TUI workflow or over SSH on host port 2222 for editor remote-dev. `entrypoint.sh` starts sshd before exec'ing CMD; host keys persist in the `bythewood-ssh` volume so fingerprints survive rebuilds. Started with `docker run --init` so PID 1 reaps zombies left behind when tmux/sshd children exit. Helper scripts (`restic-backup`, `restic-restore`, `restic-status`, `code-sync`, `server-health-check`) are baked in at `/home/dev/scripts/` and on PATH. Host setup is automated by `bootstrap.ps1`.- **`hosts/alpine/`** — Production server setup: Caddy reverse proxy (auto HTTPS), Docker Compose for services, restic backups to Backblaze B2, UFW firewall, push-to-deploy via git hooks.## Deployed Projects
modified
containers/webdev/Dockerfile
@@ -47,7 +47,7 @@ ENV DEBIAN_FRONTEND=noninteractive \ LANG=C.UTF-8 \ LC_ALL=C.UTF-8 \ TERM=xterm-256color \ PATH="/home/dev/.local/bin:$PATH" PATH="/home/dev/.local/bin:/home/dev/.cargo/bin:$PATH"RUN apt-get update && \ apt-get install -y --no-install-recommends \
@@ -59,8 +59,6 @@ RUN apt-get update && \ build-essential tzdata ca-certificates \ # Python python3 python3-pip python3-venv \ # Rust (cargo for blog.bythewood.me, darkfurrow.com axum binaries) rustc cargo \ # Docker (buildx enables BuildKit cache mounts in Dockerfiles) docker.io docker-compose-v2 docker-buildx && \ curl -fsSL https://deb.nodesource.com/setup_22.x | bash - && \
@@ -68,9 +66,17 @@ RUN apt-get update && \ curl -fsSL https://astral.sh/uv/install.sh | env UV_INSTALL_DIR=/usr/local/bin sh && \ curl -fsSL https://bun.sh/install | env BUN_INSTALL=/usr/local bash# Playwright Chromium for the Claude playwright MCP. The MCP defaults to the# stable-Chrome discovery path /opt/google/chrome/chrome, so symlink the# version-pinned playwright build there. The find resolves chromium-NNNN at# build time, so a future playwright bump still produces a valid link.ENV PLAYWRIGHT_BROWSERS_PATH=/opt/playwright-browsersRUN npx --yes playwright@latest install --with-deps chromium && \ chmod -R a+rx /opt/playwright-browsers chmod -R a+rx /opt/playwright-browsers && \ chrome_bin=$(find /opt/playwright-browsers -maxdepth 3 -path '*/chrome-linux64/chrome' | head -n 1) && \ test -x "$chrome_bin" && \ mkdir -p /opt/google/chrome && \ ln -snf "$chrome_bin" /opt/google/chrome/chromeRUN ln -snf /usr/share/zoneinfo/UTC /etc/localtime && echo "UTC" > /etc/timezone
@@ -141,6 +147,15 @@ RUN chmod +x /usr/local/bin/entrypoint.shWORKDIR /home/devUSER dev# Rust toolchain via rustup (cargo for blog.bythewood.me, darkfurrow.com,# analytics axum binaries; rust-analyzer for the Claude Code LSP plugin).# --profile minimal skips offline rust-docs; components add the LSP, linter,# and formatter.RUN curl --proto '=https' --tlsv1.2 -fsSL https://sh.rustup.rs | \ sh -s -- -y --no-modify-path --profile minimal \ --default-toolchain stable \ --component rust-analyzer,clippy,rustfmtRUN curl -fsSL https://claude.ai/install.sh | bashENTRYPOINT ["/usr/local/bin/entrypoint.sh"]