From 7d4bf5497d9d5115caf563bcd339d6021712271c Mon Sep 17 00:00:00 2001 From: Andrew Hall Date: Sat, 2 May 2020 11:10:27 -0700 Subject: [PATCH] Fix dev environment, misc. fixes - Fix dev flask env - Add separate `flask run-eventlet` command - Change dev port to 3000 - Update docker registry URL - Fix scripts - Linter noise I can't be fucked to clean up --- README.md | 29 ++++------------------------- app/client/jsx/WebAPI.jsx | 4 ++-- app/config.py | 10 +++++----- app/jitsi/__init__.py | 17 +++++++++++------ app/jitsi/events.py | 6 ++++++ app/manager.py | 17 ++++++++++------- app/setup.sh | 7 +++---- app/setup_prod.sh | 2 -- build_head.sh | 2 +- build_latest_release.sh | 2 +- start.sh | 9 ++++++--- 11 files changed, 49 insertions(+), 56 deletions(-) delete mode 100644 app/setup_prod.sh diff --git a/README.md b/README.md index 85fb02cc1..7aa8157ef 100644 --- a/README.md +++ b/README.md @@ -56,32 +56,11 @@ flask shell Room.query.all() ``` -### Running the app locally in production mode -We use multiple workers in production, so we've added an experimental message queue that only gets activated in production mode. This is a tentative plan for Celery; don't worry about this for now. -```bash -# Install kombu (this also comes installed as part of your dev env) -source venv/bin/activate -pip install kombu -# or -pip install -r requirements.txt - -# Install rabbitmq -brew install rabbitmq - -# If not in path, add it -export PATH=$PATH:/usr/local/opt/rabbitmq/sbin - -# Start server -rabbitmq-server - -# Run the app in production mode -cd add/ -source setup_prod.sh -flask run - -# To shut down the rabbitmq server -rabbitmqctl shutdown +### Running with eventlet ``` +flask run-eventlet +``` + ### Jitsi API documentation API doc: diff --git a/app/client/jsx/WebAPI.jsx b/app/client/jsx/WebAPI.jsx index ccba534d6..cd650f83e 100644 --- a/app/client/jsx/WebAPI.jsx +++ b/app/client/jsx/WebAPI.jsx @@ -5,7 +5,7 @@ import { createAdventureActions } from './utils.js' // TODO this should go into a config / use process.env const hostname = window && window.location && window.location.hostname const production = 'https://party.gbre.org/' -const development = 'http://127.0.0.1:5000' +const development = 'http://127.0.0.1:3000' const url = hostname === 'party.gbre.org' ? production : development const PING_INTERVAL_MS = 10000 @@ -54,7 +54,7 @@ export class HttpApi { return { success: false } } } - + async getRooms() { /* Fetches room definition, including adventure rooms */ try { diff --git a/app/config.py b/app/config.py index f3e3d76f4..74a08d889 100644 --- a/app/config.py +++ b/app/config.py @@ -2,29 +2,29 @@ basedir = os.path.abspath(os.path.dirname(__file__)) + class Config: # Need to change this SECRET_KEY = 'figure-this-out' # To silence deprecation warning SQLALCHEMY_TRACK_MODIFICATIONS = False BASE_DIR = basedir + MESSAGE_QUEUE = None @staticmethod def init_app(app): pass + class DevelopmentConfig(Config): - DEBUG = True SQLALCHEMY_DATABASE_URI = 'sqlite:///' + os.path.join(basedir, 'db.sqlite') - MESSAGE_QUEUE = None + class ProductionConfig(Config): # These URIs are the same for now. If we ever introduce tests we'll want to have # a test config that has its own db that doesn't interfere with these. SQLALCHEMY_DATABASE_URI = 'postgresql+psycopg2://waa:woo@jitsi-party-db:5432/jitsi' - # We use multiple workers in production, so we need a message queue to coordinate - # websocket broadcasting - MESSAGE_QUEUE = None + config = { 'development': DevelopmentConfig, diff --git a/app/jitsi/__init__.py b/app/jitsi/__init__.py index 23b3dc26d..d6d3ee2bf 100644 --- a/app/jitsi/__init__.py +++ b/app/jitsi/__init__.py @@ -8,20 +8,23 @@ staticdir = os.path.join(basedir, 'client/js') db = SQLAlchemy() -socketio = SocketIO(async_mode="eventlet") +socketio = SocketIO() # Register socket events with SocketIO instance -from . import events +from . import events # noqa + -# Factory function that returns the created application instance def create_app(config_name): + ''' + Factory function that returns the created application instance + ''' app = Flask(__name__, static_folder=staticdir) app.config.from_object(config[config_name]) config[config_name].init_app(app) from jitsi import main - # Endpoints + # Endpoints app.register_blueprint(main.main) # Enable cross-origin requests @@ -36,5 +39,7 @@ def create_app(config_name): return app -def run_prod(app): - socketio.run(app, host='0.0.0.0', port=80) + +def run_eventlet(app): + socketio.init_app(app, async_mode="eventlet") + socketio.run(app, host='0.0.0.0', port=os.getenv('FLASK_RUN_PORT')) diff --git a/app/jitsi/events.py b/app/jitsi/events.py index d3fd23335..acc558249 100644 --- a/app/jitsi/events.py +++ b/app/jitsi/events.py @@ -2,29 +2,35 @@ from flask_socketio import emit from .models import User + def broadcast_state(): users = User.get_active_users_by_room() emit('user-event', users, broadcast=True) + @socketio.on('disconnect') def on_disconnect(): broadcast_state() + @socketio.on('connect') def on_connect(): broadcast_state() + @socketio.on('ping-user') def on_ping(message): user = User.query.filter_by(id=message['user_id']).first() if user: user.ping() + @socketio.on('leave-room') def on_leave_room(message): User.leave_room(message['user']['userId'], message['room']) broadcast_state() + @socketio.on('enter-room') def on_enter_room(message): User.enter_room(message['user']['userId'], message['room']) diff --git a/app/manager.py b/app/manager.py index 9928f4663..116e825d4 100644 --- a/app/manager.py +++ b/app/manager.py @@ -1,13 +1,14 @@ import os import json -from jitsi import create_app, db, run_prod +from jitsi import create_app, db, run_eventlet from jitsi.models import Room, User -# Create the application context -app = create_app(os.getenv('FLASK_CONFIG') or 'default') +# Create the application context +app = create_app(os.getenv('FLASK_ENV') or 'default') # The following are custom flask commands + @app.shell_context_processor def make_shell_context(): '''Usage: flask shell @@ -16,9 +17,10 @@ def make_shell_context(): return dict(db=db, Room=Room, User=User) -@app.cli.command('run-prod') -def run_prod_cmd(): - run_prod(app) +@app.cli.command('run-eventlet') +def run_eventlet_cmd(): + run_eventlet(app) + @app.cli.command('create-db') def create_db(): @@ -38,6 +40,7 @@ def create_db(): rooms = json.load(open('rooms.json')) # Create rooms and insert - db_rooms = [Room(name=room_name, room_type=room['type']) for room_name, room in rooms.items()] + db_rooms = [Room(name=room_name, room_type=room['type']) + for room_name, room in rooms.items()] db.session.add_all(db_rooms) db.session.commit() diff --git a/app/setup.sh b/app/setup.sh index 1604176f0..296856b50 100644 --- a/app/setup.sh +++ b/app/setup.sh @@ -1,4 +1,3 @@ -export FLASK_APP=manager.py -export FLASK_DEBUG=1 -export FLASK_CONFIG=development -export FLASK_RUN_PORT=5000 +export FLASK_APP="manager.py" +export FLASK_ENV=development +export FLASK_RUN_PORT=3000 \ No newline at end of file diff --git a/app/setup_prod.sh b/app/setup_prod.sh deleted file mode 100644 index 7802c2529..000000000 --- a/app/setup_prod.sh +++ /dev/null @@ -1,2 +0,0 @@ -export FLASK_APP=manager.py -export FLASK_CONFIG=production diff --git a/build_head.sh b/build_head.sh index 40470b963..f93884d03 100755 --- a/build_head.sh +++ b/build_head.sh @@ -6,7 +6,7 @@ SCRIPT_DIR=$(dirname "$SCRIPT") pushd "$SCRIPT_DIR" -DOCKER_REPO="localhost:5000/gbre/jitsi-party" +DOCKER_REPO="docker.gbre.org/jitsi-party" QUERY='{ repository(owner: \"morganecf\", name: \"jitsi-party\") { releases(last: 1, orderBy: {field: CREATED_AT, direction: ASC}) {edges { node { tagName }}}}}' diff --git a/build_latest_release.sh b/build_latest_release.sh index b73b5c1e3..3432033b5 100755 --- a/build_latest_release.sh +++ b/build_latest_release.sh @@ -6,7 +6,7 @@ SCRIPT_DIR=$(dirname "$SCRIPT") pushd "$SCRIPT_DIR" -DOCKER_REPO="localhost:5000/gbre/jitsi-party" +DOCKER_REPO="docker.gbre.org/jitsi-party" QUERY='{ repository(owner: \"morganecf\", name: \"jitsi-party\") { releases(last: 1, orderBy: {field: CREATED_AT, direction: ASC}) {edges { node { tagName }}}}}' diff --git a/start.sh b/start.sh index ef577eaee..dcf715915 100755 --- a/start.sh +++ b/start.sh @@ -1,6 +1,9 @@ #! /bin/bash -source setup_prod.sh -flask create-db -FLASK_DEBUG=1 PYTHONUNBUFFERED=1 flask run-prod +export FLASK_APP="manager.py" +export FLASK_ENV=production +export FLASK_DEBUG=1 +export PYTHONUNBUFFERED=1 +export FLASK_RUN_PORT=80 +flask run-eventlet