Merge pull request 'feature/24-production_dockerfile' (#30) from feature/24-production_dockerfile into dev
All checks were successful
continuous-integration/drone/push Build is passing

Reviewed-on: #30
closes #24
This commit is contained in:
Nicolai Ort 2020-12-12 19:03:22 +00:00
commit 10dbd233a0
9 changed files with 152 additions and 56 deletions

View File

@ -1,20 +1,100 @@
--- ---
kind: pipeline kind: pipeline
name: tests:latest name: tests:node_latest
clone: clone:
disable: true disable: true
steps: steps:
- name: checkout pr - name: checkout pr
image: alpine/git image: alpine/git
commands: commands:
- git clone $DRONE_REMOTE_URL . - git clone $DRONE_REMOTE_URL .
- git checkout $DRONE_SOURCE_BRANCH - git checkout $DRONE_SOURCE_BRANCH
- mv .env.ci .env - mv .env.ci .env
- name: run tests - name: run tests
image: node:alpine image: node:alpine
commands: commands:
- yarn - yarn
- yarn test:ci - yarn test:ci
trigger: trigger:
event: event:
- pull_request - pull_request
---
kind: pipeline
type: docker
name: build:dev
steps:
- name: build featurebranch
image: plugins/docker
depends_on: [clone]
settings:
username:
from_secret: DOCKER_REGISTRY_USER
password:
from_secret: DOCKER_REGISTRY_PASSWORD
repo: registry.odit.services/lfk/backend
tags:
- dev
registry: registry.odit.services
when:
branch:
- dev
event:
- push
trigger:
branch:
- dev
event:
- push
---
kind: pipeline
type: docker
name: build:latest
steps:
- name: build featurebranch
image: plugins/docker
depends_on: [clone]
settings:
username:
from_secret: DOCKER_REGISTRY_USER
password:
from_secret: DOCKER_REGISTRY_PASSWORD
repo: registry.odit.services/lfk/backend
tags:
- latest
registry: registry.odit.services
trigger:
branch:
- main
event:
- push
---
kind: pipeline
type: docker
name: build:tags
steps:
- name: build featurebranch
image: plugins/docker
depends_on: [clone]
settings:
username:
from_secret: DOCKER_REGISTRY_USER
password:
from_secret: DOCKER_REGISTRY_PASSWORD
repo: registry.odit.services/lfk/backend
tags:
- $DRONE_TAG
registry: registry.odit.services
trigger:
branch:
- main
event:
- tag

View File

@ -5,4 +5,4 @@ DB_PORT=unused
DB_USER=unused DB_USER=unused
DB_PASSWORD=bla DB_PASSWORD=bla
DB_NAME=./test.sqlite DB_NAME=./test.sqlite
NODE_ENV=production NODE_ENV=dev

View File

@ -1,6 +1,16 @@
FROM node:alpine # Typescript Build
FROM node:14.15.1-alpine3.12
WORKDIR /app WORKDIR /app
COPY ./package.json ./ COPY package.json ./
RUN yarn RUN npm i -g pnpm
COPY ./ ./ RUN pnpm i
ENTRYPOINT [ "yarn","dev" ] COPY tsconfig.json ormconfig.js ./
COPY src ./src
RUN pnpm run build
# final image
FROM node:14.15.1-alpine3.12
COPY package.json ormconfig.js ./
RUN npm i -g pnpm
RUN pnpm i --prod
COPY --from=0 /app/dist dist
ENTRYPOINT ["node", "dist/app.js"]

View File

@ -6,18 +6,26 @@ services:
- 4010:4010 - 4010:4010
environment: environment:
APP_PORT: 4010 APP_PORT: 4010
DB_TYPE: postgres DB_TYPE: sqlite
DB_HOST: backend_db DB_HOST: bla
DB_PORT: 5432 DB_PORT: bla
DB_USER: lfk DB_USER: bla
DB_PASSWORD: changeme DB_PASSWORD: bla
DB_NAME: lfk DB_NAME: dev.sqlite
NODE_ENV: production NODE_ENV: production
backend_db: # APP_PORT: 4010
image: postgres:11-alpine # DB_TYPE: postgres
environment: # DB_HOST: backend_db
POSTGRES_DB: lfk # DB_PORT: 5432
POSTGRES_PASSWORD: changeme # DB_USER: lfk
POSTGRES_USER: lfk # DB_PASSWORD: changeme
ports: # DB_NAME: lfk
- 5432:5432 # NODE_ENV: production
# backend_db:
# image: postgres:11-alpine
# environment:
# POSTGRES_DB: lfk
# POSTGRES_PASSWORD: changeme
# POSTGRES_USER: lfk
# ports:
# - 5432:5432

16
ormconfig.js Normal file
View File

@ -0,0 +1,16 @@
const dotenv = require('dotenv');
dotenv.config();
//
const SOURCE_PATH = process.env.NODE_ENV === 'production' ? 'dist' : 'src';
module.exports = {
type: process.env.DB_TYPE,
host: process.env.DB_HOST,
port: process.env.DB_PORT,
username: process.env.DB_USER,
password: process.env.DB_PASSWORD,
database: process.env.DB_NAME,
// entities: ["src/**/entities/*.ts"],
entities: [ `${SOURCE_PATH}/**/entities/*{.ts,.js}` ],
seeds: [ `${SOURCE_PATH}/**/seeds/*{.ts,.js}` ]
// seeds: ['src/seeds/*.ts'],
};

View File

@ -1,13 +0,0 @@
import { config } from 'dotenv';
config();
export default {
type: process.env.DB_TYPE,
host: process.env.DB_HOST,
port: process.env.DB_PORT,
username: process.env.DB_USER,
password: process.env.DB_PASSWORD,
database: process.env.DB_NAME,
entities: ["src/models/entities/*.ts"],
seeds: ['src/seeds/*.ts'],
};

View File

@ -32,9 +32,7 @@
"cors": "^2.8.5", "cors": "^2.8.5",
"dotenv": "^8.2.0", "dotenv": "^8.2.0",
"express": "^4.17.1", "express": "^4.17.1",
"helmet": "^4.2.0",
"jsonwebtoken": "^8.5.1", "jsonwebtoken": "^8.5.1",
"multer": "^1.4.2",
"mysql": "^2.18.1", "mysql": "^2.18.1",
"pg": "^8.5.1", "pg": "^8.5.1",
"reflect-metadata": "^0.1.13", "reflect-metadata": "^0.1.13",
@ -44,23 +42,20 @@
"typeorm": "^0.2.29", "typeorm": "^0.2.29",
"typeorm-routing-controllers-extensions": "^0.2.0", "typeorm-routing-controllers-extensions": "^0.2.0",
"typeorm-seeding": "^1.6.1", "typeorm-seeding": "^1.6.1",
"sqlite3": "^5.0.0",
"uuid": "^8.3.1" "uuid": "^8.3.1"
}, },
"devDependencies": { "devDependencies": {
"@types/cors": "^2.8.8", "@types/cors": "^2.8.8",
"@types/dotenv": "^8.2.0",
"@types/express": "^4.17.9", "@types/express": "^4.17.9",
"@types/jest": "^26.0.16", "@types/jest": "^26.0.16",
"@types/jsonwebtoken": "^8.5.0", "@types/jsonwebtoken": "^8.5.0",
"@types/multer": "^1.4.4",
"@types/node": "^14.14.9", "@types/node": "^14.14.9",
"@types/swagger-ui-express": "^4.1.2", "@types/swagger-ui-express": "^4.1.2",
"@types/uuid": "^8.3.0", "@types/uuid": "^8.3.0",
"axios": "^0.21.0", "axios": "^0.21.0",
"dotenv-safe": "^8.2.0",
"jest": "^26.6.3", "jest": "^26.6.3",
"nodemon": "^2.0.6", "nodemon": "^2.0.6",
"sqlite3": "^5.0.0",
"start-server-and-test": "^1.11.6", "start-server-and-test": "^1.11.6",
"ts-jest": "^26.4.4", "ts-jest": "^26.4.4",
"ts-node": "^9.0.0", "ts-node": "^9.0.0",
@ -80,7 +75,6 @@
"ignore": [ "ignore": [
"src/tests/*", "src/tests/*",
"docs/*" "docs/*"
], ]
"delay": "2500"
} }
} }

