diff --git a/bite/api/migrations/0001_initial.py b/bite/api/migrations/0001_initial.py index 4282a77..0276db1 100644 --- a/bite/api/migrations/0001_initial.py +++ b/bite/api/migrations/0001_initial.py @@ -1,6 +1,8 @@ -# Generated by Django 3.0.6 on 2020-06-01 14:13 +# Generated by Django 3.1.3 on 2021-03-19 08:08 +import api.models from django.db import migrations, models +import uuid class Migration(migrations.Migration): @@ -14,20 +16,25 @@ class Migration(migrations.Migration): migrations.CreateModel( name='Device', fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('serial', models.CharField(max_length=128, unique=True)), + ('serial', models.CharField(max_length=128, unique=True, validators=[api.models.device_validation])), + ('uuid', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)), ('creation_time', models.DateTimeField(auto_now_add=True)), ('updated_time', models.DateTimeField(auto_now=True)), ], + options={ + 'ordering': ['updated_time', 'serial'], + }, ), migrations.CreateModel( name='WhiteList', fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('serial', models.CharField(max_length=128, unique=True)), + ('serial', models.CharField(max_length=128, primary_key=True, serialize=False)), ('creation_time', models.DateTimeField(auto_now_add=True)), ('updated_time', models.DateTimeField(auto_now=True)), ('is_published', models.BooleanField(default=True)), ], + options={ + 'ordering': ['serial', 'updated_time'], + }, ), ] diff --git a/bite/api/migrations/0002_auto_20200601_1523.py b/bite/api/migrations/0002_auto_20200601_1523.py deleted file mode 100644 index 2d77c86..0000000 --- a/bite/api/migrations/0002_auto_20200601_1523.py +++ /dev/null @@ -1,21 +0,0 @@ -# Generated by Django 3.0.6 on 2020-06-01 15:23 - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('api', '0001_initial'), - ] - - operations = [ - migrations.AlterModelOptions( - name='device', - options={'ordering': ['updated_time', 'serial']}, - ), - migrations.AlterModelOptions( - name='whitelist', - options={'ordering': ['serial', 'updated_time']}, - ), - ] diff --git a/bite/api/migrations/0003_auto_20200602_2128.py b/bite/api/migrations/0003_auto_20200602_2128.py deleted file mode 100644 index b01d214..0000000 --- a/bite/api/migrations/0003_auto_20200602_2128.py +++ /dev/null @@ -1,19 +0,0 @@ -# Generated by Django 3.0.6 on 2020-06-02 21:28 - -import api.models -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('api', '0002_auto_20200601_1523'), - ] - - operations = [ - migrations.AlterField( - model_name='device', - name='serial', - field=models.CharField(max_length=128, unique=True, validators=[api.models.device_validation]), - ), - ] diff --git a/bite/api/migrations/0004_device_uuid.py b/bite/api/migrations/0004_device_uuid.py deleted file mode 100644 index e627420..0000000 --- a/bite/api/migrations/0004_device_uuid.py +++ /dev/null @@ -1,19 +0,0 @@ -# Generated by Django 3.0.6 on 2020-06-05 09:19 - -from django.db import migrations, models -import uuid - - -class Migration(migrations.Migration): - - dependencies = [ - ('api', '0003_auto_20200602_2128'), - ] - - operations = [ - migrations.AddField( - model_name='device', - name='uuid', - field=models.UUIDField(default=uuid.uuid4, editable=False, unique=True), - ), - ] diff --git a/bite/api/models.py b/bite/api/models.py index 7c2863c..b53e0c2 100644 --- a/bite/api/models.py +++ b/bite/api/models.py @@ -37,7 +37,7 @@ def device_validation(value): class WhiteList(models.Model): - serial = models.CharField(max_length=128, unique=True) + serial = models.CharField(primary_key=True, max_length=128) creation_time = models.DateTimeField(auto_now_add=True) updated_time = models.DateTimeField(auto_now=True) is_published = models.BooleanField(default=True) @@ -52,7 +52,7 @@ class WhiteList(models.Model): class Device(models.Model): serial = models.CharField(max_length=128, unique=True, validators=[device_validation]) - uuid = models.UUIDField(unique=True, default=uuid.uuid4, + uuid = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False) creation_time = models.DateTimeField(auto_now_add=True) updated_time = models.DateTimeField(auto_now=True) diff --git a/bite/telemetry/migrations/0001_initial.py b/bite/telemetry/migrations/0001_initial.py index 924cb81..8ff1ba3 100644 --- a/bite/telemetry/migrations/0001_initial.py +++ b/bite/telemetry/migrations/0001_initial.py @@ -1,8 +1,9 @@ -# Generated by Django 3.0.6 on 2020-06-01 14:45 +# Generated by Django 3.1.3 on 2021-03-19 08:08 -import django.contrib.postgres.fields.jsonb +import django.core.validators from django.db import migrations, models import django.db.models.deletion +import telemetry.models class Migration(migrations.Migration): @@ -17,10 +18,16 @@ class Migration(migrations.Migration): migrations.CreateModel( name='Telemetry', fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('time', models.DateTimeField(auto_now_add=True)), - ('payload', django.contrib.postgres.fields.jsonb.JSONField()), - ('device', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='api.Device')), + ('id', models.AutoField(primary_key=True, serialize=False)), + ('time', models.DateTimeField(auto_now_add=True, db_index=True)), + ('transport', models.CharField(choices=[('http', 'http'), ('mqtt', 'mqtt')], default='http', max_length=4)), + ('clock', models.IntegerField(null=True, validators=[django.core.validators.MinValueValidator(0)])), + ('payload', models.JSONField(validators=[telemetry.models.telemetry_validation])), + ('device', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='api.device')), ], + options={ + 'verbose_name_plural': 'Telemetry', + 'ordering': ['-time', 'device'], + }, ), ] diff --git a/bite/telemetry/migrations/0002_auto_20200601_1557.py b/bite/telemetry/migrations/0002_auto_20200601_1557.py deleted file mode 100644 index b6f83d2..0000000 --- a/bite/telemetry/migrations/0002_auto_20200601_1557.py +++ /dev/null @@ -1,17 +0,0 @@ -# Generated by Django 3.0.6 on 2020-06-01 15:57 - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('telemetry', '0001_initial'), - ] - - operations = [ - migrations.AlterModelOptions( - name='telemetry', - options={'ordering': ['time', 'device']}, - ), - ] diff --git a/bite/telemetry/migrations/0003_auto_20200602_2131.py b/bite/telemetry/migrations/0003_auto_20200602_2131.py deleted file mode 100644 index b48039b..0000000 --- a/bite/telemetry/migrations/0003_auto_20200602_2131.py +++ /dev/null @@ -1,26 +0,0 @@ -# Generated by Django 3.0.6 on 2020-06-02 21:31 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('telemetry', '0002_auto_20200601_1557'), - ] - - operations = [ - migrations.AlterModelOptions( - name='telemetry', - options={'ordering': ['time', 'device'], 'verbose_name_plural': 'Telemetry'}, - ), - migrations.RemoveField( - model_name='telemetry', - name='id', - ), - migrations.AlterField( - model_name='telemetry', - name='time', - field=models.DateTimeField(auto_now_add=True, primary_key=True, serialize=False), - ), - ] diff --git a/bite/telemetry/migrations/0004_auto_20200602_2132.py b/bite/telemetry/migrations/0004_auto_20200602_2132.py deleted file mode 100644 index 94f40bd..0000000 --- a/bite/telemetry/migrations/0004_auto_20200602_2132.py +++ /dev/null @@ -1,15 +0,0 @@ -# Generated by Django 3.0.6 on 2020-06-02 21:32 - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('telemetry', '0003_auto_20200602_2131'), - ] - - operations = [ - migrations.RunSQL( - "SELECT create_hypertable('telemetry_telemetry', 'time');"), - ] diff --git a/bite/telemetry/migrations/0005_telemetry_clock.py b/bite/telemetry/migrations/0005_telemetry_clock.py deleted file mode 100644 index 476e345..0000000 --- a/bite/telemetry/migrations/0005_telemetry_clock.py +++ /dev/null @@ -1,19 +0,0 @@ -# Generated by Django 3.0.6 on 2020-06-03 13:08 - -import django.core.validators -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('telemetry', '0004_auto_20200602_2132'), - ] - - operations = [ - migrations.AddField( - model_name='telemetry', - name='clock', - field=models.IntegerField(null=True, validators=[django.core.validators.MinValueValidator(0)]), - ), - ] diff --git a/bite/telemetry/migrations/0006_auto_20200603_1317.py b/bite/telemetry/migrations/0006_auto_20200603_1317.py deleted file mode 100644 index 6ca695a..0000000 --- a/bite/telemetry/migrations/0006_auto_20200603_1317.py +++ /dev/null @@ -1,17 +0,0 @@ -# Generated by Django 3.0.6 on 2020-06-03 13:17 - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('telemetry', '0005_telemetry_clock'), - ] - - operations = [ - migrations.AlterModelOptions( - name='telemetry', - options={'ordering': ['-time', 'device'], 'verbose_name_plural': 'Telemetry'}, - ), - ] diff --git a/bite/telemetry/migrations/0007_telemetry_transport.py b/bite/telemetry/migrations/0007_telemetry_transport.py deleted file mode 100644 index 29395d8..0000000 --- a/bite/telemetry/migrations/0007_telemetry_transport.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 3.0.6 on 2020-06-08 20:07 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('telemetry', '0006_auto_20200603_1317'), - ] - - operations = [ - migrations.AddField( - model_name='telemetry', - name='transport', - field=models.CharField(choices=[('http', 'http'), ('mqtt', 'mqtt')], default='http', max_length=4), - ), - ] diff --git a/bite/telemetry/migrations/0008_auto_20200619_1627.py b/bite/telemetry/migrations/0008_auto_20200619_1627.py deleted file mode 100644 index 799aa39..0000000 --- a/bite/telemetry/migrations/0008_auto_20200619_1627.py +++ /dev/null @@ -1,20 +0,0 @@ -# Generated by Django 3.0.7 on 2020-06-19 16:27 - -import django.contrib.postgres.fields.jsonb -from django.db import migrations -import telemetry.models - - -class Migration(migrations.Migration): - - dependencies = [ - ('telemetry', '0007_telemetry_transport'), - ] - - operations = [ - migrations.AlterField( - model_name='telemetry', - name='payload', - field=django.contrib.postgres.fields.jsonb.JSONField(validators=[telemetry.models.telemetry_validation]), - ), - ] diff --git a/bite/telemetry/migrations/0009_auto_20200823_1340.py b/bite/telemetry/migrations/0009_auto_20200823_1340.py deleted file mode 100644 index 9558f8c..0000000 --- a/bite/telemetry/migrations/0009_auto_20200823_1340.py +++ /dev/null @@ -1,19 +0,0 @@ -# Generated by Django 3.1 on 2020-08-23 13:40 - -from django.db import migrations, models -import telemetry.models - - -class Migration(migrations.Migration): - - dependencies = [ - ('telemetry', '0008_auto_20200619_1627'), - ] - - operations = [ - migrations.AlterField( - model_name='telemetry', - name='payload', - field=models.JSONField(validators=[telemetry.models.telemetry_validation]), - ), - ] diff --git a/bite/telemetry/models.py b/bite/telemetry/models.py index 1e37c06..2854df9 100644 --- a/bite/telemetry/models.py +++ b/bite/telemetry/models.py @@ -30,8 +30,9 @@ def telemetry_validation(value): class Telemetry(models.Model): + id = models.AutoField(primary_key=True) device = models.ForeignKey(Device, on_delete=models.CASCADE) - time = models.DateTimeField(primary_key=True, auto_now_add=True) + time = models.DateTimeField(db_index=True, auto_now_add=True) transport = models.CharField(max_length=4, choices=[('http', 'http'), ('mqtt', 'mqtt')], default='http') diff --git a/docker/django/Dockerfile b/docker/django/Dockerfile index 7cd9284..8e14657 100644 --- a/docker/django/Dockerfile +++ b/docker/django/Dockerfile @@ -17,20 +17,20 @@ # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . -FROM python:3.8-alpine AS builder +FROM python:3.9-alpine AS builder RUN apk update && apk add gcc musl-dev postgresql-dev \ && pip install psycopg2-binary # --- -FROM python:3.8-alpine +FROM python:3.9-alpine ENV PYTHONUNBUFFERED 1 ENV DJANGO_SETTINGS_MODULE "bite.settings" RUN apk update && apk add --no-cache postgresql-libs \ && wget https://github.com/jwilder/dockerize/releases/download/v0.6.1/dockerize-alpine-linux-amd64-v0.6.1.tar.gz -qO- \ | tar -xz -C /usr/local/bin -COPY --from=builder /usr/local/lib/python3.8/site-packages/ /usr/local/lib/python3.8/site-packages/ +COPY --from=builder /usr/local/lib/python3.9/site-packages/ /usr/local/lib/python3.9/site-packages/ COPY --chown=1000:1000 requirements.txt /srv/app/bite/requirements.txt RUN pip3 install --no-cache-dir -r /srv/app/bite/requirements.txt diff --git a/docker/docker-compose.dev.yml b/docker/docker-compose.dev.yml index dcca815..0230502 100644 --- a/docker/docker-compose.dev.yml +++ b/docker/docker-compose.dev.yml @@ -40,6 +40,10 @@ services: volumes: - ../bite:/srv/app/bite + static-files: + volumes: + - ../bite:/srv/app/bite + mqtt-to-db: volumes: - ../bite:/srv/app/bite diff --git a/docker/docker-compose.yml b/docker/docker-compose.yml index 6e994f5..eac862f 100644 --- a/docker/docker-compose.yml +++ b/docker/docker-compose.yml @@ -54,7 +54,7 @@ services: broker: <<: *service_default - image: eclipse-mosquitto + image: eclipse-mosquitto:1.6 volumes: - "./mqtt/mosquitto/mosquitto.conf:/mosquitto/config/mosquitto.conf" networks: @@ -65,6 +65,8 @@ services: ingress: <<: *service_default image: nginx:stable-alpine + environment: + NGINX_ENTRYPOINT_QUIET_LOGS: 1 ports: - "${CUSTOM_DOCKER_IP:-0.0.0.0}:80:80" networks: diff --git a/docker/ntpd/Dockerfile b/docker/ntpd/Dockerfile index eea5209..c2c2850 100644 --- a/docker/ntpd/Dockerfile +++ b/docker/ntpd/Dockerfile @@ -17,7 +17,7 @@ # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . -FROM alpine:3.9 +FROM alpine:3.12 RUN apk update && apk add chrony && \ chown -R chrony:chrony /var/lib/chrony diff --git a/docker/simulator/Dockerfile b/docker/simulator/Dockerfile index 971f342..6a59f02 100644 --- a/docker/simulator/Dockerfile +++ b/docker/simulator/Dockerfile @@ -17,7 +17,7 @@ # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . -FROM python:3.8-alpine +FROM python:3.9-alpine RUN pip3 install urllib3 paho-mqtt COPY ./device_simulator.py /opt/bite/device_simulator.py