diff --git a/Dockerfile.prod b/Dockerfile.prod index 4aa5e1d..4c81f00 100644 --- a/Dockerfile.prod +++ b/Dockerfile.prod @@ -1,6 +1,20 @@ # Use official Node.js image as the base FROM node:18-alpine AS build +# Accept build arguments for environment variables +ARG DOMAIN +ARG EMAIL +ARG TRAEFIK_PASSWORD_HASH +ARG PROJECT_DIR +ARG NODE_ENV=production + +# Set environment variables for the build stage +ENV DOMAIN=$DOMAIN +ENV EMAIL=$EMAIL +ENV TRAEFIK_PASSWORD_HASH=$TRAEFIK_PASSWORD_HASH +ENV PROJECT_DIR=$PROJECT_DIR +ENV NODE_ENV=$NODE_ENV + # Set working directory WORKDIR /app diff --git a/craco.config.js b/craco.config.js index 5d51b69..4584cda 100644 --- a/craco.config.js +++ b/craco.config.js @@ -23,23 +23,39 @@ module.exports = { envPath = path.resolve(__dirname, "../client_env/.env"); } - // If relative path doesn't exist, try absolute path (for server) - console.log("Loading environment variables from:", envPath); webpackConfig.plugins.forEach((plugin) => { if (plugin.constructor.name === "DefinePlugin") { + // Try to load from .env file first const dotenv = require("dotenv").config({ path: envPath }); - const envKeys = Object.keys(dotenv.parsed || {}).reduce( - (prev, next) => { - prev[`process.env.${next}`] = JSON.stringify( - dotenv.parsed[next] - ); - return prev; - }, - {} - ); - plugin.definitions = { ...plugin.definitions, ...envKeys }; + + // Get environment variables from .env file + const envFromFile = dotenv.parsed || {}; + + // Get environment variables from process.env (for production builds) + const envFromProcess = { + DOMAIN: process.env.DOMAIN, + EMAIL: process.env.EMAIL, + TRAEFIK_PASSWORD_HASH: process.env.TRAEFIK_PASSWORD_HASH, + PROJECT_DIR: process.env.PROJECT_DIR, + NODE_ENV: process.env.NODE_ENV, + ENV: process.env.NODE_ENV === 'production' ? 'PROD' : 'LOCAL', + // Add any other environment variables you need + }; + + // Merge environment variables (process.env takes precedence) + const allEnvVars = { ...envFromFile, ...envFromProcess }; + + // Remove undefined values + const filteredEnvVars = Object.keys(allEnvVars).reduce((prev, next) => { + if (allEnvVars[next] !== undefined) { + prev[`process.env.${next}`] = JSON.stringify(allEnvVars[next]); + } + return prev; + }, {}); + + plugin.definitions = { ...plugin.definitions, ...filteredEnvVars }; } }); return webpackConfig; diff --git a/docker-compose.yml b/docker-compose.yml index 8473993..cac23bc 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -30,6 +30,12 @@ services: build: context: . dockerfile: Dockerfile.prod + args: + DOMAIN: ${DOMAIN} + EMAIL: ${EMAIL} + TRAEFIK_PASSWORD_HASH: ${TRAEFIK_PASSWORD_HASH} + PROJECT_DIR: ${PROJECT_DIR} + NODE_ENV: production container_name: dictionary-app restart: unless-stopped networks: