commit c7bfeb2158c5f973c2b2205e0180baf60919e7bd
Author: moxitech
Date: Sun Sep 15 17:39:33 2024 +0700
Basic Structure
diff --git a/.env b/.env
new file mode 100644
index 0000000..6597656
--- /dev/null
+++ b/.env
@@ -0,0 +1,44 @@
+# PORTS - порты программ
+
+API_PORT=8080
+KERNEL_PORT=7000
+FRONT_PORT=3000
+DB_PORT=5432
+RABBIT_PORT=5672
+
+# HOSTS - "хосты" программ - виртуальные имена вместо ip (прим. 172.168.0.2:8080(API) -> api:8080)
+
+API_HOST=api
+KERNEL_HOST=kernel
+FRONT_HOST=site
+DB_HOST=postgres
+RABBIT_HOST=rabbitmq
+
+
+# CREDINTALS - "секреты" программ - имена root пользователей, пароли, etc
+
+API_GOD_PASSWORD=enter
+API_GOD_USERNAME=enter
+FRONT_GOD_PASSWORD=enter
+FRONT_GOD_USERNAME=enter
+DB_PASSWORD=enter
+DB_USERNAME=enter
+DB_STANDART_DATABASE=sns
+RABBIT_USERNAME=enter
+RABBIT_PASSWORD=enter
+
+# SETUP_RUNNERS - установки при запуске отдельных программ
+
+RUNNER_MODE=DEV
+RUNNER_SECURITY=NOT
+RUNNER_OPTIMIZE=YES
+RUNNER_OPTIMIZE=YES
+RUN_AUTO_MIGRATE=TRUE
+
+# SECRETUM - секреты путей
+
+SECRETUM_WS=mysecret_change_me_please
+SECRETUM_JWT=mysecret_change_me_please
+SECRETUM_JWT_ALGORITHM=HS256
+
+
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..112f020
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,38 @@
+.venv
+
+# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
+
+# dependencies
+*/*/node_modules
+*/*/.pnp
+*/*/.pnp.js
+*/*/.yarn/install-state.gz
+
+# testing
+*/*/coverage
+
+# next.js
+*/*/.next/
+*/*/out/
+
+# production
+*/*/build
+
+# misc
+*/*/.DS_Store
+*/*/*.pem
+
+# debug
+*/*/npm-debug.log*
+*/*/yarn-debug.log*
+*/*/yarn-error.log*
+
+# local env files
+*/*/.env*.local
+
+# vercel
+*/*/.vercel
+
+# typescript
+*/*/*.tsbuildinfo
+*/*/next-env.d.ts
diff --git a/Api/Application/Dockerfile b/Api/Application/Dockerfile
new file mode 100644
index 0000000..cc4f39a
--- /dev/null
+++ b/Api/Application/Dockerfile
@@ -0,0 +1,17 @@
+# Название образа
+FROM python:3.12.6-slim-bookworm
+
+# Установка рабочей директории
+WORKDIR /app
+
+# Копирование файлов в контейнер
+COPY requirements.txt requirements.txt
+RUN pip install -r requirements.txt
+
+COPY . .
+
+# Установка переменных окружения
+ENV PYTHONUNBUFFERED 1
+EXPOSE 8080
+# Установка команды по умолчанию
+CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8080"]
diff --git a/Api/Application/app/models/db_models.py b/Api/Application/app/models/db_models.py
new file mode 100644
index 0000000..dd8a8b0
--- /dev/null
+++ b/Api/Application/app/models/db_models.py
@@ -0,0 +1,3 @@
+
+
+### Классы моделей приложения для представления в БД ###
diff --git a/Api/Application/app/models/dto_models.py b/Api/Application/app/models/dto_models.py
new file mode 100644
index 0000000..da160f0
--- /dev/null
+++ b/Api/Application/app/models/dto_models.py
@@ -0,0 +1,3 @@
+
+
+### Классы DTO (data-transfer-object) приложения для передачи на фронтенд ###
diff --git a/Api/Application/main.py b/Api/Application/main.py
new file mode 100644
index 0000000..8117f4a
--- /dev/null
+++ b/Api/Application/main.py
@@ -0,0 +1,17 @@
+### Точка входа API ###
+
+from typing import Union
+
+from fastapi import FastAPI
+
+app = FastAPI()
+
+# Пример!
+@app.get("/")
+def read_root():
+ return {"Hello": "World"}
+
+# Пример!
+@app.get("/items/{item_id}")
+def read_item(item_id: int, q: Union[str, None] = None):
+ return {"item_id": item_id, "q": q}
diff --git a/Api/Application/requirements.txt b/Api/Application/requirements.txt
new file mode 100644
index 0000000..5714623
--- /dev/null
+++ b/Api/Application/requirements.txt
@@ -0,0 +1,14 @@
+annotated-types==0.7.0
+anyio==4.4.0
+click==8.1.7
+fastapi==0.114.2
+greenlet==3.1.0
+h11==0.14.0
+idna==3.9
+pydantic==2.9.1
+pydantic_core==2.23.3
+sniffio==1.3.1
+SQLAlchemy==2.0.34
+starlette==0.38.5
+typing_extensions==4.12.2
+uvicorn==0.30.6
diff --git a/Api/Kernel/Dockerfile b/Api/Kernel/Dockerfile
new file mode 100644
index 0000000..e69de29
diff --git a/Docs/Images/wires.png b/Docs/Images/wires.png
new file mode 100644
index 0000000..31341d2
Binary files /dev/null and b/Docs/Images/wires.png differ
diff --git a/Docs/etc/.env b/Docs/etc/.env
new file mode 100644
index 0000000..7a7ca79
--- /dev/null
+++ b/Docs/etc/.env
@@ -0,0 +1,44 @@
+# PORTS - порты программ
+
+API_PORT=8081
+KERNEL_PORT=7000
+FRONT_PORT=3000
+DB_PORT=5432
+RABBIT_PORT=
+
+# HOSTS - "хосты" программ - виртуальные имена вместо ip (прим. 172.168.0.2:8080(API) -> api:8080)
+
+API_HOST=api
+KERNEL_HOST=kernel
+FRONT_HOST=site
+DB_HOST=postgres
+RABBIT_HOST=rabbitmq
+
+
+# CREDINTALS - "секреты" программ - имена root пользователей, пароли, etc
+
+API_GOD_PASSWORD=enter
+API_GOD_USERNAME=enter
+FRONT_GOD_PASSWORD=enter
+FRONT_GOD_USERNAME=enter
+DB_PASSWORD=enter
+DB_USERNAME=enter
+DB_STANDART_DATABASE=sns
+RABBIT_USERNAME=enter
+RABBIT_PASSWORD=enter
+
+# SETUP_RUNNERS - установки при запуске отдельных программ
+
+RUNNER_MODE=DEV
+RUNNER_SECURITY=NOT
+RUNNER_OPTIMIZE=YES
+RUNNER_OPTIMIZE=YES
+RUN_AUTO_MIGRATE=TRUE
+
+# SECRETUM - секреты путей
+
+SECRETUM_WS=mysecret_change_me_please
+SECRETUM_JWT=mysecret_change_me_please
+SECRETUM_JWT_ALGORITHM=HS256
+
+
diff --git a/Frontend/sns-frontend/.dockerignore b/Frontend/sns-frontend/.dockerignore
new file mode 100644
index 0000000..c2658d7
--- /dev/null
+++ b/Frontend/sns-frontend/.dockerignore
@@ -0,0 +1 @@
+node_modules/
diff --git a/Frontend/sns-frontend/.gitignore b/Frontend/sns-frontend/.gitignore
new file mode 100644
index 0000000..fd3dbb5
--- /dev/null
+++ b/Frontend/sns-frontend/.gitignore
@@ -0,0 +1,36 @@
+# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
+
+# dependencies
+/node_modules
+/.pnp
+.pnp.js
+.yarn/install-state.gz
+
+# testing
+/coverage
+
+# next.js
+/.next/
+/out/
+
+# production
+/build
+
+# misc
+.DS_Store
+*.pem
+
+# debug
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+
+# local env files
+.env*.local
+
+# vercel
+.vercel
+
+# typescript
+*.tsbuildinfo
+next-env.d.ts
diff --git a/Frontend/sns-frontend/Dockerfile b/Frontend/sns-frontend/Dockerfile
new file mode 100644
index 0000000..f70e34e
--- /dev/null
+++ b/Frontend/sns-frontend/Dockerfile
@@ -0,0 +1,17 @@
+# Используем официальный образ Node.js в качестве базового
+FROM node:18 AS build
+
+# Устанавливаем рабочую директорию внутри контейнера
+WORKDIR /app
+
+# Копируем package.json и package-lock.json (или yarn.lock) для установки зависимостей
+COPY package*.json ./
+
+# Устанавливаем зависимости
+RUN npm install
+
+# Копируем весь исходный код в контейнер
+COPY . .
+
+# Создаем продакшн сборку приложения
+CMD ["npm", "run", "dev"]
\ No newline at end of file
diff --git a/Frontend/sns-frontend/README.md b/Frontend/sns-frontend/README.md
new file mode 100644
index 0000000..5d98b1e
--- /dev/null
+++ b/Frontend/sns-frontend/README.md
@@ -0,0 +1,40 @@
+This is a [Next.js](https://nextjs.org/) project bootstrapped with [`create-next-app`](https://github.com/vercel/next.js/tree/canary/packages/create-next-app).
+
+## Getting Started
+
+First, run the development server:
+
+```bash
+npm run dev
+# or
+yarn dev
+# or
+pnpm dev
+# or
+bun dev
+```
+
+Open [http://localhost:3000](http://localhost:3000) with your browser to see the result.
+
+You can start editing the page by modifying `pages/index.js`. The page auto-updates as you edit the file.
+
+[API routes](https://nextjs.org/docs/api-routes/introduction) can be accessed on [http://localhost:3000/api/hello](http://localhost:3000/api/hello). This endpoint can be edited in `pages/api/hello.js`.
+
+The `pages/api` directory is mapped to `/api/*`. Files in this directory are treated as [API routes](https://nextjs.org/docs/api-routes/introduction) instead of React pages.
+
+This project uses [`next/font`](https://nextjs.org/docs/basic-features/font-optimization) to automatically optimize and load Inter, a custom Google Font.
+
+## Learn More
+
+To learn more about Next.js, take a look at the following resources:
+
+- [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js features and API.
+- [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial.
+
+You can check out [the Next.js GitHub repository](https://github.com/vercel/next.js/) - your feedback and contributions are welcome!
+
+## Deploy on Vercel
+
+The easiest way to deploy your Next.js app is to use the [Vercel Platform](https://vercel.com/new?utm_medium=default-template&filter=next.js&utm_source=create-next-app&utm_campaign=create-next-app-readme) from the creators of Next.js.
+
+Check out our [Next.js deployment documentation](https://nextjs.org/docs/deployment) for more details.
diff --git a/Frontend/sns-frontend/jsconfig.json b/Frontend/sns-frontend/jsconfig.json
new file mode 100644
index 0000000..b8d6842
--- /dev/null
+++ b/Frontend/sns-frontend/jsconfig.json
@@ -0,0 +1,7 @@
+{
+ "compilerOptions": {
+ "paths": {
+ "@/*": ["./src/*"]
+ }
+ }
+}
diff --git a/Frontend/sns-frontend/next.config.mjs b/Frontend/sns-frontend/next.config.mjs
new file mode 100644
index 0000000..d5456a1
--- /dev/null
+++ b/Frontend/sns-frontend/next.config.mjs
@@ -0,0 +1,6 @@
+/** @type {import('next').NextConfig} */
+const nextConfig = {
+ reactStrictMode: true,
+};
+
+export default nextConfig;
diff --git a/Frontend/sns-frontend/nginx.conf b/Frontend/sns-frontend/nginx.conf
new file mode 100644
index 0000000..d196d67
--- /dev/null
+++ b/Frontend/sns-frontend/nginx.conf
@@ -0,0 +1,11 @@
+server {
+ listen 3000;
+
+ location / {
+ root /usr/share/nginx/html;
+ index index.html index.htm;
+ try_files $uri $uri/ /index.html =404;
+ }
+
+ include /etc/nginx/extra-conf.d/*.conf;
+}
\ No newline at end of file
diff --git a/Frontend/sns-frontend/package-lock.json b/Frontend/sns-frontend/package-lock.json
new file mode 100644
index 0000000..604cb71
--- /dev/null
+++ b/Frontend/sns-frontend/package-lock.json
@@ -0,0 +1,399 @@
+{
+ "name": "sns-frontend",
+ "version": "0.1.0",
+ "lockfileVersion": 3,
+ "requires": true,
+ "packages": {
+ "": {
+ "name": "sns-frontend",
+ "version": "0.1.0",
+ "dependencies": {
+ "next": "14.2.11",
+ "react": "^18",
+ "react-dom": "^18"
+ }
+ },
+ "node_modules/@next/env": {
+ "version": "14.2.11",
+ "resolved": "https://registry.npmjs.org/@next/env/-/env-14.2.11.tgz",
+ "integrity": "sha512-HYsQRSIXwiNqvzzYThrBwq6RhXo3E0n8j8nQnAs8i4fCEo2Zf/3eS0IiRA8XnRg9Ha0YnpkyJZIZg1qEwemrHw=="
+ },
+ "node_modules/@next/swc-darwin-arm64": {
+ "version": "14.2.11",
+ "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.2.11.tgz",
+ "integrity": "sha512-eiY9u7wEJZWp/Pga07Qy3ZmNEfALmmSS1HtsJF3y1QEyaExu7boENz11fWqDmZ3uvcyAxCMhTrA1jfVxITQW8g==",
+ "cpu": [
+ "arm64"
+ ],
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@next/swc-darwin-x64": {
+ "version": "14.2.11",
+ "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-14.2.11.tgz",
+ "integrity": "sha512-lnB0zYCld4yE0IX3ANrVMmtAbziBb7MYekcmR6iE9bujmgERl6+FK+b0MBq0pl304lYe7zO4yxJus9H/Af8jbg==",
+ "cpu": [
+ "x64"
+ ],
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@next/swc-linux-arm64-gnu": {
+ "version": "14.2.11",
+ "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.2.11.tgz",
+ "integrity": "sha512-Ulo9TZVocYmUAtzvZ7FfldtwUoQY0+9z3BiXZCLSUwU2bp7GqHA7/bqrfsArDlUb2xeGwn3ZuBbKtNK8TR0A8w==",
+ "cpu": [
+ "arm64"
+ ],
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@next/swc-linux-arm64-musl": {
+ "version": "14.2.11",
+ "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.2.11.tgz",
+ "integrity": "sha512-fH377DnKGyUnkWlmUpFF1T90m0dADBfK11dF8sOQkiELF9M+YwDRCGe8ZyDzvQcUd20Rr5U7vpZRrAxKwd3Rzg==",
+ "cpu": [
+ "arm64"
+ ],
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@next/swc-linux-x64-gnu": {
+ "version": "14.2.11",
+ "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.2.11.tgz",
+ "integrity": "sha512-a0TH4ZZp4NS0LgXP/488kgvWelNpwfgGTUCDXVhPGH6pInb7yIYNgM4kmNWOxBFt+TIuOH6Pi9NnGG4XWFUyXQ==",
+ "cpu": [
+ "x64"
+ ],
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@next/swc-linux-x64-musl": {
+ "version": "14.2.11",
+ "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.2.11.tgz",
+ "integrity": "sha512-DYYZcO4Uir2gZxA4D2JcOAKVs8ZxbOFYPpXSVIgeoQbREbeEHxysVsg3nY4FrQy51e5opxt5mOHl/LzIyZBoKA==",
+ "cpu": [
+ "x64"
+ ],
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@next/swc-win32-arm64-msvc": {
+ "version": "14.2.11",
+ "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.2.11.tgz",
+ "integrity": "sha512-PwqHeKG3/kKfPpM6of1B9UJ+Er6ySUy59PeFu0Un0LBzJTRKKAg2V6J60Yqzp99m55mLa+YTbU6xj61ImTv9mg==",
+ "cpu": [
+ "arm64"
+ ],
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@next/swc-win32-ia32-msvc": {
+ "version": "14.2.11",
+ "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.2.11.tgz",
+ "integrity": "sha512-0U7PWMnOYIvM74GY6rbH6w7v+vNPDVH1gUhlwHpfInJnNe5LkmUZqhp7FNWeNa5wbVgRcRi1F1cyxp4dmeLLvA==",
+ "cpu": [
+ "ia32"
+ ],
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@next/swc-win32-x64-msvc": {
+ "version": "14.2.11",
+ "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.2.11.tgz",
+ "integrity": "sha512-gQpS7mcgovWoaTG1FbS5/ojF7CGfql1Q0ZLsMrhcsi2Sr9HEqsUZ70MPJyaYBXbk6iEAP7UXMD9HC8KY1qNwvA==",
+ "cpu": [
+ "x64"
+ ],
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@swc/counter": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz",
+ "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ=="
+ },
+ "node_modules/@swc/helpers": {
+ "version": "0.5.5",
+ "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.5.tgz",
+ "integrity": "sha512-KGYxvIOXcceOAbEk4bi/dVLEK9z8sZ0uBB3Il5b1rhfClSpcX0yfRO0KmTkqR2cnQDymwLB+25ZyMzICg/cm/A==",
+ "dependencies": {
+ "@swc/counter": "^0.1.3",
+ "tslib": "^2.4.0"
+ }
+ },
+ "node_modules/busboy": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz",
+ "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==",
+ "dependencies": {
+ "streamsearch": "^1.1.0"
+ },
+ "engines": {
+ "node": ">=10.16.0"
+ }
+ },
+ "node_modules/caniuse-lite": {
+ "version": "1.0.30001660",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001660.tgz",
+ "integrity": "sha512-GacvNTTuATm26qC74pt+ad1fW15mlQ/zuTzzY1ZoIzECTP8HURDfF43kNxPgf7H1jmelCBQTTbBNxdSXOA7Bqg==",
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/caniuse-lite"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ]
+ },
+ "node_modules/client-only": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz",
+ "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA=="
+ },
+ "node_modules/graceful-fs": {
+ "version": "4.2.11",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
+ "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="
+ },
+ "node_modules/js-tokens": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="
+ },
+ "node_modules/loose-envify": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
+ "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
+ "dependencies": {
+ "js-tokens": "^3.0.0 || ^4.0.0"
+ },
+ "bin": {
+ "loose-envify": "cli.js"
+ }
+ },
+ "node_modules/nanoid": {
+ "version": "3.3.7",
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz",
+ "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "bin": {
+ "nanoid": "bin/nanoid.cjs"
+ },
+ "engines": {
+ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
+ }
+ },
+ "node_modules/next": {
+ "version": "14.2.11",
+ "resolved": "https://registry.npmjs.org/next/-/next-14.2.11.tgz",
+ "integrity": "sha512-8MDFqHBhdmR2wdfaWc8+lW3A/hppFe1ggQ9vgIu/g2/2QEMYJrPoQP6b+VNk56gIug/bStysAmrpUKtj3XN8Bw==",
+ "dependencies": {
+ "@next/env": "14.2.11",
+ "@swc/helpers": "0.5.5",
+ "busboy": "1.6.0",
+ "caniuse-lite": "^1.0.30001579",
+ "graceful-fs": "^4.2.11",
+ "postcss": "8.4.31",
+ "styled-jsx": "5.1.1"
+ },
+ "bin": {
+ "next": "dist/bin/next"
+ },
+ "engines": {
+ "node": ">=18.17.0"
+ },
+ "optionalDependencies": {
+ "@next/swc-darwin-arm64": "14.2.11",
+ "@next/swc-darwin-x64": "14.2.11",
+ "@next/swc-linux-arm64-gnu": "14.2.11",
+ "@next/swc-linux-arm64-musl": "14.2.11",
+ "@next/swc-linux-x64-gnu": "14.2.11",
+ "@next/swc-linux-x64-musl": "14.2.11",
+ "@next/swc-win32-arm64-msvc": "14.2.11",
+ "@next/swc-win32-ia32-msvc": "14.2.11",
+ "@next/swc-win32-x64-msvc": "14.2.11"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": "^1.1.0",
+ "@playwright/test": "^1.41.2",
+ "react": "^18.2.0",
+ "react-dom": "^18.2.0",
+ "sass": "^1.3.0"
+ },
+ "peerDependenciesMeta": {
+ "@opentelemetry/api": {
+ "optional": true
+ },
+ "@playwright/test": {
+ "optional": true
+ },
+ "sass": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/picocolors": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.0.tgz",
+ "integrity": "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw=="
+ },
+ "node_modules/postcss": {
+ "version": "8.4.31",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz",
+ "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==",
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/postcss"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "dependencies": {
+ "nanoid": "^3.3.6",
+ "picocolors": "^1.0.0",
+ "source-map-js": "^1.0.2"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14"
+ }
+ },
+ "node_modules/react": {
+ "version": "18.3.1",
+ "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz",
+ "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==",
+ "dependencies": {
+ "loose-envify": "^1.1.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/react-dom": {
+ "version": "18.3.1",
+ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz",
+ "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==",
+ "dependencies": {
+ "loose-envify": "^1.1.0",
+ "scheduler": "^0.23.2"
+ },
+ "peerDependencies": {
+ "react": "^18.3.1"
+ }
+ },
+ "node_modules/scheduler": {
+ "version": "0.23.2",
+ "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz",
+ "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==",
+ "dependencies": {
+ "loose-envify": "^1.1.0"
+ }
+ },
+ "node_modules/source-map-js": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz",
+ "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/streamsearch": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz",
+ "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==",
+ "engines": {
+ "node": ">=10.0.0"
+ }
+ },
+ "node_modules/styled-jsx": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.1.tgz",
+ "integrity": "sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==",
+ "dependencies": {
+ "client-only": "0.0.1"
+ },
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "peerDependencies": {
+ "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0"
+ },
+ "peerDependenciesMeta": {
+ "@babel/core": {
+ "optional": true
+ },
+ "babel-plugin-macros": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/tslib": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz",
+ "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA=="
+ }
+ }
+}
diff --git a/Frontend/sns-frontend/package.json b/Frontend/sns-frontend/package.json
new file mode 100644
index 0000000..e33ae67
--- /dev/null
+++ b/Frontend/sns-frontend/package.json
@@ -0,0 +1,16 @@
+{
+ "name": "sns-frontend",
+ "version": "0.1.0",
+ "private": true,
+ "scripts": {
+ "dev": "next dev",
+ "build": "next build",
+ "start": "next start",
+ "lint": "next lint"
+ },
+ "dependencies": {
+ "react": "^18",
+ "react-dom": "^18",
+ "next": "14.2.11"
+ }
+}
diff --git a/Frontend/sns-frontend/public/favicon.ico b/Frontend/sns-frontend/public/favicon.ico
new file mode 100644
index 0000000..718d6fe
Binary files /dev/null and b/Frontend/sns-frontend/public/favicon.ico differ
diff --git a/Frontend/sns-frontend/src/pages/_app.js b/Frontend/sns-frontend/src/pages/_app.js
new file mode 100644
index 0000000..b97e52f
--- /dev/null
+++ b/Frontend/sns-frontend/src/pages/_app.js
@@ -0,0 +1,5 @@
+import "@/styles/globals.css";
+
+export default function App({ Component, pageProps }) {
+ return ;
+}
diff --git a/Frontend/sns-frontend/src/pages/_document.js b/Frontend/sns-frontend/src/pages/_document.js
new file mode 100644
index 0000000..b2fff8b
--- /dev/null
+++ b/Frontend/sns-frontend/src/pages/_document.js
@@ -0,0 +1,13 @@
+import { Html, Head, Main, NextScript } from "next/document";
+
+export default function Document() {
+ return (
+
+
+
+
+
+
+
+ );
+}
diff --git a/Frontend/sns-frontend/src/pages/api/hello.js b/Frontend/sns-frontend/src/pages/api/hello.js
new file mode 100644
index 0000000..aee21e9
--- /dev/null
+++ b/Frontend/sns-frontend/src/pages/api/hello.js
@@ -0,0 +1,5 @@
+// Next.js API route support: https://nextjs.org/docs/api-routes/introduction
+
+export default function handler(req, res) {
+ res.status(200).json({ name: "John Doe" });
+}
diff --git a/Frontend/sns-frontend/src/pages/fonts/GeistMonoVF.woff b/Frontend/sns-frontend/src/pages/fonts/GeistMonoVF.woff
new file mode 100644
index 0000000..f2ae185
Binary files /dev/null and b/Frontend/sns-frontend/src/pages/fonts/GeistMonoVF.woff differ
diff --git a/Frontend/sns-frontend/src/pages/fonts/GeistVF.woff b/Frontend/sns-frontend/src/pages/fonts/GeistVF.woff
new file mode 100644
index 0000000..1b62daa
Binary files /dev/null and b/Frontend/sns-frontend/src/pages/fonts/GeistVF.woff differ
diff --git a/Frontend/sns-frontend/src/pages/index.js b/Frontend/sns-frontend/src/pages/index.js
new file mode 100644
index 0000000..c766478
--- /dev/null
+++ b/Frontend/sns-frontend/src/pages/index.js
@@ -0,0 +1,118 @@
+import Head from "next/head";
+import Image from "next/image";
+import localFont from "next/font/local";
+import styles from "@/styles/Home.module.css";
+
+const geistSans = localFont({
+ src: "./fonts/GeistVF.woff",
+ variable: "--font-geist-sans",
+ weight: "100 900",
+});
+const geistMono = localFont({
+ src: "./fonts/GeistMonoVF.woff",
+ variable: "--font-geist-mono",
+ weight: "100 900",
+});
+
+export default function Home() {
+
+ return (
+ <>
+
+ Create Next App
+
+
+
+
+
+
+
+
+ -
+ Get started by editing
src/pages/index.js
.
+
+ - Save and see your changes instantly.
+
+
+
+
+
+
+ >
+ );
+}
diff --git a/Frontend/sns-frontend/src/styles/Home.module.css b/Frontend/sns-frontend/src/styles/Home.module.css
new file mode 100644
index 0000000..8a46041
--- /dev/null
+++ b/Frontend/sns-frontend/src/styles/Home.module.css
@@ -0,0 +1,165 @@
+.page {
+ --gray-rgb: 0, 0, 0;
+ --gray-alpha-200: rgba(var(--gray-rgb), 0.08);
+ --gray-alpha-100: rgba(var(--gray-rgb), 0.05);
+
+ --button-primary-hover: #383838;
+ --button-secondary-hover: #f2f2f2;
+
+ display: grid;
+ grid-template-rows: 20px 1fr 20px;
+ align-items: center;
+ justify-items: center;
+ min-height: 100svh;
+ padding: 80px;
+ gap: 64px;
+ font-family: var(--font-geist-sans);
+}
+
+@media (prefers-color-scheme: dark) {
+ .page {
+ --gray-rgb: 255, 255, 255;
+ --gray-alpha-200: rgba(var(--gray-rgb), 0.145);
+ --gray-alpha-100: rgba(var(--gray-rgb), 0.06);
+
+ --button-primary-hover: #ccc;
+ --button-secondary-hover: #1a1a1a;
+ }
+}
+
+.main {
+ display: flex;
+ flex-direction: column;
+ gap: 32px;
+ grid-row-start: 2;
+}
+
+.main ol {
+ font-family: var(--font-geist-mono);
+ padding-left: 0;
+ margin: 0;
+ font-size: 14px;
+ line-height: 24px;
+ letter-spacing: -0.01em;
+ list-style-position: inside;
+}
+
+.main li:not(:last-of-type) {
+ margin-bottom: 8px;
+}
+
+.main code {
+ font-family: inherit;
+ background: var(--gray-alpha-100);
+ padding: 2px 4px;
+ border-radius: 4px;
+ font-weight: 600;
+}
+
+.ctas {
+ display: flex;
+ gap: 16px;
+}
+
+.ctas a {
+ appearance: none;
+ border-radius: 128px;
+ height: 48px;
+ padding: 0 20px;
+ border: none;
+ border: 1px solid transparent;
+ transition: background 0.2s, color 0.2s, border-color 0.2s;
+ cursor: pointer;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ font-size: 16px;
+ line-height: 20px;
+ font-weight: 500;
+}
+
+a.primary {
+ background: var(--foreground);
+ color: var(--background);
+ gap: 8px;
+}
+
+a.secondary {
+ border-color: var(--gray-alpha-200);
+ min-width: 180px;
+}
+
+.footer {
+ grid-row-start: 3;
+ display: flex;
+ gap: 24px;
+}
+
+.footer a {
+ display: flex;
+ align-items: center;
+ gap: 8px;
+}
+
+.footer img {
+ flex-shrink: 0;
+}
+
+/* Enable hover only on non-touch devices */
+@media (hover: hover) and (pointer: fine) {
+ a.primary:hover {
+ background: var(--button-primary-hover);
+ border-color: transparent;
+ }
+
+ a.secondary:hover {
+ background: var(--button-secondary-hover);
+ border-color: transparent;
+ }
+
+ .footer a:hover {
+ text-decoration: underline;
+ text-underline-offset: 4px;
+ }
+}
+
+@media (max-width: 600px) {
+ .page {
+ padding: 32px;
+ padding-bottom: 80px;
+ }
+
+ .main {
+ align-items: center;
+ }
+
+ .main ol {
+ text-align: center;
+ }
+
+ .ctas {
+ flex-direction: column;
+ }
+
+ .ctas a {
+ font-size: 14px;
+ height: 40px;
+ padding: 0 16px;
+ }
+
+ a.secondary {
+ min-width: auto;
+ }
+
+ .footer {
+ flex-wrap: wrap;
+ align-items: center;
+ justify-content: center;
+ }
+}
+
+@media (prefers-color-scheme: dark) {
+ .logo {
+ filter: invert();
+ }
+}
diff --git a/Frontend/sns-frontend/src/styles/globals.css b/Frontend/sns-frontend/src/styles/globals.css
new file mode 100644
index 0000000..e3734be
--- /dev/null
+++ b/Frontend/sns-frontend/src/styles/globals.css
@@ -0,0 +1,42 @@
+:root {
+ --background: #ffffff;
+ --foreground: #171717;
+}
+
+@media (prefers-color-scheme: dark) {
+ :root {
+ --background: #0a0a0a;
+ --foreground: #ededed;
+ }
+}
+
+html,
+body {
+ max-width: 100vw;
+ overflow-x: hidden;
+}
+
+body {
+ color: var(--foreground);
+ background: var(--background);
+ font-family: Arial, Helvetica, sans-serif;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+}
+
+* {
+ box-sizing: border-box;
+ padding: 0;
+ margin: 0;
+}
+
+a {
+ color: inherit;
+ text-decoration: none;
+}
+
+@media (prefers-color-scheme: dark) {
+ html {
+ color-scheme: dark;
+ }
+}
diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000..f7b32b5
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,28 @@
+
+
+build:
+ docker compose build
+
+dev: build
+ docker compose up -d --force-recreate
+
+devf: dev
+ docker compose logs -f
+
+up:
+ docker compose up -d --force-recreate
+
+upf: up
+ docker compose logs -f
+
+logs:
+ docker compose logs -f
+
+
+stop:
+ docker compose stop
+start:
+ docker compose start
+
+exterminatus:
+ docker-compose down --volumes
diff --git a/Readme.md b/Readme.md
new file mode 100644
index 0000000..4588962
--- /dev/null
+++ b/Readme.md
@@ -0,0 +1,73 @@
+
+## WORLD-NETWORK-SIMULATOR
+
+##### В данном репозитории храниться проект WNS, в начальной имплементации - симуляция дронов
+
+#### Запуск проекта
+
+У вас должен быть установлен следующий инструментарий:
+
+ - Docker
+ - Docker-compose (на win достаточно docker)
+ - Make (утилита для работы с Makefile)
+ - И прочие конкретные компиляторы и тд, в зависимости от потребности
+
+Запуск
+```
+ make build - сборка кода
+ make up -d --force-recreate - поднять контейнеры с перекомпиляцией измененных переменных окружений
+
+ make devf - build + up + logs - соберет, поднимет и даст логи
+
+
+ #> прочее <#
+ make stop - остановит контейнеры
+ make exterminatus - снесет все контейнеры и их данные
+```
+
+#### Описание структуры папок
+
+```
+// >Tree -L 2
+.
+├── Api - серверная часть
+│ ├── Application - FastApi с конечными точками фронта
+│ ├── Dockerfile
+│ └── Kernel - "Ядро" всей программы
+├── docker-compose.yaml
+├── Frontend - интерфейс и клиентская часть
+│ └── Dockerfile
+├── Makefile - файл-сборщик
+├── Readme.md
+└── Services - микросервисы (сервер)
+ ├── Updater - Раздает обновления фротенд ПО
+ ├── Lister - Обновляет необходимые таблицы БД
+ └── Dockerfile
+```
+
+Как выглядит Диаграмма межсервисных связей:
+
+![wires](./Docs/Images/wires.png)
+
+
+### Отдельные примечания для работы с репозиториями
+
+#### Api/Application - главное api с которым работает фронтенд
+
+```
+# В корне проекта (а это уровень где лежит .env docker-compose и тд), открываем терминал
+
+# САМОЕ ПЕРВОЕ ДЕЙСТВИЕ: для разработки без docker пишем след. команды:
+python -m venv .venv # создаем локальное вирт. окружение
+pip install -r Api/Application/requirements.txt # устанавливаем зависимости
+source .venv/bin/activate # Активируем окружение (если на винде пишем: .venv/Scripts/activate)
+
+
+# Далее рассматриваем команды относительно папки Api/Applicaition, тобишь при команде ls/dir вы должны увидеть:
+app Dockerfile requirements.txt
+
+# Полезные команды
+pip freeze > requirements.txt -> "заморозит" зависимости, нужно когда устанавливаете новый пакет в pip
+
+```
+
diff --git a/Services/Listener/Dockerfile b/Services/Listener/Dockerfile
new file mode 100644
index 0000000..e69de29
diff --git a/Services/Updater/Dockerfile b/Services/Updater/Dockerfile
new file mode 100644
index 0000000..e69de29
diff --git a/docker-compose.yaml b/docker-compose.yaml
new file mode 100644
index 0000000..e0edd4c
--- /dev/null
+++ b/docker-compose.yaml
@@ -0,0 +1,67 @@
+
+services:
+ postgres:
+ image: postgres:13
+ container_name: sns-postgres-db
+ volumes:
+ - postgres_data:/var/lib/postgresql/data
+ environment:
+ POSTGRES_DB: ${DB_STANDART_DATABASE}
+ POSTGRES_USER: ${DB_USERNAME}
+ POSTGRES_PASSWORD: ${DB_PASSWORD}
+ ports:
+ - "${DB_PORT}:5432"
+ networks:
+ - sns_network
+ restart: always
+
+ nginx:
+ image: nginx:alpine
+ container_name: sns-nginx-service
+ ports:
+ - "80:80"
+ volumes:
+ - ./nginx.conf:/etc/nginx/nginx.conf
+ networks:
+ - sns_network
+ depends_on:
+ - site
+ restart: always
+
+ api:
+ container_name: sns-api
+ build:
+ context: ./Api/Application
+ dockerfile: Dockerfile
+ env_file: ".env"
+ ports:
+ - "${API_PORT}:8080"
+ depends_on:
+ - postgres
+ networks:
+ - sns_network
+ restart: always
+
+ site:
+ container_name: sns-site
+ build:
+ context: ./Frontend/sns-frontend
+ dockerfile: Dockerfile
+ env_file: ".env"
+ ports:
+ - "${FRONT_PORT}:3000"
+ depends_on:
+ - api
+ networks:
+ - sns_network
+ restart: always
+
+
+networks:
+ sns_network:
+ driver: bridge
+
+
+volumes:
+ postgres_data:
+ rabbit_data:
\ No newline at end of file
diff --git a/nginx.conf b/nginx.conf
new file mode 100644
index 0000000..e59fd2f
--- /dev/null
+++ b/nginx.conf
@@ -0,0 +1,29 @@
+user root;
+worker_processes 1;
+events {
+ worker_connections 1024;
+}
+
+http {
+ server {
+ listen 80;
+ server_name localhost;
+ add_header 'Access-Control-Allow-Origin' 'http://localhost' always;
+
+ location / {
+ proxy_pass http://site:3000/;
+ proxy_set_header Host $host;
+ proxy_set_header X-Real-IP $remote_addr;
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+ proxy_set_header X-Forwarded-Proto $scheme;
+ }
+ location /api {
+ proxy_pass http://api:8080/;
+ proxy_set_header Host $host;
+ proxy_set_header X-Real-IP $remote_addr;
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+ proxy_set_header X-Forwarded-Proto $scheme;
+ }
+
+ }
+}