Esta guia resume los comandos para desplegar en produccion la pila integrada:
- RELECOV Platform
- iSkyLIMS
- Nextstrain
- Apache reverse proxy en contenedor
- Base de datos MySQL/MariaDB externa
Se asume que los datos iniciales vienen del entorno de desarrollo:
- dump de base de datos de
relecov-platform - dump de base de datos de
relecov-iskylims - documentos de
relecov-platform - documentos de
relecov-iskylims - datos de Nextstrain
Los ejemplos usan Podman rootless. Si se usa Docker, sustituir --engine podman por --engine docker y podman compose por docker compose.
- Instalacion de RELECOV Platform en produccion con Podman rootless
- Indice
- Requisitos minimos del host
- Clonar repositorios
- Preparar directorios del host
- Preparar ficheros recibidos de desarrollo
- Crear bases de datos de produccion e importar dumps
- Crear volumenes e importar documentos y Nextstrain
- Configurar produccion
- Instalar contenedores
- Reparar permisos
- Comprobaciones
- Operaciones utiles
git- Podman rootless y
podman-composeopodman compose - Docker Engine y Docker Compose v2 si no se usa Podman
- Acceso a un servidor MySQL/MariaDB de produccion
- Cliente MySQL/MariaDB en el host para crear bases de datos e importar dumps
- Usuario de sistema con permisos para ejecutar contenedores rootless
- Permisos de
sudosolo para preparar paquetes y directorios del host
No ejecutar container_install.sh con sudo. El usuario que ejecuta Podman debe ser el mismo usuario que ejecuta el instalador.
Los dos repositorios deben quedar al mismo nivel:
mkdir -p /opt/containers_apps/relecov-platform-all
cd /opt/containers_apps/relecov-platform-all
git clone https://github.com/BU-ISCIII/relecov-platform.git relecov-platform
git clone https://github.com/BU-ISCIII/iskylims.git relecov-iskylimsActualizar codigo si los repositorios ya existen:
cd /opt/containers_apps/relecov-platform-all/relecov-platform
git pull
cd /opt/containers_apps/relecov-platform-all/relecov-iskylims
git pullCrear rutas de bind mounts para configuracion Apache y logs:
sudo mkdir -p /srv/containers/bind/relecov-platform/relecov_apache_conf
sudo mkdir -p /srv/containers/bind/relecov-platform/relecov_django_setting
sudo mkdir -p /var/log/local/relecov-platform/apache
sudo mkdir -p /var/log/local/relecov-platform/apps
sudo mkdir -p /var/log/local/relecov-iskylims/apps
sudo chown -R "_USER-RUNNING_PODMAN_:_USER-RUNNING_PODMAN_" /srv/containers/bind/relecov-platform/relecov_apache_conf
sudo chown -R "_USER-RUNNING_PODMAN_:_USER-RUNNING_PODMAN_" /srv/containers/bind/relecov-platform/relecov_django_setting
sudo chown -R "_USER-RUNNING_PODMAN_:_USER-RUNNING_PODMAN_" /var/log/local/relecov-platform
sudo chown -R "_USER-RUNNING_PODMAN_:_USER-RUNNING_PODMAN_" /var/log/local/relecov-platform
sudo chown -R "_USER-RUNNING_PODMAN_:_USER-RUNNING_PODMAN_" /var/log/local/relecov-iskylims
sudo chown -R "bioinfo:bioinfo" /srv/containers/bind/relecov-platform/relecov_apache_conf
sudo chown -R "bioinfo:bioinfo" /srv/containers/bind/relecov-platform/relecov_django_setting
sudo chown -R "bioinfo:bioinfo" /var/log/local/relecov-platform
sudo chown -R "bioinfo:bioinfo" /var/log/local/relecov-platform
sudo chown -R "bioinfo:bioinfo" /var/log/local/relecov-iskylimsSi la infraestructura usa rutas distintas, reflejarlas despues en APACHE_CONF_PATH, APACHE_LOG_PATH, PLATFORM_LOG_PATH e ISKYLIMS_LOG_PATH.
Ejemplo de carpeta de entrada:
mkdir -p /opt/containers_apps/relecov-platform-all/inputCopiar ahi estos ficheros, ajustando nombres si hace falta:
/opt/containers_apps/relecov-platform-all/input/relecov_platform_dev.sql
/opt/containers_apps/relecov-platform-all/input/relecov_iskylims_dev.sql
/opt/containers_apps/relecov-platform-all/input/relecov_platform_documents.tar
/opt/containers_apps/relecov-platform-all/input/relecov_iskylims_documents.tar
/opt/containers_apps/relecov-platform-all/input/nextstrain_data.tar
Variables usadas en los comandos:
DB_HOST="<host_mysql>"
DB_PORT="3306"
DB_ADMIN_USER="root"
PLATFORM_DB="relecov_prod"
ISKYLIMS_DB="iskylims_prod"
APP_DB_USER="django"
APP_DB_PASS="<password_segura>"Crear bases de datos y usuario:
mysql --user="$DB_ADMIN_USER" --password --host="$DB_HOST" --port="$DB_PORT" <<SQL
CREATE DATABASE IF NOT EXISTS ${PLATFORM_DB} CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE DATABASE IF NOT EXISTS ${ISKYLIMS_DB} CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER IF NOT EXISTS '${APP_DB_USER}'@'%' IDENTIFIED BY '${APP_DB_PASS}';
GRANT ALL PRIVILEGES ON ${PLATFORM_DB}.* TO '${APP_DB_USER}'@'%';
GRANT ALL PRIVILEGES ON ${ISKYLIMS_DB}.* TO '${APP_DB_USER}'@'%';
FLUSH PRIVILEGES;
SQLImportar dumps de desarrollo:
mysql --user="$APP_DB_USER" --password --host="$DB_HOST" --port="$DB_PORT" "$PLATFORM_DB" \
< /opt/containers_apps/relecov-platform-all/input/relecov_platform_dev.sql
mysql --user="$APP_DB_USER" --password --host="$DB_HOST" --port="$DB_PORT" "$ISKYLIMS_DB" \
< /opt/containers_apps/relecov-platform-all/input/relecov_iskylims_dev.sqlUsar un nombre de proyecto Compose estable para que los volumenes tengan nombres previsibles:
export COMPOSE_PROJECT_NAME=relecovCrear volumenes:
podman volume create relecov_relecov_documents
podman volume create relecov_iskylims_documents
podman volume create relecov_nextstrain_dataImportar documentos y datos. podman volume import espera un fichero .tar con el contenido del volumen.
El .tar debe contener directamente lo que debe quedar dentro del volumen, no una carpeta contenedora adicional llamada documents o nextstrain_data.
Estructura esperada para relecov_platform_documents.tar:
relecov_platform_documents.tar
|-- <fichero_o_directorio_1>
|-- <fichero_o_directorio_2>
`-- ...
Despues del import, debe quedar asi dentro del volumen:
/opt/relecov-platform/documents/
|-- <fichero_o_directorio_1>
|-- <fichero_o_directorio_2>
`-- ...
No debe quedar asi:
/opt/relecov-platform/documents/
`-- documents/
|-- <fichero_o_directorio_1>
`-- ...
Ejemplo para crear el .tar correctamente desde el entorno origen:
tar -cf relecov_platform_documents.tar -C /opt/relecov-platform/documents .
tar -cf relecov_iskylims_documents.tar -C /opt/iskylims/documents .
tar -cf nextstrain_data.tar -C /ruta/nextstrain_data .Importar los .tar:
podman volume import relecov_relecov_documents /opt/containers_apps/relecov-platform-all/input/relecov_platform_documents.tar
podman volume import relecov_iskylims_documents /opt/containers_apps/relecov-platform-all/input/relecov_iskylims_documents.tar
podman volume import relecov_nextstrain_data /opt/containers_apps/relecov-platform-all/input/nextstrain_data.tarSi el compose se ejecuto sin COMPOSE_PROJECT_NAME=relecov, revisar los nombres reales:
podman volume lsCrear ficheros de configuracion:
cd /opt/containers_apps/relecov-platform-all/relecov-platform
cp conf/docker_production_settings.txt conf/my_prod_settings_relecov.txt
cp ../relecov-iskylims/conf/docker_production_settings.txt ../relecov-iskylims/conf/my_prod_settings_iskylims.txtEditar configuracion de RELECOV Platform:
nano conf/my_prod_settings_relecov.txtValores principales:
INSTALL_PATH='/opt/relecov-platform'
APACHE_CONF_PATH='/srv/containers/bind/relecov-platform/relecov_apache_conf'
DJANGO_SETTINGS_PATH='/srv/containers/bind/relecov-platform/relecov_django_setting/settings.py'
APACHE_LOG_PATH='/var/log/local/relecov-platform/apache'
PLATFORM_LOG_PATH='/var/log/local/relecov-platform/apps'
ISKYLIMS_LOG_PATH='/var/log/local/relecov-iskylims/apps'
APACHE_FORWARDED_PROTO='https'
APACHE_FORWARDED_PORT='443'
APACHE_HOST_PORT='8090'
APP_UID='1212'
APP_GID='1212'
APP_PORT='8000'
ISKYLIMS_APP_PORT='8001'
NEXTSTRAIN_PORT='8100'
MAPBOX_ACCESS_TOKEN='<token_publico_mapbox_restringido_por_URL>'
MAPBOX_STYLE_OWNER='mapbox'
MAPBOX_STYLE_ID='light-v11'
DB_USER='django'
DB_PASS='<password_segura>'
DB_NAME='relecov_prod'
DB_SERVER_IP='<host_mysql>'
DB_PORT=3306
DNS_URL='relecov-platform.isciiides.es'
RELECOV_PLATFORM_SERVER_NAME='relecov-platform.isciiides.es'
RELECOV_ISKYLIMS_SERVER_NAME='relecov-iskylims.isciiides.es'
RELECOV_NEXTSTRAIN_SERVER_NAME='nextstrain.isciiides.es'
EMAIL_HOST_SERVER='<smtp>'
EMAIL_PORT='25'
EMAIL_HOST_USER='<correo>'
EMAIL_HOST_PASSWORD=''
EMAIL_USE_TLS='False'Editar configuracion de iSkyLIMS:
nano ../relecov-iskylims/conf/my_prod_settings_iskylims.txtValores principales:
INSTALL_PATH='/opt/iskylims'
APP_UID='1212'
APP_GID='1212'
APP_PORT='8001'
APACHE_FORWARDED_PROTO='https'
APACHE_FORWARDED_PORT='443'
DB_USER='django'
DB_PASS='<password_segura>'
DB_NAME='iskylims_prod'
DB_SERVER_IP='<host_mysql>'
DB_PORT=3306
DNS_URL='relecov-iskylims.isciiides.es'
EMAIL_HOST_SERVER='<smtp>'
EMAIL_PORT='25'
EMAIL_HOST_USER='<correo>'
EMAIL_HOST_PASSWORD=''
EMAIL_USE_TLS='False'Ejecutar desde relecov-platform:
cd /opt/containers_apps/relecov-platform/relecov-platform
export COMPOSE_PROJECT_NAME=relecov
bash container_install.sh --engine podman \
--action upgrade \
--git_revision develop \
--install_conf_map app,my_prod_settings_relecov.txt \
--install_conf_map iskylims_app,../relecov-iskylims/my_prod_settings_iskylims.txt \
2>&1 | tee relecov_prod_install_$(date +%Y%m%d_%H%M%S).logEl instalador:
- construye las imagenes;
- genera
.env.prod.file; - renderiza la configuracion Apache;
- arranca
apache,app,iskylims_appynextstrain; - aplica migraciones;
- refresca estaticos;
- prepara permisos de bind mounts y volumenes.
Ejecutar si se han importado volumenes, cambiado propietarios, recreado contenedores manualmente o cambiado APP_UID / APP_GID:
cd /opt/containers_apps/relecov-platform-all/relecov-platform
export COMPOSE_PROJECT_NAME=relecov
bash container_install.sh --engine podman \
--action fix-permissions \
--install_conf_map app,my_prod_settings_relecov.txt \
--install_conf_map iskylims_app,../relecov-iskylims/my_prod_settings_iskylims.txtSi los contenedores no estaban arrancados, arrancar y repetir para reparar tambien los volumenes montados:
podman compose --env-file .env.prod.file -f docker-compose.prod.yml up -d
bash container_install.sh --engine podman \
--action fix-permissions \
--install_conf_map app,conf/my_prod_settings_relecov.txt \
--install_conf_map iskylims_app,../relecov-iskylims/conf/my_prod_settings_iskylims.txtEstado de contenedores:
cd /opt/containers_apps/relecov-platform-all/relecov-platform
export COMPOSE_PROJECT_NAME=relecov
podman compose --env-file .env.prod.file -f docker-compose.prod.yml psLogs:
podman compose --env-file .env.prod.file -f docker-compose.prod.yml logs --tail 200 apache
podman compose --env-file .env.prod.file -f docker-compose.prod.yml logs --tail 200 app
podman compose --env-file .env.prod.file -f docker-compose.prod.yml logs --tail 200 iskylims_app
podman compose --env-file .env.prod.file -f docker-compose.prod.yml logs --tail 200 nextstrainChecks Django:
podman exec -it relecov_app python /opt/relecov-platform/manage.py check
podman exec -it relecov_iskylims_app python /opt/iskylims/manage.py checkChecks por Apache:
curl -I -H "Host: relecov-platform.isciiides.es" http://<host>:8090
curl -I -H "Host: relecov-iskylims.isciiides.es" http://<host>:8090
curl -I -H "Host: nextstrain.isciiides.es" http://<host>:8090Usar siempre .env.prod.file al ejecutar Compose directamente:
export COMPOSE_PROJECT_NAME=relecov
podman compose --env-file .env.prod.file -f docker-compose.prod.yml ps
podman compose --env-file .env.prod.file -f docker-compose.prod.yml up -d
podman compose --env-file .env.prod.file -f docker-compose.prod.yml restart app
podman compose --env-file .env.prod.file -f docker-compose.prod.yml restart iskylims_app
podman compose --env-file .env.prod.file -f docker-compose.prod.yml downEntrar a contenedores:
podman exec -it relecov_app bash
podman exec -it relecov_iskylims_app bashExportar backups desde produccion:
BACKUP_DIR=~/relecov_prod_backup_$(date +%Y%m%d_%H%M%S)
mkdir -p "$BACKUP_DIR"
mysqldump --user="$APP_DB_USER" --password --host="$DB_HOST" --port="$DB_PORT" "$PLATFORM_DB" \
> "$BACKUP_DIR/relecov_platform.sql"
mysqldump --user="$APP_DB_USER" --password --host="$DB_HOST" --port="$DB_PORT" "$ISKYLIMS_DB" \
> "$BACKUP_DIR/relecov_iskylims.sql"
podman volume export relecov_relecov_documents > "$BACKUP_DIR/relecov_platform_documents.tar"
podman volume export relecov_iskylims_documents > "$BACKUP_DIR/relecov_iskylims_documents.tar"
podman volume export relecov_nextstrain_data > "$BACKUP_DIR/nextstrain_data.tar"