diff --git a/Dockerfile b/Dockerfile index 7946b64..8163936 100644 --- a/Dockerfile +++ b/Dockerfile @@ -35,7 +35,10 @@ RUN git clone https://framagit.org/les/gancio.git && \ cd gancio && \ git checkout $GANCIO_VERSION +# Aplicar parches WORKDIR /opt/gancio +COPY patches patches +RUN git apply patches/*.patch # Instalar dependencias de desarrollo, compilar y empaquetar RUN yarn install && \ diff --git a/README.md b/README.md index 7c2fa10..84c9f6f 100644 --- a/README.md +++ b/README.md @@ -122,7 +122,7 @@ docker-compose run --rm gancio "gancio setup --docker --db=sqlite" ``` -## Instalacion Automatica ( en desarrollo, ver TODOs ) +## Instalacion Automatica En este caso, nos interesa desplegar Gancio sin intervencion de una usuaria. Queremos: @@ -147,6 +147,8 @@ Al editar el archvio, los datos que nos interesa cambiar en este archivo son nuevo con `cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w ${1:-24} | head -n 1` - `admin_email`, email de la cuenta de administradora (se usa para acceder al gestionar el servicio) +- `admin_pass`, clave de acceso para la cuenta de administradora. _SE ELIMINA + AUTOMATICAMENTE DEL FICHERO AL CREAR LA CUENTA_ - `smtp`, si se desea enviar correos, modificar a los datos de vuestro servidor de SMPT @@ -159,26 +161,15 @@ segura de lo que haces ;) ### Cuenta de administradora -La mayoria de los datos que necesita la instancia de Gancio se encuentran en -el `config.json`, a excepcion de la clave de la cuenta de administradora. - -Esta clave solo sera necesaria en el caso de iniciar una nueva instancia de +Esta cuenta solo se creara en el caso de iniciar una nueva instancia de Gancio, sin datos. -Si estamos re-iniciando una instancia existente, o migrando una instancia que -ya cuenta con su propia base de datos, esta variable 'clave de administradora' -sera ignorada y se deberan conocer los datos de la cuenta de administradora -originales. +Si estamos re-iniciando una instancia existente, estos datos seran ignorados +y se deberan conocer los datos de la cuenta de administradora originales. Entonces, en una instancia nueva iniciada sin datos, la administradora podra -loguearse utilizando el dato `admin_email` informado en el `config.json` y la -clave que especifiquemos en la variable de entorno `GANCIO_ADMIN_PASS` - -_TODO cuando iniciemos con una base de datos vacia, crear la usuaria admin con -los datos del config.json y un password pasado por entorno -idea: crear script node que apalanque las funciones existentes para ejecutar las -migraciones en la base de datos, y para crear la usuaria administradora_ - +loguearse utilizando el dato `admin_email` y `admin_pass` informado en el +`config.json` ### Autenticacion para SMTP @@ -197,6 +188,7 @@ informacion en la seccion `smtp` del fichero `config.json` ... ``` + ## Configuracion del servicio Dado que utilizamos `docker-compose` para ejecutar Gancio, aprovecharemos la posibilidad de definir nuestras variables de entorno en un archivo `.env` que @@ -209,26 +201,13 @@ cp .env.sample .env ``` ### Variables de Despliegue (necesarias en todos los casos) -- `GANCIO_DATA_PATH`, ruta en el host que contiene los datos de Gancio _(valor por - defecto `./data` = subcarpeta `data` en la misma carpeta que -`docker-compose.yml`)_ +- `GANCIO_DATA_PATH`, ruta en el host que contiene los datos de Gancio + _(valor por defecto `./data` = subcarpeta `data` en la misma carpeta que + `docker-compose.yml`)_ - `GANCIO_PORT`, puerto del host en el que se expondra el servicio de Gancio _(valor por defecto `13120`)_ -### Variables de Instalacion Automatica (solo para Instalaciones Automaticas) -Estas variables solo son necesarias en los procesos de instalacion automatica -de nuevas instancias. -Se pueden pasar como variables de entorno al docker durante su primera -ejecucion, ej `docker-compose run -e MI_VAR=valor gancio ...` -Como alternativa, se pueden informar estas variables en el fichero `.env`, en -cuyo caso se borran luego de ser utilizadas para finalizar la instalacion -automatica. -- `GANCIO_ADMIN_PASS`, clave de acceso de la cuenta de administradora [ solo - es necesaria en Instalaciones Automaticas nuevas ]. - -_TODO eliminar estas variables de `.env` luego de persistirlas en la bbdd_ - ## Ejecucion de Gancio Llegado este punto, podemos iniciar nuestra intancia diff --git a/docker-compose.yml b/docker-compose.yml index 3c1694f..f305780 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -3,10 +3,9 @@ version: '3' services: gancio: build: . - restart: always image: gancio:latest container_name: gancio - command: [ "gancio start --docker --db=sqlite" ] + command: [ "gancio deploy --docker --db=sqlite --autostart" ] volumes: - $GANCIO_DATA_PATH:/opt/gancio ports: diff --git a/patches/0001-adds-deploy-command-to-gancio.patch b/patches/0001-adds-deploy-command-to-gancio.patch new file mode 100644 index 0000000..ca458ac --- /dev/null +++ b/patches/0001-adds-deploy-command-to-gancio.patch @@ -0,0 +1,104 @@ +From b2722e244c8249d6cdc3464610fb257e8c80d849 Mon Sep 17 00:00:00 2001 +From: matus +Date: Fri, 4 Jun 2021 16:29:07 +0000 +Subject: [PATCH] adds deploy command to gancio + +--- + server/cli.js | 67 +++++++++++++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 67 insertions(+) + +diff --git a/server/cli.js b/server/cli.js +index 41005ca2..7148f3e0 100755 +--- a/server/cli.js ++++ b/server/cli.js +@@ -305,6 +305,67 @@ async function setup (options) { + process.exit(0) + } + ++async function deploy (options) { ++ consola.info('You\'re going to deploy gancio on this machine.') ++ ++ // check for mandatory config.json ++ if (firstrun.check(options.config)) { ++ consola.error(` ⚠ MISSING CINFIGURATION: Configuration file "${options.config}" not found! ++ Use "--config " to specify another path, or generate one running 'gancio setup'`) ++ process.exit(-1) ++ } ++ const config = require(options.config) ++ ++ // run migrations on ddbb ++ await run_migrations(config.db) ++ ++ const db = require('./api/models') ++ const User = require('./api/models/user') ++ await db.authenticate() ++ ++ // if new instance, initialize ++ const users = await User.findAll() ++ if (users.length === 0) { ++ // check for necesary data ++ if (!(config.admin_email && config.admin_pass)) { ++ consola.error(`⚠ MISSING CONFIGURATION: Cannot create Admin account on new deployment ++ Please, specify both 'admin_email' and 'admin_pass' on the config file`) ++ process.exit(-1) ++ } ++ ++ // generate a random salt ++ consola.info(`Generate random salt`) ++ config.secret = Math.random().toString(36).substring(2, 15) + Math.random().toString(36).substring(2, 15) ++ ++ // create admin user ++ const admin = { email: config.admin_email, password: config.admin_pass } ++ ++ consola.info(`Create admin with email: ${admin.email}`) ++ await User.create({ ++ email: admin.email, ++ password: admin.password, ++ is_admin: true, ++ is_active: true ++ }) ++ ++ // remove admin password and store salt/secret on config.json ++ delete config.admin_pass ++ ++ consola.info(`Save configuration to ${options.config}`) ++ try { ++ fs.writeFileSync(options.config, JSON.stringify(config, null, 2)) ++ } catch (e) { ++ consola.warn(` ⚠️ ${e}. You can specify configuration path using '--config'`) ++ } ++ ++ } ++ ++ if ( options.autostart ) { ++ // start gancio using default method ++ start(options) ++ } ++} ++ + consola.info(`📅 ${pkg.name} - v${pkg.version} - ${pkg.description}`) + + require('yargs') +@@ -323,6 +384,11 @@ require('yargs') + describe: 'Configuration file', + default: '/opt/gancio/config.json' + }) ++ .option('autostart', { ++ describe: 'Start gancio service after deploying', ++ default: false, ++ type: 'boolean' ++ }) + .coerce('config', config_path => { + const absolute_config_path = path.resolve(cwd, config_path) + process.env.config_path = absolute_config_path +@@ -330,6 +396,7 @@ require('yargs') + }) + .command(['start', 'run', '$0'], 'Start gancio', {}, start) + .command('setup', 'Setup a new instance', {}, setup) ++ .command('deploy', 'Deploy a instance from config files', {}, deploy) + .help('h') + .alias('h', 'help') + .epilog('Made with ❤ by underscore hacklab - https://gancio.org') +-- +2.31.1 +