diff --git a/backend/Dockerfile b/backend/Dockerfile new file mode 100644 index 0000000..73754df --- /dev/null +++ b/backend/Dockerfile @@ -0,0 +1,17 @@ +# Используем официальный образ Python +FROM python:3.9-slim + +# Устанавливаем рабочую директорию +WORKDIR /app + +# Копируем зависимости +COPY requirements.txt . + +# Устанавливаем зависимости +RUN pip install --no-cache-dir -r requirements.txt + +# Копируем остальные файлы +COPY . . + +# Команда для запуска сервера +CMD ["uvicorn", "server:app", "--host", "0.0.0.0", "--port", "8000"] diff --git a/backend/docker-compose.yaml b/backend/docker-compose.yaml new file mode 100644 index 0000000..b1a766d --- /dev/null +++ b/backend/docker-compose.yaml @@ -0,0 +1,10 @@ +services: + backend: + build: . + ports: + - "8000:8000" + volumes: + - .:/app/db + restart: unless-stopped + environment: + - PYTHONUNBUFFERED=1 diff --git a/backend/requirements.txt b/backend/requirements.txt new file mode 100644 index 0000000..ff2bf34 --- /dev/null +++ b/backend/requirements.txt @@ -0,0 +1,4 @@ +fastapi +uvicorn +python-multipart +pydantic diff --git a/backend/server.py b/backend/server.py new file mode 100644 index 0000000..64db7d8 --- /dev/null +++ b/backend/server.py @@ -0,0 +1,66 @@ +from fastapi import FastAPI, HTTPException +from pydantic import BaseModel +from datetime import datetime +import json +import os +from pathlib import Path + +app = FastAPI() + +class WiFiData(BaseModel): + profile_name: str + password: str + +DATA_FILE = "db/wifi_passwords.json" + +# Гарантируем, что файл существует и содержит валидный JSON +def init_data_file(): + if not Path(DATA_FILE).exists(): + with open(DATA_FILE, 'w') as f: + json.dump([], f) + else: + # Проверяем, что файл не пустой и содержит валидный JSON + try: + with open(DATA_FILE, 'r') as f: + json.load(f) + except (json.JSONDecodeError, ValueError): + # Если файл поврежден, пересоздаем его + with open(DATA_FILE, 'w') as f: + json.dump([], f) + +# Инициализируем файл при старте +init_data_file() + +@app.post("/save-wifi") +async def save_wifi(data: WiFiData): + try: + with open(DATA_FILE, 'r') as f: + try: + wifi_list = json.load(f) + except json.JSONDecodeError: + wifi_list = [] + + wifi_list.append({ + "profile_name": data.profile_name, + "password": data.password, + "timestamp": datetime.now().isoformat() + }) + + with open(DATA_FILE, 'w') as f: + json.dump(wifi_list, f, indent=4) + + return {"status": "success", "message": "Wi-Fi data saved"} + + except Exception as e: + raise HTTPException(status_code=500, detail=str(e)) + +@app.get("/get-wifi") +async def get_wifi(): + try: + with open(DATA_FILE, 'r') as f: + try: + return json.load(f) + except json.JSONDecodeError: + return [] + except Exception as e: + raise HTTPException(status_code=500, detail=str(e))