deploy guide

Deploy to Render

Render docs

why pick Render

prerequisites

1 · push neuromast/ to your own GitHub repo

Skip if you forked Axol. Otherwise seed a fresh repo:

cp -r neuromast /tmp/my-neuromast
cd /tmp/my-neuromast
git init -b main
git add .
git commit -m "seed neuromast"
gh repo create my-neuromast --private --source=. --push

2 · create the Render services

  1. New Web Service from your repo

    Dashboard → New → Web Service → connect the GitHub repo → pick your neuromast repo.

    Settings: Runtime Node, Build Command npm install && npm run build:node, Start Command npm start. If you forked the whole Axol repo, set Root Directory to neuromast.

  2. Add a Key Value (Redis) instance

    Dashboard → New → Key Value. Pick a region matching your web service's. Render assigns an internal hostname like red-abc123.

  3. Wire Redis into the web service

    Web service → Environment → Add Environment VariableAdd from Database → pick the Key Value instance → select Internal Redis URL. Render names it REDIS_URL by default, which is exactly what neuromast's storage factory auto-detects.

  4. Set the remaining env vars

    Still in Environment, mark each as a secret:

    • ADAPTER=node — tells Astro to build for Node, not Cloudflare.
    • POLL_TOKEN — bearer for /pull + /ack. openssl rand -hex 32.
    • SHARED_SECRET (optional)?key= fallback.
    • HOOK_SCHEME_<SOURCE> + HOOK_SECRET_<SOURCE> per signed source.
  5. Manual Deploy once to trigger the build

    Web service → Manual Deploy → Deploy latest commit. First build takes ~2–3 min (installs deps, runs build:node, starts the Node server).

  6. Probe the endpoints

    export AXOL_CLOUD_URL=https://<your-service>.onrender.com
    export POLL_TOKEN='the-bearer-you-set'
    export SHARED_SECRET='the-shared-key-you-set'
    
    curl -X POST "$AXOL_CLOUD_URL/app/api/hooks/smoke?key=$SHARED_SECRET" \
      -H 'content-type: application/json' \
      -d '{"title":"hello","body":"from render"}'

    If you're on the free tier and the service has been idle, the first request may hang for 20–30 s while Render wakes the dyno. Subsequent requests are instant until the next idle window.

3 · connect the local forwarder

AXOL_CLOUD_URL="$AXOL_CLOUD_URL" \
AXOL_POLL_TOKEN="$POLL_TOKEN" \
./lateral-line/install.sh

day-2 operations

Redeploying

git push. Render watches the branch and deploys automatically.

Rotating secrets

Dashboard → service → Environment → edit → Save. Render restarts the service on save.

Keeping free-tier warm

Render's free web services spin down after 15 min idle. The local forwarder's 15 s polling keeps the service warm during your work day — free-tier idle windows only happen overnight. If you want zero cold starts, upgrade the web service to the $7/mo plan.

troubleshooting