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[cod]
|
||||||
*$py.class
|
*$py.class
|
||||||
requirements.txt
|
requirements.txt
|
||||||
|
users.json
|
||||||
|
app/users.json
|
||||||
# C extensions
|
# C extensions
|
||||||
*.so
|
*.so
|
||||||
|
|
||||||
|
|
|
@ -1,11 +1,14 @@
|
||||||
FROM tiangolo/uvicorn-gunicorn-fastapi:python3.9-slim
|
FROM tiangolo/uvicorn-gunicorn-fastapi:python3.9-slim
|
||||||
ENV DOCKER=1
|
ENV DOCKER=1
|
||||||
|
|
||||||
COPY requirements.txt /app/requirements.txt
|
|
||||||
RUN pip install \
|
RUN pip install \
|
||||||
python-jose \
|
python-jose \
|
||||||
passlib \
|
passlib \
|
||||||
python-multipart \
|
python-multipart \
|
||||||
docker \
|
docker \
|
||||||
aiodocker
|
aiodocker \
|
||||||
COPY ./app /app/app
|
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 = "*"
|
python-multipart = "*"
|
||||||
docker = "*"
|
docker = "*"
|
||||||
aiodocker = "*"
|
aiodocker = "*"
|
||||||
|
sse-starlette = "*"
|
||||||
|
|
||||||
[dev-packages]
|
[dev-packages]
|
||||||
pytest = "*"
|
pytest = "*"
|
||||||
|
|
11
app/main.py
11
app/main.py
|
@ -1,7 +1,16 @@
|
||||||
from fastapi import FastAPI, Depends
|
from fastapi import FastAPI, Depends
|
||||||
|
from fastapi.middleware.cors import CORSMiddleware
|
||||||
from app import auth, user, server
|
from app import auth, user, server
|
||||||
from os import getenv
|
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()
|
dependencies = list()
|
||||||
if not getenv('DISABLE_AUTH'):
|
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 base64
|
||||||
import docker
|
import docker
|
||||||
import aiodocker
|
import aiodocker
|
||||||
|
@ -42,23 +43,25 @@ async def commnd(server, command):
|
||||||
return f"{server} {base64.urlsafe_b64decode(command).decode('utf_8')}"
|
return f"{server} {base64.urlsafe_b64decode(command).decode('utf_8')}"
|
||||||
|
|
||||||
|
|
||||||
@router.websocket("/server/{server}/logs")
|
@router.get("/server/{server}/logs")
|
||||||
async def logs(websocket: WebSocket, server: str):
|
async def logs(server: str, request: Request):
|
||||||
await websocket.accept()
|
|
||||||
container = await getContainer(server)
|
container = await getContainer(server)
|
||||||
async for line in container.log(stdout=True, follow=True, tail=5000):
|
#event_generator = logGenerator(request, server)
|
||||||
#print(line)
|
return EventSourceResponse(container.log(stdout=True, follow=True, tail=5000))
|
||||||
await websocket.send_bytes(line)
|
|
||||||
print("Closed")
|
|
||||||
return server
|
|
||||||
|
|
||||||
@router.get("/server/{server}/stats")
|
async def logGenerator(request, server):
|
||||||
async def stats(websocket: WebSocket, server: str):
|
|
||||||
await websocket.accept()
|
|
||||||
container = await getContainer(server)
|
container = await getContainer(server)
|
||||||
async for line in container.log():
|
for line in container.log(stdout=True, follow=True, tail=5000):
|
||||||
await websocket.send_bytes(line)
|
if await request.is_disconnected():
|
||||||
return server
|
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):
|
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'
|
version: '3.7'
|
||||||
|
|
||||||
services:
|
services:
|
||||||
app:
|
api:
|
||||||
build: .
|
build: .
|
||||||
env_file:
|
env_file:
|
||||||
- .env
|
- .env
|
||||||
ports:
|
ports:
|
||||||
- 8000:8000
|
- 8000:8000
|
||||||
tty: true
|
|
||||||
stdin_open: true
|
|
||||||
volumes:
|
volumes:
|
||||||
- ./app:/app/app
|
- ./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
|
command: uvicorn app.main:app --host 0.0.0.0 --reload
|
|
@ -5,10 +5,7 @@ services:
|
||||||
build: .
|
build: .
|
||||||
env_file:
|
env_file:
|
||||||
- .env
|
- .env
|
||||||
ports:
|
|
||||||
- 8000:80
|
|
||||||
tty: true
|
|
||||||
stdin_open: true
|
|
||||||
volumes:
|
volumes:
|
||||||
- ./app:/app/app
|
- ./app:/app/app
|
||||||
|
- /var/run/docker.sock:/var/run/docker.sock
|
||||||
command: pytest app/test/test_main.py -s
|
command: pytest app/test/test_main.py -s
|
|
@ -1,13 +1,33 @@
|
||||||
version: '3.7'
|
version: '3.7'
|
||||||
|
|
||||||
services:
|
services:
|
||||||
app:
|
api:
|
||||||
build: .
|
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_file:
|
||||||
- .env
|
- .env
|
||||||
ports:
|
|
||||||
- 8000:80
|
|
||||||
tty: true
|
|
||||||
stdin_open: true
|
|
||||||
|
|
||||||
|
|
||||||
|
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