From 48a60c896d86de9bf76806ca60da35ef9f77259e Mon Sep 17 00:00:00 2001 From: Jan Tuomi Date: Wed, 5 Feb 2020 11:55:43 +0200 Subject: Add prod env --- .gitignore | 1 + backend/knexfile.js | 16 ++++++++ backend/migrations/20200201145548_password-salt.js | 11 ------ backend/migrations/20200201154548_password-salt.js | 11 ++++++ docker-compose.prod.yml | 40 +++++++++++++++++++ frontend/Dockerfile.prod | 14 +++++++ frontend/default.conf | 45 ++++++++++++++++++++++ frontend/public/index.html | 3 +- 8 files changed, 129 insertions(+), 12 deletions(-) delete mode 100644 backend/migrations/20200201145548_password-salt.js create mode 100644 backend/migrations/20200201154548_password-salt.js create mode 100644 docker-compose.prod.yml create mode 100644 frontend/Dockerfile.prod create mode 100644 frontend/default.conf diff --git a/.gitignore b/.gitignore index 3665dba..a80688f 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,4 @@ .pnp.js db.json node_modules/ +build/ diff --git a/backend/knexfile.js b/backend/knexfile.js index 73d0a10..4984c40 100644 --- a/backend/knexfile.js +++ b/backend/knexfile.js @@ -17,4 +17,20 @@ module.exports = { tableName: 'knex_migrations', }, }, + production: { + client: 'postgresql', + connection: { + host: process.env.DATABASE_HOST, + database: process.env.DATABASE_DB, + user: process.env.DATABASE_USER, + password: process.env.DATABASE_PASSWORD, + }, + pool: { + min: 2, + max: 10, + }, + migrations: { + tableName: 'knex_migrations', + }, + }, }; diff --git a/backend/migrations/20200201145548_password-salt.js b/backend/migrations/20200201145548_password-salt.js deleted file mode 100644 index 217b02b..0000000 --- a/backend/migrations/20200201145548_password-salt.js +++ /dev/null @@ -1,11 +0,0 @@ -exports.up = function(knex) { - return knex.schema.table('users', function(table) { - table.string('salt').notNullable(); - }); -}; - -exports.down = function(knex) { - return knex.schema.table('users', function(table) { - table.dropColumn('salt'); - }); -}; diff --git a/backend/migrations/20200201154548_password-salt.js b/backend/migrations/20200201154548_password-salt.js new file mode 100644 index 0000000..217b02b --- /dev/null +++ b/backend/migrations/20200201154548_password-salt.js @@ -0,0 +1,11 @@ +exports.up = function(knex) { + return knex.schema.table('users', function(table) { + table.string('salt').notNullable(); + }); +}; + +exports.down = function(knex) { + return knex.schema.table('users', function(table) { + table.dropColumn('salt'); + }); +}; diff --git a/docker-compose.prod.yml b/docker-compose.prod.yml new file mode 100644 index 0000000..ae61e1d --- /dev/null +++ b/docker-compose.prod.yml @@ -0,0 +1,40 @@ +version: "3.7" + +services: + db_prod: + image: postgres:12-alpine + tty: true + environment: + POSTGRES_PASSWORD: postgres + ports: + - 5432:5432 + volumes: + - dbdata_prod:/var/lib/postgresql/data + + backend_prod: + build: backend + command: npm start + tty: true + environment: + DATABASE_HOST: db_prod + DATABASE_DB: postgres + DATABASE_USER: postgres + DATABASE_PASSWORD: postgres + NODE_ENV: production + ports: + - 4000:4000 + depends_on: + - db_prod + + frontend_prod: + build: + context: frontend + dockerfile: Dockerfile.prod + tty: true + environment: + REACT_APP_API_BASE_URL: http://localhost:4000 + ports: + - 3000:80 + +volumes: + dbdata_prod: diff --git a/frontend/Dockerfile.prod b/frontend/Dockerfile.prod new file mode 100644 index 0000000..7c4d6d1 --- /dev/null +++ b/frontend/Dockerfile.prod @@ -0,0 +1,14 @@ +FROM node:12-alpine AS builder + +WORKDIR /app +COPY package-lock.json package.json ./ +RUN npm ci +COPY . ./ +ENV NODE_ENV=production +RUN npm run build + +FROM nginx:alpine AS server + +WORKDIR /usr/share/nginx/html +COPY default.conf /etc/nginx/conf.d/default.conf +COPY --from=builder /app/build ./ diff --git a/frontend/default.conf b/frontend/default.conf new file mode 100644 index 0000000..3856e3f --- /dev/null +++ b/frontend/default.conf @@ -0,0 +1,45 @@ +server { + listen 80; + server_name localhost; + + #charset koi8-r; + #access_log /var/log/nginx/host.access.log main; + + location / { + root /usr/share/nginx/html; + #index index.html index.htm; + try_files $uri $uri/ /index.html; + } + + #error_page 404 /404.html; + + # redirect server error pages to the static page /50x.html + # + error_page 500 502 503 504 /50x.html; + location = /50x.html { + root /usr/share/nginx/html; + } + + # proxy the PHP scripts to Apache listening on 127.0.0.1:80 + # + #location ~ \.php$ { + # proxy_pass http://127.0.0.1; + #} + + # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000 + # + #location ~ \.php$ { + # root html; + # fastcgi_pass 127.0.0.1:9000; + # fastcgi_index index.php; + # fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name; + # include fastcgi_params; + #} + + # deny access to .htaccess files, if Apache's document root + # concurs with nginx's one + # + #location ~ /\.ht { + # deny all; + #} +} \ No newline at end of file diff --git a/frontend/public/index.html b/frontend/public/index.html index cc94d49..b41fd33 100644 --- a/frontend/public/index.html +++ b/frontend/public/index.html @@ -7,7 +7,8 @@ + img-src * data:; + script-src 'self' 'unsafe-inline';" />