diff --git a/.env b/.env new file mode 100644 index 0000000..2ef7459 --- /dev/null +++ b/.env @@ -0,0 +1,2 @@ +HOST_MONGO=mongo +HOST_REDIS=redis \ No newline at end of file diff --git a/Dockerfile b/Dockerfile index ccb6afd..58c293a 100644 --- a/Dockerfile +++ b/Dockerfile @@ -2,6 +2,11 @@ RUN mkdir /app WORKDIR /app ADD requirements.txt ./requirements.txt - RUN pip install -r requirements.txt + RUN apt-get clean && apt-get update && apt-get install -y --no-install-recommends \ + g++ \ + gcc \ + && pip install -r requirements.txt \ + && apt-get purge -y --auto-remove gcc g++\ + && rm -rf /var/lib/apt/lists/* COPY . /app/ \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml index ed84303..21b2271 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -2,26 +2,34 @@ version: '2' services: web: + container_name: 'realtime_web' build: . image: realtime command: python manage.py runserver 0.0.0.0:8000 + env_file: .env ports: - "8000:8000" links: - redis - mongo + volumes: + - './:/app' depends_on: - redis - mongo zmq_server: + container_name: 'zmq_server' image: 'realtime' ports: - '127.0.0.1:4444:4444' - command: 'python scripts/server.py' + command: 'python -u scripts/server.py' + env_file: .env links: - redis - mongo + volumes: + - './:/app' depends_on: - web diff --git a/plotter/consumers.py b/plotter/consumers.py index f2b8e18..39c1d55 100644 --- a/plotter/consumers.py +++ b/plotter/consumers.py @@ -1,8 +1,8 @@ - +import os import json import numpy as np from datetime import datetime -import mongoengine + from pymongo import MongoClient from models import Experiment, Data @@ -11,10 +11,8 @@ from channels.handler import AsgiHandler from channels.auth import channel_session_user from channels import Group -from profilehooks import profile - -# mongoengine.connect('dbplots') -CLIENT = MongoClient('mongo:27017') +host = os.environ.get('HOST_MONGO', 'localhost') +CLIENT = MongoClient('{}:27017'.format(host)) DB = CLIENT['dbplots'] # Connected to websocket.connect @@ -40,8 +38,8 @@ def ws_message(message, code, plot): datas = DB.data.find({'experiment': e['_id']}, ['time', 'data']).sort('time', 1) dum = [(d['time'], d['data'][plot]) for d in datas] e['time'] = [d[0] for d in dum] - dum = np.array([d[1] for d in dum]) - e[plot] = np.swapaxes(dum, 0, 1).tolist() + dum = [d[1] for d in dum] + e[plot] = map(list, zip(*dum)) e.pop('date', None) e.pop('_id', None) message.reply_channel.send({'text': json.dumps(e)}) diff --git a/plotter/views.py b/plotter/views.py index de02417..023fba2 100644 --- a/plotter/views.py +++ b/plotter/views.py @@ -1,6 +1,7 @@ # -*- coding: utf-8 -*- from __future__ import unicode_literals +import os from datetime import datetime from django import forms @@ -12,7 +13,9 @@ from bootstrap3_datetime.widgets import DateTimePicker from pymongo import MongoClient -CLIENT = MongoClient('mongo:27017') +host = os.environ.get('HOST_MONGO', 'localhost') + +CLIENT = MongoClient('{}:27017'.format(host)) DB = CLIENT['dbplots'] # Forms @@ -44,9 +47,13 @@ def main(request, code=None, plot=None): if plot is not None: initial['plot'] = plot + print 'hola' codes = DB.experiment.find().distinct('code') + print codes exps = [DB.experiment.find_one({'code': c}, ['name']) for c in codes] + print exps names = [q['name'] for q in exps] + print names form = SearchForm( initial = initial, exp_choices = [(e[0], e[1]) for e in zip(codes, names)] @@ -59,8 +66,10 @@ def main(request, code=None, plot=None): 'form': form, } - if codes: + if code and codes: kwargs['title'] = [t[1] for t in zip(codes, names) if t[0]==int(code)][0] + else: + kwargs['title'] = 'JRO' if plot == 'rti': return render(request, 'rti.html', kwargs) diff --git a/realtime/settings.py b/realtime/settings.py index dd0f663..78b8353 100644 --- a/realtime/settings.py +++ b/realtime/settings.py @@ -122,11 +122,13 @@ USE_TZ = True STATIC_URL = '/static/' +host = os.environ.get('HOST_REDIS', 'localhost') + CHANNEL_LAYERS = { "default": { "BACKEND": "asgi_redis.RedisChannelLayer", "CONFIG": { - "hosts": [("redis", 6379)], + "hosts": [(host, 6379)], }, "ROUTING": "realtime.routing.channel_routing", }, diff --git a/requirements.txt b/requirements.txt index 6747a91..9be8471 100644 --- a/requirements.txt +++ b/requirements.txt @@ -2,7 +2,7 @@ asgi-redis==1.4.3 Django==1.11.7 django-bootstrap3==9.1.0 django-bootstrap3-datetimepicker-2==2.5.0 -django-channels==0.7.0 +channels==1.1.8 mongoengine==0.15.0 numpy==1.13.3 pymongo==3.5.1 diff --git a/scripts/server.py b/scripts/server.py index 63714c0..7fcb0dd 100644 --- a/scripts/server.py +++ b/scripts/server.py @@ -12,15 +12,21 @@ os.environ.setdefault("DJANGO_SETTINGS_MODULE", "realtime.settings") from plotter.models import Experiment, Data -mongoengine.connect('dbplots', host='mongo', port=27017) + +host_mongo = os.environ.get('HOST_MONGO', 'localhost') +mongoengine.connect('dbplots', host=host_mongo, port=27017) + + +host_redis = os.environ.get('HOST_REDIS', 'localhost') +channel = asgi_redis.RedisChannelLayer(hosts=[(host_redis, 6379)]) context = zmq.Context() receiver = context.socket(zmq.SUB) -receiver.bind("tcp://127.0.0.1:4444") +receiver.bind("tcp://0.0.0.0:4444") receiver.setsockopt(zmq.SUBSCRIBE, '') -channel = asgi_redis.RedisChannelLayer(hosts=[('redis', 6379)]) + def update_db(buffer): dt = datetime.utcfromtimestamp(buffer['time']) @@ -52,8 +58,8 @@ def update_db(buffer): new = False return new -print 'Waiting for messages...' -while True: +print 'Starting...' +while True: buffer = receiver.recv_json() if 'xrange' not in buffer: buffer['xrange'] = []