Celestino Rey vor 1 Jahr
Ursprung
Commit
3db980a187

+ 7 - 7
Dockerfile

@@ -1,13 +1,9 @@
 # yup, python 3.11!
 FROM python:3.11-slim
 
-<<<<<<< HEAD
-# install nginx
-RUN apt-get update && apt-get install nginx netcat-openbsd rsync -y
-=======
 # install nginx y otras cosas
-RUN apt-get update && apt-get install nginx netcat-openbsd curl vim jq -y
->>>>>>> c04abab64cc16d19cf44b2b6e95eb68cccfb37b5
+RUN apt-get update && apt-get install nginx netcat-openbsd curl vim jq rsync -y
+
 # copy our nginx configuration to overwrite nginx defaults
 RUN rm /etc/nginx/sites-enabled/default
 RUN rm /etc/nginx/sites-available/default
@@ -31,10 +27,14 @@ RUN python -m venv /opt/venv && \
     /opt/venv/bin/python -m pip install pip --upgrade && \
     /opt/venv/bin/python -m pip install -r requirements.txt
 
+# Añade path a .bashrc
+
+RUN echo "export PATH=/opt/venv/bin/:$PATH" >> /root/.bashrc
+
 # make our entrypoint.sh executable
 RUN chmod +x config/entrypoint.sh
 
-EXPOSE 80
+EXPOSE 8080
 
 # execute our entrypoint.sh file
 CMD ["./config/entrypoint.sh"]

+ 28 - 25
README.md

@@ -1,21 +1,41 @@
 # Versión para openshift
 
-## permitir a nginx correr con privilegios
-
-### esto se hace una vez dentro del proyecto.
-
-oc adm policy add-scc-to-user -z default anyuid
-
 ## Instalación
+### app reymota
 
 Crear un proyecto y luego añadir una app desde Agregar, importar desde git.
 
+    oc new-app http://gitea.reymota.es/creylopez/ReyMotaAppsOC.git -e DEBUG="False" -e VERSION=11.0 --name='reymota'
+
 Tal y como está la estructura de directorios, deberia detectar automáticamente una compilación Python
 
+## asignación de los volúmenes
+### Si la pvc no está creada
+
+    oc set volume deployment.apps/reymota --add -t pvc --claim-size=300M --name=reymota-lyrics-migrations --claim-name='reymota-lyrics-migrations' --mount-path='/app/lyrics/migrations'
+    oc set volume deployment.apps/reymota --add -t pvc --claim-size=300M --name=reymota-media --claim-name='reymota-media' --mount-path='/app/mediafiles'
+    oc set volume deployment.apps/reymota --add -t pvc --claim-size=300M --name=reymota-repostajes-migrations --claim-name='reymota-repostajes-migrations' --mount-path='/app/repostajes/migrations'
+    oc set volume deployment.apps/reymota --add -t pvc --claim-size=300M --name=reymota-reymotausers-migrations --claim-name='reymota-reymotausers-migrations' --mount-path='/app/reymotausers/migrations'
+    oc set volume deployment.apps/reymota --add -t pvc --claim-size=50G --name=static-volume --claim-name='static-volume' --mount-path='/app/staticfiles'
+     
+ 
+### Si la pvc ya está creada
+
+    oc set volume deployment.apps/reymota --add -t pvc --name=reymota-lyrics-migrations --claim-name='reymota-lyrics-migrations' --mount-path='/app/lyrics/migrations'
+    oc set volume deployment.apps/reymota --add -t pvc --name=reymota-media --claim-name='reymota-media' --mount-path='/app/mediafiles'
+    oc set volume deployment.apps/reymota --add -t pvc --name=reymota-repostajes-migrations --claim-name='reymota-repostajes-migrations' --mount-path='/app/repostajes/migrations'
+    oc set volume deployment.apps/reymota --add -t pvc --name=reymota-reymotausers-migrations --claim-name='reymota-reymotausers-migrations' --mount-path='/app/reymotausers/migrations'
+    oc set volume deployment.apps/reymota --add -t pvc --name=static-volume --claim-name='static-volume' --mount-path='/app/staticfiles'
+
 
-Desde la línea de comandos, sería:
+## Exponer el servicio
+    oc expose service/reymota
+    
+### postgresql
+Se hace desde el yaml
+
+    oc create -f postgresql-deployment.yaml
 
-oc new-app http://gitea.reymota.es/creylopez/ReyMotaAppsOC.git -e DEBUG=True
 
 
 
@@ -65,20 +85,3 @@ ALTER SEQUENCE tablename_id_seq RESTART WITH nn;
 
 esto se hace cuando restauro un volcado de la bd sobre una instalación nueva. Si hay índices ya creados, hay que reinciar a partir del último.
 
