🎉 We are now featured on arktype.io!
ArkEnv

How to load environment variables

Learn environment variables management in different environments and deployment scenarios.

Link to section: local-developmentLocal development

Link to section: using-env-filesUsing .env files

The most common way to manage environment variables during development is using .env files:

.env
DATABASE_HOST=localhost
DATABASE_PORT=5432
NODE_ENV=development
API_KEY=your-secret-key
LOG_LEVEL=debug

Link to section: best-practices-for-env-filesBest practices for .env files

  1. Document required variables Create a .env.example file to document required variables:

    .env.example
    DATABASE_HOST=localhost
    DATABASE_PORT=5432
    NODE_ENV=development
    API_KEY=your-secret-key-here
    LOG_LEVEL=info
  2. Gitignore configuration Add these patterns to your .gitignore:

    .gitignore
    .env
    .env.*
    !.env.example
  3. Environment-specific files Use different files for different environments:

    • .env.development - Development settings
    • .env.test - Test environment settings
    • .env.production - Production defaults (if needed)

Link to section: loading-environment-variablesLoading environment variables

Link to section: using-dotenvUsing dotenv

The simplest way to load environment variables is using the dotenv package:

src/index.ts
import 'dotenv/config';
// or
import * as dotenv from 'dotenv';
dotenv.config();

Link to section: framework-specific-solutionsFramework-specific solutions

Many frameworks have built-in support for environment variables:

Link to section: nextjsNext.js

Link to section: viteVite

Link to section: expressExpress

src/app.ts
import express from 'express';
import dotenv from 'dotenv';

dotenv.config();
const app = express();

Link to section: nestjsNest.js

src/app.module.ts
import { ConfigModule } from '@nestjs/config';

@Module({
  imports: [
    ConfigModule.forRoot({
      isGlobal: true,
    }),
  ],
})

Link to section: runtime-argumentsRuntime arguments

You can also supply variables when running your application:

DATABASE_HOST=localhost DATABASE_PORT=5432 npm start

Link to section: production-deploymentProduction deployment

Link to section: cloud-platformsCloud platforms

Link to section: awsAWS

  • Use AWS Systems Manager Parameter Store for non-sensitive values
  • Use AWS Secrets Manager for sensitive values
  • Set environment variables in ECS Task Definitions or Lambda configurations

Link to section: google-cloud-platformGoogle Cloud Platform

  • Use Cloud Secret Manager for sensitive values
  • Set environment variables in Cloud Run or App Engine configurations

Link to section: azureAzure

  • Use Azure Key Vault for sensitive values
  • Configure App Settings in Azure App Service

Link to section: container-environmentsContainer environments

Link to section: dockerDocker

Dockerfile
ENV NODE_ENV=production
docker-compose.yml
services:
  app:
    environment:
      - NODE_ENV=production
      - DATABASE_HOST=db

Link to section: kubernetesKubernetes

deployment.yaml
spec:
  containers:
    - name: app
      env:
        - name: NODE_ENV
          value: "production"
        - name: DATABASE_HOST
          valueFrom:
            configMapKeyRef:
              name: app-config
              key: database-host

Link to section: traditional-hostingTraditional hosting

  • Set environment variables through the hosting platform's dashboard
  • Use deployment scripts to configure environment variables
  • Consider using configuration management tools

Link to section: security-best-practicesSecurity best practices

  1. Never commit sensitive values

    • Keep .env files out of version control
    • Use secrets management services in production
  2. Use different values per environment

    • Don't share sensitive credentials between environments
    • Use environment-specific configurations
  3. Access control

    • Limit access to production environment variables
    • Use role-based access control for secrets management
  4. Encryption

    • Encrypt sensitive values at rest
    • Use secure channels for transmitting secrets

Link to section: validation-and-typesafetyValidation and typesafety

ArkEnv helps ensure your environment variables are valid:

src/config/env.ts
import arkenv from 'arkenv';

export const  = arkenv({
  // Required variables with validation
  DATABASE_HOST: "string.host",
  DATABASE_PORT: "number.port",
  
  // Boolean values (accepts "true"/"false" strings, converts to boolean)
  DEBUG: "boolean",
  
  // Optional variables with defaults
  LOG_LEVEL: "'debug' | 'info' | 'warn' | 'error' = 'info'",
  
  // Optional variables
  "FEATURE_FLAGS?": 'string[]'
});

Link to section: common-patternsCommon patterns

Link to section: configuration-factoryConfiguration factory

Create a configuration factory to handle different environments:

src/config/index.ts
import arkenv from 'arkenv';

const  = () => {
  const  = arkenv({
    NODE_ENV: "'development' | 'test' | 'production'",
    DATABASE_HOST: "string.host",
    DATABASE_PORT: "number.port",
  });

  return {
    isProduction: .NODE_ENV === 'production',
    database: {
      host: .DATABASE_HOST,
      port: .DATABASE_PORT,
    }
  };
};

export const  = ();

Link to section: feature-flagsFeature flags

Use environment variables for feature flags:

src/config/features.ts
import arkenv from 'arkenv';

export const  = arkenv({
  "ENABLE_BETA_FEATURES": 'boolean = false',
  "MAINTENANCE_MODE": 'boolean = false',
  "ALLOWED_ORIGINS": 'string[]'
});

Link to section: troubleshootingTroubleshooting

Link to section: common-issuesCommon issues

  1. Missing variables

    • Check if .env file exists
    • Verify variable names match exactly
    • Ensure variables are loaded before use
  2. Type errors

    • Verify variable types match schema
    • Check for typos in variable names
    • Ensure all required variables are provided
  3. Loading order

    • Load environment variables before importing config
    • Consider using a bootstrap file
    • Check framework-specific loading behavior