lunes, 25 de diciembre de 2023

ODOO (IX) :Introducción a Python

 1. Introducción a Python

No es un lenguaje tipado, cosa que puede provocar numerosos errores tipo "runtime"

Vemos algunas instrucciones

# Asignación
mivar=1

# Reasdignación
mivar="hola"

# Condiciones. Cuidado con olvidarse la indentanción
if var1 = 1 : print ("Verdadero")
else : 
   print("Falso")

#Captura de errores
try : c = 2 / 0
except NameError: print ("Error", NameError)

2. Decoradores

Son funciones que modifican a otras funciones y se utilizan mucho en Odoo

Veamos como se define una función simple

# Definición de la función
def add_one(num):
        print("incrementando 1 ...")
return num + 1 # Llamada a la función resultado = add_one(1) print(resultado) # Debe salir 2

Se pueden definir funciones que acepten funciones como parametros , por ejemplo

# Definición de la función que utiliza una función como parámetro
def complex_func (func, param):
	print("llamando a la primera funcion ...")
	return func(param)
	
# Llamada a la función
final_value1= complex_func(add_one, 5)  # devuelve 6
print (final_value1)

Una función también puede devolver funciones

# Definición de la función que devuelve otra función
def other_func (func, param):
	print("other_function is called")
    
	def inner_function():
    		print("inner_function is called")
      
	return inner_function
	
# Llamada a la función
returned_function = other_function()
returned_function()

Vamos a crear una función que añade 4 al resultado de otra función

# Definición de la función que utiliza una función como parámetro
def add4_func (func, param):
	print("llamando a la primera funcion ...")
	return func(param) + 4
	
# Llamada a la función
final_value2= add4_func(add_one, 5)  # devuelve 10
print (final_value2)

Veamos un ejemplo de actuación sin decoradores y a continuación con decoradores. Observar como se pasan los parámetros en ambos casos. 

#Definicón de función sin decorador
def myFun(*args):
    str=""
    for ele in args:
        str += ele
    print (str)
    
		
#Llamada función sin decorador
myDecorator (2,6) (myFun) ("uno, ", "dos, ","tres ","y ", "cuatro." )


#Definición de función con decorador
@myDecorator(10,20)
def myFun2(*args):
    str=""
    for ele in args:
        str += ele
    print (str)

#Llamada a función con decorador		
print (myFun2("cinco, ","seis ", "y ","siete."))

Los decoradores también se pueden encadenar. En este caso el ejemplo es de geeksforgeeks

# Prueba de encadenamiento de decoradores
def decor1(func): 
    def inner(): 
        x = func() 
        return x * x 
    return inner 
 
def decor(func): 
    def inner(): 
        x = func() 
        return 2 * x 
    return inner 
 
@decor1
@decor
def num(): 
    return 10

# Ahora se cambia el orden de encadenamiento
@decor
@decor1
def num2():
    return 10
   
print(num()) 
print(num2())

3. Clases


4. Librerías útiles

- Web scraping.

- ORM









ODOO (VIII) :Introducción a Docker, Postgresql, Linux, HTML,CSS y Bootstrap

1. Instalación de docker

1.1 Ubuntu


aptinstall docker.io docker-compose -y

1.2 Linux Mint

Veamos primeramente que versión tenemos:
cat /etc/linuxmint/info

Y nos devuelve

RELEASE=20.2
CODENAME=uma
EDITION="Xfce"
DESCRIPTION="Linux Mint 20.2 Uma"
DESKTOP=Gnomedocker stop id_contenedordocker stop id_contenedor
TOOLKIT=GTK
NEW_FEATURES_URL=https://www.linuxmint.com/rel_uma_xfce_whatsnew.php
RELEASE_NOTES_URL=https://www.linuxmint.com/rel_uma_xfce.php
USER_GUIDE_URL=https://www.linuxmint.com/documentation.php
GRUB_TITLE=Linux Mint 20.2 Xfce


En linux.how2shout.com se muestra como instalar docker de tres maneras

La primera es para instalar la versión por defecto del contenedor de Linux Mint:

#1. Actualizar el repositorio
sudo apt update

#2. Instalar paquetes de docker
sudo apt install docker docker-compose docker-doc docker-registry docker.io

#3. Verificar la versión
docker --version

#4. Añadir nuestro usuario ("myuser") al grupo "docker" para nousar sudo con docker
sudo usermod -aG docker myuser

