diff --git a/deploy.sh b/deploy.sh index d00c1e6..68822e3 100755 --- a/deploy.sh +++ b/deploy.sh @@ -1,34 +1,37 @@ #!/bin/bash set -e -echo "🔧 Deploying Extrudex Docker runtime..." +echo "🔧 Deploying Extrudex (Go + React) on Raspberry Pi..." # Check if Docker Compose is available -if ! command -v docker-compose &> /dev/null && ! docker compose version &> /dev/null; then +if ! docker compose version &>/dev/null && ! command -v docker-compose &>/dev/null; then echo "❌ Docker Compose is not installed" exit 1 fi COMPOSE_CMD="docker compose" -if command -v docker-compose &> /dev/null; then +if command -v docker-compose &>/dev/null; then COMPOSE_CMD="docker-compose" fi -echo "📦 Building and starting services..." +echo "📦 Building and starting Go backend + React frontend + PostgreSQL..." $COMPOSE_CMD -f docker-compose.dev.yml up -d --build echo "⏳ Waiting for services to become healthy..." -sleep 15 +sleep 10 echo "✅ Deployment complete!" echo "" echo "Services running:" echo " • PostgreSQL: localhost:5433" -echo " • Extrudex API: http://localhost:5080" -echo " • Extrudex Web: http://localhost:5081" +echo " • Extrudex API (Go): http://localhost:5080" +echo " • Extrudex Web (React): http://localhost:5081" +echo "" +echo "Barcode scanner: HID keyboard input — focus any text field to start scanning." +echo "Kiosk mode: Chromium auto-starts on boot via systemd (extrudex-kiosk.service)." echo "" echo "To view logs:" echo " $COMPOSE_CMD -f docker-compose.dev.yml logs -f" echo "" echo "To stop:" -echo " $COMPOSE_CMD -f docker-compose.dev.yml down" \ No newline at end of file +echo " $COMPOSE_CMD -f docker-compose.dev.yml down" diff --git a/docker-compose.dev.yml b/docker-compose.dev.yml index a0a3d49..1df3411 100644 --- a/docker-compose.dev.yml +++ b/docker-compose.dev.yml @@ -28,13 +28,10 @@ services: ports: - "5080:8080" environment: - - ASPNETCORE_ENVIRONMENT=Development - - ASPNETCORE_URLS=http://+:8080 - - EXTRUDEX_DB_HOST=extrudex-db - - EXTRUDEX_DB_PORT=5432 - - EXTRUDEX_DB_NAME=extrudex - - EXTRUDEX_DB_USER=extrudex - - EXTRUDEX_DB_PASSWORD=changeme + - DATABASE_URL=postgres://extrudex:changeme@extrudex-db:5432/extrudex?sslmode=disable + - PORT=8080 + - CORS_ORIGIN=* + - LOG_LEVEL=info depends_on: extrudex-db: condition: service_healthy @@ -44,7 +41,7 @@ services: interval: 30s timeout: 10s retries: 3 - start_period: 40s + start_period: 15s networks: - extrudex-network diff --git a/docs/PI-KIOSK-SETUP.md b/docs/PI-KIOSK-SETUP.md new file mode 100644 index 0000000..6354aaa --- /dev/null +++ b/docs/PI-KIOSK-SETUP.md @@ -0,0 +1,168 @@ +# Pi 5 Kiosk Setup — Extrudex (Go + React) + +## Prerequisites + +- Raspberry Pi 5 (4 GB or 8 GB) +- MicroSD card (32 GB minimum, Class 10+) +- HDMI touchscreen display +- USB barcode scanner (HID keyboard mode) +- Power supply (27W USB-C recommended) + +## One-Line Setup + +```bash +# 1. Install Raspberry Pi OS (64-bit, Desktop) +# 2. Enable SSH and VNC +# 3. Run the automated bootstrap +curl -sSL https://raw.githubusercontent.com/CubeCraft-Creations/Extrudex/dev/scripts/pi-bootstrap.sh | bash +``` + +Or follow the manual steps below. + +## Manual Setup + +### 1. Install Docker + +```bash +curl -fsSL https://get.docker.com | sh +sudo usermod -aG docker pi +``` + +Log out and back in for group changes to take effect. + +### 2. Clone and deploy + +```bash +cd /home/pi +git clone https://code.cubecraftcreations.com/CubeCraft-Creations/Extrudex.git +cd Extrudex +git checkout dev + +# Run the deploy script +chmod +x deploy.sh +./deploy.sh +``` + +### 3. Verify services + +```bash +docker compose -f docker-compose.dev.yml ps +# All three services should be "Up" +``` + +Check the health endpoint: +```bash +curl http://localhost:5080/health +# Expected: {"status":"ok","db_connected":true,"timestamp":"..."} +``` + +### 4. Configure kiosk auto-start + +```bash +# Enable the Docker stack service (starts on boot) +sudo cp systemd/extrudex.service /etc/systemd/system/ +sudo systemctl daemon-reload +sudo systemctl enable extrudex.service + +# Enable the kiosk service (starts Chromium after Docker stack) +sudo cp systemd/extrudex-kiosk.service /etc/systemd/system/ +sudo systemctl daemon-reload +sudo systemctl enable extrudex-kiosk.service +``` + +### 5. Configure display server + +For Pi 5, Raspberry Pi OS uses Wayland by default. If you encounter +X11-specific issues, switch to X11 in raspi-config (Advanced Options → +Resolution → X11). + +The kiosk service supports both Wayland and X11 display servers. + +### 6. Touchscreen calibration (if needed) + +```bash +# Install calibration tools +sudo apt install -y xinput-calibrator + +# Run calibration, note the device ID and parameters +xinput_calibrator +``` + +Add the calibration to `~/.config/labwc/labwc.conf` or `/etc/X11/xorg.conf.d/` +as appropriate for your display server. + +## USB Barcode Scanner + +The USB barcode scanner works as a HID keyboard device — it types scanned +codes followed by an Enter keypress. No driver configuration is needed. + +On the React frontend, the search input auto-focuses on page load and +will capture barcode input immediately. After a touch on another element, +tap the search field again to re-focus. + +## Auto-Refresh on Wake + +The React app polls the SSE endpoint every 30 seconds for real-time +updates. When the Pi wakes from sleep, the next poll will immediately +sync the UI. + +The kiosk service has `Restart=always` and `RestartSec=10`, so Chromium +will restart within 10 seconds of any crash or power cycle. + +## Touch Gestures + +Chromium is launched with `--touch-events=enabled` and `--enable-pinch` +for native touch gesture support: +- **Tap** — click/submit +- **Two-finger scroll** — page scrolling +- **Pinch** — zoom (disabled in kiosk mode by default; enable if needed) + +## Troubleshooting + +### Services not starting +```bash +sudo systemctl status extrudex +sudo systemctl status extrudex-kiosk +docker compose -f docker-compose.dev.yml logs +``` + +### Kiosk shows blank page +- Ensure Docker stack is running: `docker compose ps` +- Check nginx is serving the React build: `curl http://localhost:5081` +- Check Chromium logs: `journalctl -u extrudex-kiosk -n 50` + +### Barcode not working +- Verify scanner is in HID keyboard mode (most USB scanners default to this) +- Open a text field and scan — you should see digits appear +- Check with `dmesg | grep -i usb` for device enumeration + +### PostgreSQL connection refused +```bash +docker compose -f docker-compose.dev.yml restart extrudex-db +# Wait 15 seconds, then check health +curl http://localhost:5080/health +``` + +## Architecture + +``` +┌──────────────────────────────────────────────┐ +│ Pi 5 (Raspberry Pi OS 64-bit) │ +│ │ +│ ┌─────────────┐ ┌──────────┐ ┌─────────┐ │ +│ │ Chromium │ │ Nginx │ │ Go │ │ +│ │ Kiosk │→│ (React) │→│ API │ │ +│ │ :5081 │ │ :5080 │ │ :8080 │ │ +│ └─────────────┘ └──────────┘ └────┬────┘ │ +│ │ │ +│ ┌────────▼────┐ │ +│ │ PostgreSQL │ │ +│ │ :5432 │ │ +│ └─────────────┘ │ +│ │ +│ ┌──────────┐ │ +│ │ USB │ │ +│ │ Scanner │ → HID keyboard → Browser │ +│ └──────────┘ │ +└──────────────────────────────────────────────┘ +``` diff --git a/frontend/nginx.conf b/frontend/nginx.conf index 4201e44..4c3caa0 100644 --- a/frontend/nginx.conf +++ b/frontend/nginx.conf @@ -10,7 +10,7 @@ server { } location /api/ { - proxy_pass http://backend:8080/api/; + proxy_pass http://extrudex-api:8080/api/; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection 'upgrade'; diff --git a/systemd/extrudex-kiosk.service b/systemd/extrudex-kiosk.service new file mode 100644 index 0000000..2d77506 --- /dev/null +++ b/systemd/extrudex-kiosk.service @@ -0,0 +1,36 @@ +[Unit] +Description=Extrudex Kiosk (Chromium, Go + React frontend) +After=network-online.target extrudex.service +Requires=extrudex.service + +[Service] +Type=simple +User=pi +Group=pi +Environment=DISPLAY=:0 +Environment=XAUTHORITY=/home/pi/.Xauthority +WorkingDirectory=/home/pi + +ExecStart=/usr/bin/chromium-browser \ + --no-first-run \ + --no-default-browser-check \ + --autoplay-policy=no-user-gesture-required \ + --disable-infobars \ + --disable-window-activation \ + --disable-full-screen-modal \ + --kiosk http://localhost:5081 \ + --disable-features=TranslateUI \ + --touch-events=enabled \ + --enable-pinch + +ExecReload=/bin/kill -HUP $MAINPID + +Restart=always +RestartSec=10 + +# Touchscreen / kiosk +Environment=QT_QPA_PLATFORM=wayland +Environment=QT_WAYLAND_SHELL_INTEGRATION=wayland + +[Install] +WantedBy=multi-user.target diff --git a/systemd/extrudex-kiosk@.service b/systemd/extrudex-kiosk@.service new file mode 100644 index 0000000..fb8b420 --- /dev/null +++ b/systemd/extrudex-kiosk@.service @@ -0,0 +1,12 @@ +[Unit] +Description=Extrudex Kiosk Session (user-level, seat %i) +After=graphical-session.target + +[Service] +Type=simple +Environment=DISPLAY=:0 +ExecStart=/bin/true +Restart=on-failure + +[Install] +WantedBy=graphical-session.target diff --git a/systemd/extrudex.service b/systemd/extrudex.service new file mode 100644 index 0000000..432967f --- /dev/null +++ b/systemd/extrudex.service @@ -0,0 +1,16 @@ +[Unit] +Description=Extrudex Docker Compose Stack (Go + React) +After=network-online.target docker.service +Requires=docker.service + +[Service] +Type=oneshot +RemainAfterExit=yes +WorkingDirectory=/home/pi/extrudex +ExecStart=/usr/bin/docker compose -f docker-compose.dev.yml up -d +ExecStop=/usr/bin/docker compose -f docker-compose.dev.yml down +TimeoutStartSec=120 +TimeoutStopSec=120 + +[Install] +WantedBy=multi-user.target