Dokploy deploy: Dockerfile, DB CA cert, blog images, CSP
CI / build-and-test (push) Has been cancelled

- Add Dockerfile (multi-stage Node 20), .dockerignore, docker-compose.yml, and
  DEPLOY-DOKPLOY.md for container deployment on Dokploy.
- Commit the DigitalOcean managed-Postgres Project CA cert (certs/ca-certificate.crt)
  so production TLS verification (fail-closed) works in-container. Public CA, safe to commit.
- Blog cover images served from DO Spaces; allow *.digitaloceanspaces.com in the prod CSP img-src.
- Includes the AI (case summaries) and Cloudflare Turnstile bot-protection features.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Leon Serfaty
2026-07-17 13:04:18 -04:00
co-authored by Claude Fable 5
parent d9b807662a
commit d1d96e4dd2
29 changed files with 1224 additions and 28 deletions
+6 -2
View File
@@ -36,7 +36,7 @@ export function useMe() {
export function useLogin() {
const qc = useQueryClient();
return useMutation<AuthUser, ApiError, { email: string; password: string }>({
return useMutation<AuthUser, ApiError, { email: string; password: string; turnstileToken?: string }>({
mutationFn: async (vars) => {
const data = await api.post<MeResponse>('/api/auth/login', vars);
return data.user;
@@ -47,7 +47,11 @@ export function useLogin() {
export function useSignup() {
const qc = useQueryClient();
return useMutation<AuthUser, ApiError, { email: string; password: string; fullName: string; firmName: string }>({
return useMutation<
AuthUser,
ApiError,
{ email: string; password: string; fullName: string; firmName: string; turnstileToken?: string }
>({
mutationFn: async (vars) => {
const data = await api.post<MeResponse>('/api/auth/signup', vars);
return data.user;
+1 -1
View File
@@ -2,7 +2,7 @@ import { useMutation } from '@tanstack/react-query';
import { api, type ApiError } from '@/lib/api';
export function useRequestPasswordReset() {
return useMutation<{ ok: boolean }, ApiError, { email: string }>({
return useMutation<{ ok: boolean }, ApiError, { email: string; turnstileToken?: string }>({
mutationFn: (body) => api.post('/api/auth/request-password-reset', body),
});
}