tylorshin
500+ Views

Meteor 1.3 배포

지금껏 제가 본 많은 분들이 궁금해하셨고...또 아직까지 한국어로 된 완벽한 가이드가 없는 것 같아, 제가 부족한 실력에도 불구하고 한 번 가이드를 작성해보려고 합니다.
서버 환경
AWS EC2 Ubuntu 14.04 (MongoDB도 싱글 레플리카셋으로 동일 서버에서 돌립니다)
(어차피 테스트라 큰 환경이 필요하지 않기 때문에...)
(이 환경으로 테스트 해보신다면 어플리케이션이 크지 않은 이상 프리티어인 m2.micro에서도 가능합니다)
여러 프로젝트를 돌리거나 보안상의 이유로 서버에 프로젝트용 계정을 따로 만들어서 관리하시거나 하실 수 있는데, 현재 가이드는 정말 기초만을 다루는 걸 목표로 하기 때문에 그냥 합니다.

서버 구성

AWS에 EC2 서버를 만듭니다. 22번 포트랑 80번 포트 열어주는 거 잊지 마시고요.
ubuntu ec2 서버를 만드는 튜토리얼은 굉장히 많으므로 생략합니다.
꼭 AWS가 아니여도 상관없습니다.
아 되도록이면 authorized_keys 설정을 해두시는 게 편합니다.

authorized_keys 설정

mkdir ~/.ssh sudo chmod 700 ~/.ssh cd ~/.ssh touch authorized_keys sudo vim authorized_keys authorized_keys에 접속하려는 컴퓨터의 id_rsa.pub 추가

최초로 해야할 것(패키지 매니저 업데이트)

sudo apt-get update

로케일 세팅

sudo locale-gen en_US.UTF-8
/etc/default/locale 파일에 빠진
LANG="en_US"
LANGUAGE="en_US:en"
를 추가해 줌.
sudo vim /etc/default/locale 등으로 들어가서 하시던 echo로 하시던 상관없습니다.
이후,

C++ 컴파일러 설치,

sudo apt-get install build-essential libssl-dev
다음은

NodeJS 설치.

쌩으로 NodeJS를 설치하는 것보다 NVM을 통해서 버젼관리를 하면서 설치하는 것을 추천합니다.
에 접속해서 install script 에 위치한 curl 실행
(글 작성일 기준 0.31.0 버젼)
설치가 끝나면 하라는 대로 하거나 , 아니면 쉘을 한 번 껐다 켜야 할 겁니다.
이후
nvm install 0.10.41
(현재 Meteor guide에서 추천하는 nodeJS 버젼입니다. 0.12.xx번대까지 나와있지만 저게 가장 좋을거예요)
혹시 모르니깐 설치 끝나면
nvm use 0.10.41
한 번 해주시고요.

다음으로 Passenger와 Nginx를 동시에 설치해야합니다.

일단 패신져 참조 링크에서 보이는 데로 nginx와 passenger를 깔아줍니다.
# Install our PGP key and add HTTPS support for APT sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 561F9B9CAC40B2F7 sudo apt-get install -y apt-transport-https ca-certificates # Add our APT repository sudo sh -c 'echo deb https://oss-binaries.phusionpassenger.com/apt/passenger trusty main > /etc/apt/sources.list.d/passenger.list' sudo apt-get update # Install Passenger + Nginx sudo apt-get install -y nginx-extras passenger
이후 /etc/nginx/nginx.conf 를 텍스트 편집기(vim 등) 으로 열고
# passenger_root /some-filename/locations.ini; # passenger_ruby /usr/bin/passenger_free_ruby;
passenger_root /some-filename/locations.ini; passenger_ruby /usr/bin/passenger_free_ruby;
로 바꿔줍니다.
또한!!
저희는 nodeJS를 NVM을 통해서 설치했으므로, passenger에게 nodeJS path를 NVM path를 사용하라고 지정해주어야 합니다.
passenger_nodejs /home/ubuntu/.nvm/v0.10.41/bin/node;
를 넣어주세요.
현재 nodeJS 주소는 nvm which 등으로 확인 가능합니다.
설정이 끝났으면 저장하고 나와서 nginx를 restart 시켜줍니다.
sudo service nginx restart
설치가 제대로 되었는지 확인하기 위해서
sudo /usr/bin/passenger-config validate-install
이후 sudo /usr/sbin/passenger-memory-stats
해보면 돌아가는지 안돌아가는지 바로 확인할 수 있습니다.

