
# Estructura de carpetas

Se recomienda la siguiente estructura de carpeta para iniciar proyecto

~~~txt
/app
  |-- /transporte
  |    |-- (codigo del proyecto backend)
  |
  |-- /dumps
  |    |-- (respaldos de la base de datos transporte)
  |
  |-- /proto
  |    |-- (codigo del proyecto)
  |
  |-- docker-compose.yml
  |-- restore_db.sh
~~~
<br>
<br>
<br>

# Docker

Para iniciar la aplicacion usando docker

~~~bash
cd /app
docker compose up -d
~~~
<br>
<br>
<br>


# Proyectos involucrados

## Transporte

Ref: https://gitlab.com/m3f_usm/admin_transporte/backend

## Proto

Ref: https://gitlab.com/m3f_usm/proto

## Respaldos de base de datos

Ver información en:

https://gitlab.com/m3f_usm/admin_transporte/backend/-/wikis/Databases

<br>
<br>
<br>

# archivo: restore_db.sh

~~~sh
#!/bin/sh

# obtener el ultimo respaldo de la carpeta
LASTFILEDUMP=$(ls -t /dumps/*.sql.gz | sort -r | head -n 1)
echo "FILE: $LASTFILEDUMP"

# restaurar la base datos
gunzip -c "$LASTFILEDUMP" | psql -U postgres "$POSTGRES_DB"
~~~


# archivo produccion: docker-compose.yml

~~~yml
version: '3'
name: transporte

services:

  backend:
      image: python:3.11-alpine
      depends_on:
        - db
      environment:
        - PORT=4000
        - DBHOST=db
        - DBPORT=5432
        - DBNAME=transporte
        - DBSCHEMA=public
        - DBUSER=postgres
        - DBPASS=password
        - DB_REDIS_HOST=dbproto
        - DB_REDIS_PORT=6379
        - SECRET_JWT="kf6Jc!f30Z!1k1N0#!%#"
      ports:
        - 4000:4000
      volumes:
        - ./transporte:/app
        - venv:/root/venv
      working_dir: /app
      command: sh -c "
        [ -d /root/venv/bin ] || ( \
            python -m venv /root/venv/ \
            && . /root/venv/bin/activate \
            && pip install -r requirements.txt \
        ) ;

        . /root/venv/bin/activate ;

        cd /app ;
        [ -d project ] || django-admin startproject project ;
        [ -f .env ] || ( [ -f .env.develop ] && cp .env.develop .env ) ;
        chmod -R o+w project/ ;
        python project/manage.py runserver 0.0.0.0:$$PORT
        "

  db:
    image: postgis/postgis:14-3.4-alpine
    volumes:
      - db:/var/lib/postgresql/data
      - ./dumps:/dumps
      - ./restore_db.sh:/docker-entrypoint-initdb.d/02_restore_db.sh
    ports:
      - 5432:5432
    environment:
      POSTGRES_PASSWORD: password
      POSTGRES_DB: transporte
      PGDATA: /var/lib/postgresql/data/pgdata

  proto:
    image: python:3.11-alpine
    environment:
      - DB_REDIS_HOST=dbproto
      - DB_REDIS_PORT=6379
      - TZ=America/Santiago
    volumes:
      - ./proto:/app
      - venv_proto:/root/venv
    working_dir: /app
    command: sh -c "
      [ -d /root/venv/bin ] || ( \
          python -m venv /root/venv/ \
          && . /root/venv/bin/activate \
          && pip install -r requirements.txt \
      ) ;

      . /root/venv/bin/activate ;

      cd /app ;
      [ -f .env ] || ( [ -f .env.develop ] && cp .env.develop .env ) ;
      watch -n 30 -t python main.py
      "

  dbproto:
    image: redis:7.2-alpine


volumes:
  db:
  venv:
  venv_proto:
~~~

<br>
<br>
<br>

# tunnel para desarrollo

Ver información en:

https://gitlab.com/m3f_usm/admin_transporte/backend/-/wikis/home


# archivo desarrollo: docker-compose.yml 

~~~yml
version: '3'
name: transporte

services:

  frontend:
    image: node:18-alpine
    volumes:
      - ./frontend:/app
    ports:
      - 3000:3000
    environment:
      - VITE_PORT=3000
      - VITE_BACKEND=http://localhost:4000/api
    working_dir: /app
    command: sh -c "
      [ ! -d node_modules ] && npm install ;
      chmod -R o+w . ;
      npm run dev
      "

  backend:
      image: python:3.11-alpine
      depends_on:
        - db
      environment:
        - PORT=4000
        - DBHOST=db
        - DBPORT=5432
        - DBNAME=transporte
        - DBSCHEMA=public
        - DBUSER=postgres
        - DBPASS=password
        - DB_REDIS_HOST=dbproto
        - DB_REDIS_PORT=6379
        - SECRET_JWT="kf6Jc!f30Z!1k1N0#!%#"
      ports:
        - 4000:4000
      volumes:
        - ./transporte:/app
        - venv:/root/venv
      working_dir: /app
      command: sh -c "
        [ -d /root/venv/bin ] || ( \
            python -m venv /root/venv/ \
            && . /root/venv/bin/activate \
            && pip install -r requirements.txt \
        ) ;

        . /root/venv/bin/activate ;

        cd /app ;
        [ -d project ] || django-admin startproject project ;
        [ -f .env ] || ( [ -f .env.develop ] && cp .env.develop .env ) ;
        chmod -R o+w project/ ;
        python project/manage.py runserver 0.0.0.0:$$PORT
        "
      extra_hosts:
        - db:<direccion ip de tu computador>


volumes:
  venv:
~~~


# Script para levantar aplicacion python sin docker

## file: start.sh

~~~bash
#!/bin/sh
cd /app

# si no existe directorio de ambiente, se crea
if [ ! -d /root/venv ]; then
  python -m venv /root/venv
  . /root/venv/bin/activate
  pip install -r requirements.txt
fi

# activar ambiente con dependencias
. /root/venv/bin/activate

# si no existe un proyecto inicial, lo crea
if [ ! -d /app/project ]; then
  django-admin startproject project
fi

# iniciar servidor con puerto 8000
python /app/project/manage.py runserver 0.0.0.0:8000
~~~

# Extraer models de base de datos

~~~bash
python manage.py inspectdb > api/models.py
~~~