Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 14 additions & 0 deletions Dockerfile.prod
Original file line number Diff line number Diff line change
@@ -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

Expand Down
40 changes: 28 additions & 12 deletions craco.config.js
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
6 changes: 6 additions & 0 deletions docker-compose.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down