Ejemplo n.º 1
0
    def start(cls, frontend_only=False):
        config_object = Config()
        config = config_object.get_config()

        cls.stop(output=False, frontend_only=frontend_only)
        if frontend_only:
            CLI.colored_print("Launching frontend containers",
                              CLI.COLOR_SUCCESS)
        else:
            CLI.colored_print("Launching environment", CLI.COLOR_SUCCESS)

        # Test if ports are available
        ports = []
        if config_object.proxy:
            nginx_port = int(config.get("nginx_proxy_port", 80))
        else:
            nginx_port = int(config.get("exposed_nginx_docker_port", 80))

        if frontend_only or config_object.frontend or \
                not config_object.multi_servers:
            ports.append(nginx_port)

        if (not frontend_only or config_object.master_backend or
                config_object.slave_backend) and \
                config_object.expose_backend_ports:
            ports.append(config.get("postgresql_port", 5432))
            ports.append(config.get("mongo_port", 27017))
            ports.append(config.get("redis_main_port", 6379))
            ports.append(config.get("redis_cache_port", 6380))

        for port in ports:
            if Network.is_port_open(port):
                CLI.colored_print(
                    "Port {} is already open. "
                    "KoboToolbox can't start".format(port), CLI.COLOR_ERROR)
                sys.exit(1)

        # Start the back-end containers
        if not frontend_only:
            if not config_object.multi_servers or \
                    config_object.master_backend or config_object.slave_backend:
                backend_role = config.get("backend_server_role", "master")

                backend_command = [
                    "docker-compose", "-f",
                    "docker-compose.backend.{}.yml".format(backend_role), "-f",
                    "docker-compose.backend.{}.override.yml".format(
                        backend_role), "-p",
                    config_object.get_prefix("backend"), "up", "-d"
                ]
                CLI.run_command(backend_command, config.get("kobodocker_path"))

        # If this was previously a shared-database setup, migrate to separate
        # databases for KPI and KoBoCAT
        migrate_single_to_two_databases()

        # Start the front-end containers
        if not config_object.multi_servers or config_object.frontend:
            frontend_command = [
                "docker-compose", "-f", "docker-compose.frontend.yml", "-f",
                "docker-compose.frontend.override.yml", "-p",
                config_object.get_prefix("frontend"), "up", "-d"
            ]

            if config.get('maintenance_enabled', False):
                cls.start_maintenance()
                # Start all front-end services except the non-maintenance NGINX
                frontend_command.extend([
                    s for s in config_object.get_service_names()
                    if s != 'nginx'
                ])

            CLI.run_command(frontend_command, config.get("kobodocker_path"))

            # Start reverse proxy if user uses it.
            if config_object.use_letsencrypt:
                proxy_command = ["docker-compose", "up", "-d"]
                CLI.run_command(proxy_command,
                                config_object.get_letsencrypt_repo_path())

        if config.get('maintenance_enabled', False):
            CLI.colored_print(
                "Maintenance mode is enabled. To resume "
                "normal operation, use `--stop-maintenance`", CLI.COLOR_INFO)
        elif not frontend_only:
            if not config_object.multi_servers or config_object.frontend:
                CLI.colored_print(
                    "Waiting for environment to be ready. "
                    "It can take a few minutes.", CLI.COLOR_SUCCESS)
                cls.info()
            else:
                CLI.colored_print(("Backend server should be up & running! "
                                   "Please look at docker logs for further "
                                   "information"), CLI.COLOR_WARNING)
