diff --git a/app/tasks/install.php b/app/tasks/install.php index 4db2dedca..e00f761dc 100644 --- a/app/tasks/install.php +++ b/app/tasks/install.php @@ -4,6 +4,7 @@ global $cli; use Utopia\CLI\Console; use Utopia\Config\Config; +use Utopia\View; $cli ->task('install') @@ -22,14 +23,11 @@ $cli * 3. Ask user to backup important volumes, env vars, and SQL tables * In th future we can try and automate this for smaller/medium size setups * 4. Drop new docker-compose.yml setup (located inside the container, no network dependencies with appwrite.io) - * 5. Run docker-compose up -d + * 5. Run docker-compose up -d - DONE * 6. Run data migration */ $vars = Config::getParam('variables'); - - // var_dump(realpath(__DIR__.'/docker-compose.yml')); - // var_dump(yaml_parse_file(__DIR__.'/docker-compose.yml')); Console::success('Starting Appwrite installation...'); @@ -58,31 +56,37 @@ $cli } } - var_dump($input); + $templateForCompose = new View('../views/install/compose.phtml'); + $templateForEnv = new View('../views/install/env.phtml'); - // $composeUrl = $source.'/docker-compose.yml?'.http_build_query([ - // 'version' => $version, - // 'domain' => $domain, - // 'httpPort' => $httpPort, - // 'httpsPort' => $httpsPort, - // 'target' => $target, - // ]); - - // $composeFile = @file_get_contents($composeUrl); - - // if(!$composeFile) { - // throw new Exception('Failed to fetch Docker Compose file'); - // } + $templateForCompose + ->setParam('httpPort', $httpPort) + ->setParam('httpsPort', $httpsPort) + ->setParam('version', APP_VERSION_STABLE) + ; - // if(!file_put_contents('/install/appwrite/docker-compose.yml', $composeFile)) { - // throw new Exception('Failed to save Docker Compose file'); - // } + $templateForEnv + ->setParam('vars', $input) + ; + + $path = '/usr/src/code'; + + if(!file_put_contents($path.'/docker-compose.yml', $templateForCompose->render())) { + Console::error('Failed to save Docker Compose file'); + exit(1); + } + + if(!file_put_contents($path.'/.env', $templateForEnv->render())) { + Console::error('Failed to save environment variables file'); + exit(1); + } $stdout = ''; $stderr = ''; - Console::execute('docker-compose -f /install/appwrite/docker-compose.yml up -d', null, $stdout, $stderr); - if ($stdout != NULL) { + Console::execute("docker-compose -f {$path}.'/docker-compose.yml up -d --remove-orphans", null, $stdout, $stderr); + + if ($stderr !== '') { Console::error("Failed to install Appwrite dockers"); } else { Console::success("Appwrite installed successfully"); diff --git a/app/views/install/compose.phtml b/app/views/install/compose.phtml new file mode 100644 index 000000000..c9e4932ae --- /dev/null +++ b/app/views/install/compose.phtml @@ -0,0 +1,327 @@ +getParam('httpPort', ''); +$httpsPort = $this->getParam('httpsPort', ''); +$version = $this->getParam('version', ''); +?>version: '3' + +services: + traefik: + image: traefik:2.2 + container_name: appwrite-traefik + command: + - --providers.file.directory=/storage/config + - --providers.file.watch=true + - --providers.docker=true + - --entrypoints.web.address=:80 + - --entrypoints.websecure.address=:443 + restart: unless-stopped + ports: + - :80 + - :443 + volumes: + - /var/run/docker.sock:/var/run/docker.sock + - appwrite-config:/storage/config:ro + - appwrite-certificates:/storage/certificates:ro + depends_on: + - appwrite + networks: + - gateway + - appwrite + + appwrite: + image: appwrite/appwrite: + container_name: appwrite + restart: unless-stopped + networks: + - appwrite + labels: + - traefik.http.routers.appwrite.rule=PathPrefix(`/`) + - traefik.http.routers.appwrite-secure.rule=PathPrefix(`/`) + - traefik.http.routers.appwrite-secure.tls=true + volumes: + - appwrite-uploads:/storage/uploads:rw + - appwrite-cache:/storage/cache:rw + - appwrite-config:/storage/config:rw + - appwrite-certificates:/storage/certificates:rw + - appwrite-functions:/storage/functions:rw + depends_on: + - mariadb + - redis + - clamav + - influxdb + environment: + - _APP_ENV + - _APP_OPTIONS_ABUSE + - _APP_OPTIONS_FORCE_HTTPS + - _APP_OPENSSL_KEY_V1 + - _APP_DOMAIN + - _APP_DOMAIN_TARGET + - _APP_REDIS_HOST + - _APP_REDIS_PORT + - _APP_DB_HOST + - _APP_DB_PORT + - _APP_DB_SCHEMA + - _APP_DB_USER + - _APP_DB_PASS + - _APP_INFLUXDB_HOST + - _APP_INFLUXDB_PORT + - _APP_STORAGE_LIMIT + - _APP_FUNCTIONS_TIMEOUT + - _APP_FUNCTIONS_CONTAINERS + + appwrite-worker-usage: + image: appwrite/appwrite: + entrypoint: worker-usage + container_name: appwrite-worker-usage + restart: unless-stopped + networks: + - appwrite + depends_on: + - redis + - telegraf + environment: + - _APP_ENV + - _APP_REDIS_HOST + - _APP_REDIS_PORT + - _APP_STATSD_HOST + - _APP_STATSD_PORT + + appwrite-worker-audits: + image: appwrite/appwrite: + entrypoint: worker-audits + container_name: appwrite-worker-audits + restart: unless-stopped + networks: + - appwrite + depends_on: + - redis + - mariadb + environment: + - _APP_ENV + - _APP_REDIS_HOST + - _APP_REDIS_PORT + - _APP_DB_HOST + - _APP_DB_PORT + - _APP_DB_SCHEMA + - _APP_DB_USER + - _APP_DB_PASS + + appwrite-worker-webhooks: + image: appwrite/appwrite: + entrypoint: worker-webhooks + container_name: appwrite-worker-webhooks + restart: unless-stopped + networks: + - appwrite + depends_on: + - redis + - mariadb + environment: + - _APP_ENV + - _APP_REDIS_HOST + - _APP_REDIS_PORT + - _APP_DB_HOST + - _APP_DB_PORT + - _APP_DB_SCHEMA + - _APP_DB_USER + - _APP_DB_PASS + + appwrite-worker-tasks: + image: appwrite/appwrite: + entrypoint: worker-tasks + container_name: appwrite-worker-tasks + restart: unless-stopped + networks: + - appwrite + depends_on: + - redis + - mariadb + environment: + - _APP_ENV + - _APP_REDIS_HOST + - _APP_REDIS_PORT + - _APP_DB_HOST + - _APP_DB_PORT + - _APP_DB_SCHEMA + - _APP_DB_USER + - _APP_DB_PASS + + appwrite-worker-deletes: + image: appwrite/appwrite: + entrypoint: worker-deletes + container_name: appwrite-worker-deletes + restart: unless-stopped + networks: + - appwrite + depends_on: + - redis + - mariadb + volumes: + - appwrite-uploads:/storage/uploads:rw + - appwrite-cache:/storage/cache:rw + environment: + - _APP_ENV + - _APP_REDIS_HOST + - _APP_REDIS_PORT + - _APP_DB_HOST + - _APP_DB_PORT + - _APP_DB_SCHEMA + - _APP_DB_USER + - _APP_DB_PASS + + appwrite-worker-certificates: + image: appwrite/appwrite: + entrypoint: worker-certificates + container_name: appwrite-worker-certificates + restart: unless-stopped + networks: + - appwrite + depends_on: + - redis + - mariadb + volumes: + - appwrite-config:/storage/config:rw + - appwrite-certificates:/storage/certificates:rw + environment: + - _APP_ENV + - _APP_REDIS_HOST + - _APP_REDIS_PORT + - _APP_DB_HOST + - _APP_DB_PORT + - _APP_DB_SCHEMA + - _APP_DB_USER + - _APP_DB_PASS + + appwrite-worker-functions: + image: appwrite/appwrite: + entrypoint: worker-functions + container_name: appwrite-worker-functions + restart: unless-stopped + networks: + - appwrite + depends_on: + - redis + - mariadb + volumes: + - /var/run/docker.sock:/var/run/docker.sock + - /tmp:/tmp:rw + - appwrite-functions:/storage/functions:rw + environment: + - _APP_ENV + - _APP_REDIS_HOST + - _APP_REDIS_PORT + - _APP_DB_HOST + - _APP_DB_PORT + - _APP_DB_SCHEMA + - _APP_DB_USER + - _APP_DB_PASS + - _APP_FUNCTIONS_TIMEOUT + - _APP_FUNCTIONS_CONTAINERS + + appwrite-worker-mails: + image: appwrite/appwrite: + entrypoint: worker-mails + container_name: appwrite-worker-mails + restart: unless-stopped + networks: + - appwrite + depends_on: + - redis + - smtp + environment: + - _APP_ENV + - _APP_REDIS_HOST + - _APP_REDIS_PORT + - _APP_SMTP_HOST + - _APP_SMTP_PORT + + appwrite-schedule: + image: appwrite/appwrite: + entrypoint: schedule + container_name: appwrite-schedule + restart: unless-stopped + networks: + - appwrite + depends_on: + - redis + environment: + - _APP_ENV + - _APP_REDIS_HOST + - _APP_REDIS_PORT + + mariadb: + image: appwrite/mariadb:1.0.3 # fix issues when upgrading using: mysql_upgrade -u root -p + container_name: appwrite-mariadb + restart: unless-stopped + networks: + - appwrite + volumes: + - appwrite-mariadb:/var/lib/mysql:rw + ports: + - "3306:3306" + environment: + - MYSQL_ROOT_PASSWORD=rootsecretpassword + - MYSQL_DATABASE=appwrite + - MYSQL_USER=user + - MYSQL_PASSWORD=password + command: 'mysqld --innodb-flush-method=fsync' + + smtp: + image: appwrite/smtp:1.0.1 + container_name: appwrite-smtp + restart: unless-stopped + networks: + - appwrite + environment: + - MAILNAME=appwrite + - RELAY_NETWORKS=:192.168.0.0/24:10.0.0.0/16 + + redis: + image: redis:5.0 + container_name: appwrite-redis + restart: unless-stopped + networks: + - appwrite + volumes: + - appwrite-redis:/data:rw + + clamav: + image: appwrite/clamav:1.0.12 + container_name: appwrite-clamav + restart: unless-stopped + networks: + - appwrite + volumes: + - appwrite-uploads:/storage/uploads + + influxdb: + image: influxdb:1.6 + container_name: appwrite-influxdb + restart: unless-stopped + networks: + - appwrite + volumes: + - appwrite-influxdb:/var/lib/influxdb:rw + + telegraf: + image: appwrite/telegraf:1.0.0 + container_name: appwrite-telegraf + restart: unless-stopped + networks: + - appwrite + +networks: + gateway: + appwrite: + +volumes: + appwrite-mariadb: + appwrite-redis: + appwrite-cache: + appwrite-uploads: + appwrite-certificates: + appwrite-functions: + appwrite-influxdb: + appwrite-chronograf: + appwrite-config: diff --git a/app/views/install/env.phtml b/app/views/install/env.phtml new file mode 100644 index 000000000..c3ebb6f91 --- /dev/null +++ b/app/views/install/env.phtml @@ -0,0 +1,8 @@ +getParam('vars'); + +foreach ($vars as $key => $value) { + echo $key.'='.$value."\n"; +} +?> \ No newline at end of file