A simple website to store reports and photos from hiking trips. This is a personal learning project.
Despite the simplicity of the app, the stack is meant to be robust and well made. None of this is vibe-coded in order to actually practice modern web development principles and technologies, though I admit that AI has helped create initial scaffolding for Github Actions workflow and Terraform.
- Python (FastAPI)
- JWT-based auth (two fixed roles with two fixed passwords, bcrypt hashes in env vars)
- PostgreSQL (asyncpg)
- raw SQL queries (no ORM)
- migrations handled by alembic
- GCP Storage bucket for photos (private, backend requests presigned URLs)
- very basic vanilla TypeScript for now
- bunded by Vite
- defined in Terraform for GCP
- hosting uses Firebase
- completely separate stage and prod envs
- docker-compose for local development, including faked GCP bucket
- Github Actions workflow deploys on pushes to
stageandprodbranches - Github -> GCP auth relies on WIF (Workload Identity Federation)
More detailed documentation can be found in the respective folders (and of course in the code itself).
cp .env.example .env- Edit
.envand fill in your values docker compose up -dcd frontend && npm run dev- The website is now available at
localhost:5173(or another port that Vite chooses)
See infra/README.md for instructions on how to setup GCP projects.
For manual deployment, read comments in backend/deploy.sh (backend) and frontend/README.md (frontend).
Github Actions workflow in .github/workflows/deploy.yml documents the same process (except manual auth).