#5. Rearrancar la máquina
sudo reboot

#6. Testear con el contenedor hello-world
docker run hello-world


La segunda es para instalar la última versión del repositorio de Docker:

#1. Actualizar el repositorio
sudo apt update

#2. Instalar paquetes de dependencias
sudo apt install apt-transport-https ca-certificates curl gnupg-agent software-properties-common

#3. Añadir la ultima versión al repositorio
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

echo deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu focal stable | sudo tee /etc/apt/sources.list.d/docker.list

#4. Actualizar el repositorio
sudo apt update

#5. Borrar cualquier vestigio de versiones anteriores instaladas
sudo apt remove docker docker-compose docker-doc docker-registry docker.io

#6. Instalar las versiones descargadas
sudo apt-get install docker-ce docker-ce-cli containerd.io

#7. Verificar la versión
docker --version

#8. Añadir nuestro usuario ("myuser") al grupo "docker" para nousar sudo con docker
sudo usermod -aG docker myuser

#5. Rearrancar la máquina
sudo reboot

#6. Testear con el contenedor hello-world
docker run hello-world

La tercera es instalarla con snap:

sudo rm /etc/apt/preferences.d/nosnap.pref

#1. Actualizar el repositorio
sudo apt update

#2. Instalar instalador snap
sudo apt install snapd

#3. Instalar docker desde snap
sudo snap install dockerdocker stop id_contenedor

2. Conceptos básicos

Docker trabaja sobre una declaración en un fichero
Docker-compose orquesta múltiples dockers


#1. Listar los contenedores que estan conrriendo
docker ps

#2. Listar todos los contenedores incluidos los parados
docker ps -a

#3. Parar un contenedor
docker stop id_contenedor

#4. Eliminar un contenedor parado
docker rm id_contenedor

#5. Arrancar un contenedor parado
docker start id_contenedor

#6. Arrancar un contenedor parado
docker start id_contenedor

#7. Ejecutar un contenedor en marcha con la consola interactiva
docker exec -it id_contenedor bash

#8. Ver historial de las imágenes
docker image history id_imagen

#9. Ejecutar un contenedor mysql
docker run -e MYSQL_ROOT_PASSWORD=myPassword -d mysql:8.0.13

#10. Ejecutar un contenedor padmin
docker run -p 5050:80 --link db:db --name pgadmin4dev -e "PGADMIN_DEFAULT_EMAIL=mfalcon@ynext.cl" -e "PGADMIN_DEFAULT_PASSWORD=secret" -d dpage/pgadmin4

#11. Descargar una imagen de pgadmin
docker pull dpage/pgadmin4

#12. Ejecutar un contenedor FTP
docker run -d -p 21:21 -p 21000-21010:21000-21010 -e USERS="one|1234" -e ADDRESS=127.0.0.1 delfer/alpine-ftp-server


#=====================================================================
# Guardar nuesto docker a un repositorios de docker llamado Docker Hub
#=====================================================================
#1. Nos logueamos 
docker login

#2. Damos un tag
docker tag mfalconsoft/odoo:10.0 mfalconsoft/odoo:10.0

#3. Guardamos el contenedor
docker push mfalconsoft/odoo:10.0
#4. Ejecutamos el contenedor
docker run -d mfalconsoft/odoo:10.0


#=====================================================================
# DOCKER-COMPOSE
#=====================================================================
#1. Arrancar el docker compose sin soltar el cursor mostrando el log
docker-compose up

#2. Arrancar el docker compose y volver el cursor
docker-compose up -d

#3. Parar el docker compose 
docker-compose down


3. Resumen de Postgres

Para conectarse a la consola SQL, dentro de una shell, ejecutar:

psql postgres

Para listar las BD, ya dentro de la consola de postgres

\l

Para conectar a una BD (por ejemplo MyDB)

\c MyDB

Para hacer consultas, actualizaciones etc

---1. CONSULTA DE CAMPOS CON CONDICION Y ORDENADA
SELECT campo1, campo2
FROM TABLA1 
WHERE campo1 >34 AND campo2 LIKE '%HOLA%'
ORDER BY campo1;

---2. CONSULTA AGRUPADA
SELECT DISTICNT COUNT(*), campo1, campo2
FROM TABLA1
GROUP BY campo1, campo2;

