Add docs/adding-a-script.md
This commit is contained in:
@@ -0,0 +1,118 @@
|
|||||||
|
# Adding a new script
|
||||||
|
|
||||||
|
Two files per app, both sourcing the shared libs at runtime.
|
||||||
|
|
||||||
|
## 1. `install/<app>-install.sh` — runs inside the LXC
|
||||||
|
|
||||||
|
```bash
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
APP="myapp"
|
||||||
|
LIB_URL="${LIB_URL:-https://gitea.luki-net.org/luki-net/proxmox-scripts/raw/branch/main/lib}"
|
||||||
|
source <(curl -fsSL "$LIB_URL/install.func")
|
||||||
|
|
||||||
|
[[ "$EUID" -eq 0 ]] || { msg_err "Must run as root"; exit 1; }
|
||||||
|
|
||||||
|
setup_base_apt git some-package # base packages + extras
|
||||||
|
create_system_user myapp /opt/myapp
|
||||||
|
|
||||||
|
# ... app-specific install ...
|
||||||
|
|
||||||
|
write_systemd_unit myapp "$(cat <<EOF
|
||||||
|
[Unit]
|
||||||
|
Description=my app
|
||||||
|
After=network-online.target
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
ExecStart=/opt/myapp/bin/myapp
|
||||||
|
Restart=on-failure
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
||||||
|
EOF
|
||||||
|
)"
|
||||||
|
|
||||||
|
wait_for_http "http://127.0.0.1:8080/" 30
|
||||||
|
apt_cleanup
|
||||||
|
msg_ok "$APP installation finished"
|
||||||
|
```
|
||||||
|
|
||||||
|
### Helpers from `lib/install.func`
|
||||||
|
|
||||||
|
| Helper | Purpose |
|
||||||
|
|--------|---------|
|
||||||
|
| `msg_info` / `msg_ok` / `msg_warn` / `msg_err` | colored logging |
|
||||||
|
| `setup_base_apt [pkg...]` | apt update + base packages (ca-certificates curl openssl tzdata gnupg) + extras |
|
||||||
|
| `apt_cleanup` | autoremove + autoclean |
|
||||||
|
| `create_system_user USER HOME` | `useradd --system`, idempotent |
|
||||||
|
| `write_systemd_unit NAME CONTENT` | write unit file + daemon-reload + `enable --now` |
|
||||||
|
| `wait_for_http URL [TIMEOUT]` | retry-curl until 2xx (default 30s) |
|
||||||
|
|
||||||
|
## 2. `ct/<app>.sh` — runs on the Proxmox host
|
||||||
|
|
||||||
|
```bash
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
APP="myapp"
|
||||||
|
APP_DESCRIPTION="short tagline"
|
||||||
|
APP_PORT="8080"
|
||||||
|
|
||||||
|
LIB_URL="${LIB_URL:-https://gitea.luki-net.org/luki-net/proxmox-scripts/raw/branch/main/lib}"
|
||||||
|
INSTALL_SCRIPT_URL="${INSTALL_SCRIPT_URL:-https://gitea.luki-net.org/luki-net/proxmox-scripts/raw/branch/main/install/myapp-install.sh}"
|
||||||
|
|
||||||
|
# App-specific defaults
|
||||||
|
DEFAULT_HOSTNAME="myapp"
|
||||||
|
DEFAULT_DISK="10"
|
||||||
|
DEFAULT_CORES="2"
|
||||||
|
DEFAULT_RAM="1024"
|
||||||
|
|
||||||
|
source <(curl -fsSL "$LIB_URL/build.func")
|
||||||
|
|
||||||
|
# Override the default summary printer with whatever the app needs.
|
||||||
|
print_app_summary() {
|
||||||
|
cat <<EOF
|
||||||
|
Web UI: http://$IP_CT:$APP_PORT
|
||||||
|
EOF
|
||||||
|
}
|
||||||
|
|
||||||
|
run_installer
|
||||||
|
```
|
||||||
|
|
||||||
|
### What `run_installer` does
|
||||||
|
|
||||||
|
1. `preflight_pve` — root + Proxmox check
|
||||||
|
2. `show_header` — banner
|
||||||
|
3. `prompt_lxc_config` — interactive prompts (skipped if vars are already set via env)
|
||||||
|
4. `resolve_debian_template` — picks the latest matching template, downloads if missing
|
||||||
|
5. `create_lxc` — `pct create` with all gathered settings, generates `ROOT_PASSWORD`
|
||||||
|
6. `bootstrap_install_script "$INSTALL_SCRIPT_URL"` — installs curl in the LXC, downloads + runs the in-container installer
|
||||||
|
7. `print_summary` — calls your `print_app_summary` + LXC root password
|
||||||
|
|
||||||
|
## 3. Add to README
|
||||||
|
|
||||||
|
Append a row to the "Available scripts" table in `README.md` with the one-liner:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
bash -c "$(curl -fsSL https://gitea.luki-net.org/luki-net/proxmox-scripts/raw/branch/main/ct/myapp.sh)"
|
||||||
|
```
|
||||||
|
|
||||||
|
## 4. Commit
|
||||||
|
|
||||||
|
```bash
|
||||||
|
git add ct/myapp.sh install/myapp-install.sh README.md
|
||||||
|
git commit -m "Add myapp installer"
|
||||||
|
git push
|
||||||
|
```
|
||||||
|
|
||||||
|
## Tips
|
||||||
|
|
||||||
|
- **Idempotency**: install scripts may be re-run if a build fails midway. Guard expensive steps (`[[ ! -x ... ]]`, `[[ ! -f ... ]]`).
|
||||||
|
- **Credentials**: write generated passwords to `/root/<app>.credentials` (chmod 600). The host-side `print_app_summary` can `pct exec` to read them back.
|
||||||
|
- **Env-driven non-interactive use**:
|
||||||
|
```bash
|
||||||
|
CTID=200 HOSTNAME=myapp DISK_SIZE=30 RAM=4096 IPCFG=dhcp \
|
||||||
|
bash -c "$(curl -fsSL .../ct/myapp.sh)"
|
||||||
|
```
|
||||||
|
- **Local testing**: set `LIB_URL` to your fork's URL or a feature branch to test lib changes without touching `main`.
|
||||||
Reference in New Issue
Block a user