init2
This commit is contained in:
parent
074ca16f7c
commit
d3dc448552
10 changed files with 37 additions and 33 deletions
8
.dockerignore
Normal file
8
.dockerignore
Normal file
|
|
@ -0,0 +1,8 @@
|
||||||
|
__pycache__/
|
||||||
|
**/__pycache__/
|
||||||
|
*.pyc
|
||||||
|
*.pyo
|
||||||
|
.env
|
||||||
|
data/
|
||||||
|
*.db
|
||||||
|
.git/
|
||||||
17
Dockerfile
17
Dockerfile
|
|
@ -1,20 +1,15 @@
|
||||||
FROM python:3.12-slim
|
FROM python:3.11-slim
|
||||||
|
|
||||||
|
ENV PYTHONDONTWRITEBYTECODE=1
|
||||||
|
ENV PYTHONUNBUFFERED=1
|
||||||
|
|
||||||
WORKDIR /app
|
WORKDIR /app
|
||||||
|
|
||||||
# Устанавливаем maxapi из локального источника
|
COPY requirements.txt .
|
||||||
# (build context = родительская папка caps/)
|
|
||||||
COPY maxapi-main/ /maxapi-main/
|
|
||||||
RUN pip install --no-cache-dir /maxapi-main/
|
|
||||||
|
|
||||||
# Устанавливаем зависимости приложения
|
|
||||||
COPY support_bot/requirements.txt ./requirements.txt
|
|
||||||
RUN pip install --no-cache-dir -r requirements.txt
|
RUN pip install --no-cache-dir -r requirements.txt
|
||||||
|
|
||||||
# Копируем исходный код
|
COPY . .
|
||||||
COPY support_bot/ .
|
|
||||||
|
|
||||||
# Папка для SQLite-файла
|
|
||||||
RUN mkdir -p /app/data
|
RUN mkdir -p /app/data
|
||||||
|
|
||||||
EXPOSE 8080
|
EXPOSE 8080
|
||||||
|
|
|
||||||
|
|
@ -23,9 +23,9 @@ async def list_bot_users(
|
||||||
)
|
)
|
||||||
orgs = await get_all_organizations()
|
orgs = await get_all_organizations()
|
||||||
return templates.TemplateResponse(
|
return templates.TemplateResponse(
|
||||||
"bot_users/list.html",
|
request=request,
|
||||||
{
|
name="bot_users/list.html",
|
||||||
"request": request,
|
context={
|
||||||
"users": users,
|
"users": users,
|
||||||
"orgs": orgs,
|
"orgs": orgs,
|
||||||
"filter_authorized": is_authorized,
|
"filter_authorized": is_authorized,
|
||||||
|
|
|
||||||
|
|
@ -12,7 +12,7 @@ router = APIRouter(prefix="/chat-log", dependencies=[Depends(require_admin)])
|
||||||
async def chat_list(request: Request):
|
async def chat_list(request: Request):
|
||||||
chats = await get_chat_list()
|
chats = await get_chat_list()
|
||||||
return templates.TemplateResponse(
|
return templates.TemplateResponse(
|
||||||
"chat_log/list.html", {"request": request, "chats": chats}
|
request=request, name="chat_log/list.html", context={"chats": chats}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -20,6 +20,7 @@ async def chat_list(request: Request):
|
||||||
async def chat_history(request: Request, max_user_id: int):
|
async def chat_history(request: Request, max_user_id: int):
|
||||||
messages = await get_message_log(max_user_id=max_user_id, limit=200)
|
messages = await get_message_log(max_user_id=max_user_id, limit=200)
|
||||||
return templates.TemplateResponse(
|
return templates.TemplateResponse(
|
||||||
"chat_log/history.html",
|
request=request,
|
||||||
{"request": request, "messages": messages, "max_user_id": max_user_id},
|
name="chat_log/history.html",
|
||||||
|
context={"messages": messages, "max_user_id": max_user_id},
|
||||||
)
|
)
|
||||||
|
|
|
||||||
|
|
@ -28,8 +28,9 @@ async def list_org_users(request: Request, org_id: int | None = None):
|
||||||
users = await get_org_users(org_id=org_id)
|
users = await get_org_users(org_id=org_id)
|
||||||
orgs = await get_all_organizations()
|
orgs = await get_all_organizations()
|
||||||
return templates.TemplateResponse(
|
return templates.TemplateResponse(
|
||||||
"org_users/list.html",
|
request=request,
|
||||||
{"request": request, "users": users, "orgs": orgs, "filter_org_id": org_id},
|
name="org_users/list.html",
|
||||||
|
context={"users": users, "orgs": orgs, "filter_org_id": org_id},
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -37,7 +38,7 @@ async def list_org_users(request: Request, org_id: int | None = None):
|
||||||
async def create_org_user_form(request: Request):
|
async def create_org_user_form(request: Request):
|
||||||
orgs = await get_all_organizations()
|
orgs = await get_all_organizations()
|
||||||
return templates.TemplateResponse(
|
return templates.TemplateResponse(
|
||||||
"org_users/create.html", {"request": request, "orgs": orgs}
|
request=request, name="org_users/create.html", context={"orgs": orgs}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -19,13 +19,13 @@ router = APIRouter(prefix="/orgs", dependencies=[Depends(require_admin)])
|
||||||
async def list_orgs(request: Request):
|
async def list_orgs(request: Request):
|
||||||
orgs = await get_all_organizations()
|
orgs = await get_all_organizations()
|
||||||
return templates.TemplateResponse(
|
return templates.TemplateResponse(
|
||||||
"orgs/list.html", {"request": request, "orgs": orgs}
|
request=request, name="orgs/list.html", context={"orgs": orgs}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
@router.get("/create", response_class=HTMLResponse)
|
@router.get("/create", response_class=HTMLResponse)
|
||||||
async def create_org_form(request: Request):
|
async def create_org_form(request: Request):
|
||||||
return templates.TemplateResponse("orgs/create.html", {"request": request})
|
return templates.TemplateResponse(request=request, name="orgs/create.html", context={})
|
||||||
|
|
||||||
|
|
||||||
@router.post("/create")
|
@router.post("/create")
|
||||||
|
|
@ -39,7 +39,7 @@ async def create_org(name: str = Form(...)):
|
||||||
async def edit_org_form(request: Request, org_id: int):
|
async def edit_org_form(request: Request, org_id: int):
|
||||||
org = await get_organization(org_id)
|
org = await get_organization(org_id)
|
||||||
return templates.TemplateResponse(
|
return templates.TemplateResponse(
|
||||||
"orgs/edit.html", {"request": request, "org": org}
|
request=request, name="orgs/edit.html", context={"org": org}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -19,9 +19,9 @@ async def list_tickets(
|
||||||
tickets = await get_all_tickets(org_id=org_id, status=status)
|
tickets = await get_all_tickets(org_id=org_id, status=status)
|
||||||
orgs = await get_all_organizations()
|
orgs = await get_all_organizations()
|
||||||
return templates.TemplateResponse(
|
return templates.TemplateResponse(
|
||||||
"tickets/list.html",
|
request=request,
|
||||||
{
|
name="tickets/list.html",
|
||||||
"request": request,
|
context={
|
||||||
"tickets": tickets,
|
"tickets": tickets,
|
||||||
"orgs": orgs,
|
"orgs": orgs,
|
||||||
"filter_org_id": org_id,
|
"filter_org_id": org_id,
|
||||||
|
|
@ -35,8 +35,9 @@ async def ticket_detail(request: Request, ticket_id: int):
|
||||||
ticket = await get_ticket(ticket_id)
|
ticket = await get_ticket(ticket_id)
|
||||||
attachments = await get_attachments(ticket_id)
|
attachments = await get_attachments(ticket_id)
|
||||||
return templates.TemplateResponse(
|
return templates.TemplateResponse(
|
||||||
"tickets/detail.html",
|
request=request,
|
||||||
{"request": request, "ticket": ticket, "attachments": attachments},
|
name="tickets/detail.html",
|
||||||
|
context={"ticket": ticket, "attachments": attachments},
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
Binary file not shown.
Binary file not shown.
|
|
@ -1,14 +1,12 @@
|
||||||
services:
|
services:
|
||||||
support_bot:
|
support_bot:
|
||||||
build:
|
build: .
|
||||||
context: .. # родительская папка caps/ — нужна для доступа к maxapi-main/
|
|
||||||
dockerfile: support_bot/Dockerfile
|
|
||||||
env_file: .env
|
env_file: .env
|
||||||
environment:
|
environment:
|
||||||
DB_PATH: /app/data/support.db # переопределяем путь внутри контейнера
|
DB_PATH: /app/data/support.db
|
||||||
ADMIN_HOST: "0.0.0.0"
|
ADMIN_HOST: "0.0.0.0"
|
||||||
ports:
|
ports:
|
||||||
- "${ADMIN_PORT:-8080}:8080"
|
- "${ADMIN_PORT:-8080}:8080"
|
||||||
volumes:
|
volumes:
|
||||||
- ./data:/app/data # SQLite-файл живёт здесь — данные сохраняются между перезапусками
|
- ./data:/app/data
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue