Compare commits

...

11 Commits

Author SHA1 Message Date
Jimmy 49a49f7ea6 Use server side events 2022-01-17 05:27:26 +00:00
Jimmy d8b8c0f801 Add cors midleware 2022-01-17 05:26:59 +00:00
Jimmy 9cdc0ad923 Add dependencies 2022-01-17 05:26:27 +00:00
Jimmy af0954b6ff Add dependencies and use uvicorn 2022-01-17 05:25:02 +00:00
Jimmy 6df31460e8 Add production file 2022-01-17 05:23:16 +00:00
Jimmy b00e0faedc Remove ports, tty and stdin_open 2022-01-16 07:10:06 +00:00
Jimmy 02097426ba Add user creation script 2022-01-16 07:09:23 +00:00
Jimmy bd6afffd77 Ignore users.json 2022-01-16 07:07:55 +00:00
Jimmy f2e4478edc Move and rename 2022-01-16 07:06:45 +00:00
Jimmy 3a5716a2f9 Remove requirements.txt 2022-01-16 07:05:00 +00:00
Jimmy 26490887ee Add users, docker.sock 2022-01-16 07:04:39 +00:00
11 changed files with 96 additions and 46 deletions

3
.gitignore vendored
View File

@ -4,7 +4,8 @@ __pycache__/
*.py[cod]
*$py.class
requirements.txt
users.json
app/users.json
# C extensions
*.so

View File

@ -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"]

View File

@ -12,6 +12,7 @@ passlib = "*"
python-multipart = "*"
docker = "*"
aiodocker = "*"
sse-starlette = "*"
[dev-packages]
pytest = "*"

View File

@ -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'):

View File

@ -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):

18
app/useradd.py Normal file
View File

@ -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)

10
app/users.json Normal file → Executable file
View File

@ -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"]
}
}

View File

@ -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

View File

@ -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

View File

@ -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

8
users.json.sample Normal file
View File

@ -0,0 +1,8 @@
{
"johndoe": {
"username": "johndoe",
"hashed_password": "$2b$12$EixZaYVK1fsbw1ZfbX3OXePaWxn96p36WQoeG6Lruj3vjPGga31lW",
"disabled": "False",
"servers": ["a", "b","minecraft"]
}
}