Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/nystudio107/dotenvy
Speed up your production sites by ditching .env for key/value variable pairs as Apache, Nginx, and shell equivalents
https://github.com/nystudio107/dotenvy
apache bash dotenv env environment environment-variables nginx php shell
Last synced: 2 months ago
JSON representation
Speed up your production sites by ditching .env for key/value variable pairs as Apache, Nginx, and shell equivalents
- Host: GitHub
- URL: https://github.com/nystudio107/dotenvy
- Owner: nystudio107
- License: mit
- Created: 2019-02-17T00:12:46.000Z (almost 6 years ago)
- Default Branch: v1
- Last Pushed: 2019-08-14T20:03:05.000Z (over 5 years ago)
- Last Synced: 2024-10-09T11:22:33.338Z (2 months ago)
- Topics: apache, bash, dotenv, env, environment, environment-variables, nginx, php, shell
- Language: PHP
- Homepage:
- Size: 42 KB
- Stars: 32
- Watchers: 4
- Forks: 1
- Open Issues: 1
-
Metadata Files:
- Readme: README.md
- Changelog: CHANGELOG.md
- License: LICENSE.md
Awesome Lists containing this project
README
[![Scrutinizer Code Quality](https://scrutinizer-ci.com/g/nystudio107/dotenvy/badges/quality-score.png?b=v1)](https://scrutinizer-ci.com/g/nystudio107/dotenvy/?branch=v1) [![Code Coverage](https://scrutinizer-ci.com/g/nystudio107/dotenvy/badges/coverage.png?b=v1)](https://scrutinizer-ci.com/g/nystudio107/dotenvy/?branch=v1) [![Build Status](https://scrutinizer-ci.com/g/nystudio107/dotenvy/badges/build.png?b=v1)](https://scrutinizer-ci.com/g/nystudio107/dotenvy/build-status/v1) [![Code Intelligence Status](https://scrutinizer-ci.com/g/nystudio107/dotenvy/badges/code-intelligence.svg?b=v1)](https://scrutinizer-ci.com/code-intelligence)
# Dotenvy
Speed up your production sites by ditching .env for key/value variable pairs as Apache, Nginx, and shell equivalents
## Requirements
PHP 7.0 or later, and a project that uses [Composer](https://getcomposer.org/)
## Installation
To install this package, follow these instructions.
1. Open your terminal and go to your project:
cd /path/to/project
2. Then tell Composer to require the package:
composer require nystudio107/dotenvy
## CraftQuest.io video: Injecting Environment Variables with Dotenvy
[![CraftQuest.io video: Injecting Environment Variables with Dotenvy](https://i.vimeocdn.com/video/769743390.jpg?mw=1900&mh=1069&q=70)](https://craftquest.io/livestreams/injecting-environment-variables-with-dotenvy)
## Dotenvy Overview
Dotenvy is a small tool that takes the contents of your `.env` file, and outputs them in a format that can be pasted directly into an Apache server config, Nginx server config, shell CLI `.bashrc`, or Docker `Dockerfile`
Why? Because as per the [phpdotenv](https://github.com/vlucas/phpdotenv) documentation:
> phpdotenv is made for development environments, and generally should not be used in production. **In production, the actual environment variables should be set so that there is no overhead of loading the .env file on each request.** This can be achieved via an automated deployment process with tools like Vagrant, chef, or Puppet, or can be set manually with cloud hosts like Pagodabox and Heroku.
The `.env` file is meant to be a convenience to make things easier to change in local development environments.
What the [phpdotenv](https://github.com/vlucas/phpdotenv) package does is parse your `.env` file, and then call [putenv()](http://php.net/manual/en/function.putenv.php) to set each environment variable. This sets the [$_ENV superglobal](http://php.net/manual/en/reserved.variables.environment.php) that your application can later read in via [getenv()](http://php.net/manual/en/function.getenv.php).
Using the technique described here, the exact same `$_ENV` superglobal gets set with your environmental variables, and are made available via the same `getenv()` function. The difference is that your webserver or CLI sets the variables directly, without having to parse the `.env` file.
Without question, this is a micro-optimization... and is unlikely to make a significant performance difference. But why add overhead for no reason?
This is a partial implementation of feature I've been hoping to have in Craft CMS core in some fashion: [Add `craft config/cache` as a console command](https://github.com/craftcms/cms/issues/1607)
## Using DotenvyFrom your project's root directory that contains the `.env` and `/vendor` directory, do:
```bash
vendor/bin/dotenvy
```If you're on Windows, do:
```bash
vendor/bin/dotenvy.bat
```If your `.env` file lives somewhere else, you can pass in the directory to the `.env` file:
```bash
vendor/bin/dotenvy /path/to/some/dir/
```Then **do not create** a `.env` file on your production environment, instead paste or insert via a deployment system the resulting file that Dotenvy generates for you.
In this way, the appropriate `.env` variables will be automatically injected by your Apache server, or Nginx server, or via CLI.
This means that the `.env` file no longer needs to be parsed on every request.
### Updating `.gitignore`
Make sure you `.gitignore` all of the `.env*` files with a line like this in your root project `.gitignore` file:
```
.env*
```
...to ensure that none of your secrets in the generated `.env*` files are checked into git. Note the trailing `*`### Example `.env` file
Given a `.env` file that looks like this:
```bash
# The environment Craft is currently running in ('dev', 'staging', 'production', etc.)
ENVIRONMENT="local"# The secure key Craft will use for hashing and encrypting data
SECURITY_KEY="jMgCxHuaM1g3qSzHiknTt5S8gDy5BNW7"# The database driver that will be used ('mysql' or 'pgsql')
DB_DRIVER="mysql"# The database server name or IP address (usually this is 'localhost' or '127.0.0.1')
DB_SERVER="localhost"# The database username to connect with
DB_USER="homestead"# The database password to connect with
DB_PASSWORD="secret"# The name of the database to select
DB_DATABASE="craft3"# The database schema that will be used (PostgreSQL only)
DB_SCHEMA="public"# The prefix that should be added to generated table names (only necessary if multiple things are sharing the same database)
DB_TABLE_PREFIX=""# The port to connect to the database with. Will default to 5432 for PostgreSQL and 3306 for MySQL.
DB_PORT="3306"
```The following files will be output in the same directory as the `.env` file:
#### Apache `.env_apache.txt`
Paste these inside the `` block
```apacheconfig
# Apache .env variables
# Paste these inside the block:
SetEnv ENVIRONMENT "local"
SetEnv SECURITY_KEY "jMgCxHuaM1g3qSzHiknTt5S8gDy5BNW7"
SetEnv DB_DRIVER "mysql"
SetEnv DB_SERVER "localhost"
SetEnv DB_USER "homestead"
SetEnv DB_PASSWORD "secret"
SetEnv DB_DATABASE "craft3"
SetEnv DB_SCHEMA "public"
SetEnv DB_TABLE_PREFIX ""
SetEnv DB_PORT "3306"
```...or you can include the files that Dotenvy generates directly in your Apache conf via:
```
Include /home/forge/SOMEDOMAIN/.env_apache.txt
```#### Nginx `.env_nginx.txt`
Paste these inside the `server {}` or `location ~ \.php {}` block or in the `fastcgi_params` file:
```apacheconfig
# Nginx .env variables
# Paste these inside the server {} or location ~ \.php {} block or in the fastcgi_params file:
fastcgi_param ENVIRONMENT "local";
fastcgi_param SECURITY_KEY "jMgCxHuaM1g3qSzHiknTt5S8gDy5BNW7";
fastcgi_param DB_DRIVER "mysql";
fastcgi_param DB_SERVER "localhost";
fastcgi_param DB_USER "homestead";
fastcgi_param DB_PASSWORD "secret";
fastcgi_param DB_DATABASE "craft3";
fastcgi_param DB_SCHEMA "public";
fastcgi_param DB_TABLE_PREFIX "";
fastcgi_param DB_PORT "3306";
```...or you can include the files that Dotenvy generates directly in your Nginx conf via:
```
include /home/forge/SOMEDOMAIN/.env_nginx.txt
```See [Nginx-Craft](https://github.com/nystudio107/nginx-craft) for details.
#### CLI (Bash shell) `.env_cli.txt`
Paste these inside your `.bashrc` file in your `$HOME` directory:
```bash
# CLI (bash) .env variables
# Paste these inside your .bashrc file in your $HOME directory:
export ENVIRONMENT="local"
export SECURITY_KEY="jMgCxHuaM1g3qSzHiknTt5S8gDy5BNW7"
export DB_DRIVER="mysql"
export DB_SERVER="localhost"
export DB_USER="homestead"
export DB_PASSWORD="secret"
export DB_DATABASE="craft3"
export DB_SCHEMA="public"
export DB_TABLE_PREFIX=""
export DB_PORT="3306"
```#### Docker `.env_docker.txt`
Paste these inside your `Dockerfile` file:
```dockerfile
# Docker .env variables
# Paste these into your Dockerfile
ENV ENVIRONMENT="local"
ENV SECURITY_KEY="jMgCxHuaM1g3qSzHiknTt5S8gDy5BNW7"
ENV DB_DRIVER="mysql"
ENV DB_SERVER="localhost"
ENV DB_USER="homestead"
ENV DB_PASSWORD="secret"
ENV DB_DATABASE="craft3"
ENV DB_SCHEMA="public"
ENV DB_TABLE_PREFIX=""
ENV DB_PORT="3306"
```## The Craft CMS CLI
Note that if you set the `.env` variables directly in your Apache or Nginx config, these variables will **not** be available using the Craft CMS `./craft` CLI command.
That's because the webserver doesn't run at all for CLI requests. Instead, you'll need to add them to your `.bashrc` file as noted above, or you can use the Unix [source](https://bash.cyberciti.biz/guide/Source_command) command, e.g:
```bash
source .env_cli.txt && ./craft migrate/all
```In the above example, the `source` command will execute the `export` statements in the `.env_cli.txt` and then run the `./craft` executable with those environmental variables set.
This pattern is useful if you are running multiple sites on a single instance, and so setting the `.env` variables globally for a user via `.bashrc` doesn't make sense.
## Dotenvy RoadmapSome things to do, and ideas for potential features:
* Release it
Brought to you by [nystudio107](https://nystudio107.com/)