⚡ Technical Specification · v1.0 · 2026

E-UBI Device Blueprint

A complete hardware and software specification for constructing a physical E-UBI community terminal — from bare components to a fully networked, solar-powered node running TheEtherNet.

🍓 Raspberry Pi 4/5 ⚡ Node.js 20 LTS 🗄️ PostgreSQL 16 🔄 PM2 Process Manager ☁️ Cloudflare Tunnel 📡 Socket.io Real-Time

Physical Components

Every E-UBI terminal is built around a Raspberry Pi single-board computer paired with a touchscreen display, solid-state storage, and a solar-aware power supply. The design is intentionally modular — swap components as the project scales.

🍓
Processing Unit
Raspberry Pi 5 (8 GB)
Quad-core Cortex-A76 @ 2.4 GHz · BCM2712 · PCIe 2.0 for NVMe SSD. Pi 4 (4 GB) is the minimum for running Postgres + Node concurrently.
🖥️
Display
7″ Official RPi Touchscreen
800 × 480 px IPS · 10-point capacitive touch · DSI connector · 70 mA at 5 V. Ideal for kiosk-mode deployments.
💾
Primary Storage
128 GB microSD (U3/A2)
Samsung Pro Endurance or equivalent. High write-endurance is critical for Postgres WAL. Upgrade to NVMe SSD via PCIe hat for production nodes.
🔌
Power Supply
27W USB-C (Pi 5 official)
5.1 V / 5 A. For solar deployments use a 12 V→5 V buck converter (Waveshare Solar Power Manager D) with a 50 W panel + 10 Ah LiFePO₄.
📡
Connectivity
Wi-Fi 802.11ac + Gigabit Ethernet
Built-in on Pi 4/5. For remote deployments add a 4G LTE USB dongle (Huawei E3372) configured via ModemManager.
🎛️
Optional Peripherals
NFC + Audio + Speaker
PN532 NFC module (I²C) for tap-to-login. I²S DAC or 3.5 mm jack for music playback via TheEtherNet profile player.

📋 Bill of Materials

Component Model / Part Est. Cost (USD) Required?
Single-board ComputerRaspberry Pi 5 — 8 GB RAM$80Required
MicroSD CardSamsung Pro Endurance 128 GB$18Required
Touchscreen DisplayOfficial RPi 7″ Touch Display$80Required
Display Case / StandSmartiPi Touch Pro 2$30Required
Power SupplyRaspberry Pi 27W USB-C PSU$12Required
Active CoolerOfficial RPi 5 Active Cooler$5Required
NVMe SSD (Pi 5)WD_BLACK SN770M 256 GB$45Optional
PCIe NVMe HatPimoroni NVMe Base for RPi 5$15Optional
Solar Power ManagerWaveshare Solar Power Manager D$22Optional
Solar Panel50 W 18 V Monocrystalline$40Optional
LiFePO₄ Battery12 V 10 Ah LiFePO₄$35Optional
NFC ModulePN532 I²C Breakout$8Optional
4G LTE DongleHuawei E3372h-325$30Optional
Core kit total~$225
Full solar kit total~$430

Software Architecture

The E-UBI terminal runs a single Express.js process that serves the static SPA build, proxies TheEtherNet API/WebSocket traffic, and exposes the community JSON API — all managed by PM2 and tunnelled to the internet via Cloudflare.

🗺️ Request Flow

