Docker daemon can't bind-mount a subdirectory that it can't independently
verify — mount the parent and set -w /src/backend instead.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Public feed (/) with infinite scroll via Intersection Observer
- Self-registration (/register)
- Admin area (/admin/entries, /admin/users) with user management
- journal_entries: visibility (public/private) + hashtags fields
- users: is_admin flag
- DB schema updated (recreate DB to apply)
- CI: run go test via docker run (golang:1.25-alpine) — fixes 'go not found'
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Introduce store interfaces (TrackpointStorer, StopStorer, SuggestionStorer)
in internal/db/interfaces.go so handlers can be tested without a real DB.
- Refactor HandleSingleTrackpoint, HandleBatchTrackpoints, HandleListDays,
HandleListTrackpoints, HandleListStops, HandleListSuggestions to accept
the new interfaces instead of concrete *db.*Store pointers (no behaviour
change; concrete types satisfy the interfaces implicitly).
- internal/api/ingest_test.go: 13 handler tests covering happy path,
invalid JSON, invalid timestamp, missing event_id/device_id, out-of-range
lat/lon, empty/oversized batch, store errors, and idempotency (single + batch).
- internal/api/query_test.go: 14 handler tests covering missing query params
(400) and empty-result-is-array guarantees for all four query endpoints.
- internal/auth/auth_test.go: 5 unit tests for HashPassword / VerifyPassword
(correct password, wrong password, empty password, malformed hash, salt
uniqueness).
- internal/db/trackpoints_test.go: 6 unit tests for the validateTrackpoint
helper (happy path, missing fields, coordinate bounds, invalid source).
- .gitea/workflows/deploy.yml: add "Test" step (go test ./...) before
"Build & Deploy" so a failing test aborts the deployment.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- README.md: rewrite with accurate setup steps including all lessons learned
- CLAUDE.md: update with working CI/CD patterns and known pitfalls
- gitea-actions.md: new file documenting Gitea Actions usage, expressions,
act_runner config, and troubleshooting for future projects
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Secure: true requires HTTPS — cookie was not sent back on HTTP requests,
breaking the session after login.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Allows git clone, .env write and docker compose to operate
on the actual NAS filesystem, not the container's tmpfs.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Runs job steps in docker:latest image with host socket mounted —
no need to mount host Docker binary.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Remove submodule tracking; backend is now a plain directory in the repo.
Also update deploy workflow: remove --recurse-submodules.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Runner registered with default labels (ubuntu-latest) instead of
self-hosted — update runs-on to match.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- docker-compose.yml: remove bundled postgres, connect to shared
postgres via host-gateway:5433, add uploads volume, configurable port
- .gitea/workflows/deploy.yml: Gitea Actions workflow for automated
deploy on push to main
- infra/README.md: step-by-step setup guide for NAS deployment
(shared postgres, pgAdmin, act_runner, Gitea secrets)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Adds .env.example as a template and .gitignore to exclude the actual
.env file, preventing accidental credential commits.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Add root Dockerfile: node build → copy dist into Go embed path → distroless binary
- Update docker-compose: one service (api on :9050), DB renamed ralph→pamietnik
- Remove references to RALPH/reisejournal across all docs and configs
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>