Commit 8706147f by Dhamodharan S

initial setup

parents
Pipeline #35084 passed with stages
in 2 minutes 24 seconds
/tmp
# dependencies
/node_modules
# IDEs and editors
/.idea
.project
.classpath
.c9/
*.launch
.settings/
*.sublime-workspace
# IDE - VSCode
.vscode/*
!.vscode/settings.json
!.vscode/tasks.json
!.vscode/launch.json
!.vscode/extensions.json
# misc
/.sass-cache
/connect.lock
/coverage
/libpeerconnection.log
testem.log
/typings
# System Files
.DS_Store
Thumbs.db
# Logs
logs
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*
# Optional eslint cache
.eslintcache
# Optional REPL history
.node_repl_history
# Output of 'npm pack'
*.tgz
# Yarn Integrity file
.yarn-integrity
.env
\ No newline at end of file
stages:
- build
- deploy
variables:
app_log_path: /var/log/whatsapp-api/app.log
app_port: '3000' # this is the port exposed by the container
dotenv: conf/.env.example
image_tag: $CI_BUILD_REF_NAME
image: $CI_REGISTRY_IMAGE
registry_pass: $CI_BUILD_TOKEN
registry_user: gitlab-ci-token
registry: $CI_REGISTRY
ecs_definition: conf/ecs-task-definition.json
ecs_entrypoint: app:3000
app_image_tag: $CI_REGISTRY_IMAGE:$CI_COMMIT_REF_NAME
docker_build_develop:
tags:
- docker
stage: build
variables:
app_env: development
app_url: https://whatsapp-api-dev.dev.kacdn.net
script:
- env
- docker login -u $registry_user -p $registry_pass $registry
- docker build -t $app_image_tag --build-arg NODE_ENV=$app_env --build-arg APP_URL=$app_url .
- docker push $app_image_tag
only:
- develop
docker_build_master:
tags:
- docker
- eu
stage: build
variables:
app_env: staging
app_url: https://whatsapp-api-staging.eu-staging.kacdn.net
script:
- env
- docker login -u $registry_user -p $registry_pass $registry
- docker build -t $app_image_tag --build-arg NODE_ENV=$app_env --build-arg APP_URL=$app_url .
- docker push $app_image_tag
only:
- master
docker_build_release:
tags:
- docker
stage: build
variables:
app_env: production
script:
- docker login -u $registry_user -p $registry_pass $registry
- docker build -t $app_image_tag --build-arg NODE_ENV=$app_env .
- docker push $app_image_tag
only:
- /^v.*$/
deploy_dev:
image: registry.git.int.krds.com/tools/deploy:edge
tags:
- deploy
- sg
stage: deploy
variables:
app_env: development
app_url: https://whatsapp-api-dev.dev.kacdn.net
app_db_host: 10.41.0.222
app_db_name: d_whatsapp_api
app_db_user: d_root_whatsapp
app_db_pass: '$v_app_db_pass'
script:
- deploy-ecs sg-devbox
only:
- develop
deploy_staging:
image: registry.git.int.krds.com/tools/deploy:edge
tags:
- deploy
- eu
stage: deploy
variables:
app_env: staging
app_url: https://whatsapp-api-staging.eu-staging.kacdn.net
app_db_host: 10.40.2.27
app_db_name: s_whatsapp_api
app_db_user: s_root_whatsapp
app_db_pass: '$v_app_db_pass'
script:
- deploy-ecs eu-staging
only:
- master
deploy_release:
image: registry.git.int.krds.com/tools/deploy:edge
tags:
- deploy
- sg
stage: deploy
variables:
app_env: production
app_db_host: sg-db-prod.cpfsyotz8wym.ap-southeast-1.rds.amazonaws.com
app_db_name: p_whatsapp_api
app_db_user: p_root_whatsapp
app_db_pass: '$v_app_db_pass'
script:
- deploy-ecs sg-prod-2
only:
- /^v.*$/
\ No newline at end of file
FROM mhart/alpine-node:8.9.0
# need to install Bash as it doenst port with this image
RUN apk add --no-cache bash
#change to tmp folder this helps caching npm pakages for faster build next time
WORKDIR /tmp
COPY package.json /tmp/
COPY package-lock.json /tmp/
RUN npm config set registry http://registry.npmjs.org/ && npm install
#SET working dir and copy files to it
WORKDIR /usr/src/app
COPY . /usr/src/app/
# LOGS VOLUME
VOLUME ["/var/log/whatsapp-api/", "/usr/src/whatsapp-api/public"]
#copy node_modules folder from tmp
RUN cp -a /tmp/node_modules /usr/src/app/
ARG NODE_ENV=staging
ENV NODE_ENV=${NODE_ENV}
#DEFAULT IS SET TO dev url
ARG APP_URL=https://whatsapp-api-staging.eu-staging.kacdn.net
ENV APP_URL=${APP_URL}
RUN echo ${NODE_ENV} ${APP_URL}
#expose port
EXPOSE 3000
#strat the app
CMD [ "node", "server" ]
#!/usr/bin/env node
/**
* Module dependencies.
*/
var app = require('../app');
var debug = require('debug')('whatsapp-api:server');
var http = require('http');
/**
* Get port from environment and store in Express.
*/
var port = normalizePort(process.env.PORT || '3000');
app.set('port', port);
/**
* Create HTTP server.
*/
var server = http.createServer(app);
/**
* Listen on provided port, on all network interfaces.
*/
server.listen(port);
server.on('error', onError);
server.on('listening', onListening);
/**
* Normalize a port into a number, string, or false.
*/
function normalizePort(val) {
var port = parseInt(val, 10);
if (isNaN(port)) {
// named pipe
return val;
}
if (port >= 0) {
// port number
return port;
}
return false;
}
/**
* Event listener for HTTP server "error" event.
*/
function onError(error) {
if (error.syscall !== 'listen') {
throw error;
}
var bind = typeof port === 'string'
? 'Pipe ' + port
: 'Port ' + port;
// handle specific listen errors with friendly messages
switch (error.code) {
case 'EACCES':
console.error(bind + ' requires elevated privileges');
process.exit(1);
break;
case 'EADDRINUSE':
console.error(bind + ' is already in use');
process.exit(1);
break;
default:
throw error;
}
}
/**
* Event listener for HTTP server "listening" event.
*/
function onListening() {
var addr = server.address();
var bind = typeof addr === 'string'
? 'pipe ' + addr
: 'port ' + addr.port;
debug('Listening on ' + bind);
}
APP_CACHE=false
APP_DEBUG=true
CACHE_DRIVER=array
DB_PORT=3306
INSTALLED=false
LOG_PATH={{app_log_path}}
APP_ENV={{app_env}}
APP_URL={{app_url}}
APP_PORT=3000
DB_HOST={{app_db_host}}
DB_USERNAME={{app_db_user}}
DB_PASSWORD={{app_db_pass}}
DB_DATABASE={{app_db_name}}
{
"family": "DRCILABO-TAP-THE-STRESSORS-API-ECS",
"taskRoleArn": "arn:aws:iam::060686542424:role/EcsTaskS3ReadOnlyAccess",
"networkMode": "bridge",
"containerDefinitions": [
{
"name": "app",
"image": "{{app_image_tag}}",
"cpu": 1,
"memoryReservation": 128,
"essential": true,
"readonlyRootFilesystem": false,
"command": [
"node",
"./server.js"
],
"environment": [
{
"name": "APP_URL",
"value": "{{app_url}}"
},
{
"name": "APP_PORT",
"value": "{{app_port}}"
},
{
"name": "APP_ENV",
"value": "{{app_env}}"
},
{
"name": "NODE_ENV",
"value": "{{app_env}}"
},
{
"name": "PORT",
"value": "{{app_port}}"
},
{
"name": "DB_HOST",
"value": "{{app_db_host}}"
},
{
"name": "DB_USERNAME",
"value": "{{app_db_user}}"
},
{
"name": "DB_PASSWORD",
"value": "{{app_db_pass}}"
},
{
"name": "DB_DATABASE",
"value": "{{app_db_name}}"
},
{
"name": "LOG_PATH",
"value": "{{app_log_path}}"
}
]
}
]
}
require('dotenv').config();
const config = {
DB_HOST: process.env.DB_HOST,
DB_USERNAME: process.env.DB_USERNAME,
DB_PASSWORD: process.env.DB_PASSWORD,
DB_DATABASE: process.env.DB_DATABASE,
port: '3000',
env: process.env.APP_ENV
};
module.exports = config;
const Sequelize = require('sequelize')
const config = require("./config");
const WebhookResponseModel = require('../models/webhook_response')
const sequelize = new Sequelize(config.DB_DATABASE, config.DB_USERNAME, config.DB_PASSWORD, {
host: config.DB_HOST,
dialect: 'mysql',
pool: {
max: 10,
min: 0,
acquire: 30000,
idle: 10000
},
define: {
timestamps: false
}
})
const WebhookResponses = WebhookResponseModel(sequelize, Sequelize);
// sequelize.sync({ force: true })
// .then(() => {
// console.log(`Database & tables created!`)
// })
module.exports = {
WebhookResponses
}
\ No newline at end of file
var express = require('express');
var httpError = require('http-errors');
const bodyParser = require("body-parser");
const cors = require("cors");
var indexRouter = require('../routes/index');
var app = express();
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));
app.use(cors());
app.use('/api', indexRouter);
// catch 404 and forward to error handler
app.use((req, res, next) => {
console.log("Page not Found");
const err = new httpError(404);
//return next(err);
res.send("Page not Found");
});
module.exports = app;
const { WebhookResponses } = require('../config/db.config');
async function saveResponse(req, res) {
try {
let response = req.body;
WebhookResponses.create({response: response})
.then(user => res.json({status: 200,info: 'OK'}))
.catch(function (err) {
console.log(err);
res.send({status: 200,info: 'OK'});
});
} catch (err) {
console.log(err);
// res.status(400).send({error: true, message:err});
res.send({status: 200,info: 'OK'});
}
}
module.exports = {
saveResponse
};
\ No newline at end of file
module.exports = (sequelize, type) => {
return sequelize.define('webhook_responses', {
id: {
type: type.INTEGER,
primaryKey: true,
autoIncrement: true
},
response: type.JSON,
created_at: {
type: 'TIMESTAMP',
defaultValue: sequelize.literal('CURRENT_TIMESTAMP'),
allowNull: false
}
})
}
\ No newline at end of file
{
"name": "whatsapp-api",
"version": "1.0.0",
"private": true,
"scripts": {
"serve": "nodemon server",
"start": "nodemon server"
},
"dependencies": {
"body-parser": "^1.19.0",
"cors": "^2.8.5",
"dotenv": "^8.2.0",
"express": "^4.16.4",
"http-errors": "~1.6.3",
"mysql2": "^2.1.0",
"nodemon": "^2.0.3",
"precache": "0.0.0",
"sequelize": "^5.21.6"
}
}
body {
padding: 50px;
font: 14px "Lucida Grande", Helvetica, Arial, sans-serif;
}
a {
color: #00B7FF;
}
var express = require('express');
const webhookCtrl = require("../controllers/webhook.controller");
var router = express.Router();
router.get("/check", (req, res) => {
res.send("OK");
});
/* GET home page. */
router.post('/webhook', webhookCtrl.saveResponse);
module.exports = router;
const config = require("./config/config");
const app = require("./config/express");
app.listen(config.port, () => {
console.info(config);
console.info(`server started on port ${config.port} (${config.env})`);
});
module.exports = app;
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment