Ubuntu: 우분투 환경에서 환경변수 로딩 문제

조회수 1579회

안녕하세요.

윈도우즈에서 nodejs를 개발중이고 우분투에 배포하려고 하고 있습니다. 개발환경에서는 .env파일에서 환경변수를 잘 읽어옵니다. ubuntu production에서는 undefined만 나옵니다.

라이브러리를 required할때 dotenv npm usage에 나와있듯이 아래와 같이 작성했습니다:

require('dotenv').config()

라이브러리 요청시에 혹시 제가 모르고 있는 옵션이 있는지 있어서 로딩이 안되는걸까요? 혹시 폴더구조라던가 다른 코드가 필요하다면 말씀해주시겠어요?

읽어주셔서 감사합니다.

  • (•́ ✖ •̀)
    알 수 없는 사용자
  • 배포는 어떡해 하셨는데요? 단순히 업로드만 했다면 그렇게 하면 안됩니다. node_modules 은 복사하지 말고 package.json 만 복사하고 yarn 혹은 npm install 을 하세요 그러면 package.json 안의 모듈들을 다 받아옵니다. 모듈중에 js가 아닌 확장모듈이 있을수도 있습니다. 정영훈 2019.5.28 14:29
  • 아 물론 모듈설치는 다 했습니다. 아래 관련 코드를 좀 올려보겠습니다. 한 번 확인해주실 수 있을까요? 배포는 github을 통해 단순히 인스턴스에서 git clone을 통해 했습니다. .gitignore를 통해 node_modules는 복사하지 않았구요. 알 수 없는 사용자 2019.5.28 18:26

2 답변

  • #  * .env
    a=1
    b=2
    

    mint(ubuntu 18.04 기반)에서 테스트 해보니 문제가 없습니다.

    let dotenv = require('dotenv');
    require('dotenv').config({ path: '/home/allinux/.env' });
    
    console.log(process.env.a);
    console.log(process.env.b);
    
    
    1
    2
    
    • 정영훈님 답변 정성스럽게 달아주시느라고 정말 고생하셨습니다. 제 멍청한 실수를 찾았습니다. 깃헙에 .env파일을 안올리다보니 인스턴스로는 .env파일을 원시적인 방법으로 복붙했습니다. 그과정에서 문자열이 떨어져나갔더군요. ㅠㅠ 알 수 없는 사용자 2019.5.29 09:48
    • 하다보면 그런경우도 있고 그렇죠. 원인찾고 해결하셨다니 다행입니다. 정영훈 2019.5.29 22:07
  • 디렉토리 구조는 아래와 같습니다:

    └─src
        ├─db
        │  └─models
        ├─routes
        │  ├─blog
        │  ├─blogFeed
        │  ├─youtube
        │  └─youtubeFeed
        └─utils
    

    src/app.js에서는 아무 설정없이 환경변수가 당연히 로딩이 되구요. 문제인건 db로더를 sequelize 코드 컨벤션대로 src/db/models/index.js에 작성해뒀습니다. 아래코드는 src/db/models/index.js입니다:

    require('dotenv').config();
    const mongoose = require('mongoose');
    const env = process.env;
    
    module.exports = () => {
      connect = () => {
        mongoose.connect(
          `${env.MONGO_URI}${env.MONGO_DATABASE}`,
          {
            useNewUrlParser: true,
            useCreateIndex: true,
            useFindAndModify: true
          },
          err => {
            if (err) {
              console.error(`connection error:`, err);
            }
            console.log(
              `> Connected on
     - URI: ${env.MONGO_URI}
     - Database: ${env.MONGO_DATABASE.toUpperCase()} 
     - Environment: ${env.NODE_ENV.toUpperCase()}`
            );
          }
        );
      };
      connect();
      mongoose.connection.on('disconnected', connect);
    };
    

    로컬에서는 분명히 잘됩니다. undefined로 환경변수가 잡히지도 않구요. heroku에서도 당연히 환경변수 설정을 설정페이지에서 해줬기때문에 .env파일과 상관없이 production모드로 잘 작동합니다.

    문제는 .env파일까지 1도 틀림없이 우분투 인스턴스에 들어갔는데 .env파일로 설정한 환경변수가 undefined로 잡힌다는거죠.

    dotenv깃헙 저장소나 스택오버플로우에서 찾아봤지만 죄다 path를 작성해주란 말 뿐이었습니다. 이게 맞겠다싶어 따라해봤는데 안되는군요.

    // local env
    let path = require('path').join(__dirname, '../../../.env');
    require('dotenv').config({
      path: path
    });
    
    console.log(path); // C:\dev\training\rss-feed\.env
    

    우분투에서는

    // ubuntu instance env
    let path = require('path').join(__dirname, '../../../.env');
    require('dotenv').config({
      path: path
    });
    
    console.log(path); // /home/ubuntu/training-rss-feed/.env
    

    경로는 콘솔에 찍히는데 환경변수 인식이 안되는건 도저히 이해가 안되네요. 혹여 제가 멍청한 실수라도 한건지 알려주시면 감사하겠습니다.

    • (•́ ✖ •̀)
      알 수 없는 사용자
    • 문제를 해결하려면 일단 dotnev 로만 우분투에서 문제재현을 해보세요. 꼭 재현을 해야 합니다. 만약 별도 테스트를 했을시 문제가 없다면 문제해결이 어려워집니다. dotenv 문제가 아니라는 결론이니까요. .env 파일 퍼미션은 어떻해 되어 있나요? 정영훈 2019.5.28 21:03
    • 파일권한은 손대지 않았으니 당연히 dot파일이라 숨김으로 되어있습니다. 로컬과 우분투 인스턴스, 똑같은 코드로 재현했습니다. 일단은 정신이 맑을때 다시 손대려고 json파일 하나 만들어 가라로 서버는 돌리긴 했습니다. 도움주시려고 해서 감사합니다. 알 수 없는 사용자 2019.5.28 21:16
    • 숨김이 아니라...ls -al 해보면 -rw-r--r-- 이렇게 된 것을 알려달라는 이야깁니다. 읽기 권한이 있는지 보려구요. 정영훈 2019.5.28 22:22
    • 딱 -rw-r--r-- 이걸로 찍힙니다. 알 수 없는 사용자 2019.5.28 22:53
    • 권한도 문제가 없군요. 그럼 아래에 제가 테스트한 코드를 path 와 .env를 변경해서 해보세요. 우분투에서 dotenv 모듈이 동작하는지 알고자 합니다. 정영훈 2019.5.29 07:13
    • 물론 절대경로로도 해봤습니다. 계속 이러는걸 보면 제가 멍청한 실수를 한게 맞는것같습니다. 다시 한번 찾아보고 댓글 달아보겠습니다. 알 수 없는 사용자 2019.5.29 08:17

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)