[AWS EC2] docker + postgresQL + node.js + express + next.js 배포 문제해결

kcs·2023년 1월 21일
0

첫 번째 문제

EC2에 express로 서버를 띄우고 docker container에 postgresQL을 실행시켰다.
그런데 서버와 db가 연결이 안되는 문제가 발생했다.

생각을 해보니 서버에서 EC2로 띄운 db주소를 어떻게 알지??

TypeORM의 DataSource인스턴스 생성 설정을 계속 확인하게 되었다.
그런데 host가 'db'로 되어있는게 이상했다.
분명 강사님은 db로 입력하라고 했다.. 그래서 헷갈렸다

해결 방법

아래 코드처럼 host에 'db'가 아닌 EC2 도메인주소를 입력해야 한다.


// server/src/data-source.ts

import "reflect-metadata";
import { DataSource } from "typeorm";

export const AppDataSource = new DataSource({
  type: "postgres",
  host: "db",  // 여기에 EC2 도메인 주소를 입력해야 한다.
  port: 5432,
  username: "postgres",
  password: "password",
  database: "postgres",
  synchronize: true,
  logging: false,
  entities: ["./src/entities/**/*.ts"],
  migrations: [],
  subscribers: [],
});

두 번째 문제

EC2에 올리고서 부터 로컬환경에서는 문제없던 쿠키문제가 생겼다.
서버에서 쿠키가 브라우저(클라이언트)로 넘어오지 않는 문제가 생겼다.
원인은 아래 코드처럼 serialize 옵션중 secure를 설정했기 때문이다.
secure가 true일 때 https 프로토콜에서만 response.header를 통해 쿠키가 전달이 된다.
그런데 생성한 EC2는 http프로토콜로 통신 중이었다.

const login = async (req: Request, res: Response) => {
  
  // ...
  
  res.set(
      "Set-Cookie",
      cookie.serialize("token", token, {
        httpOnly: true,
        secure: process.env.NODE_ENV === "production",
        maxAge: 60 * 60 * 24 * 7,
        path: "/",
      })
    );
    return res.json({ user, token });
  } catch (error) {
    
    // ...
    
  }
};

해결방법

임시방편으로 토이프로젝트 한정으로 주석처리 하는걸로 해결했다.
실무에서는 어떤식으로 해결해야 하는지 확인이 필요하겠다.

const login = async (req: Request, res: Response) => {
  
  // ...
  
  res.set(
      "Set-Cookie",
      cookie.serialize("token", token, {
        httpOnly: true,
        // ❌secure: process.env.NODE_ENV === "production",
        maxAge: 60 * 60 * 24 * 7,
        path: "/",
      })
    );
    return res.json({ user, token });
  } catch (error) {
    
    // ...
    
  }
};
profile
프론트엔드 개발자

0개의 댓글