prepare production dockerfiles and env

This commit is contained in:
2024-12-02 01:24:46 +02:00
parent b3b8637f0e
commit 62b975ab72
9 changed files with 97 additions and 22 deletions

View File

@@ -6,10 +6,10 @@ COPY Pipfile Pipfile.lock ./
RUN pip install pipenv && \ RUN pip install pipenv && \
pipenv install --system --deploy && \ pipenv install --system --deploy && \
pip install flask-cors pip install flask-cors tinydb
# Create necessary directories for data storage # Create directory for database
RUN mkdir -p /app/surveys/quiz RUN mkdir -p /app/data
COPY . . COPY . .

View File

@@ -14,12 +14,17 @@ import pandas as pd
import db_conf import db_conf
from flask import send_file from flask import send_file
from flask_cors import CORS from flask_cors import CORS
from tinydb import TinyDB
#from flask_mail import Mail, Message #from flask_mail import Mail, Message
#import firebase_admin #import firebase_admin
#from firebase_admin import credentials, firestore, initialize_app, firebase #from firebase_admin import credentials, firestore, initialize_app, firebase
app = Flask(__name__, static_folder='../frontend/build', static_url_path='/') app = Flask(__name__, static_folder='../frontend/build', static_url_path='/')
CORS(app) # Add this line CORS(app) # Add this line
db = TinyDB('/app/data/responses.json')
responses_table = db.table('responses')
app.config['MYSQL_DATABASE_HOST'] = db_conf.host app.config['MYSQL_DATABASE_HOST'] = db_conf.host
app.config['MYSQL_DATABASE_USER'] = db_conf.user app.config['MYSQL_DATABASE_USER'] = db_conf.user
app.config['MYSQL_DATABASE_PASSWORD'] = db_conf.password app.config['MYSQL_DATABASE_PASSWORD'] = db_conf.password
@@ -105,10 +110,11 @@ def record_responses_to_db():
# msg = Message("Quiz Response for " + str(session_id),sender='minivlat@gmail.com', recipients=['minivlat@gmail.com']) # msg = Message("Quiz Response for " + str(session_id),sender='minivlat@gmail.com', recipients=['minivlat@gmail.com'])
# msg.body = data_send # msg.body = data_send
# mail.send(msg) # mail.send(msg)
fname = str(session_id)+'.txt' # fname = str(session_id)+'.txt'
fname = './surveys/quiz/' + fname # fname = './surveys/quiz/' + fname
with open(fname, 'w+') as test: responses_table.insert(data)
test.write(json.dumps(data) + "\n") # with open(fname, 'w+') as test:
# test.write(json.dumps(data) + "\n")
print('TODO: Record quiz responses into a file or DB') print('TODO: Record quiz responses into a file or DB')
print('Collected quiz data: ', data) print('Collected quiz data: ', data)

1
ReactTool/frontend/.env Normal file
View File

@@ -0,0 +1 @@
REACT_APP_API_URL=http://localhost:8000

View File

@@ -0,0 +1 @@
REACT_APP_API_URL=https://mini-vlat-ua.duckdns.org/api

View File

@@ -0,0 +1,14 @@
# ReactTool/frontend/Dockerfile.prod
FROM node:16 as build
WORKDIR /app
COPY package*.json ./
COPY yarn.lock ./
RUN yarn install
COPY . .
RUN yarn build
FROM nginx:alpine
COPY --from=build /app/build /usr/share/nginx/html

View File

@@ -31,7 +31,7 @@ class Tutorial extends Component {
componentDidMount() { componentDidMount() {
fetch('http://localhost:8000/new_session_id', { fetch(`${process.env.REACT_APP_API_URL}/new_session_id`, {
headers: { 'Accept': 'application/json', 'Content-Type': 'application/json' }, headers: { 'Accept': 'application/json', 'Content-Type': 'application/json' },
method: 'POST', method: 'POST',
body: JSON.stringify({ body: JSON.stringify({

View File

@@ -178,7 +178,7 @@ class VisQuiz extends Component {
on_survey_click() { on_survey_click() {
fetch('http://localhost:8000/record_responses_to_db', { fetch(`${process.env.REACT_APP_API_URL}//record_responses_to_db`, {
headers: { 'Accept': 'application/json', 'Content-Type': 'application/json' }, headers: { 'Accept': 'application/json', 'Content-Type': 'application/json' },
method: 'POST', method: 'POST',
body: JSON.stringify({ body: JSON.stringify({

61
docker-compose.prod.yml Normal file
View File

@@ -0,0 +1,61 @@
# docker-compose.prod.yml
version: '3.8'
services:
traefik:
image: traefik:v2.10
command:
- "--api.insecure=false"
- "--providers.docker=true"
- "--providers.docker.exposedbydefault=false"
- "--entrypoints.web.address=:80"
- "--entrypoints.websecure.address=:443"
- "--certificatesresolvers.myresolver.acme.tlschallenge=true"
- "--certificatesresolvers.myresolver.acme.email=ptrvtch@protonmail.com"
- "--certificatesresolvers.myresolver.acme.storage=/letsencrypt/acme.json"
ports:
- "80:80"
- "443:443"
volumes:
- "/var/run/docker.sock:/var/run/docker.sock:ro"
- "./letsencrypt:/letsencrypt"
networks:
- web
frontend:
build:
context: ./ReactTool/frontend
args:
- NODE_ENV=production
labels:
- "traefik.enable=true"
- "traefik.http.routers.frontend.rule=Host(`mini-vlat-ua.duckdns.org`)"
- "traefik.http.routers.frontend.entrypoints=websecure"
- "traefik.http.routers.frontend.tls.certresolver=myresolver"
- "traefik.http.services.frontend.loadbalancer.server.port=80"
networks:
- web
depends_on:
- backend
backend:
build:
context: ./ReactTool/backend
volumes:
- ./data/db:/app/data
environment:
- FLASK_ENV=production
labels:
- "traefik.enable=true"
- "traefik.http.routers.backend.rule=Host(`mini-vlat-ua.duckdns.org`) && PathPrefix(`/api`)"
- "traefik.http.routers.backend.entrypoints=websecure"
- "traefik.http.routers.backend.tls.certresolver=myresolver"
- "traefik.http.services.backend.loadbalancer.server.port=5000"
- "traefik.http.middlewares.backend-strip.stripprefix.prefixes=/api"
- "traefik.http.routers.backend.middlewares=backend-strip@docker"
networks:
- web
networks:
web:
driver: bridge

View File

@@ -1,20 +1,20 @@
# docker-compose.yml (development)
version: '3.8' version: '3.8'
services: services:
frontend: frontend:
build: build:
context: ./ReactTool/frontend context: ./ReactTool/frontend
args:
- NODE_ENV=development
ports: ports:
- "3000:3000" - "3000:3000"
volumes: volumes:
- ./ReactTool/frontend:/app - ./ReactTool/frontend:/app
- /app/node_modules - /app/node_modules
environment: environment:
- REACT_APP_BACKEND_URL=http://localhost:8000 - NODE_ENV=development
depends_on: depends_on:
- backend - backend
networks:
- app-network
backend: backend:
build: build:
@@ -23,14 +23,6 @@ services:
- "8000:5000" - "8000:5000"
volumes: volumes:
- ./ReactTool/backend:/app - ./ReactTool/backend:/app
- ./data/surveys/quiz:/app/surveys/quiz - ./data/db:/app/data
environment: environment:
- FLASK_APP=app.py
- FLASK_ENV=development - FLASK_ENV=development
- PYTHONUNBUFFERED=1
networks:
- app-network
networks:
app-network:
driver: bridge