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 + + + + +
+
+ Next.js logo +
    +
  1. + Get started by editing src/pages/index.js. +
  2. +
  3. Save and see your changes instantly.
  4. +
+ + +
+ +
+ + ); +} 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; + } + + } +}