From 8167c77a2728607cdef26e38ba18323c7a8c94d4 Mon Sep 17 00:00:00 2001 From: lorsan Date: Sat, 10 Jan 2026 17:51:08 +0300 Subject: [PATCH] Add docker --- .env.example | 61 ++++ .env.old | 53 +++ .gitignore | 3 +- assets/mini-logo.png | Bin 0 -> 36869 bytes backend/.dockerignore | 23 ++ backend/Dockerfile | 18 + backend/app/auth/router.py | 4 +- backend/app/chats/models.py | 13 + backend/app/core/config.py | 12 +- backend/app/main.py | 18 +- backend/app/pre_restart.py | 31 ++ backend/app/users/router.py | 4 +- backend/app/users/service.py | 17 +- backend/app/{core => utils}/S3_client.py | 0 backend/scripts/prestart.sh | 8 + docker-compose.yml | 121 +++++++ frontend/.dockerignore | 15 + frontend/Dockerfile | 28 ++ frontend/index.html | 2 +- frontend/public/favicon.png | Bin 0 -> 36869 bytes frontend/src/App.tsx | 18 + frontend/src/assets/mini-logo.png | Bin 0 -> 36869 bytes frontend/src/components/auth/LoginForm.tsx | 11 +- frontend/src/components/auth/RegisterForm.tsx | 18 +- .../components/common/VerificationBanner.tsx | 105 ++++++ frontend/src/index.css | 44 ++- frontend/src/pages/AuthPage.tsx | 5 +- frontend/src/pages/ChatPage.tsx | 151 +++++++-- frontend/src/pages/ForgotPasswordPage.tsx | 152 +++++++++ frontend/src/pages/ProfilePage.tsx | 319 +++++++++++++++--- frontend/src/pages/ResetPasswordPage.tsx | 5 +- frontend/src/pages/SettingsPage.tsx | 125 +++++++ frontend/src/pages/VerifyEmailPage.tsx | 4 + frontend/src/services/api.ts | 28 +- frontend/src/services/authService.ts | 21 ++ frontend/src/store/themeStore.ts | 31 ++ 36 files changed, 1351 insertions(+), 117 deletions(-) create mode 100644 .env.example create mode 100755 .env.old create mode 100644 assets/mini-logo.png create mode 100644 backend/.dockerignore create mode 100644 backend/Dockerfile create mode 100644 backend/app/chats/models.py create mode 100644 backend/app/pre_restart.py rename backend/app/{core => utils}/S3_client.py (100%) create mode 100755 backend/scripts/prestart.sh create mode 100644 docker-compose.yml create mode 100644 frontend/.dockerignore create mode 100644 frontend/Dockerfile create mode 100644 frontend/public/favicon.png create mode 100644 frontend/src/assets/mini-logo.png create mode 100644 frontend/src/components/common/VerificationBanner.tsx create mode 100644 frontend/src/pages/ForgotPasswordPage.tsx create mode 100644 frontend/src/pages/SettingsPage.tsx create mode 100644 frontend/src/store/themeStore.ts diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..9cfff5e --- /dev/null +++ b/.env.example @@ -0,0 +1,61 @@ +# === GENERAL === +COMPANY_NAME="Aether Messenger" +MODE=PROD +LOG_LEVEL=INFO + +# === BACKEND === +BACKEND_HOST=0.0.0.0 +BACKEND_PORT=8080 +WORKERS=4 +URL=https://yourdomain.com + +# === FIRST SUPERUSER === +FIRST_SUPER_USER_EMAIL=admin@example.com +FIRST_SUPER_USER_PASS=changeme123 +FIRST_SUPER_USER_USERNAME=admin + +# === CORS === +# Добавьте свой домен +CORS_ORIGINS=["https://yourdomain.com", "http://localhost:3000"] + +# === AUTH === +SECRET_KEY=your-super-secret-key-change-me +ALGORITHM=HS256 +ACCESS_TOKEN_EXPIRE_MINUTES=15 +EMAIL_TOKEN_EXPIRE_MINUTES=60 +REFRESH_TOKEN_EXPIRE_DAYS=30 + +# === SMTP (Email) === +SMTP_SERVER=smtp.gmail.com +SMTP_PORT=587 +SMTP_EMAIL=your-email@gmail.com +SMTP_PASS=your-app-password + +# === S3 Storage === +S3_URL=https://s3.amazonaws.com +S3_ACCESS_KEY_ID=your-access-key +S3_SECRET_ACCESS_KEY=your-secret-key +S3_BUCKET_NAME=aether-bucket + +# === DATABASE (PostgreSQL) === +DB_HOST=database +DB_PORT=5432 +DB_USER=aether_user +DB_PASS=strong_password_here +DB_NAME=aether_db + +# === REDIS === +REDIS_HOST=redis +REDIS_PORT=6379 +REDIS_PASS= +REDIS_DB=0 + +# === RABBITMQ === +RMQ_HOST=rabbitmq +RMQ_USER=aether_rmq +RMQ_PASS=rabbitmq_password +RMQ_PORT=5672 + +# === FRONTEND === +VITE_API_URL=/api/v1 +FRONTEND_PORT=3056 diff --git a/.env.old b/.env.old new file mode 100755 index 0000000..bbf8d35 --- /dev/null +++ b/.env.old @@ -0,0 +1,53 @@ +COMPANY_NAME=AETHER + +MODE=DEV +LOG_LEVEL=DEBUG + +BACKEND_HOST=localhost +BACKEND_PORT=8080 +WORKERS=4 +FRONTEND_URL=http://localhost:5173 + +VITE_API_URL=/api/v1 +FRONTEND_PORT=3056 + +FIRST_SUPER_USER_EMAIL=admin@example.com +FIRST_SUPER_USER_PASS=admin +FIRST_SUPER_USER_USERNAME=admin + +DB_HOST=localhost +DB_PORT=5432 +DB_PASS=postgres +DB_USER=postgres +DB_NAME=Aether + +REDIS_HOST=localhost +REDIS_PORT=6379 +# REDIS_PASS= +# REDIS_DB= + +#CORS_HEADERS=["Content-Type", "Set-Cookie", "Access-Control-Allow-Headers", "Access-Control-Allow-Origin", "Authorization"] +#CORS_ORIGINS=["http://localhost:3000"] +#CORS_METHODS=["GET", "POST", "OPTIONS", "DELETE", "PATCH", "PUT"] + +CORS_HEADERS=["Content-Type", "Set-Cookie", "Access-Control-Allow-Headers", "Access-Control-Allow-Origin", "Authorization"] +CORS_ORIGINS=["http://localhost:5500", "http://localhost:5173", "http://localhost:8080", "http://127.0.0.1:8080", "null"] +CORS_METHODS=["GET", "POST", "OPTIONS", "DELETE", "PATCH", "PUT"] + +SECRET_KEY=sercretKey +ALGORITHM=HS256 + +SMTP_SERVER=localhost +SMTP_PORT=1025 +SMTP_EMAIL=noreply@cityvibe.ru +SMTP_PASS=test + +RMQ_HOST=localhost +RMQ_USER=guest +RMQ_PASS=guest +RMQ_PORT=5672 + +S3_URL=http://192.168.31.190:9002 +S3_ACCESS_KEY_ID=lorsan +S3_SECRET_ACCESS_KEY=Lorser2009! +S3_BUCKET_NAME=aether \ No newline at end of file diff --git a/.gitignore b/.gitignore index 243e7f0..a6b3109 100755 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ __pycache__ .env -test.py \ No newline at end of file +test.py +.env.old \ No newline at end of file diff --git a/assets/mini-logo.png b/assets/mini-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..33fbaed555dab07519fed5790a2af73ba9fb0ff1 GIT binary patch literal 36869 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 literal 0 HcmV?d00001 diff --git a/backend/.dockerignore b/backend/.dockerignore new file mode 100644 index 0000000..a096942 --- /dev/null +++ b/backend/.dockerignore @@ -0,0 +1,23 @@ +__pycache__ +*.pyc +*.pyo +*.pyd +.Python +*.so +*.egg +*.egg-info +dist +build +*.log +.git +.gitignore +.env +.venv +venv/ +ENV/ +env/ +.pytest_cache +.coverage +htmlcov/ +.mypy_cache +.ruff_cache \ No newline at end of file diff --git a/backend/Dockerfile b/backend/Dockerfile new file mode 100644 index 0000000..0990c64 --- /dev/null +++ b/backend/Dockerfile @@ -0,0 +1,18 @@ +FROM python:3.13.7-bookworm + +WORKDIR /app + +RUN pip install --no-cache-dir poetry + +COPY pyproject.toml poetry.lock ./ + +RUN poetry config virtualenvs.create false && \ + poetry install --no-interaction --no-ansi --no-root + +COPY app/ ./app +COPY alembic.ini . +COPY scripts ./scripts + +RUN chmod +x /app/scripts/prestart.sh + +CMD ["python", "-m", "app.main"] \ No newline at end of file diff --git a/backend/app/auth/router.py b/backend/app/auth/router.py index 92d5eeb..857bbdf 100644 --- a/backend/app/auth/router.py +++ b/backend/app/auth/router.py @@ -98,9 +98,9 @@ async def change_password( @router.post("/password/reset") async def send_reset_password_email( - username: str + username_email: str ) -> Dict: - await UserService.send_reset_password_email(username) + await UserService.send_reset_password_email(username_email) return {"status": True, "message": "Successfully send email reset password"} @router.post("/password/reset/{token}") diff --git a/backend/app/chats/models.py b/backend/app/chats/models.py new file mode 100644 index 0000000..9cc3c19 --- /dev/null +++ b/backend/app/chats/models.py @@ -0,0 +1,13 @@ +from sqlalchemy.orm import Mapped, mapped_column +from sqlalchemy import ForeignKey + +from app.core.database import Base + + +class MessageModel(Base): + __tablename__ = "message" + + id: Mapped[int] = mapped_column(primary_key=True, index=True) + sender_id: Mapped[int] = mapped_column(ForeignKey("user.id", ondelete="CASCADE"), index=True) + recipient_id: Mapped[int] = mapped_column(ForeignKey("user.id", ondelete="CASCADE"), index=True) + content: Mapped[str] = mapped_column() \ No newline at end of file diff --git a/backend/app/core/config.py b/backend/app/core/config.py index 2868983..f64325b 100755 --- a/backend/app/core/config.py +++ b/backend/app/core/config.py @@ -9,10 +9,14 @@ class Settings(BaseSettings): MODE: Literal["DEV", "TEST", "PROD"] LOG_LEVEL: Literal["ERROR", "WARNING", "INFO", "DEBUG"] - HOST: str - PORT: int + BACKEND_HOST: str + BACKEND_PORT: int WORKERS: int - URL: str + FRONTEND_URL: str + + FIRST_SUPER_USER_EMAIL: str + FIRST_SUPER_USER_PASS: str + FIRST_SUPER_USER_USERNAME: str CORS_ORIGINS: List[str] = ["http://localhost:5500", "http://127.0.0.1:5500", "http://localhost:8080", "http://127.0.0.1:8080", "null"] CORS_HEADERS: List[str] = ["*"] @@ -62,7 +66,7 @@ class Settings(BaseSettings): def RABBITMQ_URL(self) -> str: return f"amqp://{self.RMQ_USER}:{self.RMQ_PASS}@{self.RMQ_HOST}:{self.RMQ_PORT}//" - model_config = SettingsConfigDict(env_file=".env", extra="allow") + model_config = SettingsConfigDict(env_file="../.env", extra="allow") settings: Settings = Settings() \ No newline at end of file diff --git a/backend/app/main.py b/backend/app/main.py index 5d2db18..f3236d9 100755 --- a/backend/app/main.py +++ b/backend/app/main.py @@ -29,6 +29,11 @@ async def lifespan(app: FastAPI): api_router = APIRouter(prefix="/api/v1") api_router.include_router(user_router) api_router.include_router(auth_router) + +@api_router.get("/health") +async def test_health(): + return {"status": True} + app = FastAPI( title=settings.COMPANY_NAME, description="## Backend messenger aether", @@ -82,24 +87,19 @@ async def log_requests(request: Request, call_next): raise -@app.get("/health") -async def test_health(): - return {"status": True} - - if __name__ == "__main__": if settings.MODE == "PROD": UVICORN_PARAMS = dict( - host=settings.HOST, - port=settings.PORT, + host=settings.BACKEND_HOST, + port=settings.BACKEND_PORT, reload=False, workers=settings.WORKERS, access_log=False ) else: UVICORN_PARAMS = dict( - host=settings.HOST, - port=settings.PORT, + host=settings.BACKEND_HOST, + port=settings.BACKEND_PORT, reload=True, access_log=False ) diff --git a/backend/app/pre_restart.py b/backend/app/pre_restart.py new file mode 100644 index 0000000..11b4e4f --- /dev/null +++ b/backend/app/pre_restart.py @@ -0,0 +1,31 @@ +import asyncio + +from app.core.database import async_session_maker +from app.core.config import settings +from app.users.schemas import UserCreateDB +from app.users.dao import UserDAO +from app.utils.hash_password import hash_password + + +async def init() -> None: + async with async_session_maker() as session: + super_user = await UserDAO.find_one_or_none(session, email=settings.FIRST_SUPER_USER_EMAIL) + + if super_user is not None: + return + + await UserDAO.add( + session, + obj_in=UserCreateDB( + email=settings.FIRST_SUPER_USER_EMAIL, + username=settings.FIRST_SUPER_USER_USERNAME, + display_name="Admin", + hashed_password=hash_password(settings.FIRST_SUPER_USER_PASS), + is_active=True, + is_verified=True, + is_superuser=True + ) + ) + await session.commit() + +asyncio.run(init()) \ No newline at end of file diff --git a/backend/app/users/router.py b/backend/app/users/router.py index 66d6c23..02a747d 100755 --- a/backend/app/users/router.py +++ b/backend/app/users/router.py @@ -7,7 +7,7 @@ from app.users.schemas import User, UserUpdate from app.users.service import UserService from app.auth.service import AuthService from app.users.models import UserModel -from app.auth.dependencies import get_current_verified_user, get_current_superuser +from app.auth.dependencies import get_current_verified_user, get_current_superuser, get_current_user router = APIRouter(prefix="/users", tags=["User"]) @@ -15,7 +15,7 @@ log = logging.getLogger(__name__) @router.get("/me") -async def get_current_user(user: UserModel = Depends(get_current_verified_user)) -> User: +async def get_current_user(user: UserModel = Depends(get_current_user)) -> User: log.debug("Getting current user profile", extra={"user_id": str(user.id)}) return user diff --git a/backend/app/users/service.py b/backend/app/users/service.py index 4e27e77..13848f6 100644 --- a/backend/app/users/service.py +++ b/backend/app/users/service.py @@ -5,11 +5,10 @@ from typing import List from fastapi import HTTPException, status, UploadFile from sqlalchemy import or_ -from sqlalchemy.orm.sync import update from app.utils.hash_password import hash_password, verify_password from app.services.redis_service import EmailTokenStorage, ChangePasswordTokenStorage -from app.core.S3_client import s3_client +from app.utils.S3_client import s3_client from app.core.exceptions import InvalidTokenException, TokenExpiredException, UserNotFoundException from app.users.models import UserModel from app.users.dao import UserDAO @@ -66,7 +65,7 @@ class UserService: @classmethod async def send_verify_email(cls, user: UserModel): token = cls._create_uuid_token() - url = f"{settings.URL}/verify-email/{token}" + url = f"{settings.FRONTEND_URL}/verify-email/{token}" email_token_expires = timedelta(minutes=settings.EMAIL_TOKEN_EXPIRE_MINUTES) await EmailTokenStorage.save_token( @@ -180,15 +179,21 @@ class UserService: @classmethod - async def send_reset_password_email(cls, username: str): + async def send_reset_password_email(cls, username_email: str): async with async_session_maker() as session: - user = await UserDAO.find_one_or_none(session, username=username) + user = await UserDAO.find_one_or_none( + session, + or_( + UserModel.email==username_email, + UserModel.username==username_email + ) + ) if user is None: raise UserNotFoundException token = cls._create_uuid_token() - url = f"{settings.URL}/reset-password/{token}" + url = f"{settings.FRONTEND_URL}/reset-password/{token}" token_expires = timedelta(minutes=settings.EMAIL_TOKEN_EXPIRE_MINUTES) await ChangePasswordTokenStorage.save_token( diff --git a/backend/app/core/S3_client.py b/backend/app/utils/S3_client.py similarity index 100% rename from backend/app/core/S3_client.py rename to backend/app/utils/S3_client.py diff --git a/backend/scripts/prestart.sh b/backend/scripts/prestart.sh new file mode 100755 index 0000000..3a949c7 --- /dev/null +++ b/backend/scripts/prestart.sh @@ -0,0 +1,8 @@ +#!/usr/bin/env bash + +set -e +set -x + +alembic upgrade head + +python -m app.pre_restart \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..c16539c --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,121 @@ +services: + database: + image: postgres:latest + environment: + - POSTGRES_PASSWORD=${DB_PASS} + - POSTGRES_USER=${DB_USER} + - POSTGRES_DB=${DB_NAME} + ports: + - "5432:5432" + healthcheck: + test: [ "CMD-SHELL", "pg_isready -U $${POSTGRES_USER} -d $${POSTGRES_DB}" ] + interval: 5s + timeout: 10s + retries: 5 + networks: + - aether + volumes: + - db-data:/var/lib/postgresql + restart: unless-stopped + + rabbitmq: + image: rabbitmq:3.8-management + environment: + RABBITMQ_DEFAULT_USER: "${RMQ_USER}" + RABBITMQ_DEFAULT_PASS: "${RMQ_PASS}" + ports: + - "5672:5672" + - "15672:15672" + networks: + - aether + volumes: + - rabbitmq-data:/var/lib/rabbitmq + restart: unless-stopped + + redis: + image: redis:latest + ports: + - "6379:6379" + healthcheck: + test: [ "CMD", "redis-cli", "ping" ] + interval: 5s + retries: 5 + networks: + - aether + volumes: + - redis-data:/data + restart: unless-stopped + + prestart: + build: + context: ./backend + command: bash scripts/prestart.sh + depends_on: + database: + condition: service_healthy + networks: + - aether + env_file: + - .env + + celery: + build: + context: ./backend + command: celery -A app.core.celery_app.celery_app worker -l INFO + depends_on: + database: + condition: service_healthy + prestart: + condition: service_completed_successfully + networks: + - aether + env_file: + - .env + restart: unless-stopped + + backend: + build: + context: ./backend + depends_on: + database: + condition: service_healthy + prestart: + condition: service_completed_successfully + celery: + condition: service_started + redis: + condition: service_healthy + ports: + - "3541:${BACKEND_PORT}" + healthcheck: + test: ["CMD-SHELL", "curl", "http://${BACKEND_HOST}:${BACKEND_PORT}/api/v1/health"] + interval: 5s + timeout: 5s + retries: 5 + networks: + - aether + env_file: + - .env + restart: unless-stopped + + frontend: + build: + context: ./frontend + args: + VITE_API_URL: ${VITE_API_URL} + depends_on: + backend: + condition: service_healthy + ports: + - "${FRONTEND_PORT}:3000" + networks: + - aether + restart: unless-stopped + +volumes: + db-data: + rabbitmq-data: + redis-data: + +networks: + aether: \ No newline at end of file diff --git a/frontend/.dockerignore b/frontend/.dockerignore new file mode 100644 index 0000000..d37fee0 --- /dev/null +++ b/frontend/.dockerignore @@ -0,0 +1,15 @@ +node_modules +dist +build +.git +.gitignore +.env.local +.env.development +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +.DS_Store +coverage +.vscode +.idea \ No newline at end of file diff --git a/frontend/Dockerfile b/frontend/Dockerfile new file mode 100644 index 0000000..4337dbc --- /dev/null +++ b/frontend/Dockerfile @@ -0,0 +1,28 @@ +FROM node:20-alpine + +WORKDIR /app + +# Копируем файлы зависимостей +COPY package.json package-lock.json* ./ + +# Устанавливаем зависимости +RUN npm ci + +# Копируем исходники +COPY . . + +# ARG для передачи переменных окружения на этапе сборки +ARG VITE_API_URL +ENV VITE_API_URL=${VITE_API_URL} + +# Собираем production build (Vite встроит переменные в код) +RUN npm run build + +# Устанавливаем простой HTTP сервер для отдачи статики +RUN npm install -g serve + +# Порт (только документация) +EXPOSE 3000 + +# Запускаем сервер для отдачи статики +CMD ["serve", "-s", "dist", "-l", "3000"] \ No newline at end of file diff --git a/frontend/index.html b/frontend/index.html index 8c9853f..c18315e 100644 --- a/frontend/index.html +++ b/frontend/index.html @@ -2,7 +2,7 @@ - + Aether — Messenger diff --git a/frontend/public/favicon.png b/frontend/public/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..33fbaed555dab07519fed5790a2af73ba9fb0ff1 GIT binary patch literal 36869 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 literal 0 HcmV?d00001 diff --git a/frontend/src/App.tsx b/frontend/src/App.tsx index dec003a..9dfc66d 100644 --- a/frontend/src/App.tsx +++ b/frontend/src/App.tsx @@ -1,12 +1,15 @@ import { BrowserRouter, Routes, Route, Navigate } from 'react-router-dom'; import { useEffect } from 'react'; import { useAuthStore } from './store/authStore'; +import { useThemeStore } from './store/themeStore'; import { authService } from './services/authService'; import AuthPage from './pages/AuthPage'; import VerifyEmailPage from './pages/VerifyEmailPage'; import ResetPasswordPage from './pages/ResetPasswordPage'; +import ForgotPasswordPage from './pages/ForgotPasswordPage'; import ChatPage from './pages/ChatPage'; import ProfilePage from './pages/ProfilePage'; +import SettingsPage from './pages/SettingsPage'; function PrivateRoute({ children }: { children: React.ReactNode }) { const isAuthenticated = useAuthStore((state) => state.isAuthenticated); @@ -26,6 +29,12 @@ function PrivateRoute({ children }: { children: React.ReactNode }) { function App() { const setUser = useAuthStore((state) => state.setUser); const setLoading = useAuthStore((state) => state.setLoading); + const theme = useThemeStore((state) => state.theme); + + useEffect(() => { + // Apply theme on mount + document.documentElement.setAttribute('data-theme', theme); + }, [theme]); useEffect(() => { const checkAuth = async () => { @@ -48,6 +57,7 @@ function App() { } /> } /> } /> + } /> } /> + + + + } + /> } /> diff --git a/frontend/src/assets/mini-logo.png b/frontend/src/assets/mini-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..33fbaed555dab07519fed5790a2af73ba9fb0ff1 GIT binary patch literal 36869 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 literal 0 HcmV?d00001 diff --git a/frontend/src/components/auth/LoginForm.tsx b/frontend/src/components/auth/LoginForm.tsx index f2d4bab..38d94f5 100644 --- a/frontend/src/components/auth/LoginForm.tsx +++ b/frontend/src/components/auth/LoginForm.tsx @@ -21,7 +21,7 @@ export default function LoginForm() { setIsLoading(true); try { - const data = await authService.login({ username, password }); + await authService.login({ username, password }); const user = await authService.getCurrentUser(); setUser(user); navigate('/chat'); @@ -55,9 +55,14 @@ export default function LoginForm() { - +
navigate('/auth'), 2000); } catch (err: any) { @@ -63,6 +64,21 @@ export default function RegisterForm() { />
+
+ + setDisplayName(e.target.value)} + placeholder="Как вас называть" + className="w-full px-0 py-3 bg-transparent border-0 border-b-2 border-gray-200 font-inter text-text-main placeholder:text-text-muted/50 focus:outline-none focus:border-accent-terracotta transition-all duration-300" + required + /> +
+