-<<<<<<< HEAD
-## Copiar ficheros al contenedor
-
-Copy local directory to a pod directory
-oc rsync /home/user/source devpod1234:/src
-
-# Copy pod directory to a local directory
-oc rsync devpod1234:/src /home/user/source
-=======
-## Para que git no pida credenciales
-
-git config --global credential.helper store
-
-
-la siguiente vez que se haga el push nos la pedirá una última vez
-
->>>>>>> c04abab64cc16d19cf44b2b6e95eb68cccfb37b5

+ 11 - 0
Yamls/env-prod-db-configmap.yaml

@@ -0,0 +1,11 @@
+apiVersion: v1
+data:
+  POSTGRES_DB: reymota
+  POSTGRES_PASSWORD: Dsa-0213
+  POSTGRES_USER: creylopez
+kind: ConfigMap
+metadata:
+  labels:
+    io.kompose.service: db-env-prod-db
+  name: env-prod-db
+  namespace: reymota

+ 5 - 5
postgres-deployment.yaml → Yamls/postgresql-deployment.yaml

@@ -5,14 +5,14 @@ metadata:
     kompose.cmd: kompose convert
     kompose.version: 1.34.0 (cbf2835db)
   labels:
-    io.kompose.service: db
-  name: db
+    io.kompose.service: postgresql
+  name: postgresql
   namespace: reymota
 spec:
   replicas: 1
   selector:
     matchLabels:
-      io.kompose.service: db
+      io.kompose.service: postgresql
   strategy:
     type: Recreate
   template:
@@ -21,7 +21,7 @@ spec:
         kompose.cmd: kompose convert
         kompose.version: 1.34.0 (cbf2835db)
       labels:
-        io.kompose.service: db
+        io.kompose.service: postgresql
     spec:
       containers:
         - env:
@@ -41,7 +41,7 @@ spec:
                   key: POSTGRES_USER
                   name: env-prod-db
           image: postgres:15
-          name: db
+          name: postgresql
           volumeMounts:
             - mountPath: /var/lib/postgresql/data
               name: postgresql

+ 17 - 0
Yamls/postgresql-service.yaml

@@ -0,0 +1,17 @@
+apiVersion: v1
+kind: Service
+metadata:
+  annotations:
+    kompose.cmd: kompose convert
+    kompose.version: 1.34.0 (cbf2835db)
+  labels:
+    io.kompose.service: postgresql
+  name: postgresql
+  namespace: reymota
+spec:
+  ports:
+    - name: "5432"
+      port: 5432
+      targetPort: 5432
+  selector:
+    io.kompose.service: postgresql

+ 17 - 0
Yamls/pvc-postgresql.yaml

@@ -0,0 +1,17 @@
+apiVersion: v1
+kind: PersistentVolumeClaim
+metadata:
+  finalizers:
+  - kubernetes.io/pvc-protection
+  labels:
+    template: postgresql-persistent-template
+  name: postgresql
+  namespace: reymota
+spec:
+  accessModes:
+  - ReadWriteOnce
+  resources:
+    requests:
+      storage: 1Gi
+  storageClassName: lvms-vg1
+  volumeMode: Filesystem

+ 3 - 0
borraDB.sh

@@ -0,0 +1,3 @@
+oc delete -f Yamls/env-prod-db-configmap.yaml
+oc delete -f Yamls/postgresql-deployment.yaml
+oc delete -f Yamls/postgresql-service.yaml

+ 4 - 0
creaDB.sh

@@ -0,0 +1,4 @@
+oc create -f Yamls/env-prod-db-configmap.yaml
+#oc create -f Yamls/pvc-postgresql.yaml
+oc create -f Yamls/postgresql-deployment.yaml
+oc create -f Yamls/postgresql-service.yaml

+ 0 - 67
pvc.yaml

