Skip to content

ProgrammingBanks/Back

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

20 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

nginx,nodejs,mysql 도커

추가점

  • redis 추가 (공부차원에서 넣어봄 신경쓰지 말것)
  • redis 시험 페이지 index.js에 적용
  • redis session 적용가능
  • sequelize, seqeulize-auto, express 구동확인
  • 기존의 도커는 호스팅을 중점으로 파일을 만들었다
  • 지금 세팅은 개발에 집중하게 docker-compse.yml 23번째 줄에 command: tail -f /dev/null을 삽입

필독

  • command: tail -f /dev/null 도커 프로세스가 끝나도 종료되지 않게 세팅
  • vscode나 ssh로 연결해서 node 컨테이너로 들어간후 yarn dev || npm run dev를 쳐서 실행할것
  • 치고나면 log가 나오지 않을것인데 그것은 pm2 monit쳐서 확인 가능하다

docker

  • docker-compose up -d build를 통해 백그라운드와 빌드를 동시 가능
  • docker-compose에서 command를 통해 시작할때 서버와 mysql nginx가 실행되게 하였다.

node.js - express

  • Login : passport 사용 (로그인 사용할때 필수적으로 사용되는 모듈) passport.js
패스포트 예시
./passport/index.js
const passport = require('passport');
const local = require('./local');
const { User } = require('../models');

module.exports = () => {
  passport.serializeUser((user, done) => {
    done(null, user.id);
  });

  passport.deserializeUser(async (id, done) => {
    try {
      const user = await User.findOne({ where: { id }});
      done(null, user); // req.user
    } catch (error) {
      console.error(error);
      done(error);
    }
  });

  local();
};

./passport/local.js
const passport = require('passport');
const { Strategy: LocalStrategy } = require('passport-local');
const bcrypt = require('bcrypt');
const { User } = require('../models');

module.exports = () => {
  passport.use(new LocalStrategy({
    usernameField: 'email',
    passwordField: 'password',
  }, async (email, password, done) => {
    try {
      const user = await User.findOne({
        where: { email }
      });
      if (!user) {
        return done(null, false, { reason: '존재하지 않는 이메일입니다!' });
      }
      const result = await bcrypt.compare(password, user.password);
      if (result) {
        return done(null, user);
      }
      return done(null, false, { reason: '비밀번호가 틀렸습니다.' });
    } catch (error) {
      console.error(error);
      return done(error);
    }
  }));
};
  • helmet : http header의 보안관련 모듈
  • morgan : express 내에서 로그 기록 남김
  • express -view=ejs 폴더명 (express를 써서 간단한 필요 모듈을 설치하자)

nginx

  • nginx -g daemon off 명령어로 현재 백그라운드에서 실행
  • nginx는 리버스 프록시 서버(어플리케이션과 클라이언트 사이에서 중계를 해주는 친구)
  • nginx기능 : 로드 밸런싱, 보안, 가속화 기타 등등
로드 밸런싱의 예제 
upstream testserver{
               least_conn;
               server 1**.***.**.**:8801 weight=10
               server 2**.***.**.**:8801 weight=10
               server 3**.***.**.**:8801 weight=10
               server 4**.***.**.**:8801 weight=10
  • docker에서는 --daemon off을 해주지 않으면 포그라운드에서 작동하기 때문에 꺼진다.

pm2

  • 싱글 스레드의 node.js를 보완하는 프로세스 매니저
  • 한개의 코어만 사용하면 자원 활용이 취약하기 때문에 pm2로 클러스터 기능을 발휘할수있다.
  • 기본적인 사용법은 pm2 start index.js
  • --watch명령어가 뒤에 붙게되면 파일의 변화를 감지해서 바꿔준다.
  • docker에서는 --no daemon 을 해주지 않으면 포그라운드에서 작동하기 때문에 꺼진다.
  • pm2 plus를 통해 pm2사이트에서 gui로 관리하거나 내용을 볼수있다.
  • pm2 plus는 유료이나 간단한 기능은 무료로 제공(무료의 pm2 monit도 있다)
pm2 stop <filename>
pm2 delete <filename>
pm2 log [<filename>]
pm2 list
pm2 monit
pm2 kill
pm2 show API

pm2

mysql-sequelize

  • ORM을 지원해주는 라이브러리
  • 하지만 우리는 코드로 테이블을 만드는것은 귀찮기 때문에 workbench er 다이어그램 으로 테이블을 만들것이다.
  • 만든 테이블은 sequelize auto로 만들어진 테이블을 코드화를 진행.
yarn sequelize-auto -o "./models" -d DB이름 -h mysql -u root -p 3306 -x root -e mysql

여기서 host는 localhost가 아니라 컨테이너 이름으로 지정

환경

사용 라이브러리

  • 칼만 필터

칼만 필터는 과거의 정보와 새로운 측정값을 사용하여 측정값에 포함된 잡음을 제거시켜 값을 최적화 하는 필터 kalmanjs

  • 사용법 예시
var KalmanFilter = require('kalmanjs')

var kf = new KalmanFilter();
console.log(kf.filter(3));
console.log(kf.filter(2));
console.log(kf.filter(1));
//Generate a simple static dataset
var dataConstant = Array.apply(null, {length: dataSetSize}).map(function() {
  return 4;
});
//Add noise to data
var noisyDataConstant = dataConstant.map(function(v) {
  return v + randn(0, 3);
});

//Apply kalman filter
var kalmanFilter = new KalmanFilter({R: 0.01, Q: 3});

var dataConstantKalman = noisyDataConstant.map(function(v) {
  return kalmanFilter.filter(v);
});

Admin

sequelize - express를 사용해서 만드는게 적정 Admin 페이지

JWT

서버에 부담을 적게 주기위해 사용 사용처는 정보교류(보안), 회원인증

  • 설치 : npm isntall jsonwebtoken rand-token

  • 우리는 passport와 JWT를 같이 써야한다

//passport/index.js
const passport = require("passport");
const passportJWT = require("passport-jwt");
const bcrypt = require("bcrypt");

const JWTStrategy = passportJWT.Strategy;
const { ExtractJwt } = passportJWT;
const LocalStrategy = require("passport-local").Strategy;
  • ID,PWD에 대한 전략
const LocalStrategyOption = {
  username: "UserId",
  userpwd: "PWD",
};
async function idpwVerify(id, pwd, done) {
  let user;
  try {
    user = await userDAO.find(id);

    if (!user) return done(null, false);
    const CorrectPassword = await bcrypt.compare(pwd, user.userpwd);
    if (!CorrectPassword) return done(null, false);
  } catch (e) {
    done(e);
  }
  return done(null, user);
}
  • 토큰 전략 생성
const jwtStrategyOption = {
  jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(),
  secretOrKey: global.config.secret,
};

async function jwtVerifty(payload, done) {
  let user;
  try {
    user = await userDAO.find(payload.uid);
    if (!user) return done(null, false);
  } catch (e) {
    return done(e);
  }
  return done(null, user);
}

날씨 정보

해야할일

  • 백엔드 문서 설계화
  • rest-API 통신 문서 설계화
  • 개발환경 구축
  • 로그인 구현
  • 받아오는 자료에 대한 CRUD
  • 앱과의 통신
  • 로드 밸런싱
  • AWS나 학교 서버에 배포

Releases

No releases published

Packages

No packages published