Compare commits
11 Commits
9a254575f2
...
49a49f7ea6
Author | SHA1 | Date |
---|---|---|
Jimmy | 49a49f7ea6 | |
Jimmy | d8b8c0f801 | |
Jimmy | 9cdc0ad923 | |
Jimmy | af0954b6ff | |
Jimmy | 6df31460e8 | |
Jimmy | b00e0faedc | |
Jimmy | 02097426ba | |
Jimmy | bd6afffd77 | |
Jimmy | f2e4478edc | |
Jimmy | 3a5716a2f9 | |
Jimmy | 26490887ee |
|
@ -4,7 +4,8 @@ __pycache__/
|
|||
*.py[cod]
|
||||
*$py.class
|
||||
requirements.txt
|
||||
|
||||
users.json
|
||||
app/users.json
|
||||
# C extensions
|
||||
*.so
|
||||
|
||||
|
|
|
@ -1,11 +1,14 @@
|
|||
FROM tiangolo/uvicorn-gunicorn-fastapi:python3.9-slim
|
||||
ENV DOCKER=1
|
||||
|
||||
COPY requirements.txt /app/requirements.txt
|
||||
RUN pip install \
|
||||
python-jose \
|
||||
passlib \
|
||||
python-multipart \
|
||||
docker \
|
||||
aiodocker
|
||||
COPY ./app /app/app
|
||||
aiodocker \
|
||||
sse-starlette \
|
||||
anyio
|
||||
COPY ./app /app/app
|
||||
|
||||
CMD ["uvicorn", "app.main:app", "--proxy-headers", "--host", "0.0.0.0", "--port", "80"]
|
||||
|
|
1
Pipfile
1
Pipfile
|
@ -12,6 +12,7 @@ passlib = "*"
|
|||
python-multipart = "*"
|
||||
docker = "*"
|
||||
aiodocker = "*"
|
||||
sse-starlette = "*"
|
||||
|
||||
[dev-packages]
|
||||
pytest = "*"
|
||||
|
|
11
app/main.py
11
app/main.py
|
@ -1,7 +1,16 @@
|
|||
from fastapi import FastAPI, Depends
|
||||
from fastapi.middleware.cors import CORSMiddleware
|
||||
from app import auth, user, server
|
||||
from os import getenv
|
||||
app = FastAPI()
|
||||
app = FastAPI(docs_url="/")
|
||||
|
||||
app.add_middleware(
|
||||
CORSMiddleware,
|
||||
allow_origins=["*"],
|
||||
allow_credentials=True,
|
||||
allow_methods=["*"],
|
||||
allow_headers=["*"],
|
||||
)
|
||||
|
||||
dependencies = list()
|
||||
if not getenv('DISABLE_AUTH'):
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
from fastapi import APIRouter, HTTPException, status, WebSocket
|
||||
from fastapi import APIRouter, HTTPException, status, WebSocket, Request
|
||||
from sse_starlette.sse import EventSourceResponse
|
||||
import base64
|
||||
import docker
|
||||
import aiodocker
|
||||
|
@ -42,23 +43,25 @@ async def commnd(server, command):
|
|||
return f"{server} {base64.urlsafe_b64decode(command).decode('utf_8')}"
|
||||
|
||||
|
||||
@router.websocket("/server/{server}/logs")
|
||||
async def logs(websocket: WebSocket, server: str):
|
||||
await websocket.accept()
|
||||
@router.get("/server/{server}/logs")
|
||||
async def logs(server: str, request: Request):
|
||||
container = await getContainer(server)
|
||||
async for line in container.log(stdout=True, follow=True, tail=5000):
|
||||
#print(line)
|
||||
await websocket.send_bytes(line)
|
||||
print("Closed")
|
||||
return server
|
||||
#event_generator = logGenerator(request, server)
|
||||
return EventSourceResponse(container.log(stdout=True, follow=True, tail=5000))
|
||||
|
||||
@router.get("/server/{server}/stats")
|
||||
async def stats(websocket: WebSocket, server: str):
|
||||
await websocket.accept()
|
||||
async def logGenerator(request, server):
|
||||
container = await getContainer(server)
|
||||
async for line in container.log():
|
||||
await websocket.send_bytes(line)
|
||||
return server
|
||||
for line in container.log(stdout=True, follow=True, tail=5000):
|
||||
if await request.is_disconnected():
|
||||
print("client disconnected!!!")
|
||||
break
|
||||
yield line
|
||||
|
||||
# @router.get("/server/{server}/stats")
|
||||
# async def stats(server: str):
|
||||
|
||||
# container = await getContainer(server)
|
||||
# return EventSourceResponse(container.stats(stream=True))
|
||||
|
||||
|
||||
async def getContainer(server):
|
||||
|
|
|
@ -0,0 +1,18 @@
|
|||
from distutils.fancy_getopt import fancy_getopt
|
||||
from site import USER_BASE
|
||||
from passlib.context import CryptContext
|
||||
from json import load, dump
|
||||
from sys import argv
|
||||
|
||||
with open("app/users.json", 'r+') as f:
|
||||
fake_users_db = load(f)
|
||||
pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto")
|
||||
fake_users_db[argv[1]] = {"username": argv[1], "hashed_password": pwd_context.hash(argv[2]),
|
||||
"disabled": False, "servers": argv[3:]}
|
||||
f.seek(0)
|
||||
dump(fake_users_db, f, indent=2)
|
||||
print(fake_users_db)
|
||||
|
||||
|
||||
|
||||
|
|
@ -1,10 +0,0 @@
|
|||
{
|
||||
"johndoe": {
|
||||
"username": "johndoe",
|
||||
"full_name": "John Doe",
|
||||
"email": "johndoe@example.com",
|
||||
"hashed_password": "$2b$12$EixZaYVK1fsbw1ZfbX3OXePaWxn96p36WQoeG6Lruj3vjPGga31lW",
|
||||
"disabled": "False",
|
||||
"servers": ["a", "b","minecraft"]
|
||||
}
|
||||
}
|
|
@ -1,14 +1,14 @@
|
|||
version: '3.7'
|
||||
|
||||
services:
|
||||
app:
|
||||
api:
|
||||
build: .
|
||||
env_file:
|
||||
- .env
|
||||
ports:
|
||||
- 8000:8000
|
||||
tty: true
|
||||
stdin_open: true
|
||||
volumes:
|
||||
- ./app:/app/app
|
||||
- /var/run/docker.sock:/var/run/docker.sock
|
||||
- ./users.json:/app/app/users.json
|
||||
command: uvicorn app.main:app --host 0.0.0.0 --reload
|
|
@ -5,10 +5,7 @@ services:
|
|||
build: .
|
||||
env_file:
|
||||
- .env
|
||||
ports:
|
||||
- 8000:80
|
||||
tty: true
|
||||
stdin_open: true
|
||||
volumes:
|
||||
- ./app:/app/app
|
||||
- /var/run/docker.sock:/var/run/docker.sock
|
||||
command: pytest app/test/test_main.py -s
|
|
@ -1,13 +1,33 @@
|
|||
version: '3.7'
|
||||
|
||||
services:
|
||||
app:
|
||||
build: .
|
||||
services:
|
||||
api:
|
||||
build: ./
|
||||
volumes:
|
||||
- /var/run/docker.sock:/var/run/docker.sock
|
||||
- ./users.json:/app/app/users.json
|
||||
restart: unless-stopped
|
||||
networks:
|
||||
- caddy
|
||||
labels:
|
||||
caddy: console
|
||||
caddy.reverse_proxy: "{{upstreams 80}}"
|
||||
#caddy.tls: "admin@localhost"
|
||||
caddy.tls: "internal"
|
||||
env_file:
|
||||
- .env
|
||||
ports:
|
||||
- 8000:80
|
||||
tty: true
|
||||
stdin_open: true
|
||||
|
||||
- .env
|
||||
|
||||
caddy:
|
||||
image: lucaslorentz/caddy-docker-proxy:ci-alpine
|
||||
ports:
|
||||
- 80:80
|
||||
- 443:443
|
||||
volumes:
|
||||
- /var/run/docker.sock:/var/run/docker.sock:ro
|
||||
networks:
|
||||
- caddy
|
||||
restart: unless-stopped
|
||||
|
||||
networks:
|
||||
caddy:
|
||||
name: caddy
|
|
@ -0,0 +1,8 @@
|
|||
{
|
||||
"johndoe": {
|
||||
"username": "johndoe",
|
||||
"hashed_password": "$2b$12$EixZaYVK1fsbw1ZfbX3OXePaWxn96p36WQoeG6Lruj3vjPGga31lW",
|
||||
"disabled": "False",
|
||||
"servers": ["a", "b","minecraft"]
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue