mirror of
https://github.com/temetro/temetro.git
synced 2026-08-28 11:27:40 +00:00
Fix Docker runtime: secure cookies over HTTP and empty env vars
- useSecureCookies now keys off the BETTER_AUTH_URL scheme instead of NODE_ENV, so login works over http://localhost in the (production-mode) Docker stack instead of the browser silently dropping the session cookie. - env parsing treats empty strings as unset, so compose-supplied optionals like `SMTP_PORT=` no longer fail coercion (Number("") === 0) and crash boot. - docker-compose: configurable host Postgres port (POSTGRES_PORT) to avoid clashing with an existing local Postgres. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
+5
-2
@@ -4,7 +4,7 @@ import { organization } from "better-auth/plugins";
|
|||||||
|
|
||||||
import { db } from "./db/index.js";
|
import { db } from "./db/index.js";
|
||||||
import * as authSchema from "./db/schema/auth.js";
|
import * as authSchema from "./db/schema/auth.js";
|
||||||
import { env, isProd } from "./env.js";
|
import { env } from "./env.js";
|
||||||
import { ac, roles } from "./lib/access.js";
|
import { ac, roles } from "./lib/access.js";
|
||||||
import { sendEmail } from "./lib/email.js";
|
import { sendEmail } from "./lib/email.js";
|
||||||
|
|
||||||
@@ -85,7 +85,10 @@ export const auth = betterAuth({
|
|||||||
},
|
},
|
||||||
|
|
||||||
advanced: {
|
advanced: {
|
||||||
useSecureCookies: isProd,
|
// Secure cookies only when actually served over HTTPS — otherwise the
|
||||||
|
// browser silently drops them over http://localhost and login "does
|
||||||
|
// nothing". This is correct regardless of NODE_ENV.
|
||||||
|
useSecureCookies: env.BETTER_AUTH_URL.startsWith("https://"),
|
||||||
defaultCookieAttributes: { sameSite: "lax" },
|
defaultCookieAttributes: { sameSite: "lax" },
|
||||||
ipAddress: { ipAddressHeaders: ["x-forwarded-for", "x-real-ip"] },
|
ipAddress: { ipAddressHeaders: ["x-forwarded-for", "x-real-ip"] },
|
||||||
},
|
},
|
||||||
|
|||||||
+8
-1
@@ -23,7 +23,14 @@ const schema = z.object({
|
|||||||
SMTP_FROM: z.string().default("temetro <no-reply@temetro.local>"),
|
SMTP_FROM: z.string().default("temetro <no-reply@temetro.local>"),
|
||||||
});
|
});
|
||||||
|
|
||||||
const parsed = schema.safeParse(process.env);
|
// docker compose passes unset optionals as empty strings (e.g. `${SMTP_PORT:-}`).
|
||||||
|
// Treat empty strings as "unset" so optionals/defaults apply instead of failing
|
||||||
|
// coercion (e.g. Number("") === 0).
|
||||||
|
const rawEnv = Object.fromEntries(
|
||||||
|
Object.entries(process.env).map(([k, v]) => [k, v === "" ? undefined : v]),
|
||||||
|
);
|
||||||
|
|
||||||
|
const parsed = schema.safeParse(rawEnv);
|
||||||
|
|
||||||
if (!parsed.success) {
|
if (!parsed.success) {
|
||||||
const lines = parsed.error.issues
|
const lines = parsed.error.issues
|
||||||
|
|||||||
Reference in New Issue
Block a user