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/backend.py b/backend/backend.py new file mode 100644 index 0000000..e5454e8 --- /dev/null +++ b/backend/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') + diff --git a/backend/requirements.txt b/backend/requirements.txt new file mode 100644 index 0000000..e3562d5 --- /dev/null +++ b/backend/requirements.txt @@ -0,0 +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/index.jade b/frontend/index.jade new file mode 100644 index 0000000..46e500a --- /dev/null +++ b/frontend/index.jade @@ -0,0 +1,5 @@ +html + head + title= title + body + img(src= cat_url) diff --git a/frontend/package.json b/frontend/package.json new file mode 100644 index 0000000..680a600 --- /dev/null +++ b/frontend/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" + } +} 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; +}