ARM64-optimized fork with a hardened, reproducible setup. Fixes the classic “Failed to fetch” by steering the frontend to the Pi’s API IP.
- Quick Start
- Architecture
- Detailed Setup
- Ignition Script
- Autostart on Boot
- Verification Checklist
- Troubleshooting
- FAQ
-
Install prerequisites
Docker + Docker Compose. Ensure your user is in thedockergroup. -
Configure frontend environment
Detect your Pi’s LAN IP and inject into the client build:PI_IP=$(hostname -I | awk '{print $1}') echo "REACT_APP_SERVER_IP=${PI_IP}" > client/.env
-
Build & run the stack
docker compose down docker compose build --no-cache docker compose up -d
-
Open the app
UI →http://${PI_IP}:3000
API →https://${PI_IP}:8443 -
(Optional) Enable autostart
See Autostart on Boot.
Flow summary
- Client (React) reads
REACT_APP_SERVER_IPat build time → calls API athttps://${IP}:8443. - API serves requests, talks to PostgreSQL, orchestrates modules (assetfinder, gospider, nuclei, etc.).
- All services live on Docker network
ars0n-network.
Ports
- Client →
3000/tcp(host → container) - API →
8443/tcp(host → container) - DB →
5432/tcp(internal only unless exposed)
-
Raspberry Pi 4 (8 GB recommended), ARM64 Linux
-
Docker daemon running
-
Add your user to Docker:
sudo usermod -aG docker ${USER} newgrp docker
Create the .env before building:
PI_IP=$(hostname -I | awk '{print $1}')
echo "REACT_APP_SERVER_IP=${PI_IP}" > client/.envThis writes:
REACT_APP_SERVER_IP=192.168.1.92
docker compose down
docker compose build --no-cache
docker compose up -dAutomates IP detection, environment generation, and deployment.
Save as ignition.sh in repo root, make it executable (chmod +x ignition.sh), then run:
#!/usr/bin/env bash
set -e
echo "[+] Detecting Pi IP address..."
PI_IP=$(hostname -I | awk '{print $1}')
if [ -z "$PI_IP" ]; then
echo "Error: Could not detect local IP address. Exiting."
exit 1
fi
echo "Detected IP: $PI_IP"
echo "[+] Writing frontend env configuration (client/.env)..."
mkdir -p client
cat > client/.env <<EOF
REACT_APP_SERVER_IP=${PI_IP}
EOF
echo "[+] Shutting down any existing containers..."
docker compose down || true
echo "[+] Building containers (no cache)..."
docker compose build --no-cache
echo "[+] Starting containers..."
docker compose up -d
echo "[+] Setup complete."
echo "UI : http://${PI_IP}:3000"
echo "API : https://${PI_IP}:8443"Create /etc/systemd/system/ars0n.service:
[Unit]
Description=Ars0n Framework Service
Requires=docker.service
After=network-online.target docker.service
[Service]
Type=oneshot
RemainAfterExit=yes
User=${USER}
Group=${USER}
WorkingDirectory=/path/to/your/repo
ExecStart=/usr/bin/docker compose up -d --build
ExecStop=/usr/bin/docker compose down
Restart=on-failure
RestartSec=10s
[Install]
WantedBy=multi-user.targetEnable it:
sudo systemctl daemon-reload
sudo systemctl enable --now ars0n.service-
client/.envexists and containsREACT_APP_SERVER_IP=<Pi IP> -
docker compose up -dcompletes without errors -
docker compose psshowsclient,api,dbasUp - UI reachable at
http://${PI_IP}:3000 - API reachable at
https://${PI_IP}:8443 - Browser network calls target the Pi IP (not
127.0.0.1)
| Symptom | Root Cause | Fix |
|---|---|---|
| “Failed to fetch” / import fails | Frontend still points to 127.0.0.1 |
Recreate .env, rebuild, confirm requests hit https://${IP}:8443. |
| CORS error in browser | API not allowing frontend origin | Allow CORS for http://${PI_IP}:3000. |
| UI loads but actions fail | API unreachable / wrong protocol | curl -k https://${PI_IP}:8443/ to verify API; adjust protocol or cert. |
Nothing on :3000 |
Client binds only to localhost | Ensure it listens on 0.0.0.0 in config. |
| DB errors | Database not ready / bad credentials | Check docker compose logs db and API’s DATABASE_URL. |
Logs:
docker compose logs client
docker compose logs api
docker compose logs dbNetwork & ports:
docker compose ps
ss -tulpen | grep -E '(:3000|:8443)'Q: Do I need to edit the compose file for my IP?
A: No. Run ./ignition.sh or manually create .env before building.
Q: Can I change the UI port?
A: Yes. Edit the client service ports mapping in docker-compose.yml.
Q: Will this work on non-Pi hosts?
A: Yes, provided the environment variable points to the correct host IP.
client:
container_name: ars0n-framework-v2-client-1
build:
context: ./client
args:
REACT_APP_SERVER_IP: 192.168.1.92
ports:
- "3000:3000"
depends_on:
- api
restart: unless-stopped
networks:
- ars0n-networkEnsure your full compose file matches this pattern.






