mirror of
https://github.com/daniviga/bite.git
synced 2024-11-26 14:56:13 +01:00
Add static support and health-check (#17)
This commit is contained in:
parent
454c4b43cf
commit
b18030f5e5
|
@ -1,3 +1,3 @@
|
|||
# BITE - BasicIoTExample
|
||||
# BITE - Basic/IoT/Example
|
||||
|
||||
Playing with IoT
|
||||
|
|
|
@ -37,6 +37,9 @@ INSTALLED_APPS = [
|
|||
'django.contrib.sessions',
|
||||
'django.contrib.messages',
|
||||
'django.contrib.staticfiles',
|
||||
'health_check',
|
||||
'health_check.db',
|
||||
# 'health_check.storage',
|
||||
'rest_framework',
|
||||
'api',
|
||||
'telemetry',
|
||||
|
@ -126,6 +129,8 @@ USE_TZ = True
|
|||
|
||||
STATIC_URL = '/static/'
|
||||
|
||||
STATIC_ROOT = '/srv/appdata/bite/static'
|
||||
|
||||
SKIP_WHITELIST = True
|
||||
|
||||
MQTT_BROKER = {
|
||||
|
|
|
@ -22,6 +22,7 @@ from telemetry import urls as telemetry_urls
|
|||
|
||||
urlpatterns = [
|
||||
path('admin/', admin.site.urls),
|
||||
path('ht/', include('health_check.urls')),
|
||||
path('api/', include(api_urls)),
|
||||
path('telemetry/', include(telemetry_urls)),
|
||||
]
|
||||
|
|
|
@ -0,0 +1 @@
|
|||
default_app_config = 'telemetry.apps.TelemetryConfig'
|
|
@ -1,5 +1,10 @@
|
|||
from django.apps import AppConfig
|
||||
from health_check.plugins import plugin_dir
|
||||
|
||||
|
||||
class TelemetryConfig(AppConfig):
|
||||
name = 'telemetry'
|
||||
|
||||
def ready(self):
|
||||
from telemetry.health import MQTTHealthCheck
|
||||
plugin_dir.register(MQTTHealthCheck)
|
||||
|
|
24
bite/telemetry/health.py
Normal file
24
bite/telemetry/health.py
Normal file
|
@ -0,0 +1,24 @@
|
|||
import socket
|
||||
import paho.mqtt.client as mqtt
|
||||
from health_check.backends import BaseHealthCheckBackend
|
||||
from health_check.exceptions import ServiceUnavailable
|
||||
|
||||
from django.conf import settings
|
||||
|
||||
MQTT_HOST = settings.MQTT_BROKER['HOST']
|
||||
MQTT_PORT = int(settings.MQTT_BROKER['PORT'])
|
||||
|
||||
|
||||
class MQTTHealthCheck(BaseHealthCheckBackend):
|
||||
critical_service = True
|
||||
|
||||
def check_status(self):
|
||||
client = mqtt.Client(client_id="django-hc")
|
||||
try:
|
||||
client.connect(MQTT_HOST, port=MQTT_PORT)
|
||||
client.disconnect()
|
||||
except (socket.gaierror, ConnectionRefusedError):
|
||||
self.add_error(ServiceUnavailable("Connection refused"))
|
||||
|
||||
def identifier(self):
|
||||
return self.__class__.__name__
|
|
@ -1,3 +1,4 @@
|
|||
import socket
|
||||
import asyncio
|
||||
import json
|
||||
import time
|
||||
|
@ -46,8 +47,11 @@ class Command(BaseCommand):
|
|||
try:
|
||||
client.connect(MQTT_HOST, MQTT_PORT)
|
||||
break
|
||||
except ConnectionRefusedError:
|
||||
self.stdout.write('WARNING: Broker not available')
|
||||
except (socket.gaierror, ConnectionRefusedError):
|
||||
self.stdout.write(
|
||||
self.style.WARNING('WARNING: Broker not available'))
|
||||
time.sleep(5)
|
||||
|
||||
self.stdout.write(self.style.SUCCESS('INFO: Broker subscribed'))
|
||||
client.disconnect()
|
||||
asyncio.run(self.mqtt_broker())
|
||||
|
|
|
@ -15,7 +15,10 @@ COPY --from=builder /usr/local/lib/python3.8/site-packages/ /usr/local/lib/pytho
|
|||
COPY --chown=1000:1000 bite /srv/app/bite
|
||||
COPY --chown=1000:1000 requirements.txt /tmp/requirements.txt
|
||||
|
||||
RUN pip3 install -r /tmp/requirements.txt && rm /tmp/requirements.txt
|
||||
RUN mkdir -p /srv/appdata/bite/static \
|
||||
&& chown -R 1000:1000 /srv/appdata/bite \
|
||||
&& pip3 install -r /tmp/requirements.txt \
|
||||
&& rm /tmp/requirements.txt
|
||||
|
||||
USER 1000:1000
|
||||
WORKDIR /srv/app/bite
|
||||
|
|
21
docker/docker-compose.dev.yml
Normal file
21
docker/docker-compose.dev.yml
Normal file
|
@ -0,0 +1,21 @@
|
|||
version: "3.7"
|
||||
|
||||
services:
|
||||
timescale:
|
||||
ports:
|
||||
- "5432:5432"
|
||||
|
||||
bite:
|
||||
volumes:
|
||||
- ../bite:/srv/app/bite
|
||||
command: ["python3", "manage.py", "runserver", "0.0.0.0:8000"]
|
||||
ports:
|
||||
- "8000:8000"
|
||||
|
||||
data-migration:
|
||||
volumes:
|
||||
- ../bite:/srv/app/bite
|
||||
|
||||
mqtt-to-db:
|
||||
volumes:
|
||||
- ../bite:/srv/app/bite
|
|
@ -1,20 +1,15 @@
|
|||
version: "3.7"
|
||||
|
||||
services:
|
||||
ingress:
|
||||
# command: --providers.docker # For traefik only
|
||||
ports:
|
||||
- "80:80"
|
||||
|
||||
bite:
|
||||
volumes:
|
||||
- "./django/production.py.sample:/srv/app/bite/bite/production.py"
|
||||
- ./django/production.py.sample:/srv/app/bite/bite/production.py
|
||||
command: ["gunicorn", "-b", "0.0.0.0:8000", "bite.wsgi:application"]
|
||||
|
||||
data-migration:
|
||||
volumes:
|
||||
- "./django/production.py.sample:/srv/app/bite/bite/production.py"
|
||||
- ./django/production.py.sample:/srv/app/bite/bite/production.py
|
||||
|
||||
mqtt-to-db:
|
||||
volumes:
|
||||
- "./django/production.py.sample:/srv/app/bite/bite/production.py"
|
||||
- ./django/production.py.sample:/srv/app/bite/bite/production.py
|
||||
|
|
|
@ -5,6 +5,7 @@ networks:
|
|||
|
||||
volumes:
|
||||
pgdata:
|
||||
staticdata:
|
||||
|
||||
x-op-service-default: &service_default
|
||||
restart: always # unless-stopped
|
||||
|
@ -44,25 +45,13 @@ services:
|
|||
<<: *service_default
|
||||
image: nginx:stable-alpine
|
||||
ports:
|
||||
- "8000:80"
|
||||
- "80:80"
|
||||
networks:
|
||||
- net
|
||||
volumes:
|
||||
- ./nginx/nginx.conf:/etc/nginx/nginx.conf
|
||||
- staticdata:/srv/appdata/bite/static
|
||||
- ./ingress/nginx.conf:/etc/nginx/nginx.conf
|
||||
|
||||
# User traefix instead of nginx
|
||||
# ingress:
|
||||
# <<: *service_default
|
||||
# image: traefik:v2.2
|
||||
# command: --api.insecure=true --providers.docker
|
||||
# ports:
|
||||
# - "8000:80"
|
||||
# - "8080:8080"
|
||||
# networks:
|
||||
# - net
|
||||
# volumes:
|
||||
# # So that Traefik can listen to the Docker events
|
||||
# - /var/run/docker.sock:/var/run/docker.sock
|
||||
|
||||
bite:
|
||||
<<: *service_default
|
||||
|
@ -70,33 +59,31 @@ services:
|
|||
context: ..
|
||||
dockerfile: ./docker/django/Dockerfile
|
||||
image: daniviga/bite
|
||||
volumes:
|
||||
- "../bite:/srv/app/bite"
|
||||
command: ["python3", "manage.py", "runserver", "0.0.0.0:8000"]
|
||||
command: ["gunicorn", "-b", "0.0.0.0:8000", "bite.wsgi:application"]
|
||||
networks:
|
||||
- net
|
||||
depends_on:
|
||||
- ingress
|
||||
- data-migration
|
||||
- timescale
|
||||
labels:
|
||||
- "traefik.http.routers.bite.rule=PathPrefix(`/`)"
|
||||
|
||||
data-migration:
|
||||
image: daniviga/bite
|
||||
volumes:
|
||||
- "../bite:/srv/app/bite"
|
||||
command: ["dockerize", "-wait", "tcp://timescale:5432", "python3", "manage.py", "migrate", "--noinput"]
|
||||
networks:
|
||||
- net
|
||||
depends_on:
|
||||
- timescale
|
||||
|
||||
static-files:
|
||||
image: daniviga/bite
|
||||
volumes:
|
||||
- staticdata:/srv/appdata/bite/static
|
||||
command: ["python3", "manage.py", "collectstatic", "--noinput"]
|
||||
|
||||
mqtt-to-db:
|
||||
<<: *service_default
|
||||
image: daniviga/bite
|
||||
volumes:
|
||||
- "../bite:/srv/app/bite"
|
||||
command: ["python3", "manage.py", "mqtt-to-db"]
|
||||
networks:
|
||||
- net
|
||||
|
|
|
@ -2,5 +2,5 @@
|
|||
|
||||
```bash
|
||||
export DOCKER_HOST='127.0.0.1:22375'
|
||||
docker-compose -f docker-compose.edge.yml up -d --scale device-http=4
|
||||
docker-compose -f docker-compose.modules.yml up -d --scale device-http=4
|
||||
```
|
||||
|
|
21
docker/ingress/docker-compose.traefik.yml
Normal file
21
docker/ingress/docker-compose.traefik.yml
Normal file
|
@ -0,0 +1,21 @@
|
|||
version: "3.7"
|
||||
|
||||
services:
|
||||
ingress:
|
||||
<<: *service_default
|
||||
image: traefik:v2.2
|
||||
command: --api.insecure=true --providers.docker
|
||||
ports:
|
||||
- "8000:80"
|
||||
- "8080:8080"
|
||||
networks:
|
||||
- net
|
||||
volumes:
|
||||
# So that Traefik can listen to the Docker events
|
||||
- /var/run/docker.sock:/var/run/docker.sock
|
||||
restart: always
|
||||
init: true
|
||||
|
||||
bite:
|
||||
labels:
|
||||
- "traefik.http.routers.bite.rule=PathPrefix(`/`)"
|
|
@ -51,6 +51,10 @@ http {
|
|||
proxy_connect_timeout 300;
|
||||
}
|
||||
|
||||
location /static/ {
|
||||
root /srv/appdata/bite;
|
||||
}
|
||||
|
||||
error_page 500 502 503 504 /50x.html;
|
||||
location = /50x.html {
|
||||
root /usr/share/nginx/html;
|
|
@ -1,5 +1,6 @@
|
|||
Django
|
||||
djangorestframework
|
||||
django-health-check
|
||||
psycopg2-binary
|
||||
paho-mqtt==1.5.0
|
||||
asyncio-mqtt==0.5.0
|
||||
|
|
Loading…
Reference in New Issue
Block a user