🌐 Browser / Mobile
eubi-manifesto.com
☁️ Cloudflare Tunnel
cloudflared service
⚡ Express.js (port 3000)
eubi-server · PM2
GET /
→ dist/index.html (SPA)
GET /admin
→ public/admin.html
/api/*
→ JSON REST API
/ethernet-api/*
→ proxy → port 4000
/ethernet-socket.io
→ WS proxy → port 4000
GET /ethernet
→ TheEtherNet SPA
🕸️ TheEtherNet (port 4000)
ethernet-server · PM2
🗄️ PostgreSQL 16
Prisma ORM · port 5432
📡 Socket.io
Real-time chat / events
Runtime
Node.js 20 LTS
Long-Term Support until April 2026. Install via NodeSource binary repo to stay current on ARM64.
🛣️
Web Framework
Express 5
Reverse-proxy middleware must be registered before body-parser to prevent POST body consumption before forwarding.
🗄️
Database
PostgreSQL 16
The ethereal role requires CREATEDB permission for Prisma shadow database operations during migrations.
🔷
ORM
Prisma 5
Schema at TheEtherNet/server/prisma/schema.prisma. Run migrate deploy (not dev) in production.
📡
Real-Time
Socket.io 4
Used for live DMs, typing indicators, and feed activity. WebSocket upgrade is proxied through the main Express server on /ethernet-socket.io.
🔄
Process Manager
PM2 5
Three managed processes: eubi-server, ethernet-server, and cf-tunnel. Auto-restarts on crash. Saves process list across reboots.

🔷 Database Schema (Prisma)

TheEtherNet/server/prisma/schema.prisma — key models
// Connection — set in .env as DATABASE_URL datasource db { provider = "postgresql" url = env("DATABASE_URL") } model User { id String @id @default(cuid()) username String @unique email String? @unique // optional since auth refactor passwordHash String? isGuest Boolean @default(false) createdAt DateTime @default(now()) profile Profile? posts Post[] songs Song[] sentMessages Message[] @relation("SentMessages") receivedMessages Message[] @relation("ReceivedMessages") friends FriendRequest[] @relation("FriendRequests") } model Message { id String @id @default(cuid()) content String createdAt DateTime @default(now()) sender User @relation("SentMessages", fields: [senderId], references: [id]) senderId String recipient User @relation("ReceivedMessages", fields: [recipientId], references: [id]) recipientId String }

Build & Initialise

Follow these steps in order — from flashing the OS to bringing up both PM2 processes and verifying the live tunnel. Each step includes the exact shell commands needed on a fresh Raspberry Pi OS Lite (64-bit) image.

1
Flash Raspberry Pi OS Lite (64-bit)
Use the official Raspberry Pi Imager. Choose Raspberry Pi OS Lite (64-bit), enable SSH, set hostname, Wi-Fi credentials, and your user in the "Advanced options" before writing.
# On your desktop — download imager $ snap install rpi-imager # Ubuntu/Debian # or: https://www.raspberrypi.com/software/ # After first boot — update all packages $ sudo apt update && sudo apt upgrade -y $ sudo apt install -y git curl build-essential
2
Install Node.js 20 LTS via NodeSource
Do not use the default apt repo — it ships an outdated Node version. Use the official NodeSource script instead.
$ curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash - $ sudo apt install -y nodejs $ node -v # expect: v20.x.x $ npm -v # expect: 10.x.x # Install PM2 globally $ sudo npm install -g pm2 $ pm2 startup systemd -u $USER --hp $HOME $ sudo env PATH=$PATH:/usr/bin pm2 startup systemd -u $USER --hp $HOME
3
Install PostgreSQL 16 & create the database
PostgreSQL 16 is available via the official PGDG apt repository. The ethereal role needs CREATEDB for Prisma shadow-database support during migrations.
# Add PGDG repo $ sudo sh -c 'echo "deb https://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list' $ wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add - $ sudo apt update && sudo apt install -y postgresql-16 # Create role + database $ sudo -u postgres psql -c "CREATE ROLE ethereal WITH LOGIN PASSWORD 'ethereal_pass' CREATEDB;" $ sudo -u postgres psql -c "CREATE DATABASE theethernet OWNER ethereal;" # Verify connection $ psql -U ethereal -d theethernet -c "\dt"
4
Clone the repository & install dependencies
Clone into your home directory. Install dependencies for both the main site and TheEtherNet server and client separately.
$ git clone https://github.com/EveOfSin/ccb-ubi.git ~/ccb-ubi $ cd ~/ccb-ubi # Main E-UBI site $ cd eubi-site && npm install # TheEtherNet back-end $ cd ../TheEtherNet/server && npm install # TheEtherNet front-end $ cd ../client && npm install && npm run build
5
Configure environment variables
Create a .env file in TheEtherNet/server/. Never commit this file — it is already in .gitignore.
# TheEtherNet/server/.env DATABASE_URL="postgresql://ethereal:ethereal_pass@localhost:5432/theethernet" JWT_SECRET="replace-with-a-strong-random-secret-min-32-chars" JWT_REFRESH_SECRET="replace-with-another-strong-secret" PORT=4000 NODE_ENV="production"
6
Run Prisma migrations & seed admin account
Use migrate deploy (not migrate dev) in production — it applies existing migrations without creating new ones or touching the shadow database.
$ cd ~/ccb-ubi/TheEtherNet/server # Apply all pending migrations to theethernet DB $ npx prisma migrate deploy # Generate the Prisma client (if not already built) $ npx prisma generate # Optional: open Prisma Studio to inspect data $ npx prisma studio --port 5555
7
Launch both servers with PM2
The ecosystem.config.js in eubi-site/ defines all three processes. After starting, save the list so PM2 resurrects them on reboot.
$ cd ~/ccb-ubi/eubi-site # Start / restart all processes defined in ecosystem.config.js $ pm2 start ecosystem.config.js # Persist the process list across reboots $ pm2 save # Verify all three processes are online $ pm2 list # Stream live logs from both servers $ pm2 logs --lines 50

Cloudflare Tunnel

Cloudflare Tunnel (cloudflared) exposes the local Express server on port 3000 to the public internet under your domain — no port-forwarding or static IP required. The tunnel itself is managed as a PM2 process.

1
Install cloudflared on the Pi
Download the ARM64 binary directly from the Cloudflare release page.
$ curl -L https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-arm64 -o cloudflared $ sudo mv cloudflared /usr/local/bin/ $ sudo chmod +x /usr/local/bin/cloudflared $ cloudflared --version
2
Authenticate & create a named tunnel
Log in to your Cloudflare account, then create a named tunnel and route it to your domain.
# Opens browser — log in and select your zone (eubi-manifesto.com) $ cloudflared tunnel login # Create the tunnel (generates a UUID-named credentials file) $ cloudflared tunnel create eubi-node-1 # Route DNS — replaces any existing A/CNAME record $ cloudflared tunnel route dns eubi-node-1 eubi-manifesto.com
3
Write the tunnel config file
Create ~/.cloudflared/config.yml. The tunnel forwards all traffic to localhost:3000 where Express is listening.
# ~/.cloudflared/config.yml tunnel: eubi-node-1 credentials-file: /home/pi/.cloudflared/<TUNNEL-UUID>.json ingress: - hostname: eubi-manifesto.com service: http://localhost:3000 - service: http_status:404
4
Add the tunnel to PM2 via ecosystem.config.js
Managing cloudflared as a PM2 process means it auto-restarts on crash and is included in pm2 save.
// eubi-site/ecosystem.config.js — cf-tunnel entry { name: 'cf-tunnel', script: '/usr/local/bin/cloudflared', args: 'tunnel run eubi-node-1', autorestart: true, watch: false, env: { HOME: '/home/pi' } }

Physical Design

The enclosure should be weather-resistant (for outdoor deployments), tamper-evident, and aesthetically aligned with the E-UBI brand — dark finish with gold accent lettering. Below are the recommended configurations for indoor kiosk vs. outdoor node.

🏢
Indoor Kiosk
SmartiPi Touch Pro 2
Designed specifically for the official 7″ RPi display. Includes a tilting stand, Pi 4/5 mount, and cable management. Available in black. Laser-engrave the E-UBI logo on the face plate.
🌧️
Outdoor Node
IP65 ABS Junction Box
200×150×75 mm NEMA 4X rated box. Mount display behind a polycarbonate window cutout. Use waterproof cable glands for power + Ethernet. Spray paint matte black with gold stencil.
🌞
Solar Mounting
Adjustable Tilt Bracket
Mount the 50 W panel at ~30–35° tilt facing true south (northern hemisphere) for maximum annual yield. Use an M8 stainless steel bracket rated for 60 mph wind load.
🎨
Branding
Gold on Matte Black
Vinyl cut or laser-engraved E-UBI yin-yang logo + "Community UBI Terminal" text. Font: Inter 700. Gold: #FFD700. Reserve 40 mm clearance around display bezel.
🔒
Security
Kensington Lock + Tamper Seal
Thread a Kensington cable through the Pi's mounting holes before closing the enclosure. Apply a tamper-evident holographic seal over the enclosure seam.
🌡️
Thermal Management
Active Cooler + Passive Vent
The official Pi 5 active cooler keeps the BCM2712 below 60 °C in ambient temperatures up to 35 °C. Add a 60 mm mesh vent near the top of the enclosure for convection.