Как стать автором
Обновить

Комментарии 12

Я еще могу добавить что черезмерное обращение к переменным окружения через `process.env` может негативно сказаться на производительности.
github.com/nodejs/node/issues/3104
github.com/facebook/react/issues/812

Если надо часто обращаться к значению в переменных окружения — лучше закешировать.
уже задавал вопрос к статье на medium'е, но спрошу ещё тут: чем установка «dotenv» и считывание из файла ".env" лучше, чем нативный module.exports? Например:

файл token.js (добавляем его в .gitignore)
module.exports.x = ‘MY TELEGRAM BOT TOKEN HERE’;

файл index.js
const TelegramBot = require(“node-telegram-bot-api”),
token = require(“./token”),
bot = new TelegramBot(token.x, { polling: true });

Вроде не надо ставить ничего, а задачи выполняются те же. Или я что-то не понимаю? (я ещё учусь, просьба палками не бить и не минусовать)
подход с использованием .env используется так же в других языкак и фреймворках + dotenv позволяет переопределить переменны заданные в файле .env переменными окружения. Это же можно сделать, в принципе, и с приведенном в примере
 module.exports.MY_TELEGRAM_TOKEN = process.env.MY_TELEGRAM_TOKEN || ‘MY TELEGRAM BOT TOKEN HERE’;

Вариант с token.js тоже довольно часто используется. Например в Python/Django, часто создают файл settings_local.py. Но такой подход сработает только для интерпретируемых языков, и только если код физически на сервере и его можно править.


Этот подход не сработает, если ваше приложение написано на C#, и на сервере лежит только результат команды dotnet build, без собственно кода. Или если вы делаете приложение в виде пакета, и на сервере ставите его через npm install my-package. Или если вы используете typescript, и перед запуском приложения оно собирается в большой JS файл. Теоретически в последнем случае все еще можно использовать import TOKENS from "tokens", но придется поднапрячься с настройкой, чтобы собранный файл импортировал файл с токенами.


И второй момент — переменные окружения работают на уровне ОС, чтобы использовать их не надо ничего знать о структуре вашего приложения. Например такой подход применяется в популярном сервисе Heroku. При деплое на Heroku приложение может узнать, какой из портов открыт считав значение process.env.PORT.
На примерах с Docker в статье — можно собрать один image, и запускать его с разными настройками, не меняя файлы.

На примерах с Docker в статье — можно собрать один image, и запускать его с разными настройками, не меняя файлы.

Не подскажете, если приложение написано не хипстерами и настраивается через конфиг, как решается эта проблема при создании контейнера?
зашивают конфиг в контейнер, либо монтируют директорию с конфигами при запуске.
очень сильно зависит от имеющийся инфраструктуры (можно так же юзать service discovery, свои скрипты инициализации или любые другие производные)

Это усложняет администрирование.
Вместо того, чтобы просто передать токен через переменную окружения, придется генерировать js-файл.

Вот интересно, сколько раз нужно человеку показать результат выполнения команды (вместо 1670 — PID любого процесса):
cat /proc/1670/environ
чтобы он перестал передавать, например, пароли или токены в переменных окружения.
В принципе, не для всех процессов это доступно, но, скорее всего, вы создаете нового юзера, даете ему некоторые права для запуска своего приложения, но не задумываетесь о доступе к переменным.
http://man7.org/linux/man-pages/man5/proc.5.html — для некоторого rtfm.

Для тех, кто начнет требовать пояснений — реальный пример из жизни… Есть django-based приложение, работает на сервере, предоставляет некий API. Рядом крутится фронтенд на WordPress. В один далеко не прекрасный день через одну из кучи дыр в WP сайт дефейсится и на сервере появляются какие-то странные файлы. Скрипт на php залезает в /proc и читает оттуда все что возможно, ищет в environ слова по паттерну «password» и потом их (включите фантазию).
Если django-приложение не использует переменные окружения, а хранит свои пароли, скажем, в файле /usr/local/etc/secrets.yaml с ro-правами для конкретного юзера — то php-скрипт, запущенный из-под www-data (или кто там еще) не сможет ничего увести (по крайней мере этим способом).
Запускать фронт с пожалуй самой дырявой CMS на том же сервере где и бекенд с важными данными — сама по себе очень плохая идея. В случае использования докер, все не так очевидно, и просто так вы не сможете получить переменные окружения.

P.S.
в вашем случае вы упускаете один нюанс, что если зловред будет на самой джанге, то ваш способ ничего не даст
Все так. Решение с WP было не моим, но расхлебывать пришлось мне.
Для джанги количество общеизвестных багов (которые эксплуатируют сканеры) на несколько порядков меньше чем для LAMP/WP, но да, все так.
Так environ тоже имеет маску 0400. При чём автоматически. Какая разница?
Зарегистрируйтесь на Хабре, чтобы оставить комментарий