webappAIO LXC Bootstrap
Spin up a fully configured development container in one step: SSH, Apache/PHP/MariaDB or SQLite, a Laravel API backend (backend/) + React/Vite frontend (frontend/), a self-hosted Mosquitto MQTT broker (Docker), code-server, and Claude Code — all from a single command pasted into a fresh Proxmox LXC.
Quick start
In an empty, freshly created LXC, logged in as root:
curl -fsSL https://git.innovator.bh/ghassan/webappAIO/raw/branch/main/bootstrap.sh -o bootstrap.sh && bash bootstrap.sh
You'll be prompted for:
- Project name
- Git repository to clone (leave blank to scaffold a bare backend/frontend pair instead — see below)
- Database:
mysqlorsqlite - MariaDB username/password/database (only if you chose
mysql) - Seeded Super Admin email/username/password
When it finishes you'll have a running API, a Mosquitto broker, code-server, and Claude Code installed, plus a Super Admin account ready to log in with.
Blank GIT_REPO vs. cloning this repo
- Blank scaffolds a fresh Laravel install in
backend/and a fresh Vite React-TS app infrontend/, with the core packages already required (Sanctum,spatie/laravel-permission,pragmarx/google2fa-laravel,php-mqtt/laravel-client) — the foundation to build the rest ofclaude-project-prompt.md's architecture on top of, not the finished app. GIT_REPO=https://git.innovator.bh/ghassan/webappAIO.gitclones this repo, which already contains the full RBAC + 2FA + MQTT-realtime + Users-management implementation described in that prompt.
Fully unattended install
Skip every prompt by exporting variables before running the script (useful for scripted LXC provisioning):
APP_NAME=myapp \
GIT_REPO="" \
DB_TYPE=sqlite \
SUPER_ADMIN_EMAIL=admin@myapp.test \
SUPER_ADMIN_USERNAME=admin \
SUPER_ADMIN_PASSWORD='change-me' \
INSTALL_CODE_SERVER=yes \
INSTALL_CLAUDE_CODE=yes \
bash bootstrap.sh
| Variable | Description | Default |
|---|---|---|
APP_NAME |
Project directory name under /var/www |
laravel-app |
GIT_REPO |
Git URL to clone; blank scaffolds a bare backend/frontend pair | (blank) |
DB_TYPE |
mysql or sqlite |
sqlite |
DB_USER |
MariaDB username (mysql only) |
laravel_user |
DB_PASS |
MariaDB password (mysql only) |
random |
DB_NAME |
MariaDB database name (mysql only) |
laravel_db |
SUPER_ADMIN_EMAIL |
Seeded Super Admin email | superadmin@example.com |
SUPER_ADMIN_USERNAME |
Seeded Super Admin username | superadmin |
SUPER_ADMIN_PASSWORD |
Seeded Super Admin password | random |
INSTALL_CODE_SERVER |
Install code-server | yes |
INSTALL_CLAUDE_CODE |
Install Node.js + Claude Code | yes |
FIX_SSHD |
Auto-relax sshd config (TurnKey TCP forwarding / Ubuntu root login) | yes |
What the script does
- Base system —
apt update/upgrade, installssudo curl git wget unzip. - SSH — installs and enables
openssh-server; on TurnKey Core containers enablesAllowTcpForwarding, on other distros enablesPermitRootLogin yes(needed for VS Code Remote-SSH / port tunneling). - Docker + Mosquitto — installs Docker Engine + Compose plugin, generates per-role Mosquitto broker credentials, brings up the
mosquittocontainer (MQTT on 1883, WebSockets on 9001). - Laravel + React stack — Apache, PHP + required extensions, MariaDB or SQLite, Composer, Node.js, clones or scaffolds
backend/(Laravel) andfrontend/(Vite React-TS), sets permissions, configures an Apache vhost pointing atbackend/public, generates.env(DB, MQTT, Super Admin, Sanctum/CORS), runskey:generate,migrate, anddb:seed. - Queue worker — installs and starts a systemd unit (
<app-name>-queue) runningphp artisan queue:work, required for MQTT events to actually publish. - code-server — browser-based VS Code, so you can edit the app over SSH without a local editor.
- Claude Code —
npm install -g @anthropic-ai/claude-code. - Prints a summary with the app path, DB type, container IP, Super Admin credentials, and next steps.
After install
- Edit the app:
code-server /var/www/<app-name>then open the tunneled port (8080) in your browser. - Use Claude Code:
cd /var/www/<app-name> && claude - Run the frontend dev server:
cd /var/www/<app-name>/frontend && npm run dev -- --hostthen tunnel port 5173. - Log in: the Super Admin credentials printed at the end of setup (also in
backend/.envasSUPER_ADMIN_*).
Manual SSH config notes (if you skip FIX_SSHD)
TurnKey Core:
nano /etc/ssh/sshd_config.d/turnkey.conf
# set: AllowTcpForwarding yes
Ubuntu:
nano /etc/ssh/sshd_config
# set: PermitRootLogin yes
Standard Claude Code project prompt
For a consistent architecture baseline (mobile-first React frontend, Laravel API backend, RBAC, MQTT real-time updates, SQLite↔PostgreSQL portability, security-first defaults), start every new Claude Code session in the project with claude-project-prompt.md as the system/instruction prompt.