Ejemplo n.º 2
0
    def start(cls, frontend_only=False):
        config_object = Config()
        config = config_object.get_config()

        cls.stop(output=False, frontend_only=frontend_only)
        if frontend_only:
            CLI.colored_print("Launching frontend containers", CLI.COLOR_SUCCESS)
        else:
            CLI.colored_print("Launching environment", CLI.COLOR_SUCCESS)

        # Test if ports are available
        ports = []
        if config_object.proxy:
            nginx_port = int(config.get("nginx_proxy_port", 80))
        else:
            nginx_port = int(config.get("exposed_nginx_docker_port", 80))

        if frontend_only or config_object.frontend or not config_object.multi_servers:
            ports.append(nginx_port)

        if not frontend_only or config_object.master_backend or config_object.slave_backend:
            ports.append(config.get("postgresql_port", 5432))
            ports.append(config.get("mongo_port", 27017))
            ports.append(config.get("redis_main_port", 6379))
            ports.append(config.get("redis_cache_port", 6380))

        for port in ports:
            if Network.is_port_open(port):
                CLI.colored_print("Port {} is already open. KoboToolbox can't start".format(port),
                                  CLI.COLOR_ERROR)
                sys.exit()

        # Make them up
        if not frontend_only:
            if (config.get("multi") == Config.TRUE and config.get("server_role") == "backend") or \
                    config.get("multi") != Config.TRUE:

                backend_role = config.get("backend_server_role", "master")

                backend_command = ["docker-compose",
                                   "-f", "docker-compose.backend.{}.yml".format(backend_role),
                                   "-f", "docker-compose.backend.{}.override.yml".format(backend_role),
                                   "up", "-d"]
                if config.get("docker_prefix", "") != "":
                    backend_command.insert(-2, "-p")
                    backend_command.insert(-2, config.get("docker_prefix"))

                CLI.run_command(backend_command, config.get("kobodocker_path"))

        if (config.get("multi") == Config.TRUE and config.get("server_role") == "frontend") or \
                config.get("multi") != Config.TRUE:
            frontend_command = ["docker-compose",
                                "-f", "docker-compose.frontend.yml",
                                "-f", "docker-compose.frontend.override.yml",
                                "up", "-d"]

            if config.get("docker_prefix", "") != "":
                frontend_command.insert(-2, "-p")
                frontend_command.insert(-2, config.get("docker_prefix"))

            CLI.run_command(frontend_command, config.get("kobodocker_path"))

            # Start reverse proxy if user uses it.
            if config_object.use_letsencrypt:
                proxy_command = ["docker-compose",
                                 "up", "-d"]
                CLI.run_command(proxy_command, config_object.get_letsencrypt_repo_path())

        if not frontend_only:
            if (config.get("multi") == Config.TRUE and config.get("server_role") == "frontend") or \
                    config.get("multi") != Config.TRUE:
                CLI.colored_print("Waiting for environment to be ready. It can take a few minutes.", CLI.COLOR_SUCCESS)
                cls.info()
            else:
                CLI.colored_print(("Backend server should be up & running! "
                                   "Please look at docker logs for further information"), CLI.COLOR_WARNING)
Ejemplo n.º 3
0
    def start(cls, frontend_only=False):
        config = Config()
        dict_ = config.get_dict()

        cls.stop(output=False, frontend_only=frontend_only)
        if frontend_only:
            CLI.colored_print('Launching front-end containers', CLI.COLOR_INFO)
        else:
            CLI.colored_print('Launching environment', CLI.COLOR_INFO)

        # Test if ports are available
        ports = []
        if config.proxy:
            nginx_port = int(dict_['nginx_proxy_port'])
        else:
            nginx_port = int(dict_['exposed_nginx_docker_port'])

        if frontend_only or config.frontend or \
                not config.multi_servers:
            ports.append(nginx_port)

        if (not frontend_only or config.primary_backend or
                config.secondary_backend) and \
                config.expose_backend_ports:
            ports.append(dict_['postgresql_port'])
            ports.append(dict_['mongo_port'])
            ports.append(dict_['redis_main_port'])
            ports.append(dict_['redis_cache_port'])

        for port in ports:
            if Network.is_port_open(port):
                CLI.colored_print(
                    'Port {} is already open. '
                    'KoboToolbox cannot start'.format(port), CLI.COLOR_ERROR)
                sys.exit(1)

        # Start the back-end containers
        if not frontend_only and config.backend:

            backend_role = dict_['backend_server_role']

            backend_command = [
                'docker-compose', '-f',
                'docker-compose.backend.{}.yml'.format(backend_role), '-f',
                'docker-compose.backend.{}.override.yml'.format(backend_role),
                '-p',
                config.get_prefix('backend'), 'up', '-d'
            ]
            CLI.run_command(backend_command, dict_['kobodocker_path'])

        # Start the front-end containers
        if config.frontend:

            # If this was previously a shared-database setup, migrate to
            # separate databases for KPI and KoBoCAT
            Upgrading.migrate_single_to_two_databases(config)

            frontend_command = [
                'docker-compose', '-f', 'docker-compose.frontend.yml', '-f',
                'docker-compose.frontend.override.yml', '-p',
                config.get_prefix('frontend'), 'up', '-d'
            ]

            if dict_['maintenance_enabled']:
                cls.start_maintenance()
                # Start all front-end services except the non-maintenance NGINX
                frontend_command.extend(
                    [s for s in config.get_service_names() if s != 'nginx'])

            CLI.run_command(frontend_command, dict_['kobodocker_path'])

            # Start reverse proxy if user uses it.
            if config.use_letsencrypt:
                proxy_command = ['docker-compose', 'up', '-d']
                CLI.run_command(proxy_command,
                                config.get_letsencrypt_repo_path())

        if dict_['maintenance_enabled']:
            CLI.colored_print(
                'Maintenance mode is enabled. To resume '
                'normal operation, use `--stop-maintenance`', CLI.COLOR_INFO)
        elif not frontend_only:
            if not config.multi_servers or config.frontend:
                CLI.colored_print(
                    'Waiting for environment to be ready. '
                    'It can take a few minutes.', CLI.COLOR_INFO)
                cls.info()
            else:
                CLI.colored_print((
                    '{} back-end server is starting up and should be '
                    'up & running soon!\nPlease look at docker logs for '
                    'further information: `python3 run.py -cb logs -f`'.format(
                        dict_['backend_server_role'])), CLI.COLOR_WARNING)