appwrite/src/Appwrite/Platform/Tasks/Maintenance.php

153 lines
6.1 KiB
PHP
Raw Normal View History

2020-12-14 16:39:44 +00:00
<?php
2022-11-14 10:01:41 +00:00
namespace Appwrite\Platform\Tasks;
2020-12-14 16:39:44 +00:00
use Appwrite\Event\Certificate;
2022-04-19 13:13:55 +00:00
use Appwrite\Event\Delete;
2020-12-14 16:39:44 +00:00
use Utopia\App;
use Utopia\CLI\Console;
2022-07-13 07:02:55 +00:00
use Utopia\Database\Database;
use Utopia\Database\Document;
use Utopia\Database\DateTime;
2022-04-10 09:38:22 +00:00
use Utopia\Database\Query;
2022-07-13 07:02:55 +00:00
use Utopia\Platform\Action;
2022-07-14 02:04:31 +00:00
class Maintenance extends Action
{
2022-08-02 01:58:36 +00:00
public static function getName(): string
{
return 'maintenance';
}
2022-07-13 07:02:55 +00:00
public function __construct()
{
$this
->desc('Schedules maintenance tasks and publishes them to our queues')
2022-10-28 03:57:59 +00:00
->inject('dbForConsole')
2022-12-20 16:11:30 +00:00
->inject('queueForCertificates')
->inject('queueForDeletes')
->callback(fn (Database $dbForConsole, Certificate $queueForCertificates, Delete $queueForDeletes) => $this->action($dbForConsole, $queueForCertificates, $queueForDeletes));
2022-07-13 07:02:55 +00:00
}
2022-12-20 16:11:30 +00:00
public function action(Database $dbForConsole, Certificate $queueForCertificates, Delete $queueForDeletes): void
2022-07-13 07:02:55 +00:00
{
2021-01-26 20:49:13 +00:00
Console::title('Maintenance V1');
Console::success(APP_NAME . ' maintenance process v1 has started');
2021-01-26 20:49:13 +00:00
2023-06-05 16:13:00 +00:00
// # of days in seconds (1 day = 86400s)
$interval = (int) App::getEnv('_APP_MAINTENANCE_INTERVAL', '86400');
$executionLogsRetention = (int) App::getEnv('_APP_MAINTENANCE_RETENTION_EXECUTION', '1209600');
$auditLogRetention = (int) App::getEnv('_APP_MAINTENANCE_RETENTION_AUDIT', '1209600');
$abuseLogsRetention = (int) App::getEnv('_APP_MAINTENANCE_RETENTION_ABUSE', '86400');
$usageStatsRetentionHourly = (int) App::getEnv('_APP_MAINTENANCE_RETENTION_USAGE_HOURLY', '8640000'); //100 days
$cacheRetention = (int) App::getEnv('_APP_MAINTENANCE_RETENTION_CACHE', '2592000'); // 30 days
$schedulesDeletionRetention = (int) App::getEnv('_APP_MAINTENANCE_RETENTION_SCHEDULES', '86400'); // 1 Day
2021-01-26 20:49:13 +00:00
2023-06-05 16:13:00 +00:00
Console::loop(function () use ($interval, $executionLogsRetention, $abuseLogsRetention, $auditLogRetention, $cacheRetention, $schedulesDeletionRetention, $usageStatsRetentionHourly, $dbForConsole, $queueForDeletes, $queueForCertificates) {
$time = DateTime::now();
2021-01-26 20:49:13 +00:00
2023-06-05 16:13:00 +00:00
Console::info("[{$time}] Notifying workers with maintenance tasks every {$interval} seconds");
$this->notifyDeleteExecutionLogs($executionLogsRetention, $queueForDeletes);
$this->notifyDeleteAbuseLogs($abuseLogsRetention, $queueForDeletes);
$this->notifyDeleteAuditLogs($auditLogRetention, $queueForDeletes);
$this->notifyDeleteUsageStats($usageStatsRetentionHourly, $queueForDeletes);
$this->notifyDeleteConnections($queueForDeletes);
$this->notifyDeleteExpiredSessions($queueForDeletes);
$this->renewCertificates($dbForConsole, $queueForCertificates);
$this->notifyDeleteCache($cacheRetention, $queueForDeletes);
$this->notifyDeleteSchedules($schedulesDeletionRetention, $queueForDeletes);
}, $interval);
}
2021-01-26 20:49:13 +00:00
2023-06-05 16:13:00 +00:00
private function notifyDeleteExecutionLogs(int $interval, Delete $queueForDeletes): void
{
2024-01-11 03:15:11 +00:00
$queueForDeletes
2023-06-05 16:13:00 +00:00
->setType(DELETE_TYPE_EXECUTIONS)
->setDatetime(DateTime::addSeconds(new \DateTime(), -1 * $interval))
->trigger();
}
2021-08-27 11:37:52 +00:00
2023-06-05 16:13:00 +00:00
private function notifyDeleteAbuseLogs(int $interval, Delete $queueForDeletes): void
{
2024-01-11 03:15:11 +00:00
$queueForDeletes
2023-06-05 16:13:00 +00:00
->setType(DELETE_TYPE_ABUSE)
->setDatetime(DateTime::addSeconds(new \DateTime(), -1 * $interval))
->trigger();
}
2023-06-05 16:13:00 +00:00
private function notifyDeleteAuditLogs(int $interval, Delete $queueForDeletes): void
{
2024-01-11 03:15:11 +00:00
$queueForDeletes
2023-06-05 16:13:00 +00:00
->setType(DELETE_TYPE_AUDIT)
->setDatetime(DateTime::addSeconds(new \DateTime(), -1 * $interval))
->trigger();
}
2023-06-05 16:13:00 +00:00
private function notifyDeleteUsageStats(int $usageStatsRetentionHourly, Delete $queueForDeletes): void
{
2024-01-11 03:15:11 +00:00
$queueForDeletes
2023-06-05 16:13:00 +00:00
->setType(DELETE_TYPE_USAGE)
->setUsageRetentionHourlyDateTime(DateTime::addSeconds(new \DateTime(), -1 * $usageStatsRetentionHourly))
->trigger();
}
2022-07-11 15:12:41 +00:00
2023-06-05 16:13:00 +00:00
private function notifyDeleteConnections(Delete $queueForDeletes): void
{
2024-01-11 03:15:11 +00:00
$queueForDeletes
2023-06-05 16:13:00 +00:00
->setType(DELETE_TYPE_REALTIME)
->setDatetime(DateTime::addSeconds(new \DateTime(), -60))
->trigger();
}
2022-04-10 09:38:22 +00:00
2023-06-05 16:13:00 +00:00
private function notifyDeleteExpiredSessions(Delete $queueForDeletes): void
{
2024-01-11 03:15:11 +00:00
$queueForDeletes
2023-06-05 16:13:00 +00:00
->setType(DELETE_TYPE_SESSIONS)
->trigger();
}
2022-07-03 09:36:59 +00:00
2023-06-05 16:13:00 +00:00
private function renewCertificates(Database $dbForConsole, Certificate $queueForCertificate): void
{
$time = DateTime::now();
$certificates = $dbForConsole->find('certificates', [
Query::lessThan('attempts', 5), // Maximum 5 attempts
Query::lessThanEqual('renewDate', $time), // includes 60 days cooldown (we have 30 days to renew)
Query::limit(200), // Limit 200 comes from LetsEncrypt (300 orders per 3 hours, keeping some for new domains)
]);
2022-07-03 09:36:59 +00:00
2022-11-16 12:51:43 +00:00
2023-06-05 16:13:00 +00:00
if (\count($certificates) > 0) {
Console::info("[{$time}] Found " . \count($certificates) . " certificates for renewal, scheduling jobs.");
foreach ($certificates as $certificate) {
$queueForCertificate
->setDomain(new Document([
'domain' => $certificate->getAttribute('domain')
]))
->trigger();
}
} else {
Console::info("[{$time}] No certificates for renewal.");
2022-11-16 12:51:43 +00:00
}
2023-06-05 16:13:00 +00:00
}
2022-11-16 12:51:43 +00:00
2023-06-05 16:13:00 +00:00
private function notifyDeleteCache($interval, Delete $queueForDeletes): void
{
2023-06-05 16:13:00 +00:00
($queueForDeletes)
->setType(DELETE_TYPE_CACHE_BY_TIMESTAMP)
->setDatetime(DateTime::addSeconds(new \DateTime(), -1 * $interval))
->trigger();
}
2020-12-14 21:26:37 +00:00
2023-06-05 16:13:00 +00:00
private function notifyDeleteSchedules($interval, Delete $queueForDeletes): void
{
2022-07-11 15:12:41 +00:00
2023-06-05 16:13:00 +00:00
($queueForDeletes)
->setType(DELETE_TYPE_SCHEDULES)
->setDatetime(DateTime::addSeconds(new \DateTime(), -1 * $interval))
->trigger();
2022-07-13 07:02:55 +00:00
}
2022-07-14 02:04:31 +00:00
}