Loading backend/db.py +2 −0 Original line number Diff line number Diff line Loading @@ -14,6 +14,7 @@ DB_NAME = os.getenv("DB_NAME", "postgres") DB_USER = os.getenv("DB_USER", "postgres") DB_PASSWORD = os.getenv("POSTGRES_PASSWORD", "postgres") def get_connection(): return psycopg2.connect( host=DB_HOST, Loading @@ -22,6 +23,7 @@ def get_connection(): password=DB_PASSWORD ) def init_db(): with get_connection() as conn: with conn.cursor() as cur: Loading doc/some_notes.md 0 → 100644 +70 −0 Original line number Diff line number Diff line # Some Notes ## Commands Prepare frontend ```bash docker run -it --rm -v $(pwd)/frontend:/app -w /app node:20 bash ``` Check database ```bash docker exec -it yf-web-app-db-1 psql -U postgres -d postgres ``` Insert data into database ```bash curl -X POST http://localhost:8000/api/nvda/fetch ``` Use production setup based on nginxx ```bash docker compose -f docker-compose.prod.yml up ``` ## Vidualization ### Development ```mermaid graph TD User["User Browser"] Frontend["React Frontend (Port 3000)"] Backend["Python Tornado Backend (Port 8000)"] Database["PostgreSQL Database (Port 5432)"] subgraph Docker Network ["Docker Compose Network: app-network"] Frontend -->|"HTTP Request to /api/nvda"| Backend Backend -->|"SQL SELECT"| Database Backend -->|"SQL INSERT (via yfinance fetch)"| Database Backend -->|"JSON Response"| Frontend end User -->|"Accesses localhost:3000"| Frontend Frontend -->|"Renders chart from API data"| User ``` ### Production ```mermaid graph TD User["User Browser"] NGINX["NGINX (Port 80)"] Frontend["Static React Files (/usr/share/nginx/html)"] Backend["Python Tornado Backend (Port 8000)"] Database["PostgreSQL (Port 5432)"] subgraph Docker Network: app-network NGINX -->|"Serves static files"| Frontend NGINX -->|"Proxies /api requests"| Backend Backend -->|"SQL Queries"| Database end User -->|"HTTP GET /"| NGINX User -->|"HTTP GET /api/nvda"| NGINX ``` No newline at end of file docker-compose.prod.yml 0 → 100644 +42 −0 Original line number Diff line number Diff line version: "3.8" services: db: image: postgres environment: DB_HOST: db POSTGRES_USER: postgres POSTGRES_PASSWORD: postgres POSTGRES_DB: postgres volumes: - ./pg_data:/var/lib/postgresql/data:rw networks: - app-network backend: build: context: ./backend dockerfile: Dockerfile environment: DB_HOST: db DB_NAME: postgres DB_USER: postgres POSTGRES_PASSWORD: postgres networks: - app-network nginx: image: nginx:alpine depends_on: - backend ports: - "80:80" volumes: - ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro - ./frontend/build:/usr/share/nginx/html:ro networks: - app-network networks: app-network: driver: bridge docker-compose.yml +0 −2 Original line number Diff line number Diff line Loading @@ -8,8 +8,6 @@ services: DB_NAME: postgres DB_USER: postgres POSTGRES_PASSWORD: postgres ports: - "5432:5432" volumes: - ./pg_data:/var/lib/postgresql/data:rw networks: Loading frontend/package-lock.json +31 −0 Original line number Diff line number Diff line Loading @@ -8,6 +8,7 @@ "name": "gdp-frontend", "version": "1.0.0", "dependencies": { "bootstrap": "^5.3.6", "chart.js": "^4.4.0", "react": "^18.2.0", "react-chartjs-2": "^5.2.0", Loading Loading @@ -3083,6 +3084,17 @@ } } }, "node_modules/@popperjs/core": { "version": "2.11.8", "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", "license": "MIT", "peer": true, "funding": { "type": "opencollective", "url": "https://opencollective.com/popperjs" } }, "node_modules/@rollup/plugin-babel": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.3.1.tgz", Loading Loading @@ -5159,6 +5171,25 @@ "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", "license": "ISC" }, "node_modules/bootstrap": { "version": "5.3.6", "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.3.6.tgz", "integrity": "sha512-jX0GAcRzvdwISuvArXn3m7KZscWWFAf1MKBcnzaN02qWMb3jpMoUX4/qgeiGzqyIb4ojulRzs89UCUmGcFSzTA==", "funding": [ { "type": "github", "url": "https://github.com/sponsors/twbs" }, { "type": "opencollective", "url": "https://opencollective.com/bootstrap" } ], "license": "MIT", "peerDependencies": { "@popperjs/core": "^2.11.8" } }, "node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", Loading Loading
backend/db.py +2 −0 Original line number Diff line number Diff line Loading @@ -14,6 +14,7 @@ DB_NAME = os.getenv("DB_NAME", "postgres") DB_USER = os.getenv("DB_USER", "postgres") DB_PASSWORD = os.getenv("POSTGRES_PASSWORD", "postgres") def get_connection(): return psycopg2.connect( host=DB_HOST, Loading @@ -22,6 +23,7 @@ def get_connection(): password=DB_PASSWORD ) def init_db(): with get_connection() as conn: with conn.cursor() as cur: Loading
doc/some_notes.md 0 → 100644 +70 −0 Original line number Diff line number Diff line # Some Notes ## Commands Prepare frontend ```bash docker run -it --rm -v $(pwd)/frontend:/app -w /app node:20 bash ``` Check database ```bash docker exec -it yf-web-app-db-1 psql -U postgres -d postgres ``` Insert data into database ```bash curl -X POST http://localhost:8000/api/nvda/fetch ``` Use production setup based on nginxx ```bash docker compose -f docker-compose.prod.yml up ``` ## Vidualization ### Development ```mermaid graph TD User["User Browser"] Frontend["React Frontend (Port 3000)"] Backend["Python Tornado Backend (Port 8000)"] Database["PostgreSQL Database (Port 5432)"] subgraph Docker Network ["Docker Compose Network: app-network"] Frontend -->|"HTTP Request to /api/nvda"| Backend Backend -->|"SQL SELECT"| Database Backend -->|"SQL INSERT (via yfinance fetch)"| Database Backend -->|"JSON Response"| Frontend end User -->|"Accesses localhost:3000"| Frontend Frontend -->|"Renders chart from API data"| User ``` ### Production ```mermaid graph TD User["User Browser"] NGINX["NGINX (Port 80)"] Frontend["Static React Files (/usr/share/nginx/html)"] Backend["Python Tornado Backend (Port 8000)"] Database["PostgreSQL (Port 5432)"] subgraph Docker Network: app-network NGINX -->|"Serves static files"| Frontend NGINX -->|"Proxies /api requests"| Backend Backend -->|"SQL Queries"| Database end User -->|"HTTP GET /"| NGINX User -->|"HTTP GET /api/nvda"| NGINX ``` No newline at end of file
docker-compose.prod.yml 0 → 100644 +42 −0 Original line number Diff line number Diff line version: "3.8" services: db: image: postgres environment: DB_HOST: db POSTGRES_USER: postgres POSTGRES_PASSWORD: postgres POSTGRES_DB: postgres volumes: - ./pg_data:/var/lib/postgresql/data:rw networks: - app-network backend: build: context: ./backend dockerfile: Dockerfile environment: DB_HOST: db DB_NAME: postgres DB_USER: postgres POSTGRES_PASSWORD: postgres networks: - app-network nginx: image: nginx:alpine depends_on: - backend ports: - "80:80" volumes: - ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro - ./frontend/build:/usr/share/nginx/html:ro networks: - app-network networks: app-network: driver: bridge
docker-compose.yml +0 −2 Original line number Diff line number Diff line Loading @@ -8,8 +8,6 @@ services: DB_NAME: postgres DB_USER: postgres POSTGRES_PASSWORD: postgres ports: - "5432:5432" volumes: - ./pg_data:/var/lib/postgresql/data:rw networks: Loading
frontend/package-lock.json +31 −0 Original line number Diff line number Diff line Loading @@ -8,6 +8,7 @@ "name": "gdp-frontend", "version": "1.0.0", "dependencies": { "bootstrap": "^5.3.6", "chart.js": "^4.4.0", "react": "^18.2.0", "react-chartjs-2": "^5.2.0", Loading Loading @@ -3083,6 +3084,17 @@ } } }, "node_modules/@popperjs/core": { "version": "2.11.8", "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", "license": "MIT", "peer": true, "funding": { "type": "opencollective", "url": "https://opencollective.com/popperjs" } }, "node_modules/@rollup/plugin-babel": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.3.1.tgz", Loading Loading @@ -5159,6 +5171,25 @@ "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", "license": "ISC" }, "node_modules/bootstrap": { "version": "5.3.6", "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.3.6.tgz", "integrity": "sha512-jX0GAcRzvdwISuvArXn3m7KZscWWFAf1MKBcnzaN02qWMb3jpMoUX4/qgeiGzqyIb4ojulRzs89UCUmGcFSzTA==", "funding": [ { "type": "github", "url": "https://github.com/sponsors/twbs" }, { "type": "opencollective", "url": "https://opencollective.com/bootstrap" } ], "license": "MIT", "peerDependencies": { "@popperjs/core": "^2.11.8" } }, "node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", Loading