몽고DB 준비

참조 헥헥 생각보다 할게 많네요.
sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 7F0CEB10 echo "deb http://repo.mongodb.org/apt/ubuntu trusty/mongodb-org/3.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-3.0.list
sudo apt-get update
sudo apt-get install -y mongodb-org
이러면 몽고디비 설치는 끝납니다.
mongo daemon instance를 시작시켜보세요.
sudo service mongod start

몽고DB 세팅 (미티어스쿨의 진정원님의 글을 99% 참조했습니다)

mongodb 설정파일 위치
/etc/mongod.conf
에 들어가서 레플리카셋 이름을 rs0 으로 설정해줍니다. oplogSize나 세컨더리라던가 이런 것들은 나중에 설정하셔도 됩니다.
replication: replSetName: rs0
또한 m2.micro에서는 저장공간 용량이 적어서(?) small files option을 켜주어야 mongoDB가 뻗지 않습니다.
storage: mmapv1: smallFiles: true
설정을 해줍니다. 이후 설정 파일 저장하고 나와서
sudo service mongod restart
이후,
mongo
명령어로 mongoDB Shell에 접속합시다.
설정한 레플리카셋 실행
rs.initiate();
만약 안되면,
config = {_id: "rs0", version: 1, members: [{"_id": 0, "host": "localhost:27017"}]} rs.initiate(config);
로 실행해주시면 됩니다.
이후 rs.conf() 나 rs.status() 로 상태확인이 가능합니다.
이후 계정 설정은 미티어 스쿨의 진정원님의 글을 복붙합니다(..) 너무 완벽해서요.
- admin user 생성 use admin db.createUser({user: 'admin', pwd: 'pwd', roles: [{role: 'root', 'db': 'admin'}]}) - admin user에 clusterAdmin roles grant db.auth(‘admin', 'pwd') db.system.users.update({'user':'admin'}, {$addToSet: {'role' :'clusterAdmin'}}) - oplogger user / role 생성 및 grant : oplogger 라는 유저를 별도로 두는 이유는 하나의 mongo demon에서 여러 database를 돌릴시에 oplog를 공유해야 하기 때문입니다.각 dbOwner에게 oplogger role을 부여해주어도 괜찮지만. 저는 그게 귀찮슴미다. db.createUser({ user:'oplogger', pwd:'pwd', roles:[] }) db.runCommand({ createRole: 'oplogger', privileges: [ { resource: { db:'local', collection: 'system.replset'}, actions: ['find']}, ], roles: [{role:'read', db: 'local'}] }) db.runCommand({ grantRolesToUser: 'oplogger', roles: ['oplogger']}) - 특정 디비에 dbOwner 권한 주기 use myDB db.createUser({user: 'myDbId', pwd: 'pwd', roles: [{role: 'dbOwner', 'db': 'myDB'}]}) - 그리고 나서 mongod를 auth 옵션과 함께 다시 올려줘야 authentication이 정상동작을 합니다. - meteor run 시에 MONGO_URL과 MONGO_OPLOG_URL에 해당 id / pw를 적용시켜줍미다. export MONGO_URL=mongodb://myDbId:pwd@IPAddress:27017/myDB export MONGO_OPLOG_URL=mongodb://oplogger:pwd@IPAddress:27017/local?authSource=admin 삽질에 도움이 될까 해서 올려봅니다만 걍 메모해두엇던것들을 정리한거라 욕먹을지도 모르겠습니다 ㅠㅜ 마지막으로 우리는 authentication설정을 열심히 햇음에도 불구하고 mongo 쉘로 로컬에서 혹은 외부에서 접속하려고 하면 test database를 통해서 기냥 접속이 됩니다. 일단 접속이 됨니다. 물론 권한이 없기 때문에 별짓은 하지 못 합니다. 하지만 일단 접속이 됩니다. (실제로 얄딱 꾸리한 몇가지 짓거리들은 할 수있는 권한도 있긴 있습니다.) 이 께림칙한 현상을 막기 위해서 여러가지 노력을 해봣는데, 현재로서는 그냥 proxy를 하나 둬서 ip제한등을 통해 관리해라가 답인듯 합니다. mongo자체에는 id/pw 없이 쉘 접근 자체를 막는 방법은 없다는 거 같습니다. 음 프록시고 ip제한이고 하는건 문제가 아닌데 이 부분에 더 깔끔한 방법 아시는부분이 있으면 공유를 부탁드립니다.
배포 준비
(이미 서버에 git 등으로 프로젝트를 복사해 놓으신 분들은 로컬에서 빌드하지 마시고 서버에서 하세요)
현재 로컬에 개발중인 프로젝트 폴더에 가서
meteor bundle package.tar.gz
이나
meteor build ./ --architecture os.linux.x86_64
을 해줍니다.
그렇다면 결과로 package.tar.gz 이나 프로젝트명.tar.gz 가 나올 겁니다.
이를
scp package.tar.gz ubuntu@ec2-xx-xx-xxx-xxx.ap-northeast-2.compute.amazonaws.com:
와 같은 명령어로 서버로 보내시면 됩니다. (애초에 git으로 하는 게 더 편해요)
번들파일 위치시키기 (Nginx 설정 전, 후 상관없이 가능)
mkdir /var/www
으로 폴더를 만들고 cd /var/www/ 로 이동.
www 폴더에 chmod, chown으로 권한관리를 해줍니다.
이후 아까 받은 우리 프로젝트 번들 파일의 압출을 풀어줍니다.
tar xzf ~/package.tar.gz
그러면 bundle 폴더가 나오는 데, 이걸 프로젝트명에 맞게 이름을 바꿔줍니다.
mv bundle projectName
이후에 projectName/programs/server 들어가서
npm install
을 하면 일단 준비가 끝납니다. (예전에는 bcrypt나 fibers 문제가 났었지만 이번 1.3 패치로 안나는 것 같습니다. meteor에서 사용하는 bcrypt 버젼이 올라갔거든요)

Nginx 설정

/etc/nginx/site-enabled/
에다가 projectName.conf 로 파일을 만들어서 설정한다. (실제로 projectName으로 하시는 분은 없으시겠죠?)
예시) meteorApp.conf
server_name 54.199.xxx.xxx; passenger_env_var ROOT_URL http://54.199.xxx.xxx;
요 녀석들은 EC2의 public IP 로 해줍니다.
이후 도메인을 달거나 하면 server_name에 추가만 계속 시켜주면 됩니다.
요런 식으로.
server { server_name 54.199.xxx.xxx; # 프로젝트 파일이 위치할 경로 root /var/www/projectName/public; passenger_enabled on; passenger_sticky_sessions on; passenger_env_var MONGO_URL mongodb://myDbId:pwd:password@localhost:27017/myDB; passenger_env_var MONGO_OPLOG_URL mongodb://oplogger:password@localhost:27017/local?authSource=admin; passenger_env_var ROOT_URL http://54.199.xxx.xxx; # Set these ONLY if your app is a Meteor bundle! passenger_app_type node; passenger_startup_file main.js; }
sudo service nginx restart
하시고 54.199.xxx.xxx로 접속하시면 미티어앱이 성공적으로 돌아가시는 모습을 볼 수 있습니다!
혹시 막히시거나 안되시는 부분, 혹은 더 나은 방법이 있으신 분은 의견 남겨주시면 피드백 할 수 있도록 노력해보겠습니다.
3 Comments
Suggested
Recent
와! 우리 어무이도 이거 보여드리면 배포 가능 하실듯!! 짱이에요!-
감사합니다~
많이 배워갑니다 ^^