Landing page for movetoeu.cloud — deploy production-ready Kubernetes clusters on EU cloud providers using Terraform/OpenTofu.
- Vite + React + TypeScript
- shadcn/ui + Tailwind CSS
- Vitest + Testing Library
npm i
npm run dev # http://localhost:8080
npm run build
npm run lint
npm run testThe static site lives on Hetzner webhosting and is deployed over SFTP with
deploy.sh (needs brew install lftp):
cp deploy.env.example deploy.env # already filled in locally
./deploy.sh --dry-run # show what would change, upload nothing
./deploy.sh # test, build, mirror dist/ -> public_html/
./deploy.sh --no-build # mirror the existing dist/ as-isIt authenticates with the ssh key registered under SSH in konsoleH, mirrors
dist/ into the docroot (deleting stale hashed assets), and then checks that
the live site actually serves the new bundle. public/.htaccess ships with the
build: it routes unknown paths to index.html for client-side routing and sets
cache headers.
Signup forms POST to the notify endpoint, which lives in its own project at
../api (FastAPI + Lettermint, an EU-based
email API). It is deployed separately to https://api.movetoeu.cloud.
- Production:
.env.productionsetsVITE_NOTIFY_ENDPOINTtohttps://api.movetoeu.cloud/api/notify. Since that is a different origin, the API host needsALLOW_ORIGINS=https://movetoeu.cloudin its env file. - Dev: no env var is set, so the forms hit
/api/notifyand Vite proxies/apitolocalhost:3001. Run the API there withcd ../api && uv run uvicorn main:app --port 3001.