public function start(string $directory, string $stackName, array $serviceNames = null, bool $upgrade = false, bool $forcedUpgrade = false) {
		if($serviceNames === null)
			$serviceNames = [];
		if( !is_array($serviceNames) )
			$serviceNames = [$serviceNames];

		$url = $this->getUrl();
		$account = $this->account;
		if ($this->cliMode && $account instanceof RancherCliAccount)
            $command = [
                $account->getCliVersion(),
                'up',
                "-f",
                "$directory/docker-compose.yml",
                '--rancher-file',
                "$directory/rancher-compose.yml",
                '-s',
                $stackName,
                '-d',
                '-p'
            ];
		else
            $command = [
                $account->getRancherCompose(),
                "-f",
                "$directory/docker-compose.yml",
                '-r',
                "$directory/rancher-compose.yml",
                '-p',
                $stackName,
                'up',
                '-d',
                '-p'
            ];

		if($upgrade)
			$command = array_merge($command, ['--upgrade']);

		if($forcedUpgrade)
			$command = array_merge($command, ['--force-upgrade']);

		$command = array_merge($command, $serviceNames);

		$process = ProcessBuilder::create( $command )
			->setTimeout(null)
			->addEnvironmentVariables([
				'RANCHER_URL' => $url,
				'RANCHER_ACCESS_KEY' => $this->account->getKey(),
				'RANCHER_SECRET_KEY' => $this->account->getSecret(),
			])->getProcess();

		$ran = $this->processHelper->run($this->output, $process, null, null, OutputInterface::VERBOSITY_NORMAL);
		if( $ran->getExitCode() != 0 )
			throw new StartFailedException("Command ".$ran->getCommandLine());
	}