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[cod]
*$py.class *$py.class
requirements.txt requirements.txt
users.json
app/users.json
# C extensions # C extensions
*.so *.so

View File

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

View File

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

View File

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

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

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

View File

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

View File

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

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