From 07795a0db3ae2babb46211f6c49067e80b7b10ee Mon Sep 17 00:00:00 2001 From: Slava Fuodorov Date: Thu, 21 Aug 2025 17:50:25 +0700 Subject: [PATCH 1/6] Add python backend code --- backend.py | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 backend.py diff --git a/backend.py b/backend.py new file mode 100644 index 0000000..e5454e8 --- /dev/null +++ b/backend.py @@ -0,0 +1,19 @@ +import requests +from flask import Flask + + +app = Flask(__name__) + +@app.route("/cat_get") +def hello_world(): + resp = requests.get('https://api.thecatapi.com/v1/images/search') + cat_json = resp.json() + + if cat_json: + return cat_json[0].get('url', '') + else: + return '' + +if __name__ == '__main__': + app.run(debug=True, host='::', port='3001') + From 43c49ce080a0cda76a54a0875630251103db9d78 Mon Sep 17 00:00:00 2001 From: Slava Fuodorov Date: Thu, 21 Aug 2025 17:51:08 +0700 Subject: [PATCH 2/6] Add python requirements! --- requirements.txt | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 requirements.txt diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..30692b7 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,2 @@ +flask +requests From fa3e58c1f68cea9fff557c245d8347b76d5efd5f Mon Sep 17 00:00:00 2001 From: Slava Fuodorov Date: Thu, 21 Aug 2025 17:54:34 +0700 Subject: [PATCH 3/6] Add front code --- frontend.ts | 20 ++++++++++++++++++++ index.jade | 5 +++++ package.json | 16 ++++++++++++++++ 3 files changed, 41 insertions(+) create mode 100644 frontend.ts create mode 100644 index.jade create mode 100644 package.json diff --git a/frontend.ts b/frontend.ts new file mode 100644 index 0000000..36eac70 --- /dev/null +++ b/frontend.ts @@ -0,0 +1,20 @@ +import * as express from "express"; +import * as path from "path"; + +const app = express(); +app.set('views', path.join(__dirname, '/')); +app.set('view engine', 'jade'); + +const port: number = 3000; +const backendUrl = "http://backend:3001"; + +app.get('/', async (req, res) => { + const cat_data = await fetch(`${backendUrl}/cat_get`); + const data = await cat_data.text(); + + res.render('index.jade', { title: "KIT Frontend", cat_url: data }); +}); + +app.listen(port, () => { + console.log(`Frontend app listening on port ${port}`) +}) diff --git a/index.jade b/index.jade new file mode 100644 index 0000000..46e500a --- /dev/null +++ b/index.jade @@ -0,0 +1,5 @@ +html + head + title= title + body + img(src= cat_url) diff --git a/package.json b/package.json new file mode 100644 index 0000000..680a600 --- /dev/null +++ b/package.json @@ -0,0 +1,16 @@ +{ + "name": "hw", + "version": "1.0.0", + "author": "Slava Fedorov ", + "dependencies": { + "express": "latest", + "jade": "latest" + }, + "devDependencies": { + "@types/express": "^4.17.21", + "typescript": "^5.5.3" + }, + "scripts": { + "build": "tsc frontend.ts" + } +} From 5ae159178d65466a9d6df9e14a1852c6ba5880f0 Mon Sep 17 00:00:00 2001 From: Slava Fuodorov Date: Fri, 22 Aug 2025 12:13:34 +0700 Subject: [PATCH 4/6] Update frontend title --- frontend.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend.ts b/frontend.ts index 36eac70..374d50a 100644 --- a/frontend.ts +++ b/frontend.ts @@ -12,7 +12,7 @@ app.get('/', async (req, res) => { const cat_data = await fetch(`${backendUrl}/cat_get`); const data = await cat_data.text(); - res.render('index.jade', { title: "KIT Frontend", cat_url: data }); + res.render('index.jade', { title: "KITTY Frontend", cat_url: data }); }); app.listen(port, () => { From e146aa76303896f5610bfd6bd5440489644df2e3 Mon Sep 17 00:00:00 2001 From: Elena Date: Mon, 5 Jan 2026 15:42:33 +0000 Subject: [PATCH 5/6] finished with task --- backend/Dockerfile | 12 ++++++++++++ backend/requirements.txt | 1 + docker-compose.yml | 29 +++++++++++++++++++++++++++++ frontend/Dockerfile | 13 +++++++++++++ frontend/frontend.js | 22 ++++++++++++++++++++++ frontend/frontend.ts | 20 -------------------- nginx/conf.d/default.conf | 15 +++++++++++++++ nginx/nginx.conf | 13 +++++++++++++ 8 files changed, 105 insertions(+), 20 deletions(-) create mode 100644 backend/Dockerfile create mode 100644 docker-compose.yml create mode 100644 frontend/Dockerfile create mode 100644 frontend/frontend.js delete mode 100644 frontend/frontend.ts create mode 100644 nginx/conf.d/default.conf create mode 100644 nginx/nginx.conf diff --git a/backend/Dockerfile b/backend/Dockerfile new file mode 100644 index 0000000..84d9a1b --- /dev/null +++ b/backend/Dockerfile @@ -0,0 +1,12 @@ +FROM python:3.12-slim + +WORKDIR /app +COPY requirements.txt . +RUN pip install --no-cache-dir -r requirements.txt + +COPY . . + +RUN mkdir -p /sockets +ENV SOCKET_PATH=/sockets/backend.sock + +CMD ["sh", "-c", "rm -f $SOCKET_PATH && gunicorn -w 2 -b unix:$SOCKET_PATH backend:app"] diff --git a/backend/requirements.txt b/backend/requirements.txt index 30692b7..e3562d5 100644 --- a/backend/requirements.txt +++ b/backend/requirements.txt @@ -1,2 +1,3 @@ flask requests +gunicorn diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..2d35790 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,29 @@ +services: + nginx: + image: nginx:1.27-alpine + ports: + - "80:80" + volumes: + - sockets:/sockets + - ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro + - ./nginx/conf.d:/etc/nginx/conf.d:ro + depends_on: + - frontend + - backend + + frontend: + build: ./frontend + volumes: + - sockets:/sockets + environment: + - SOCKET_PATH=/sockets/frontend.sock + + backend: + build: ./backend + volumes: + - sockets:/sockets + environment: + - SOCKET_PATH=/sockets/backend.sock + +volumes: + sockets: diff --git a/frontend/Dockerfile b/frontend/Dockerfile new file mode 100644 index 0000000..21aa40a --- /dev/null +++ b/frontend/Dockerfile @@ -0,0 +1,13 @@ +FROM node:20-alpine + +WORKDIR /app + +COPY package*.json ./ +RUN npm install + +COPY . . + +RUN mkdir -p /sockets +ENV SOCKET_PATH=/sockets/frontend.sock + +CMD ["sh", "-c", "rm -f $SOCKET_PATH && node frontend.js"] diff --git a/frontend/frontend.js b/frontend/frontend.js new file mode 100644 index 0000000..a98c521 --- /dev/null +++ b/frontend/frontend.js @@ -0,0 +1,22 @@ +const express = require("express"); +const path = require("path"); +const fs = require("fs") + +const app = express(); +app.set('views', path.join(__dirname, '/')); +app.set('view engine', 'jade'); + +const socketPath = "/sockets/frontend.sock"; +const backendUrl = "http://nginx/api"; + +app.get('/', async (req, res) => { + const cat_data = await fetch(`${backendUrl}/cat_get`); + const data = await cat_data.text(); + + res.render('index.jade', { title: "KITTY Frontend", cat_url: data }); +}); + +app.listen(socketPath, () => { + try{ fs.chmodSync(socketPath, parseInt("777",8))} catch (e) { console.log(e);} + console.log(`Frontend app listening on port ${socketPath}`) +}) diff --git a/frontend/frontend.ts b/frontend/frontend.ts deleted file mode 100644 index 374d50a..0000000 --- a/frontend/frontend.ts +++ /dev/null @@ -1,20 +0,0 @@ -import * as express from "express"; -import * as path from "path"; - -const app = express(); -app.set('views', path.join(__dirname, '/')); -app.set('view engine', 'jade'); - -const port: number = 3000; -const backendUrl = "http://backend:3001"; - -app.get('/', async (req, res) => { - const cat_data = await fetch(`${backendUrl}/cat_get`); - const data = await cat_data.text(); - - res.render('index.jade', { title: "KITTY Frontend", cat_url: data }); -}); - -app.listen(port, () => { - console.log(`Frontend app listening on port ${port}`) -}) diff --git a/nginx/conf.d/default.conf b/nginx/conf.d/default.conf new file mode 100644 index 0000000..a4c5218 --- /dev/null +++ b/nginx/conf.d/default.conf @@ -0,0 +1,15 @@ +server { + listen 80; + + location / { + proxy_pass http://unix:/sockets/frontend.sock; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + } + + location /api/ { + proxy_pass http://unix:/sockets/backend.sock:/; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + } +} diff --git a/nginx/nginx.conf b/nginx/nginx.conf new file mode 100644 index 0000000..94f7228 --- /dev/null +++ b/nginx/nginx.conf @@ -0,0 +1,13 @@ +worker_processes auto; + +events { worker_connections 1024; } + +http { + include /etc/nginx/mime.types; + default_type application/octet-stream; + + sendfile on; + keepalive_timeout 65; + + include /etc/nginx/conf.d/*.conf; +} From 5e0034aed3af0fb9583cbedfc65ca5ca0ba9d027 Mon Sep 17 00:00:00 2001 From: Elena Date: Sun, 18 Jan 2026 16:32:26 +0000 Subject: [PATCH 6/6] fixed nginx sockets --- backend/Dockerfile | 10 +++++++++- backend/nginx/backend.conf | 9 +++++++++ docker-compose.yml | 20 ++----------------- frontend/Dockerfile | 10 +++++++--- frontend/frontend.js | 2 +- .../nginx/frontend.conf | 6 +++--- nginx/nginx.conf | 13 ------------ 7 files changed, 31 insertions(+), 39 deletions(-) create mode 100644 backend/nginx/backend.conf rename nginx/conf.d/default.conf => frontend/nginx/frontend.conf (68%) delete mode 100644 nginx/nginx.conf diff --git a/backend/Dockerfile b/backend/Dockerfile index 84d9a1b..3f51515 100644 --- a/backend/Dockerfile +++ b/backend/Dockerfile @@ -1,12 +1,20 @@ FROM python:3.12-slim +RUN apt-get update && apt-get install -y --no-install-recommends \ + nginx \ + && rm -rf /var/lib/apt/lists/* + WORKDIR /app + COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt COPY . . +COPY nginx/backend.conf /etc/nginx/conf.d/default.conf + RUN mkdir -p /sockets + ENV SOCKET_PATH=/sockets/backend.sock -CMD ["sh", "-c", "rm -f $SOCKET_PATH && gunicorn -w 2 -b unix:$SOCKET_PATH backend:app"] +CMD ["sh", "-c", "rm -f $SOCKET_PATH && gunicorn -w 2 -b unix:$SOCKET_PATH backend:app & nginx -g 'daemon off;'"] diff --git a/backend/nginx/backend.conf b/backend/nginx/backend.conf new file mode 100644 index 0000000..9ccf522 --- /dev/null +++ b/backend/nginx/backend.conf @@ -0,0 +1,9 @@ +server{ + listen 8080; + + location / { + proxy_pass http://unix:/sockets/backend.sock:; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + } +} diff --git a/docker-compose.yml b/docker-compose.yml index 2d35790..92413d5 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,29 +1,13 @@ services: - nginx: - image: nginx:1.27-alpine + frontend: + build: ./frontend ports: - "80:80" - volumes: - - sockets:/sockets - - ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro - - ./nginx/conf.d:/etc/nginx/conf.d:ro depends_on: - - frontend - backend - frontend: - build: ./frontend - volumes: - - sockets:/sockets - environment: - - SOCKET_PATH=/sockets/frontend.sock - backend: build: ./backend - volumes: - - sockets:/sockets - environment: - - SOCKET_PATH=/sockets/backend.sock volumes: sockets: diff --git a/frontend/Dockerfile b/frontend/Dockerfile index 21aa40a..785f908 100644 --- a/frontend/Dockerfile +++ b/frontend/Dockerfile @@ -1,13 +1,17 @@ FROM node:20-alpine +RUN apk add --no-cache nginx + WORKDIR /app COPY package*.json ./ RUN npm install -COPY . . +COPY . . + +COPY nginx/frontend.conf /etc/nginx/http.d/default.conf -RUN mkdir -p /sockets +RUN mkdir -p /sockets /run/nginx ENV SOCKET_PATH=/sockets/frontend.sock -CMD ["sh", "-c", "rm -f $SOCKET_PATH && node frontend.js"] +CMD ["sh", "-c", "rm -f $SOCKET_PATH && node frontend.js & nginx -g 'daemon off;'"] diff --git a/frontend/frontend.js b/frontend/frontend.js index a98c521..337835e 100644 --- a/frontend/frontend.js +++ b/frontend/frontend.js @@ -7,7 +7,7 @@ app.set('views', path.join(__dirname, '/')); app.set('view engine', 'jade'); const socketPath = "/sockets/frontend.sock"; -const backendUrl = "http://nginx/api"; +const backendUrl = "http://backend:8080"; app.get('/', async (req, res) => { const cat_data = await fetch(`${backendUrl}/cat_get`); diff --git a/nginx/conf.d/default.conf b/frontend/nginx/frontend.conf similarity index 68% rename from nginx/conf.d/default.conf rename to frontend/nginx/frontend.conf index a4c5218..5e5279f 100644 --- a/nginx/conf.d/default.conf +++ b/frontend/nginx/frontend.conf @@ -2,13 +2,13 @@ server { listen 80; location / { - proxy_pass http://unix:/sockets/frontend.sock; + proxy_pass http://unix:/sockets/frontend.sock:; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } - + location /api/ { - proxy_pass http://unix:/sockets/backend.sock:/; + proxy_pass http://backend:8080/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } diff --git a/nginx/nginx.conf b/nginx/nginx.conf deleted file mode 100644 index 94f7228..0000000 --- a/nginx/nginx.conf +++ /dev/null @@ -1,13 +0,0 @@ -worker_processes auto; - -events { worker_connections 1024; } - -http { - include /etc/nginx/mime.types; - default_type application/octet-stream; - - sendfile on; - keepalive_timeout 65; - - include /etc/nginx/conf.d/*.conf; -}