@@ -1,67 +0,0 @@
-apiVersion: v1
-kind: PersistentVolumeClaim
-metadata:
-  creationTimestamp: null
-  labels:
-    io.kompose.service: reymota-media
-  name: reymota-media
-  namespace: reymota
-spec:
-  accessModes:
-    - ReadWriteOnce
-  resources:
-    requests:
-      storage: 100Mi
-  storageClassName: lvms-vg1
-status: {}
----
-apiVersion: v1
-kind: PersistentVolumeClaim
-metadata:
-  creationTimestamp: null
-  labels:
-    io.kompose.service: reymota-lyrics-migrations
-  name: reymota-lyrics-migrations
-  namespace: reymota
-spec:
-  accessModes:
-    - ReadWriteOnce
-  resources:
-    requests:
-      storage: 50Mi
-  storageClassName: lvms-vg1
-status: {}
----
-apiVersion: v1
-kind: PersistentVolumeClaim
-metadata:
-  creationTimestamp: null
-  labels:
-    io.kompose.service: reymota-repostajes-migrations
-  name: reymota-repostajes-migrations
-  namespace: reymota
-spec:
-  accessModes:
-    - ReadWriteOnce
-  resources:
-    requests:
-      storage: 52Mi
-  storageClassName: lvms-vg1
-status: {}
----
-apiVersion: v1
-kind: PersistentVolumeClaim
-metadata:
-  creationTimestamp: null
-  labels:
-    io.kompose.service: reymota-reymotausers-migrations
-  name: reymota-reymotausers-migrations
-  namespace: reymota
-spec:
-  accessModes:
-    - ReadWriteOnce
-  resources:
-    requests:
-      storage: 53Mi
-  storageClassName: lvms-vg1
-status: {}

+ 1 - 1
src/config/entrypoint.sh

@@ -1,7 +1,7 @@
 #!/bin/bash
 RUN_PORT="8000"
 DATABASE=postgres
-SQL_HOST=db
+SQL_HOST=postgresql
 SQL_PORT=5432
 
 export PATH=/opt/venv/bin:$PATH

+ 3 - 3
src/lyrics/management/commands/importar_albumes.py

@@ -26,10 +26,10 @@ class Command(BaseCommand):
             albumes_creados = 0
             for album_data in datos:
                 try:
