Commit Graph
527 Commits
Author SHA1 Message Date
Claude 36e56c343b asterisk-do: add netbird to the optional extras
Adds a 'netbird' keyword to the existing extras prompt, dispatching
services/base.sh's _base_setup_netbird helper — a plain function like
any other once setup.sh sources every services/*.sh file, despite its
underscore-prefixed, not-independently-registered naming. Its own
prompt already defaults to enabling NetBird's built-in SSH server
(--allow-server-ssh), which is what makes the 'backup' extra usable
against a home machine without port-forwarding a router: install
NetBird here and on that machine, join both to the same network, and
Borg's SSH remote target becomes the home machine's mesh IP instead of
a public address. Skips cleanly if NetBird's already installed.
README's Optional extras section documents the pairing.
2026-07-19 05:04:02 +00:00
Claude af7fe36283 asterisk-do: wire in authelia/ntfy/watchtower/wg-easy, borg-backup
Extends the self-contained pattern from Caddy/CrowdSec to five more
services, offered through one consolidated "Install:" prompt instead
of five separate interruptions:

- authelia: only offered if Caddy is present (it's useless without
  Caddy's forward-auth snippet); dispatched right where Caddy's state
  is already known.
- wg-easy: installed alongside the other firewall rules so its port
  lands with them. Only 51820/udp (the VPN handshake) goes on the
  public firewall — the web UI (51821) is deliberately left closed,
  documented as reachable via SSH tunnel instead, since exposing a
  VPN's own admin panel publicly is a real foot-gun.
- ntfy, watchtower: independent, dispatched after CrowdSec. Watchtower
  section is explicit that it only benefits coturn (a pulled image) —
  Asterisk is a local Dockerfile build with no registry tag to check.
- backup (borg-backup): dispatched last. Documented clearly as a
  config/data backup to a local machine or SSH remote, not a full
  droplet image — the alternative to DO's paid Droplet Backups.

Every sub-install this calls does its own `cd` into ~/docker/<name>;
each call site restores `cd "$EA_DIR"` afterward so the later bare
`docker compose up -d --build` still targets the right directory.
Verified in isolation (mocked cd side effects) since driving five
real interactive sub-installs through piped stdin isn't practical.

README updated with an "Optional extras" section covering all five.
2026-07-19 04:02:09 +00:00
Claude 5eddab9f9a asterisk-do: auto-install Caddy/CrowdSec, fix confusing domain prompt
Self-contained by default now: if Caddy or CrowdSec aren't already on
the box, asterisk-do offers to install them itself (calling their
install_ functions directly — setup.sh sources every services/*.sh up
front, so they're already in-process during a wizard run). Standalone
single-file runs get a manual pointer instead, since those functions
don't exist outside the full repo checkout.

Also fixes the confusing "Configure Caddy reverse proxy for Asterisk
Web Admin" domain prompt: it used to ask for a second, independent
domain, which silently breaks the TLS cert sync if it doesn't match
the SIP FQDN exactly (Caddy only holds a cert for the domain it's
actually serving). It now always reuses the SIP FQDN automatically —
reconstructing configure_caddy_for_service's subdomain default so the
common case (SIP domain is a subdomain of SITE_DOMAIN) needs zero
extra input, with clear wording either way. FQDN prompt, README, and
final summary updated to match.
2026-07-19 03:48:34 +00:00
Claude dfc298f6ab Wire crowdsecurity/asterisk into crowdsec.sh for asterisk-do
Vendor's logger.conf only sent Asterisk's security-level log lines
(auth failures, SIP registration scanning) to the console, i.e.
Docker's stdout — not a file CrowdSec could tail. asterisk-do.sh now
patches its copy of entrypoint.sh (vendor/ untouched) to also write
those events to /var/log/asterisk/full, which is bind-mounted to
~/docker/asterisk-do/logs/full on the host.

crowdsec.sh now detects that directory and, if present, installs the
crowdsecurity/asterisk collection (asterisk_bf + asterisk_user_enum
scenarios) with a matching log acquisition — mirroring the existing
Caddy detection pattern. Order-independent: asterisk-do's install
summary tells the user to rerun crowdsec if it's already installed,
since detection only runs during crowdsec's own install step.
2026-07-19 03:20:36 +00:00
Claude 4f5f264a96 asterisk-do: auto-add swap on low-RAM droplets, document the $4/mo tier
DigitalOcean doesn't provision swap by default and the $4/mo (512MB)
droplet has little headroom once Docker + Asterisk + coturn are
running. The installer now detects RAM <=2GB with no existing swap and
offers to add a persistent 2GB swapfile before doing anything else, so
that tier is safe to use instead of risking an OOM kill under load.
README updated with the corrected sizing table.
2026-07-19 02:57:09 +00:00
Claude d8072b61f4 Add asterisk-do: Easy Asterisk PBX tuned for a DigitalOcean droplet
Duplicates services/asterisk.sh (left untouched) into a DO-specific
variant: auto-detects the droplet's public IP/ID via the DO metadata
service, always assumes a public FQDN (no LAN/VLAN prompts), offers to
provision a matching DigitalOcean Cloud Firewall via doctl (never
touching one that's already attached), and documents droplet sizing,
firewall rules, and Sipnetic client setup in the generated README.
2026-07-19 02:47:24 +00:00
Outis 6224fe10b8 Merge pull request #175 from outis1one/claude/frigate-sky-cam-timelapse-t19akr
sky-cam: add retry-on-failure to sunrise/seasons/moon jobs
2026-07-09 09:02:54 -04:00
Claude 9bf2172786 sky-cam: add retry-on-failure to sunrise/seasons/moon jobs
install.sh generates the sunrise, sunrise-upload, seasons, and moon jobs
as Type=oneshot with only OnFailure=notify - a transient ffmpeg/network
blip fails the whole day's job with just an alert, no retry.

Add systemd drop-in overrides (Restart=on-failure, RestartSec=60,
StartLimitBurst=3 within a 10 min window) for each of these units after
install.sh runs. Drop-ins live outside the files install.sh generates,
so they survive re-running install.sh (e.g. after editing
sky-cam.conf), unlike a direct edit to the generated unit which would
be silently overwritten next time. systemd only fires OnFailure once
retries are exhausted, so this doesn't add notification spam - just
one alert after 3 tries, 60s apart.

capture.sh/capture-watchdog.sh already have Restart=on-failure baked
into install.sh's own generation (Type=simple, long-running) and don't
need this.
2026-07-08 15:02:36 +00:00
Outis 583d5a104e Merge pull request #173 from outis1one/claude/bootstrap-script-404-d8dc7h
Add SSH Host alias management (base wizard, standalone service, docs)
2026-07-02 14:16:17 -04:00
Claude c1c6d732df Merge origin/main into claude/bootstrap-script-404-d8dc7h 2026-07-02 18:11:08 +00:00
Outis 402ae94d9f Merge pull request #174 from outis1one/claude/frigate-sky-cam-timelapse-t19akr
Claude/frigate sky cam timelapse t19akr
2026-07-02 14:08:35 -04:00
Claude 702c184abf base.sh: detect NVIDIA GPU, install driver + Container Toolkit
Nothing in the repo actually installed the NVIDIA driver or
nvidia-container-toolkit — ai-gpu.sh, wolf.sh, etc. all assumed both were
already present. Adds _base_setup_nvidia_gpu, called during base install
right after Docker:

- No-ops silently on boxes without an NVIDIA GPU (lspci VGA/3D controller
  check) so non-GPU installs are unaffected
- If a GPU is present but nvidia-smi isn't working, offers to run
  'ubuntu-drivers devices' (shown to the operator) then
  'ubuntu-drivers autoinstall', and warns a reboot is required
- If Docker is present and nvidia-container-cli is missing, offers to
  install NVIDIA Container Toolkit and run
  'nvidia-ctk runtime configure --runtime=docker' so GPU-accelerated
  Docker services (ai-gpu, wolf, paintplus, iopaint) can request the GPU
- Offers to reboot immediately if a driver install requires it

Verified with a mocked-lspci/nvidia-smi/ubuntu-drivers test harness across
three scenarios: no GPU (silent no-op), GPU with no driver (full install +
toolkit + reboot prompt flow), and GPU with driver already active (skips
driver prompt, still offers toolkit).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LQJBvqzXeyuhhAcAA3Q5Wq
2026-07-02 16:46:27 +00:00
Claude d374f4983a Add SSH Host alias management (base wizard, standalone service, docs)
Lets 'ssh <alias>' connect directly to user@host instead of retyping it —
especially useful once machines are reachable over NetBird/VPN and have
IPs that aren't worth memorizing.

- lib/common.sh: ssh_config_path/add_ssh_host_alias/list_ssh_host_aliases/
  remove_ssh_host_alias helpers, operating on the invoking user's own
  ~/.ssh/config (not root's) with correct 700/600 permissions and ownership
- base.sh: after SSH key import, optionally add one or more Host aliases
  interactively as part of the base install
- services/ssh-config.sh: new standalone service (sudo ./setup.sh ssh-config)
  to list/add/remove aliases any time, independent of base install; follows
  the existing non-Docker standalone-bootstrap pattern (see crowdsec.sh)
- setup.sh: ssh-config never shows [installed] since it's a repeatable
  management tool, not a one-time install
- README: new 'SSH Host aliases' section, base row and wizard-flow step 1
  updated, ssh-config added to the extras group and copiable service list

Verified end-to-end with a test harness: add with defaults, add with a
custom user/port, list (correct numbering), and remove-by-name preserving
the other entry and file permissions.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LQJBvqzXeyuhhAcAA3Q5Wq
2026-07-02 16:20:22 +00:00
Outis e57d649c87 Merge pull request #172 from outis1one/claude/bootstrap-script-404-d8dc7h
README: sync 'What the wizard does' and base row with actual flow
2026-07-02 12:16:34 -04:00
Claude bc4678dcd7 README: sync 'What the wizard does' and base row with actual flow
The wizard description was stale — it still described the old
site-defaults-first flow and didn't mention that base now installs Docker,
openssh-server (with SSH key import), and NetBird, or that the wizard ends
by dropping into a fresh login shell so the docker group takes effect.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LQJBvqzXeyuhhAcAA3Q5Wq
2026-07-02 16:12:57 +00:00
Claude dc162b8f8d sky-cam: retire motionEye via direct RTSP capture, drop Frigate detour
capture.sh already replaces motionEye/any NVR itself - it just needs
each camera's RTSP URL. services/sky-cam.sh never actually prompted for
CAM_RTSP_<cam>, so capture/audio never had anything to connect to.

- Prompt per camera for its RTSP URL -> CAM_RTSP_<cam> in .env
- Prompt for sunrise mic / optional ambient audio library
- Fix Mattermost integration: sunrise2mm.py reads mattermost_url/
  access_token/channel_id (bot-token REST upload), not the
  MM_WEBHOOK_URL/MM_CHANNEL incoming-webhook scheme the installer used
  to write - uploads never worked before this
- Add optional ntfy push notifications
- Auto-generate SCHEDULE_SEASONS_<cam> (staggered 30 min apart) for
  every configured camera, not just the stock east/north/south, so
  install.sh wires up every applicable systemd timer for any camera set

Removes services/sky-cam-frigate.sh entirely - routing sky-cam's frames
through Frigate (via export API or restream) turned out to be solving a
problem that doesn't exist; sky-cam's own capture.sh talking directly to
each camera is simpler and has no quality/resolution tradeoffs. Frigate
continues to run fully independently for NVR/detection.
2026-07-02 05:26:24 +00:00
Claude 3c3183bbda sky-cam-frigate: source frames from Frigate's restream, not an export API
The real sky-cam repo's capture.sh already replaces MotionEye/any NVR
itself (plain ffmpeg RTSP frame-grab) - it and daily_sunrise_video.sh's
optional audio capture are the only places that touch a camera's RTSP
URL directly. Every other script (4-seasons, montage-mvt, year-end-join,
moon-track, moon-phase-monthly) only reads JPEGs/audio already on disk.

So the entire motionEye->Frigate transition is pointing CAM_RTSP_<cam>
at Frigate's go2rtc restream (rtsp://<frigate-host>:8554/<cam>) instead
of the camera directly - no upstream script changes needed. Replaces
the previous frigate-retime.sh/export-API approach, which solved a
problem (matching an arbitrary recording length to music duration) that
sky-cam's own 4-seasons.sh/montage-mvt.sh already handle via JPEG frame
counts.
2026-07-02 05:03:29 +00:00
Outis b45abf48ca Merge pull request #171 from outis1one/claude/frigate-sky-cam-timelapse-t19akr
Add sky-cam-frigate service using Frigate exports for timelapse source
2026-07-02 00:45:01 -04:00
Claude ce0a14904f Add sky-cam-frigate service using Frigate exports for timelapse source
Duplicates services/sky-cam.sh into a Frigate-backed variant that pulls
recordings via Frigate's export API instead of a JPEG image folder.
Includes a frigate-retime.sh helper that exports a coarse timelapse,
measures its actual duration with ffprobe, and re-encodes once with a
computed setpts factor to hit an exact target length (e.g. a Four
Seasons movement's runtime).
2026-07-02 04:17:53 +00:00
Outis 78f6365bbe Merge pull request #170 from outis1one/claude/asterisk-dns-filtering-vlan-5pmz12
asterisk: default to FQDN mode, auto-detect VLANs, auto-sync Caddy certs
2026-07-01 23:52:47 -04:00
Outis 4c1d8858a1 Merge pull request #169 from outis1one/claude/bootstrap-script-404-d8dc7h
setup.sh: exec a fresh login shell at the end so docker group takes e…
2026-07-01 22:46:28 -04:00
Claude 4e4a1a2070 setup.sh: exec a fresh login shell at the end so docker group takes effect
Group membership added by 'usermod -aG docker' (in require_docker) doesn't
apply to the shell that invoked sudo — only to new logins. Users had to
manually run 'newgrp docker' or reconnect SSH after every install. Since a
child process can't change its parent shell's group list directly, the
practical fix is to exec a fresh 'su - ' login shell at the end
of the guided flow, which re-reads /etc/group and lands the user back in
the same terminal with docker access already active.

Gated on: running via sudo (SUDO_USER set), interactive (not --unattended),
docker group exists and the user is actually a member, and stdin is a real
tty — so this never fires for scripted/explicit-service/piped invocations.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LQJBvqzXeyuhhAcAA3Q5Wq
2026-07-02 02:44:08 +00:00
Outis 4a78b8f395 Merge pull request #168 from outis1one/claude/bootstrap-script-404-d8dc7h
Claude/bootstrap script 404 d8dc7h
2026-07-01 16:52:00 -04:00
Claude 42a38c9397 frigate.sh: detect existing camera config, offer keep/backup/add/remove
Previously re-running the installer always overwrote config.yml and .env
from scratch, silently discarding any real camera credentials already on
disk. Now install_frigate parses an existing config.yml + .env (best-effort,
matching this installer's own output shape) and presents a numbered list
of detected cameras with a menu:

  [1] Keep everything as-is (no changes at all)
  [2] Backup existing config and start fresh
  [3] Add more cameras (keep these)
  [4] Remove cameras (choose numbers, or 'all'), then optionally add more

Implementation switches from building config.yml/.env as concatenated text
blocks inline in the collection loop to parallel CAM_* bash arrays
(name/ip/port/var-names/enabled/notify/substream-suffixes), so cameras can
be parsed, listed, removed, and re-rendered independently:

- _frigate_parse_existing: reads go2rtc streams + cameras: enabled/notifications
  from config.yml, and credential values from .env, into the CAM_* arrays
- _frigate_review_existing: numbered menu, mutates arrays per choice
- _frigate_next_suffix_int: kept cameras retain their existing FRIGATE_RTSP_USER[N]
  var names unchanged; new cameras get the next unused numeric suffix so
  credentials never collide after removals
- _frigate_camera_wizard / _frigate_render_config: same prompts and output
  shape as before, now array-driven so kept + new cameras render uniformly
- _frigate_backup_existing: copies config.yml/.env/docker-compose.yml to a
  timestamped backup-YYYYMMDD-HHMMSS/ dir before any destructive rewrite

Verified with a 5-scenario test harness (fresh install, keep-as-is producing
byte-identical output, add-camera preserving existing credentials, remove-
by-number without var collisions, backup-and-fresh) before committing.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LQJBvqzXeyuhhAcAA3Q5Wq
2026-07-01 20:25:55 +00:00
Claude 7dc9a762a0 frigate.sh: interactive camera wizard generates go2rtc + cameras config
Previously Frigate always wrote a placeholder config.yml the operator had
to hand-edit to add cameras. Now install_frigate prompts to add cameras
one at a time (name, RTSP IP/port/user/password/path, optional sub-stream,
enabled, notifications), matching the go2rtc + cameras structure used in
production frigate configs:

- Each camera gets a go2rtc stream entry (+ optional _sub for detection)
  and a cameras: block with ffmpeg inputs/roles, detect, notifications
- RTSP credentials/IPs are written to .env as FRIGATE_* variables (first
  camera gets FRIGATE_RTSP_USER/PASSWORD, later cameras get numbered
  suffixes _1, _2, ... to avoid collisions) and referenced in config.yml
  via Frigate's {FRIGATE_VAR} substitution syntax — secrets never appear
  in the YAML directly
- docker-compose.yml now includes env_file: .env so those vars actually
  reach the container for substitution to work
- Skipping all camera prompts falls back to the original starter
  config.yml for manual editing, preserving existing behavior
- README and DRY-RUN summary updated to reflect the new flow

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LQJBvqzXeyuhhAcAA3Q5Wq
2026-07-01 19:49:26 +00:00
Claude 225e277abb asterisk: default to FQDN mode, auto-detect VLANs, auto-sync Caddy certs
Defaults install_asterisk() to FQDN networking mode and prompts for VLAN/VPN
subnets (with host-network auto-detection to filter out noise like Docker
bridges) so phones on other networks get correct NAT/SDP handling from the
first boot.

The container now mounts Caddy's cert store read-only when Caddy is
installed, and the entrypoint syncs a matching Let's Encrypt cert for
DOMAIN_NAME automatically, re-checking every 12h to pick up renewals without
a restart. Falls back to self-signed only when no matching cert is found.

Also fixes a real bug hit in the field: a preserved/migrated pjsip.conf could
be missing the transport-udp/transport-tcp sections entirely, with no bind
error logged, silently blocking any device that registers without TLS. Adds
the same migration-injection already used for transport-tls.
2026-07-01 17:19:57 +00:00
Outis 8fde6c08e0 Merge pull request #167 from outis1one/claude/bootstrap-script-404-d8dc7h
setup.sh: don't offer to install Caddy when CADDY_MODE is remote/none
2026-07-01 13:15:18 -04:00
Claude 9cf3765f83 setup.sh: don't offer to install Caddy when CADDY_MODE is remote/none
The 'Install Caddy now?' prompt ran regardless of the just-answered
Caddy location question, so choosing 'remote' still asked whether to
install Caddy locally — contradicting the choice made one prompt earlier.
Gate it on CADDY_MODE being local (or unset, for configs predating the
wizard split).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LQJBvqzXeyuhhAcAA3Q5Wq
2026-07-01 17:14:36 +00:00
Outis 33ea8b1c3d Merge pull request #166 from outis1one/claude/bootstrap-script-404-d8dc7h
setup.sh: ask Caddy location unconditionally before offering site def…
2026-07-01 13:13:06 -04:00
Claude e8d49e9e70 setup.sh: ask Caddy location unconditionally before offering site defaults
Previously the Caddy-location question lived inside run_site_configure,
gated behind 'Configure site defaults now? (y/n)'. Answering 'n' (e.g.
because Caddy is on a different box and you don't care about domain/tz
autofill) meant CADDY_MODE never got set, which silently disabled Caddy
prompts for every service for the life of the install (configure_caddy_for_service
falls through to mode 'none' and returns immediately).

Split into two steps:
1. ask_caddy_location() — always runs on first setup.sh invocation,
   independent of any other prompt, and persists CADDY_MODE immediately.
2. run_site_configure() — now only asks timezone/domain/Caddy-network,
   and is only offered when CADDY_MODE=local (those defaults are only
   useful for FQDN autofill tied to a locally-managed Caddyfile).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LQJBvqzXeyuhhAcAA3Q5Wq
2026-07-01 17:11:11 +00:00
Outis a68bf34302 Merge pull request #165 from outis1one/claude/bootstrap-script-404-d8dc7h
setup.sh: ask Caddy location first in site wizard, skip network promp…
2026-07-01 13:03:26 -04:00
Claude a9446190da setup.sh: ask Caddy location first in site wizard, skip network prompt if not local
Reorders the site defaults wizard so 'Where does Caddy run?' comes before
timezone/domain, since it's the more fundamental choice and the answer
context matters when explaining the other prompts. Also skips the Caddy
Docker network prompt entirely when Caddy isn't running locally — that
setting is only relevant to services joining a local Caddy container's
bridge network; remote/none mode proxies via localhost:PORT + snippet
files instead.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LQJBvqzXeyuhhAcAA3Q5Wq
2026-07-01 16:45:47 +00:00
Outis acdd54e06c Merge pull request #164 from outis1one/claude/bootstrap-script-404-d8dc7h
common.sh: install Docker via direct apt steps instead of get.docker.com
2026-07-01 12:32:23 -04:00
Claude 83293f61cd common.sh: install Docker via direct apt steps instead of get.docker.com
The get.docker.com convenience script internally wraps every step in
'sudo -E sh -c ...'. On minimal/cloud Ubuntu images that never installed
the sudo package (common when operating purely as root), those internal
sudo calls silently fail while the outer script still exits 0 — apt never
actually runs, but no error surfaces. require_docker already runs as root,
so there's no need for sudo at all.

Replaced it with Docker's documented apt-repo steps run directly: add the
keyring, add the repo (with architecture/codename detected via dpkg and
os-release), apt-get install docker-ce + compose plugin, enable the
service. Real apt/curl/systemctl failures now propagate and print to the
terminal instead of being masked by the wrapper script.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LQJBvqzXeyuhhAcAA3Q5Wq
2026-07-01 16:26:16 +00:00
Outis 737fe714c9 Merge pull request #163 from outis1one/claude/bootstrap-script-404-d8dc7h
Claude/bootstrap script 404 d8dc7h
2026-07-01 12:20:34 -04:00
Claude 3d976b84e3 base.sh: surface Docker install failures instead of swallowing them
require_docker returning non-zero was silently ignored (no set -e).
Add explicit warning so the operator sees the failure; setup.sh already
has an unconditional Docker check after base that will retry.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LQJBvqzXeyuhhAcAA3Q5Wq
2026-07-01 16:08:00 +00:00
Claude 8b5a519717 setup.sh: always install Docker, not only on first base run
The Docker check+install was inside the else branch that only runs when
base has never been installed. On re-runs (base already present) Docker
was silently skipped and only warned about. Move the check outside the
if/else so Docker is always installed if missing, regardless of whether
base was skipped.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LQJBvqzXeyuhhAcAA3Q5Wq
2026-07-01 16:06:08 +00:00
Outis 4e548d84bb Merge pull request #162 from outis1one/claude/bootstrap-script-404-d8dc7h
fix whiptail navigation + add installed-service summary
2026-07-01 12:02:10 -04:00
Outis be9f1ded81 Merge pull request #161 from outis1one/claude/readme-services-reference-6vrheo
Add copiable list of services by category to README
2026-06-28 16:53:02 -04:00
Claude 9ff8d298ec Add copiable list of services by category to README 2026-06-28 20:49:54 +00:00
Claude a6465404fa fix whiptail navigation + add installed-service summary
whiptail fix:
- bootstrap.sh: redirect stdout and stderr to /dev/tty alongside stdin so
  whiptail has full terminal control for raw mode (arrow keys, highlighting)
- setup.sh: run 'stty sane' on /dev/tty before the menu loop to reset any
  stale terminal state from SSH reconnections or prior sessions

Installed-service summary:
- Print a grouped list of all currently-installed services before every
  menu session so the operator knows the current state at a glance

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LQJBvqzXeyuhhAcAA3Q5Wq
2026-06-28 18:17:26 +00:00
Outis 16e502cb51 Merge pull request #160 from outis1one/claude/bootstrap-script-404-d8dc7h
setup.sh: fix whiptail arrow-key navigation when run via curl | bash
2026-06-28 14:12:46 -04:00
Claude 93c373e893 setup.sh: fix whiptail arrow-key navigation when run via curl | bash
Two fixes:
1. Export TERM (default xterm-256color) early — whiptail needs a valid
   TERM to enter raw mode; when bash is started via pipe TERM may be
   unset, causing keypresses to leak to the shell instead of the menu
2. Add </dev/tty to both whiptail calls so keyboard input always comes
   from the controlling terminal regardless of how stdin was redirected

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LQJBvqzXeyuhhAcAA3Q5Wq
2026-06-28 18:11:57 +00:00
Outis 2f0b5cf7bb Merge pull request #159 from outis1one/claude/bootstrap-script-404-d8dc7h
Claude/bootstrap script 404 d8dc7h
2026-06-28 14:08:02 -04:00
Claude 01979c52f0 fix: SITE_DOMAIN not pre-filling FQDN prompts after wizard
Three fixes:
1. configure_caddy_for_service: remove the '!= example.com' filter that
   silently dropped any valid domain matching that string; now any non-empty
   SITE_DOMAIN is used as the default subdomain suggestion
2. load_site_config: trim leading/trailing whitespace from key and val so
   hand-edited .config files with extra spaces still parse correctly
3. setup.sh: call load_site_config after the site wizard saves so the
   in-memory values are guaranteed fresh for all subsequent service installs

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LQJBvqzXeyuhhAcAA3Q5Wq
2026-06-28 15:07:07 +00:00
Claude c09dd775ea base.sh: add Docker, SSH server/hardening, and NetBird to base install
- require_docker now runs as part of base so Docker is present on every box
- Install openssh-server, offer GitHub (gh:) and Launchpad (lp:) key import
  via ssh-import-id; disable password auth only after keys are confirmed imported
- Handle Ubuntu cloud-init drop-in that re-enables PasswordAuthentication
- Offer NetBird install with optional --allow-server-ssh flag and setup key

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LQJBvqzXeyuhhAcAA3Q5Wq
2026-06-28 15:00:51 +00:00
Outis 268b8c3b20 Merge pull request #158 from outis1one/claude/bootstrap-script-404-d8dc7h
common.sh: fall back to /usr/bin/docker when PATH is restricted under…
2026-06-28 10:39:53 -04:00
Claude e167f98370 common.sh: fall back to /usr/bin/docker when PATH is restricted under sudo
command -v may miss the binary if sudo stripped PATH; check the canonical
apt install location directly as a fallback before reporting failure, and
use the same fallback when printing the installed version.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LQJBvqzXeyuhhAcAA3Q5Wq
2026-06-28 14:37:03 +00:00
Outis 9cd701af73 Merge pull request #157 from outis1one/claude/bootstrap-script-404-d8dc7h
common.sh: fix Docker install failing silently in piped execution
2026-06-28 10:31:30 -04:00
Claude 64776731fb common.sh: fix Docker install failing silently in piped execution
Two bugs in require_docker:
1. apt post-install hooks (needrestart etc.) block on stdin which is
   at EOF when running via pipe; DEBIAN_FRONTEND=noninteractive skips them
2. bash's command hash table doesn't pick up a newly installed binary;
   hash -r flushes it so command -v docker finds /usr/bin/docker
Also moved usermod and success log after the binary check so [OK] only
prints when docker is actually reachable.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LQJBvqzXeyuhhAcAA3Q5Wq
2026-06-28 12:18:10 +00:00