args['document']; $domain = new Domain((isset($document['domain'])) ? $document['domain'] : ''); $expiry = 60 * 60 * 24 * 30 * 2; // 60 days if(empty($domain->get())) { throw new Exception('Missing domain'); } if(!$domain->isKnown() || $domain->isTest()) { throw new Exception('Unkown public suffix for domain'); } $target = new Domain($request->getServer('_APP_DOMAINS_TARGET', '')); if(!$target->isKnown() || $target->isTest()) { throw new Exception('Unreachable CNAME target ('.$target->get().'), plesse use a domain with a public suffix.', 500); } $validator = new CNAME($target->get()); // Verify Domain with DNS records if(!$validator->isValid($domain->get())) { throw new Exception('Failed to verify domain DNS records'); } $certificate = $consoleDB->getCollection([ 'limit' => 1, 'offset' => 0, 'orderField' => 'id', 'orderType' => 'ASC', 'orderCast' => 'string', 'filters' => [ '$collection='.Database::SYSTEM_COLLECTION_CERTIFICATES, 'domain='.$domain->get(), ], 'first' => true, ]); $certificate = (!empty($certificate) && $certificate instanceof $certificate) ? $certificate->getArrayCopy() : []; if($certificate && $certificate instanceof Document && isset($certificate['issueDate']) && ($certificate['issueDate'] + $expiry > time())) { // Check last issue time throw new Exception('Renew isn\'t required. Domain issued at '.date('d.m.Y H:i', (isset($certificate['issueDate']) ? $certificate['issueDate'] : 0))); } $staging = ($env === App::ENV_TYPE_PRODUCTION) ? '' : ' --dry-run'; $response = shell_exec("certbot certonly --webroot --noninteractive --agree-tos{$staging} --email security@appwrite.io \ -w ".APP_STORAGE_CERTIFICATES." \ -d {$domain->get()} 2>&1"); // cert2.tests.appwrite.org if(!$response) { throw new Exception('Failed to issue a certificate'); } if(!rename('/etc/letsencrypt/live/'.$domain->get(), APP_STORAGE_CERTIFICATES.'/'.$domain->get())) { throw new Exception('Failed to copy certificate: '.$staging.json_encode($response)); } $certificate = array_merge($certificate, [ '$collection' => Database::SYSTEM_COLLECTION_CERTIFICATES, '$permissions' => [ 'read' => [], 'write' => [], ], 'domain' => $domain->get(), 'issueDate' => time(), 'attempts' => 0, 'log' => $staging.json_encode($response), ]); $certificate = $consoleDB->createDocument($certificate); if(!$certificate) { throw new Exception('Failed saving certificate to DB'); } $document = array_merge($document, [ 'updated' => time(), 'certificateId' => $certificate->getId(), ]); $document = $consoleDB->updateDocument($document); if(!$document) { throw new Exception('Failed saving domain to DB'); } Authorization::reset(); } public function tearDown() { // ... Remove environment for this job } }