This setup keeps the frontend free on GitHub Pages and runs the API, worker, and Redis on an Oracle Always Free VM.
https://YOUR_USERNAME.github.io/REPO_NAME/https://YOUR_SUBDOMAIN.duckdns.orgYou do not need a paid domain for this setup.
Pages and select GitHub Actions as the source.PAGES_API_URL.PAGES_API_URL to your API URL, for example https://medyan-api.duckdns.org.main and wait for the Deploy Frontend to GitHub Pages workflow to finish.The workflow publishes index.html, public/*, and a generated config.js.
medyan-api.80 and 443 in the Oracle security list and VM firewall.Example commands:
sudo apt update
sudo apt install -y ca-certificates curl gnupg
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
$(. /etc/os-release && echo $VERSION_CODENAME) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin git
sudo usermod -aG docker $USER
deploy/oracle/.env.oracle.example to deploy/oracle/.env.oracle.API_DOMAIN, DUCKDNS_SUBDOMAIN, DUCKDNS_TOKEN, API_KEY, JWT_SECRET, and CORS_ORIGINS.docker compose -f deploy/oracle/docker-compose.oracle.yml --profile duckdns up -d --build
CORS_ORIGINS must be your exact GitHub Pages URL.AUTH_COOKIE_SAMESITE=None and HTTPS enabled.API_KEY remains server-side only. Do not add it to frontend files.PUBLIC_DETECTION_ENABLED=false, PUBLIC_EXTRACT_ENABLED=false, and PUBLIC_NEXUS_SUBMIT_ENABLED=false.X-API-Key (or Authorization: Bearer ...) for those endpoints.https://YOUR_SUBDOMAIN.duckdns.org/health.You can use the same static files and the same API stack.
CORS_ORIGINS.API_URL.