# 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 ~~~


# Docker Para iniciar la aplicacion usando docker ~~~bash cd /app docker compose up -d ~~~


# 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


# 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 para compilar imagen: Dockerfile ~~~docker # seccion frontend FROM node:20-alpine as frontend ARG gitusername ARG gitpassword # soluciona error en descarga de repositorio RUN sed -i 's/https\:\/\//http\:\/\//g' /etc/apk/repositories # descargar proyecto RUN apk update && apk add git RUN git clone "https://${gitusername}:${gitpassword}@gitlab.com/m3f_usm/admin_transporte/frontend" /frontend RUN git clone "https://${gitusername}:${gitpassword}@gitlab.com/m3f_usm/admin_transporte/backend" /backend RUN rm -rf /backend/project/dist # compilar WORKDIR /frontend RUN npm install && npm run build # seccion final -- se omite git y archivos innecerarios para reducir imagen FROM python:3.11-alpine COPY --from=frontend /backend/project/ /app/project COPY --from=frontend /backend/readme.md /app COPY --from=frontend /backend/requirements.txt /app COPY --from=frontend /frontend/dist/ /app/project/dist WORKDIR /app RUN pip install -r requirements.txt ENTRYPOINT ["python3"] CMD [ "/app/project/manage.py", "runserver", "0.0.0.0:4000" ] ~~~ # instrucciones para compilar archivo Dockerfile ~~~bash docker build -t -f Dockerfile --no-cache --build-arg gitusername= --build-arg gitpassword= . # ejemplo # docker build -t transporte:v1.2 -f Dockerfile --no-cache --build-arg gitusername=johndoe --build-arg gitpassword=mypassword . ~~~ # archivo produccion: docker-compose.yml ~~~yml version: '3' name: transporte services: transporte: image: transporte:v1.2 depends_on: - db environment: - PORT=4000 ports: - 4000:4000 volumes: - ./uploads:/uploads #- .env.prod:/app/.env # (opcional: indicar conexiones a base datos en otro servidor) 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: - dbredis:/data dbmongo: image: mongo:jammy volumes: - dbmongo:/data/db - dbmongoconfig:/data/configdb ports: - 27017:27017 environment: MONGO_INITDB_ROOT_USERNAME: root MONGO_INITDB_ROOT_PASSWORD: password volumes: db: dbredis: dbmongo: dbmongoconfig: venv_proto: ~~~


# 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 ports: - 4000:4000 volumes: - ./backend:/app - ./uploads:/uploads - 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: - dbredis:/data dbmongo: image: mongo:jammy volumes: - dbmongo:/data/db - dbmongoconfig:/data/configdb ports: - 27017:27017 environment: MONGO_INITDB_ROOT_USERNAME: root MONGO_INITDB_ROOT_PASSWORD: password volumes: db: dbredis: dbmongo: dbmongoconfig: venv: venv_proto: ~~~ # 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 ~~~