Comments 12
github.com/nodejs/node/issues/3104
github.com/facebook/react/issues/812
Если надо часто обращаться к значению в переменных окружения — лучше закешировать.
файл 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 });
Вроде не надо ставить ничего, а задачи выполняются те же. Или я что-то не понимаю? (я ещё учусь, просьба палками не бить и не минусовать)
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, и запускать его с разными настройками, не меняя файлы.
Не подскажете, если приложение написано не хипстерами и настраивается через конфиг, как решается эта проблема при создании контейнера?
Это усложняет администрирование.
Вместо того, чтобы просто передать токен через переменную окружения, придется генерировать js-файл.
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 (или кто там еще) не сможет ничего увести (по крайней мере этим способом).
P.S.
в вашем случае вы упускаете один нюанс, что если зловред будет на самой джанге, то ваш способ ничего не даст
Эффективное использование process.env