fix docker
Browse files
Dockerfile
CHANGED
@@ -38,7 +38,13 @@ ENV PYTHONUNBUFFERED 1
|
|
38 |
RUN groupadd -g 20001 MailPilot \
|
39 |
&& useradd -l -M -u 10001 -g MailPilot MailPilot
|
40 |
|
41 |
-
WORKDIR
|
|
|
|
|
|
|
|
|
|
|
|
|
42 |
|
43 |
COPY ./docker-entrypoint.sh /usr/local/bin/docker-entrypoint.sh
|
44 |
RUN chmod +x /usr/local/bin/docker-entrypoint.sh
|
|
|
38 |
RUN groupadd -g 20001 MailPilot \
|
39 |
&& useradd -l -M -u 10001 -g MailPilot MailPilot
|
40 |
|
41 |
+
WORKDIR /opt/MailPilot/MailPilot_ai_agents
|
42 |
+
|
43 |
+
# Copy the entire app directory
|
44 |
+
COPY ./app ./app
|
45 |
+
|
46 |
+
# Ensure proper permissions
|
47 |
+
RUN chmod -R 755 /opt/MailPilot/MailPilot_ai_agents
|
48 |
|
49 |
COPY ./docker-entrypoint.sh /usr/local/bin/docker-entrypoint.sh
|
50 |
RUN chmod +x /usr/local/bin/docker-entrypoint.sh
|
app/api/endpoints/v1/firebaseauth/__pycache__/app.cpython-312.pyc
CHANGED
Binary files a/app/api/endpoints/v1/firebaseauth/__pycache__/app.cpython-312.pyc and b/app/api/endpoints/v1/firebaseauth/__pycache__/app.cpython-312.pyc differ
|
|
app/api/endpoints/v1/firebaseauth/app.py
CHANGED
@@ -1,17 +1,21 @@
|
|
|
|
1 |
from app import router
|
2 |
from fastapi import FastAPI, Depends, HTTPException, status, Request, APIRouter
|
3 |
-
from fastapi.security import OAuth2PasswordBearer
|
4 |
import firebase_admin
|
5 |
from firebase_admin import credentials, auth
|
6 |
from sqlalchemy.ext.asyncio import AsyncSession
|
7 |
from sqlalchemy import select
|
8 |
-
from app.models.api.user import UserCreate, UserSignIn, PasswordReset, TokenVerify, UserResponse
|
9 |
from app.models.database.DBUser import DBUser
|
10 |
-
from app.core.database.session_manager import get_db
|
11 |
-
|
12 |
import os
|
|
|
|
|
|
|
|
|
13 |
# Initialize OAuth2 scheme
|
14 |
-
oauth2_scheme = OAuth2PasswordBearer(tokenUrl="/FirebaseAuth/
|
15 |
|
16 |
async def verify_firebase_token(token: str = Depends(oauth2_scheme)) -> dict:
|
17 |
"""Verify Firebase token and return user info"""
|
@@ -351,8 +355,38 @@ async def verify_token(token_data: TokenVerify, db: AsyncSession = Depends(get_d
|
|
351 |
detail=f"Token verification failed: {str(e)}"
|
352 |
)
|
353 |
@router.post("/token")
|
354 |
-
async def get_token(form_data: OAuth2PasswordRequestForm = Depends()
|
355 |
-
|
356 |
-
|
357 |
-
|
358 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import datetime
|
2 |
from app import router
|
3 |
from fastapi import FastAPI, Depends, HTTPException, status, Request, APIRouter
|
4 |
+
from fastapi.security import OAuth2PasswordBearer, OAuth2PasswordRequestForm
|
5 |
import firebase_admin
|
6 |
from firebase_admin import credentials, auth
|
7 |
from sqlalchemy.ext.asyncio import AsyncSession
|
8 |
from sqlalchemy import select
|
9 |
+
from app.models.api.user import UserCreate, UserSignIn, PasswordReset, TokenVerify, UserResponse,EmailVerifyRequest
|
10 |
from app.models.database.DBUser import DBUser
|
11 |
+
from app.core.database.session_manager import get_db_session as get_db
|
|
|
12 |
import os
|
13 |
+
|
14 |
+
|
15 |
+
router=APIRouter(prefix="/FirebaseAuth", tags=["Firebase Auth"])
|
16 |
+
|
17 |
# Initialize OAuth2 scheme
|
18 |
+
oauth2_scheme = OAuth2PasswordBearer(tokenUrl="/FirebaseAuth/token")
|
19 |
|
20 |
async def verify_firebase_token(token: str = Depends(oauth2_scheme)) -> dict:
|
21 |
"""Verify Firebase token and return user info"""
|
|
|
355 |
detail=f"Token verification failed: {str(e)}"
|
356 |
)
|
357 |
@router.post("/token")
|
358 |
+
async def get_token(form_data: OAuth2PasswordRequestForm = Depends()):
|
359 |
+
"""Get access token"""
|
360 |
+
try:
|
361 |
+
# Get Firebase user
|
362 |
+
firebase_user = auth.get_user_by_email(form_data.username)
|
363 |
+
|
364 |
+
# Create custom token
|
365 |
+
custom_token = auth.create_custom_token(firebase_user.uid)
|
366 |
+
|
367 |
+
return {
|
368 |
+
"access_token": custom_token.decode() if isinstance(custom_token, bytes) else custom_token,
|
369 |
+
"token_type": "bearer"
|
370 |
+
}
|
371 |
+
except Exception as e:
|
372 |
+
raise HTTPException(
|
373 |
+
status_code=status.HTTP_401_UNAUTHORIZED,
|
374 |
+
detail="Invalid credentials"
|
375 |
+
)
|
376 |
+
|
377 |
+
# Function to verify token
|
378 |
+
async def verify_token(token: str = Depends(oauth2_scheme)):
|
379 |
+
try:
|
380 |
+
# Verify the token
|
381 |
+
decoded_token = auth.verify_id_token(token)
|
382 |
+
return decoded_token
|
383 |
+
except:
|
384 |
+
raise HTTPException(
|
385 |
+
status_code=status.HTTP_401_UNAUTHORIZED,
|
386 |
+
detail="Invalid token"
|
387 |
+
)
|
388 |
+
|
389 |
+
# Example protected route
|
390 |
+
@router.get("/protected")
|
391 |
+
async def protected_route(token: str = Depends(verify_token)):
|
392 |
+
return {"message": "You have access!", "token_info": token}
|
app/models/api/__pycache__/user.cpython-312.pyc
CHANGED
Binary files a/app/models/api/__pycache__/user.cpython-312.pyc and b/app/models/api/__pycache__/user.cpython-312.pyc differ
|
|
app/models/api/user.py
CHANGED
@@ -27,3 +27,6 @@ class UserResponse(BaseModel):
|
|
27 |
created_at: datetime.datetime
|
28 |
last_login: Optional[datetime.datetime] = None
|
29 |
provider: str
|
|
|
|
|
|
|
|
27 |
created_at: datetime.datetime
|
28 |
last_login: Optional[datetime.datetime] = None
|
29 |
provider: str
|
30 |
+
|
31 |
+
class EmailVerifyRequest(BaseModel):
|
32 |
+
email: str
|
docker-compose.yml
CHANGED
@@ -26,5 +26,7 @@ services:
|
|
26 |
- .:/opt/MailPilot/MailPilot_ai_agents
|
27 |
depends_on:
|
28 |
- MailPilot_db
|
|
|
|
|
29 |
entrypoint: ["/usr/local/bin/docker-entrypoint.sh"]
|
30 |
command: ["migration"]
|
|
|
26 |
- .:/opt/MailPilot/MailPilot_ai_agents
|
27 |
depends_on:
|
28 |
- MailPilot_db
|
29 |
+
ports:
|
30 |
+
- "7860:7860"
|
31 |
entrypoint: ["/usr/local/bin/docker-entrypoint.sh"]
|
32 |
command: ["migration"]
|
logs/app.log
CHANGED
@@ -6,3 +6,11 @@
|
|
6 |
[2m2025-04-18T12:28:14.439127Z[0m [[32m[1minfo [0m] [1mWaiting for application shutdown.[0m [[0m[1m[34muvicorn.error[0m][0m [36mfilename[0m=[35mon.py[0m [36mfunc_name[0m=[35mshutdown[0m [36mlineno[0m=[35m67[0m
|
7 |
[2m2025-04-18T12:28:14.543378Z[0m [[32m[1minfo [0m] [1mApplication shutdown complete.[0m [[0m[1m[34muvicorn.error[0m][0m [36mfilename[0m=[35mon.py[0m [36mfunc_name[0m=[35mshutdown[0m [36mlineno[0m=[35m78[0m
|
8 |
[2m2025-04-18T12:28:14.586185Z[0m [[32m[1minfo [0m] [1mFinished server process [8] [0m [[0m[1m[34muvicorn.error[0m][0m [36mfilename[0m=[35mserver.py[0m [36mfunc_name[0m=[35mserve[0m [36mlineno[0m=[35m86[0m
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
6 |
[2m2025-04-18T12:28:14.439127Z[0m [[32m[1minfo [0m] [1mWaiting for application shutdown.[0m [[0m[1m[34muvicorn.error[0m][0m [36mfilename[0m=[35mon.py[0m [36mfunc_name[0m=[35mshutdown[0m [36mlineno[0m=[35m67[0m
|
7 |
[2m2025-04-18T12:28:14.543378Z[0m [[32m[1minfo [0m] [1mApplication shutdown complete.[0m [[0m[1m[34muvicorn.error[0m][0m [36mfilename[0m=[35mon.py[0m [36mfunc_name[0m=[35mshutdown[0m [36mlineno[0m=[35m78[0m
|
8 |
[2m2025-04-18T12:28:14.586185Z[0m [[32m[1minfo [0m] [1mFinished server process [8] [0m [[0m[1m[34muvicorn.error[0m][0m [36mfilename[0m=[35mserver.py[0m [36mfunc_name[0m=[35mserve[0m [36mlineno[0m=[35m86[0m
|
9 |
+
[2m2025-04-18T15:32:25.387787Z[0m [[32m[1minfo [0m] [1mApplication started [0m [[0m[1m[34mapp.main[0m][0m [36mfilename[0m=[35mmain.py[0m [36mfunc_name[0m=[35m<module>[0m [36mlineno[0m=[35m37[0m [36mproject[0m=[35mMailPilot_ai_agents[0m [36mversion[0m=[35m0.1.0-alpha[0m
|
10 |
+
[2m2025-04-18T15:32:25.398136Z[0m [[32m[1minfo [0m] [1mStarted server process [8] [0m [[0m[1m[34muvicorn.error[0m][0m [36mfilename[0m=[35mserver.py[0m [36mfunc_name[0m=[35mserve[0m [36mlineno[0m=[35m76[0m
|
11 |
+
[2m2025-04-18T15:32:25.400291Z[0m [[32m[1minfo [0m] [1mWaiting for application startup.[0m [[0m[1m[34muvicorn.error[0m][0m [36mfilename[0m=[35mon.py[0m [36mfunc_name[0m=[35mstartup[0m [36mlineno[0m=[35m48[0m
|
12 |
+
[2m2025-04-18T15:32:25.406461Z[0m [[32m[1minfo [0m] [1mApplication startup complete. [0m [[0m[1m[34muvicorn.error[0m][0m [36mfilename[0m=[35mon.py[0m [36mfunc_name[0m=[35mstartup[0m [36mlineno[0m=[35m62[0m
|
13 |
+
[2m2025-04-18T15:39:37.879642Z[0m [[32m[1minfo [0m] [1mShutting down [0m [[0m[1m[34muvicorn.error[0m][0m [36mfilename[0m=[35mserver.py[0m [36mfunc_name[0m=[35mshutdown[0m [36mlineno[0m=[35m265[0m
|
14 |
+
[2m2025-04-18T15:39:37.996700Z[0m [[32m[1minfo [0m] [1mWaiting for application shutdown.[0m [[0m[1m[34muvicorn.error[0m][0m [36mfilename[0m=[35mon.py[0m [36mfunc_name[0m=[35mshutdown[0m [36mlineno[0m=[35m67[0m
|
15 |
+
[2m2025-04-18T15:39:38.013626Z[0m [[32m[1minfo [0m] [1mApplication shutdown complete.[0m [[0m[1m[34muvicorn.error[0m][0m [36mfilename[0m=[35mon.py[0m [36mfunc_name[0m=[35mshutdown[0m [36mlineno[0m=[35m78[0m
|
16 |
+
[2m2025-04-18T15:39:38.020684Z[0m [[32m[1minfo [0m] [1mFinished server process [8] [0m [[0m[1m[34muvicorn.error[0m][0m [36mfilename[0m=[35mserver.py[0m [36mfunc_name[0m=[35mserve[0m [36mlineno[0m=[35m86[0m
|