-                    artista = Artista.objects.get(id=album_data["artist"])
+                    artista = Artista.objects.get(nombre=album_data["artista_nombre"])
 
                     creado = Album.objects.create(
-                        artist_id=artista.id,
+                        artist=artista,
                         name=album_data['name'],
                         year=album_data['year'],
                         cover_image=album_data['cover_image'],
@@ -38,7 +38,7 @@ class Command(BaseCommand):
                         albumes_creados += 1
 
                 except Artista.DoesNotExist:
-                    self.stderr.write(self.style.ERROR(f"Artista '{album_data['artista']}' no encontrado."))
+                    self.stderr.write(self.style.ERROR(f"Artista '{album_data['artista_nombre']}' no encontrado."))
 
             self.stdout.write(self.style.SUCCESS(f'Se importaron {albumes_creados} albumes correctamente.'))
 

+ 4 - 4
src/lyrics/management/commands/importar_canciones.py

@@ -26,13 +26,13 @@ class Command(BaseCommand):
             canciones_creados = 0
             for cancion_data in datos:
                 try:
-                    album = Album.objects.get(id=cancion_data["album"])
-                    artista = Artista.objects.get(id=cancion_data["artist"])
+                    album = Album.objects.get(name=cancion_data["album_nombre"])
+                    artista = Artista.objects.get(nombre=cancion_data["artista_nombre"])
 
                     creado = Song.objects.create(
-                        album_id=album.id,
+                        album=album,
+                        artist=artista,
                         title=cancion_data['title'],
-                        artist_id=artista.id,
                         year=cancion_data['year'],
                         lyrics=cancion_data['lyrics'],
                         pista=cancion_data['pista'],

+ 21 - 2
src/lyrics/serializers.py

@@ -1,3 +1,5 @@
+import os
+
 from rest_framework import serializers
 from .models import Artista, Album, Song
 
@@ -7,14 +9,31 @@ class ArtistaSerializer(serializers.ModelSerializer):
         model = Artista
         fields = '__all__'  # Incluir todos los campos del modelo
 
+    def to_representation(self, instance):
+        ret = super().to_representation(instance)
+        ret['foto'] = "artistas/" + os.path.basename(ret['foto'])
+
+        return ret
+
 
 class AlbumSerializer(serializers.ModelSerializer):
+    artista_nombre = serializers.CharField(source='artist.nombre', read_only=True)
+
     class Meta:
         model = Album
-        fields = '__all__'  # Incluir todos los campos del modelo
+        fields = ['name', 'year', 'cover_image', 'artista_nombre']
+
+    def to_representation(self, instance):
+        ret = super().to_representation(instance)
+        ret['cover_image'] = "cover_image/" + os.path.basename(ret['cover_image'])
+
+        return ret
 
 
 class CancionSerializer(serializers.ModelSerializer):
+    artista_nombre = serializers.CharField(source='artist.nombre', read_only=True)
+    album_nombre = serializers.CharField(source='album.name', read_only=True)
+
     class Meta:
         model = Song
-        fields = '__all__'  # Incluir todos los campos del modelo
+        fields = ['title', 'year', 'lyrics', 'pista', 'artista_nombre', 'album_nombre']

+ 0 - 0
src/mediafiles/artistas/.noborrar


+ 0 - 0
src/mediafiles/cover_image/.noborrar


+ 0 - 0
src/mediafiles/vehiculos/.noborrar


BIN
src/mediafiles/vehiculos/bmw.jpg


BIN
src/mediafiles/vehiculos/bmw.png


BIN
src/mediafiles/vehiculos/bmw_PMjCK7Q.png


BIN
src/mediafiles/vehiculos/bmw_cSbhRuf.png


BIN
src/mediafiles/vehiculos/bmw_x00n9W7.png


BIN
src/mediafiles/vehiculos/bmw_yVyuq4g.jpg


+ 3 - 3
src/repostajes/management/commands/importar_repostajes.py

@@ -26,10 +26,10 @@ class Command(BaseCommand):
             repostajes_creados = 0
             for repostaje_data in datos:
                 try:
-                    vehiculo = Vehiculo.objects.get(id=repostaje_data["vehiculo"])
+                    vehiculo = Vehiculo.objects.get(matricula=repostaje_data["vehiculo_matricula"])
 
                     creado = Repostaje.objects.create(
-                        vehiculo_id=vehiculo.id,
+                        vehiculo=vehiculo,
                         fecha=repostaje_data['fecha'],
                         kms=repostaje_data['kms'],
                         litros=repostaje_data['litros'],
@@ -43,7 +43,7 @@ class Command(BaseCommand):
                         repostajes_creados += 1
 
                 except Vehiculo.DoesNotExist:
-                    self.stderr.write(self.style.ERROR(f"Vehiculo '{repostaje_data['vehiculo']}' no encontrado."))
+                    self.stderr.write(self.style.ERROR(f"Vehiculo con matrícula '{repostaje_data['vehiculo_matricula']}' no encontrado."))
 
             self.stdout.write(self.style.SUCCESS(f'Se importaron {repostajes_creados} repostajes correctamente.'))
 

+ 0 - 1
src/repostajes/management/commands/importar_vehiculos.py

@@ -26,7 +26,6 @@ class Command(BaseCommand):
             vehiculos_creados = 0
             for vehiculo_data in datos:
                 creado = Vehiculo.objects.create(
-                    id=vehiculo_data['id'],
                     marca=vehiculo_data['marca'],
                     modelo=vehiculo_data['modelo'],
                     matricula=vehiculo_data['matricula'],

+ 3 - 1
src/repostajes/serializers.py

@@ -9,6 +9,8 @@ class VehiculoSerializer(serializers.ModelSerializer):
 
 
 class RepostajeSerializer(serializers.ModelSerializer):
+    vehiculo_matricula = serializers.CharField(source='vehiculo.matricula', read_only=True)
+
     class Meta:
         model = Repostaje
-        fields = '__all__'  # Incluir todos los campos del modelo
+        fields = ['id', 'fecha', 'kms', 'litros', 'descuento', 'importe', 'precioxlitro', 'kmsrecorridos', 'consumo', 'vehiculo', 'vehiculo_matricula']

+ 1 - 1
src/reymota/settings.py

@@ -87,7 +87,7 @@ DATABASES = {
         "NAME": "reymota",
         "USER": "creylopez",
         "PASSWORD": "Dsa-0213",
-        "HOST": "db",
+        "HOST": "postgresql",
         "PORT": "5432",
     }
 } 

+ 9 - 1
src/reymotausers/serializers.py

@@ -1,3 +1,5 @@
+import os
+
 from rest_framework import serializers
 from .models import ReyMotaUser
 
@@ -5,4 +7,10 @@ from .models import ReyMotaUser
 class ReyMotaUserSerializer(serializers.ModelSerializer):
     class Meta:
         model = ReyMotaUser
-        fields = '__all__'  # Incluir todos los campos del modelo
+        fields = ['email', 'password', 'foto', 'is_superuser', 'is_staff', 'is_active', 'nombre', 'last_login']
+
+    def to_representation(self, instance):
+        ret = super().to_representation(instance)
+        ret['foto'] = "profile_images/" + os.path.basename(ret['foto'])
+
+        return ret

+ 1 - 1
src/templates/index.html

@@ -9,7 +9,7 @@
     <div class="app-card alert alert-dismissible shadow-sm mb-4 border-left-decoration" role="alert">
         <div class="inner">
             <div class="app-card-body p-3 p-lg-4">
-                <h3 class="mb-3">¡Bienvenido a sitio REYMOTA.ES!</h3>
+                <h3 class="mb-3">¡Bienvenido a sitio REYMOTA.ES en Openshift!</h3>
                 <div class="row gx-5 gy-3">
                     <!--
                     <div class="col-12 col-lg-9">