nginx sat on two Docker networks (Coolify's shared per-app network,
where coolify-proxy lives, plus our custom "mandant" bridge). With
no explicit traefik.docker.network label, Traefik's Docker provider
picked one non-deterministically across deploys — when it picked
"mandant", its backend connection went to an unreachable network and
silently hung after completing the TLS/HTTP handshake with clients.
All services already share Coolify's injected network, so the custom
network was redundant. Removing it leaves each container on exactly
one network, eliminating the ambiguity.
No named 'login' route exists anywhere in this app (it's a pure API
backend for the Nuxt SPA). Authenticate::redirectTo() called
route('login') for any request without an explicit Accept: application/json
header, throwing RouteNotFoundException and surfacing as a 500 instead
of the expected 401.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
storage/framework/{cache,sessions,views}, storage/logs, and
bootstrap/cache are all gitignored with no tracked placeholder, so a
fresh checkout (as Coolify does) has none of them. composer install's
package:discover post-autoload script writes to bootstrap/cache and
failed with "directory must be present and writable" since it simply
didn't exist yet.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
composer.json dropped filament/*, livewire, and openspout in 71730fe,
but composer.lock was never regenerated. The stale lock still pinned
those packages, and a --no-dev install (as used in the prod Docker
build) failed because filament/support requires ext-intl and
openspout requires ext-zip, neither of which are installed in the
prod PHP image.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Coolify builds with --project-directory set to the repo root, which broke
the dev compose file's relative paths. Adds a dedicated prod compose stack
(baked-in code, no bind mounts, no hardcoded secrets, static Nuxt build
served by nginx) so local dev and Coolify no longer share fragile path
assumptions.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
- Nuxt 3 CSR (ssr:false), @nuxtjs/tailwindcss, dev proxy to backend
- useAuth composable: CSRF cookie, XSRF token, login/logout/fetchUser
- auth middleware: redirects to /login if no session
- Login page, client list with search + create modal
- Client detail with editable name, dynamic notes (JSON), history feed
- History form with type select, inline edit/delete per entry
- Print layout at /clients/:id/print (calls window.print on mount)
- TypeScript interfaces: User, Client, HistoryEntry, PaginatedResponse
- German UI labels throughout
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>