Next.js + express + mariadb 를 이용한 블로그 프로젝트를 완성하여 mariadb를 클라우드타입에 배포해볼려고한다. 원래는 heroku에 배포할려고 했다가 단계적으로 프리티어 서비스를 종료한다고 해서.. 무료로 배포할 수 있는 클라우드타입에 배포를 진행하였다.
먼저 클라우드타입에 로그인을 해주어야한다.
https://cloudtype.io/
버전, root password, 서비스이름, 프로젝트를 선택한뒤 배포하기를 누르면 된다.
프로젝트가 생성이 되었으면 프로젝트 설정탭에 들어가서 방화벽에 TCP 외부 접속 허용을 해준다.
클라우드타입 이용가이드에 나와있는대로 설정을 해주면 된다.
내 프로젝트 sequelize 설정은 다음과 같다.
// models/index.js
const dbConfig = require('../config/config')['development'];
const Sequelize = require('sequelize');
const sequelize = new Sequelize(
dbConfig.database,
dbConfig.username,
dbConfig.password,
{
host: dbConfig.host,
dialect: dbConfig.dialect,
operatorsAliases: false,
timezone: '+09:00',
}
);
const db = {};
db.Sequelize = Sequelize;
db.sequelize = sequelize;
// routes 사용
db.User = require('./user')(sequelize, Sequelize);
db.Post = require('./post')(sequelize, Sequelize);
db.Image = require('./image')(sequelize, Sequelize);
db.Comment = require('./comment')(sequelize, Sequelize);
Object.keys(db).forEach(modelName => {
if (db[modelName].associate) {
db[modelName].associate(db);
}
});
module.exports = db;
// config/config.js
const dotenv = require('dotenv');
dotenv.config();
module.exports = {
development: {
username: 'root',
password: process.env.DB_PASSWORD,
database: 'devlog',
host: '127.0.0.1',
dialect: 'mysql',
},
production: {
username: 'root',
password: process.env.DB_PASSWORD,
database: 'devlog',
host: '127.0.0.1',
dialect: 'mysql',
},
};
config.js 파일을 보면 배포하기전 로컬에서 작업을 하였기에 host가 127.0.0.1로 되어있다.
이제 db를 서버에 배포하였으니 host부분을 클라우드타입에서 부여된 도메인으로 바꿔주면 된다.
그리고 나는 클라우드타입에 MariaDB로 배포를 하였기에 dialect도 mariadb로 바꿔주면 끝이다.
위에 설정대로 셋팅을 완료하고 db연결을 해보았지만 에러가 나타났다..
original: SqlError: (conn=-1, no: 45012, SQLState: 08S01) Connection timeout: failed to create socket after 1006ms
Connection timeout 에러가 나타난건데 알고보니 포트설정을 따로안해주어서 생긴 에러였던 것이었다.
클라우드타입에서 부여된 포트로 설정을 안했기에 mariadb 기본포트인 3306으로 계속 연결을 시도했던 것이었다.
클라우드타입으로 돌아가서 포트번호를 확인한뒤 sequelize에 따로 설정을 해주었다.
const dbConfig = require('../config/config')['development'];
const Sequelize = require('sequelize');
const sequelize = new Sequelize(
dbConfig.database,
dbConfig.username,
dbConfig.password,
{
host: dbConfig.host,
dialect: dbConfig.dialect,
operatorsAliases: false,
timezone: '+09:00',
port: '31571', // 포트 추가 !!!
}
);
const db = {};
db.Sequelize = Sequelize;
db.sequelize = sequelize;
// routes 사용
db.User = require('./user')(sequelize, Sequelize);
db.Post = require('./post')(sequelize, Sequelize);
db.Image = require('./image')(sequelize, Sequelize);
db.Comment = require('./comment')(sequelize, Sequelize);
Object.keys(db).forEach(modelName => {
if (db[modelName].associate) {
db[modelName].associate(db);
}
});
module.exports = db;
그랬더니 정상적으로 db연결이 완료되었다!