---3. INSERCIÓN
INSERT INTO TABLE1 (campo1, campo2)
VALUES (15,''CARLOS');

---4. ACTUALIZACIÓN
UPDATE TABLA1
SET campo1=12, campo2="OK"
WHERE campo1 >34

---5. BORRADO
DELETE FROM TABLA1
WHERE campo1 >34

4. Resumen de Linux

Veamos los comandos que mas utilizaremos en Odoo

#1. Conectarse a un servidor con el comando ssh.
ssh-copy-id root@159.89.29.1

#2. Convertirse en superusuario.
sudo su

#3. Actualizar el sistema operativo.
apt-get update && apt-get upgrade -y

#4. Crear una carpeta y dar permiso.
mkdir /opt/extra-addons
chown odoo: /opt/extra-addons/ -R

#5. Editamos un fichero con Nano.
nano /etc/odoo/odoo.conf

#6. Reiniciamos un servicio
service odoo restart

#7. Paramos un servicio
service odoo stop

#8. Iniciamos un servicio
service odoo start

#9. Instalamos un programa
apt-get install htop

#10. Vemos los recursos del sistema
htop

#11. Generamos una clave pública.
ssh-keygen
cat ~/.ssh/id_rsa.pub

#12. Actualizamos Odoo
/etc/init.d/odoo stop
su - odoo -s /bin/bash
odoo -d db11-spain -u all --stop-after-init --logfile=/dev/stdout
odoo -d db16-spain -u sis_base --i18n-overwrite --stop-after-init --logfile=/dev/stdout
/etc/init.d/odoo start


5. Introducción a HTML

Poco hay que hablar de HTML. Es un lenguaje de etiquetas. Veamos una página sencilla que no se va a comentar

<!doctype html>
<html lang="es">
  <head>
    <meta charset ="UTF8">
    <title>My Blog</title>
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <link rel="stylesheet" type="text/css" href="style.css">
    <script src="http://code.jquery.com/jquery-1.9.1.min.js">
    </script>
  </head>
  <body>
    <h1 class="primera">Esto es una texto grande</h1>
    <p id="myid">Esto es un párrafo</p>
  </body>
</html>

6. Introducción a bootstrap

Para insertar bootstrap hay que meter este código en la sección <head>

<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-T3c6CoIi6uLrA9TneNEoa7RxnatzjcDSCmG1MXxSR1GAsXEV/Dwwykc2MPK8M2HN" crossorigin="anonymous">

para hacer que sea reponsive se puede meter la clase container

<div class="container">
  <h1>Hello</h1>
</div>

Existen un monton de utilidades para tablas, especificando filas y columnas junt cons us espaciado 

<div class="container text-center">
  <div class="row">
    <div class="col-6 col-sm-4">.col-6 .col-sm-4</div>
    <div class="col-6 col-sm-4">.col-6 .col-sm-4</div>
    <!-- Force next columns-->
    <div class="w-100 d-none d-md-block"> </div>

    <div class="col-6 col-sm-4">.col-6 .col-sm-4</div>
    <div class="col-6 col-sm-4">.col-6 .col-sm-4</div>
  </div>
</div>

Los colores mas usados son marcados con clases primary,secondary, success, info, warning, danger, light y black.

7. Introducción a CSS

Se crea un archivo con extensión ".css" y se vincula a una página web.

La estructura es:

Los selectores pueden ser
selectores simples (se basan en el nombre, id, clase)
selectores combinados (mostando la relación entre ellos)
Pseudo-clases (basados en un estado)
Pseudo-elementoss (para una parte del elemento)
atributo









ODOO (VII) :Introducción a Github

 1. Obtener una clave SSH de Github

# Listar los ficheros de clave ssh
ls -al ~/.ssh

# Si no existe se crea
ssh-keygen -t ed25519 -C "micorreo@gmail.com"

# Pide nombre del fichero (por omisión ~/.ssh/id_ed25519
# Y también pide una contraseña

# Verificar el agente SSH. Y devuelve algo parecido a "Agent pid 127397"
eval "$(ssh-agent -s)"

# Añadir el SSH de identidad
ssh-add ~/.ssh/id_ed25519

# ver la clave
cat ~/.ssh/id_ed25519.pub

#  devuelve algo parecido a esto:
ssh-ed25519 AAAAC3NxvC1lZDI1NTE5AAAAICfJKIcde5bVkwsiUT6DdZ7tGLxzRrCN5b2LYcalcXdw micorreo@gmail.com

Ir a Github y clicar sobre el nombre de usuario


Hacer click sobre el icono

Seleccionar SSH and GPG Keys


Le damos al botón New SSH Key

Y le introducimos a clave que mostramos:

Y cuando la acepte mostrará algo parecido

2. Comandos básicos de Github (una vez se enga la clave SSH)

2.1. Clonar un repositorio

Si se tiene la clave ssh para clonarlo se puede utilizar.

$ git clone git@github.com:falconsoft3d/docker-odoo-16.git

Si solo se quiere descargar el repositorio con el botón code, aparece Download Zip

Una vez descargado podemos ejecutar en una terminal

$ code .

Y si tenemos VS Code, nos abrirá el proyecto

2.2. Descargar los cambios producidos por otro programador

Se entra a la carpeta donde está el proyecto y se ejecuta

$ git pull

Y también dentro de Github se pueden ver los commits realizados

Y haciendo click se puede ver cada uno de los cambios y quién los ha hecho.

2.3. Hacer una modificación local y guardarla en el repositorio remoto

Modiicamos un fichero y guardamos y ejecutamos en la shell

# Guarda localmente
$ git add .

# Se comenta el cambio.
$ git commit -m "Comentario de lo que se ha hecho"

# Se traslada el cambio al repositorio remoto
$ git push

2.4. Ver los cambios locales

Ejecutamos

$ git status

2.5. Trabajar con ramas (branches)

# Nos muestra en que "branch" estamos
$ git branch

# Cambiarse a la rama 14.0
$ git checkout 14.0

# Cambiarse a la rama master
$ git checkout master





ODOO (VI) :Introducción. Instalar-desinstalar módulos. Modo desarrollador. Editar vista. Nombres técnicos. Github. Acciones planificada

1. Introducción

Veamos la pantalla de aplicaciones:


Veamos que se puede hacer:

  • Instalar: Se le da al botón morado "Activar" y se instala el módulo elegido
  • La URL nos indica el nombre del módulo (en rojo) http://localhost:7069/web#action=36&model=ir.module.module&view_type=kanban&cids=1&menu_id=5
  • El menu de arriba (#Aplicaciones) se amplía si instalamos algun módulo
  • Si desinstalamos un módulo que ya se instaló, se pierden los datos que se han introducido.

2. Modo desarrollador

En el cuadrado del menú de arriba a la izquierda seleccionamos "Ajustes

y en el apartado "Herramientas del desarollador" podemos Activar el modo desarrollador

Una vez activado, aparece una pequeña cucaracha en la parte derecha de la franja morada.


3. Editar vista

Pinchamos en la cucaracha y aparece un menú y seleccionameos "editar vista" y podemos ver el html de la vista

y la vista html es:

y podemos modiicarla siempre que sepamos lo que hacemos.

4. Nombres técnicos de módulos


En la imagen aparecen los nombres técnicos de los módulos.

5. Código fuente en Github


Entramos en Github y le damos en buscar odoo



Entamos y seleccionamos nuestra version (16.0) y en la carpeta "addons", podemos ver las subcarpetas de los módulos cuyo nombre es el nombre técnico que vimos en el punto 4


Si entramos en un módulo cuaquiera tiene el fichero init, manifest, una carpeta de vistas, otra de controladores, modelo.

En el modelo, se pueden ver clases python..


6. Apartado "Técnico" de "Ajustes" 

En Ajustes-Técnico podemos ver:
  • Acciones planificadas: Donde se indica la frecuencia de la tarea y hora de ejecución
  • Parámetros del sistema:
En Ajustes-Usuarios-Compañía se puede ver los datos de la compañía

7. Otros

Se pueden aplicar filtros de búsqueda en cualquier vista, agupar por cliente etc.
Existen diferentes tipos de vista como la pivote, la kanban, calendaio











domingo, 24 de diciembre de 2023

ODOO (V) : FALLA!!!: Curiosidades Docker-compose con Dockerfile

 1. Introducción. Curiosidad

Si queremos saber que hay dentro de la imagen que hemos descargado de ODOO16, basta con ir al repositorio oficial de odoo16 con docker y ver el contenido del "Dockerfile"

#01. Choose base image
FROM debian:bullseye-slim
MAINTAINER Odoo S.A. <info@odoo.com>

#02. Set theDockerfile de nginx default shell of the image.
SHELL ["/bin/bash", "-xo", "pipefail", "-c"]

#03. Set environment variable to generate locale C.UTF-8 for postgres
# and general locale data
ENV LANG C.UTF-8

#04. The ARG instruction defines a variable that users can pass at build-time
# to the builder with the docker build command using the --build-arg <varname>=<value> flag.
# In this case retrieve the target architecture to install the correct wkhtmltopdf package
ARG TARGETARCH

#05. Install some deps, lessc and less-plugin-clean-css, and wkhtmltopdf
RUN apt-get update && \
apt-get install -y --no-install-recommends \
ca-certificates \
curl \
dirmngr \
fonts-noto-cjk \
gnupg \
libssl-dev \
node-less \
npm \
python3-magic \
python3-num2words \
python3-odf \
python3-pdfminer \
python3-pip \
python3-phonenumbers \
python3-pyldap \
python3-qrcode \
python3-renderpm \
python3-setuptools \
python3-slugify \
python3-vobject \
python3-watchdog \
python3-xlrd \
python3-xlwt \
xz-utils && \
if [ -z "${TARGETARCH}" ]; then \
TARGETARCH="$(dpkg --print-architecture)"; \
fi; \
WKHTMLTOPDF_ARCH=${TARGETARCH} && \
case ${TARGETARCH} in \
"amd64") WKHTMLTOPDF_ARCH=amd64 && WKHTMLTOPDF_SHA=9df8dd7b1e99782f1cfa19aca665969bbd9cc159 ;; \
"arm64") WKHTMLTOPDF_SHA=58c84db46b11ba0e14abb77a32324b1c257f1f22 ;; \
"ppc64le" | "ppc64el") WKHTMLTOPDF_ARCH=ppc64el && WKHTMLTOPDF_SHA=7ed8f6dcedf5345a3dd4eeb58dc89704d862f9cd ;; \
esac \
&& curl -o wkhtmltox.deb -sSL https://github.com/wkhtmltopdf/packaging/releases/download/0.12.6.1-3/wkhtmltox_0.12.6.1-3.bullseye_${WKHTMLTOPDF_ARCH}.deb \
&& echo ${WKHTMLTOPDF_SHA} wkhtmltox.deb | sha1sum -c - \
&& apt-get install -y --no-install-recommends ./wkhtmltox.deb \
&& rm -rf /var/lib/apt/lists/* wkhtmltox.deb

#05. Install latest postgresql-client
RUN echo 'deb http://apt.postgresql.org/pub/repos/apt/ bullseye-pgdg main' > /etc/apt/sources.list.d/pgdg.list \
&& GNUPGHOME="$(mktemp -d)" \
&& export GNUPGHOME \
&& repokey='B97B0AFCAA1A47F044F244A07FCC7D46ACCC4CF8' \
&& gpg --batch --keyserver keyserver.ubuntu.com --recv-keys "${repokey}" \
&& gpg --batch --armor --export "${repokey}" > /etc/apt/trusted.gpg.d/pgdg.gpg.asc \
&& gpgconf --kill all \
&& rm -rf "$GNUPGHOME" \
&& apt-get update \
&& apt-get install --no-install-recommends -y postgresql-client \
&& rm -f /etc/apt/sources.list.d/pgdg.list \
&& rm -rf /var/lib/apt/lists/*

#06. Install rtlcss (on Debian buster)RTLCSS is a framework for transforming Cascading Style Sheets (CSS) from Left-To-Right
RUN npm install -g rtlcss

#07. Install Odoo
ENV ODOO_VERSION 16.0
ARG ODOO_RELEASE=20231222
ARG ODOO_SHA=739d7dd119c00fa27ab1bcd140b70389ce271170
RUN curl -o odoo.deb -sSL http://nightly.odoo.com/${ODOO_VERSION}/nightly/deb/odoo_${ODOO_VERSION}.${ODOO_RELEASE}_all.deb \
&& echo "${ODOO_SHA} odoo.deb" | sha1sum -c - \
&& apt-get update \
&& apt-get -y install --no-install-recommends ./odoo.deb \
&& rm -rf /var/lib/apt/lists/* odoo.deb

#08. Copy entrypoint script and Odoo configuration file
COPY ./entrypoint.sh /
COPY ./odoo.conf /etc/odoo/

#09. Set permissions and Mount /var/lib/odoo to allow restoring filestore and /mnt/extra-addons for users addons
RUN chown odoo /etc/odoo/odoo.conf \
&& mkdir -p /mnt/extra-addons \
&& chown -R odoo /mnt/extra-addons
VOLUME ["/var/lib/odoo", "/mnt/extra-addons"]

#10. Expose Odoo services
EXPOSE 8069 8071 8072

#11. Set the default config file
ENV ODOO_RC /etc/odoo/odoo.conf

COPY wait-for-psql.py /usr/local/bin/wait-for-psql.py

#12. Set default user when running the container
USER odoo

ENTRYPOINT ["/entrypoint.sh"]
CMD ["odoo"]


2. FALLA:Curiosidad: Instalar Odoo+Postgres+Nginx usando docker-compose y los respectivos dockerfiles.

Si queremos complicar un poco el asunto pero entender un poco como se pueden utilizar docker-compose junto con dockerfiles hacemos:

  1. Crear una carpeta por ejemplo prueba06 y siturarnos en ella
  2. Descargar el Dockerfile de Odoo16 y lo renombramos a odoo.dockerfile.
  3. Descargar el Dockerfile de Postgres13 y lo renombramos a postgres.dockerfile.
  4. Descargar el Dockerfile de nginx y lo renombramos a nginx.dockerfile.

Y ahora creamos un nuevo docker-compose.yml en base al anterior pero cambiando image: por dockerfile: 

Pero al hacer docker-compose falla!

version: '3.3'
services:
    odoo:
        container_name: odoo16_02
        #image: odoo:16.0
        build: 
            context: .
            dockerfile: odoo.dockerfile
        env_file: odoo16_pg13.env                 # environment file
        depends_on:
            - postgresql
        ports:
            - "7069:8069"                         #port mapping(custom-port:8069)
        volumes:
            - ./odoo-data/:/var/lib/odoo
            - ./odoo-conf/:/etc/odoo
            - ./odoo-adds/:/odoo/extra-addons      #SAME AS odoo.conf addons_path
        #--Edu (1)
        networks:
            odoo_network:
                aliases: 
                    - odoo_host
                #ipv4_adress: 172.21.0.4 
        #Fi--Edu (1)
    postgresql:
        container_name: postgres_odoo_02
        #image: postgres:13
        build: 
            context: .
            dockerfile: postgres.dockerfile
        env_file: odoo16_pg13.env               # environment file
        volumes:
            - ./postgresql-data/:/var/lib/postgresql/data/pgdata  ##SAME AS odoo16_pg13.env PGDAT [4]
        #--Edu (1)
        networks:
            odoo_network:
                aliases: 
                    - postgres_host
                #ipv4_adress: 172.21.0.2 
        #Fi--Edu (1)
    nginx:
        container_name: nginx_odoo_02
        #image: nginx:latest
        build: 
            context: .
            dockerfile: nginx.dockerfile
        depends_on:
            - odoo
        ports:
            - "7080:80"
            - "7443:443"
        #1. Copiar la CARPETA de certificados a la carpeta ./nginx-certs
        #2. Copiar el FICHERO de configuración del proxy nginx.conf   a la carpeta ./nginx-etc/nginx/conf.d
        volumes:
            - ./nginx-certs:/etc/nginx/certs
        #    - ./nginx-log/:/var/log
        #    - ./nginx-conf/odoo-nginx.conf:/etc/nginx/conf.d/odoo-nginx.conf
            - ./nginx-conf/odoo-nginx.conf:/etc/nginx/conf.d/default.conf
        #--Edu (1)
        networks:
            odoo_network:
                aliases: 
                    - nginx_host
                #ipv4_adress: 172.21.0.3 
        #Fi--Edu (1)
volumes:
    odoo-data: {}
    odoo-conf: {}
    odoo-adds: {}

    postgresql-data: {}

    nginx-certs: {}
    #nginx-conf/odoo-nginx.conf: {}    #?????????

#--Edu (1)            
networks:
    odoo_network:
        #name: odoo_net
        driver: bridge 
        #ipam:
        #    driver: DEFAULT
                #- subnet: 172.21.0.0/16
                #- gateway: 172.21.0.1  #Optional

#Fi--Edu (1)