From f3a76639fc8272b3f353ff676933284f63af08da Mon Sep 17 00:00:00 2001 From: majortom327 Date: Mon, 29 Jan 2024 20:32:59 -0800 Subject: [PATCH] Add environment variables and update code based on environment in server files --- .env.dist | 13 ++++++++--- app/db.server.ts | 3 ++- .../auth_strategies/auth0.strategy.ts | 9 ++++---- app/services/env.server.ts | 16 ++++++++++++++ app/services/logger.server.ts | 3 ++- app/services/session.server.ts | 5 +++-- docker-compose.yml | 22 +++++++++++++++++++ package.json | 14 +++++++----- 8 files changed, 68 insertions(+), 17 deletions(-) create mode 100644 app/services/env.server.ts create mode 100644 docker-compose.yml diff --git a/.env.dist b/.env.dist index fc61185..8637f18 100644 --- a/.env.dist +++ b/.env.dist @@ -1,4 +1,11 @@ -APP_KEY= -APP_NAME= +# Env vars added by Remix Forge +APP_URL="http://localhost:3000" +SESSION_SECRET="{{uuid}}" -SESSION_SECRET= +# auth0 Env Variables +AUTH0_CLIENT_ID="" +AUTH0_CLIENT_SECRET="" +AUTH0_DOMAIN="" + +# Database Env Variables +DATABASE_URL="postgresql://{{docker:postgres.POSTGRES_USER}}:{{docker:postgres.POSTGRES_PASSWORD}}@localhost:5432/{{docker:postgres.POSTGRES_DB}}" diff --git a/app/db.server.ts b/app/db.server.ts index 3815020..4f553b7 100644 --- a/app/db.server.ts +++ b/app/db.server.ts @@ -1,4 +1,5 @@ import { PrismaClient } from "@prisma/client"; +import Env from "./services/env.server"; let prisma = new PrismaClient(); @@ -7,7 +8,7 @@ declare global { var __db__: PrismaClient | undefined; } -if (process.env.NODE_ENV === "production") { +if (Env.get("NODE_ENV") === "production") { prisma = new PrismaClient(); } else { if (!global.__db__) { diff --git a/app/services/auth_strategies/auth0.strategy.ts b/app/services/auth_strategies/auth0.strategy.ts index fe6d2e2..f1ace26 100644 --- a/app/services/auth_strategies/auth0.strategy.ts +++ b/app/services/auth_strategies/auth0.strategy.ts @@ -3,10 +3,11 @@ import { Auth0Strategy } from "remix-auth-auth0"; import type { User } from "~/services/auth.server"; import { AuthStrategies } from "~/services/auth_strategies"; +import Env from "../env.server"; -const clientID = process.env.AUTH0_CLIENT_ID; -const clientSecret = process.env.AUTH0_CLIENT_SECRET; -const domain = process.env.AUTH0_DOMAIN; +const clientID = Env.get("AUTH0_CLIENT_ID"); +const clientSecret = Env.get("AUTH0_CLIENT_SECRET"); +const domain = Env.get("AUTH0_DOMAIN"); if (!clientID || !clientSecret || !domain) { throw new Error( @@ -19,7 +20,7 @@ export const auth0Strategy = new Auth0Strategy( clientID, clientSecret, domain, - callbackURL: `${process.env.APP_URL}/auth/${AuthStrategies.AUTH0}/callback`, + callbackURL: `${Env.get("APP_URL")}/auth/${AuthStrategies.AUTH0}/callback`, }, async ({ accessToken, refreshToken, profile, extraParams }) => { // Do something with the tokens and profile diff --git a/app/services/env.server.ts b/app/services/env.server.ts new file mode 100644 index 0000000..191f40a --- /dev/null +++ b/app/services/env.server.ts @@ -0,0 +1,16 @@ +import configure from "env-refiner"; +import zod from "zod"; + +export const Env = configure({ + schema: zod.object({ + APP_URL: zod.string().url(), + SESSION_SECRET: zod.string(), + + AUTH0_CLIENT_ID: zod.string(), + AUTH0_CLIENT_SECRET: zod.string(), + AUTH0_DOMAIN: zod.string(), + + DATABASE_URL: zod.string().url(), + }), +}); +export default Env; diff --git a/app/services/logger.server.ts b/app/services/logger.server.ts index 534e055..c47fa93 100644 --- a/app/services/logger.server.ts +++ b/app/services/logger.server.ts @@ -1,7 +1,8 @@ import pino from "pino"; import { match } from "ts-pattern"; +import Env from "./env.server"; -const logLevel = match(process.env.NODE_ENV) +const logLevel = match(Env.get("NODE_ENV")) .with("development", () => "debug") .with("test", () => "silent") .otherwise(() => "info"); diff --git a/app/services/session.server.ts b/app/services/session.server.ts index 8fe2d7c..f13c9b1 100644 --- a/app/services/session.server.ts +++ b/app/services/session.server.ts @@ -1,4 +1,5 @@ import { createCookieSessionStorage } from "@remix-run/node"; +import Env from "./env.server"; // export the whole sessionStorage object export const sessionStorage = createCookieSessionStorage({ @@ -7,8 +8,8 @@ export const sessionStorage = createCookieSessionStorage({ sameSite: "lax", // this helps with CSRF path: "/", // remember to add this so the cookie will work in all routes httpOnly: true, // for security reasons, make this cookie http only - secrets: [process.env.SESSION_SECRET], // replace this with an actual secret - secure: process.env.NODE_ENV === "production", // enable this in prod only + secrets: [Env.get("SESSION_SECRET")], // replace this with an actual secret + secure: Env.get("NODE_ENV") === "production", // enable this in prod only }, }); diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..041782e --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,22 @@ +version: "3.7" +services: + postgres: + image: postgres:latest + restart: always + environment: + - POSTGRES_USER=postgres + - POSTGRES_PASSWORD=postgres + - POSTGRES_DB=dev + ports: + - "5432:5432" + # volumes: + # # - ./scripts/pg-init:/docker-entrypoint-initdb.d + # - ./postgres-data:/var/lib/postgresql/data + adminer: + image: adminer + restart: always + ports: + - 8080:8080 + environment: + - ADMINER_DEFAULT_SERVER=postgres + - ADMINER_DESIGN=dracula diff --git a/package.json b/package.json index 5b7ae47..4ec00c6 100644 --- a/package.json +++ b/package.json @@ -19,7 +19,8 @@ "db:gen": "prisma generate", "db:migrate": "prisma migrate dev", "db:seed": "prisma db seed", - "db:studio": "prisma studio" + "db:studio": "prisma studio", + "env:gen": "env-refiner -i ./.env.dist -o ./.env" }, "prettier": {}, "eslintIgnore": [ @@ -32,13 +33,14 @@ "@architect/functions": "^7.0.0", "@paralleldrive/cuid2": "^2.2.2", "@prisma/client": "^5.8.1", - "@remix-run/architect": "^2.5.0", - "@remix-run/css-bundle": "^2.5.0", - "@remix-run/node": "^2.5.0", - "@remix-run/react": "^2.5.0", + "@remix-run/architect": "*", + "@remix-run/css-bundle": "*", + "@remix-run/node": "*", + "@remix-run/react": "*", "bcryptjs": "2.4.3", "class-variance-authority": "^0.7.0", "clsx": "^2.1.0", + "env-refiner": "^0.0.9", "isbot": "^3.7.0", "lucide-react": "^0.311.0", "luxon": "^3.4.4", @@ -58,7 +60,7 @@ }, "devDependencies": { "@faker-js/faker": "^8.2.0", - "@remix-run/dev": "^2.5.0", + "@remix-run/dev": "*", "@testing-library/cypress": "^10.0.1", "@testing-library/jest-dom": "^6.1.4", "@trivago/prettier-plugin-sort-imports": "^4.3.0",