@@ -51,7 +51,7 @@ There are no tests, linters, or build steps in this repo — it is pure configur - `dotfiles/host/zed-settings.json` -> `%APPDATA%\Zed\settings.json` - `dotfiles/host/zed-keymap.json` -> `%APPDATA%\Zed\keymap.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 (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`.- **`containers/webdev/`** — Ubuntu 24.04 dev container with Node (apt, only for `npx playwright install`), 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 (in Docker, auto HTTPS) on the shared `bythewood-edge` network for reverse-proxying, Docker Compose for services, restic backups to Backblaze B2, UFW firewall, push-to-deploy via git hooks.## Deployed Projects
modified
containers/webdev/Dockerfile
@@ -60,23 +60,21 @@ RUN apt-get update && \ # Python python3 python3-pip python3-venv \ # 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 - && \ apt-get install -y nodejs && \ docker.io docker-compose-v2 docker-buildx \ # Node (only used for `npx playwright install` below; bun is the JS runtime) nodejs npm && \ 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.# Playwright Chromium for the Claude playwright MCP. The MCP looks for stable# Chrome at /opt/google/chrome/chrome, so symlink the playwright build there.# The chromium-* glob absorbs future playwright revision bumps.ENV PLAYWRIGHT_BROWSERS_PATH=/opt/playwright-browsersRUN npx --yes playwright@latest install --with-deps chromium && \ 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/chrome ln -snf /opt/playwright-browsers/chromium-*/chrome-linux64/chrome /opt/google/chrome/chrome && \ test -x /opt/google/chrome/chromeRUN ln -snf /usr/share/zoneinfo/UTC /etc/localtime && echo "UTC" > /etc/timezone