View File

@ -6,13 +6,14 @@ import { config, e as errors } from './config';
import loaders from "./loaders/index"; import loaders from "./loaders/index";
import { ErrorHandler } from './middlewares/ErrorHandler'; import { ErrorHandler } from './middlewares/ErrorHandler';
const CONTROLLERS_FILE_EXTENSION = process.env.NODE_ENV === 'production' ? 'js' : 'ts';
const app = createExpressServer({ const app = createExpressServer({
authorizationChecker: authchecker, authorizationChecker: authchecker,
middlewares: [ErrorHandler], middlewares: [ErrorHandler],
development: config.development, development: config.development,
cors: true, cors: true,
routePrefix: "/api", routePrefix: "/api",
controllers: [__dirname + "/controllers/*.ts"], controllers: [`${__dirname}/controllers/*.${CONTROLLERS_FILE_EXTENSION}`],
}); });
async function main() { async function main() {

View File

@ -3,7 +3,7 @@
"target": "ES2020", "target": "ES2020",
"module": "commonjs", "module": "commonjs",
"rootDir": "./src", "rootDir": "./src",
"outDir": "./build", "outDir": "./dist",
"esModuleInterop": true, "esModuleInterop": true,
"strict": false, "strict": false,
"experimentalDecorators": true, "experimentalDecorators": true,