Merge pull request #139 from Boy132/database/sqlite

Support SQLite
This commit is contained in:
Lance Pioch 2024-05-05 15:17:08 -04:00 committed by GitHub
commit 5286f446dc
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
11 changed files with 874 additions and 504 deletions

View File

@ -11,12 +11,7 @@ LOG_STACK=single
LOG_DEPRECATIONS_CHANNEL=null LOG_DEPRECATIONS_CHANNEL=null
LOG_LEVEL=debug LOG_LEVEL=debug
DB_CONNECTION=mysql DB_CONNECTION=sqlite
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=panel
DB_USERNAME=panel
DB_PASSWORD=
REDIS_HOST=127.0.0.1 REDIS_HOST=127.0.0.1
REDIS_PASSWORD=null REDIS_PASSWORD=null

View File

@ -6,8 +6,8 @@ on:
- '**' - '**'
jobs: jobs:
tests: mysql:
name: Tests name: MySQL
runs-on: ubuntu-latest runs-on: ubuntu-latest
strategy: strategy:
fail-fast: false fail-fast: false
@ -23,6 +23,22 @@ jobs:
ports: ports:
- 3306 - 3306
options: --health-cmd="mysqladmin ping" --health-interval=10s --health-timeout=5s --health-retries=3 options: --health-cmd="mysqladmin ping" --health-interval=10s --health-timeout=5s --health-retries=3
env:
APP_ENV: testing
APP_DEBUG: "false"
APP_KEY: ThisIsARandomStringForTests12345
APP_TIMEZONE: UTC
APP_URL: http://localhost/
APP_ENVIRONMENT_ONLY: "true"
CACHE_DRIVER: array
MAIL_MAILER: array
SESSION_DRIVER: array
QUEUE_CONNECTION: sync
HASHIDS_SALT: alittlebitofsalt1234
DB_CONNECTION: mysql
DB_HOST: 127.0.0.1
DB_DATABASE: testing
DB_USERNAME: root
steps: steps:
- name: Code Checkout - name: Code Checkout
uses: actions/checkout@v4 uses: actions/checkout@v4
@ -48,18 +64,11 @@ jobs:
tools: composer:v2 tools: composer:v2
coverage: none coverage: none
- name: Setup .env
run: cp .env.example .env
- name: Install dependencies - name: Install dependencies
run: composer install --no-interaction --no-suggest --prefer-dist run: composer install --no-interaction --no-suggest --prefer-dist
- name: Generate App Key
run: php artisan key:generate
- name: Unit tests - name: Unit tests
run: vendor/bin/phpunit tests/Unit run: vendor/bin/phpunit tests/Unit
if: ${{ always() }}
env: env:
DB_HOST: UNIT_NO_DB DB_HOST: UNIT_NO_DB
SKIP_MIGRATIONS: true SKIP_MIGRATIONS: true
@ -69,3 +78,64 @@ jobs:
env: env:
DB_PORT: ${{ job.services.database.ports[3306] }} DB_PORT: ${{ job.services.database.ports[3306] }}
DB_USERNAME: root DB_USERNAME: root
sqlite:
name: SQLite
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
php: [8.2, 8.3]
env:
APP_ENV: testing
APP_DEBUG: "false"
APP_KEY: ThisIsARandomStringForTests12345
APP_TIMEZONE: UTC
APP_URL: http://localhost/
APP_ENVIRONMENT_ONLY: "true"
CACHE_DRIVER: array
MAIL_MAILER: array
SESSION_DRIVER: array
QUEUE_CONNECTION: sync
HASHIDS_SALT: alittlebitofsalt1234
DB_CONNECTION: sqlite
DB_DATABASE: ${{ github.workspace }}/database/testing.sqlite
steps:
- name: Code Checkout
uses: actions/checkout@v4
- name: Get cache directory
id: composer-cache
run: |
echo "dir=$(composer config cache-files-dir)" >> $GITHUB_OUTPUT
- name: Cache
uses: actions/cache@v4
with:
path: ${{ steps.composer-cache.outputs.dir }}
key: ${{ runner.os }}-composer-${{ matrix.php }}-${{ hashFiles('**/composer.lock') }}
restore-keys: |
${{ runner.os }}-composer-${{ matrix.php }}-
- name: Setup PHP
uses: shivammathur/setup-php@v2
with:
php-version: ${{ matrix.php }}
extensions: bcmath, cli, curl, gd, mbstring, mysql, openssl, pdo, tokenizer, xml, zip
tools: composer:v2
coverage: none
- name: Install dependencies
run: composer install --no-interaction --no-suggest --prefer-dist
- name: Create SQLite file
run: touch database/testing.sqlite
- name: Unit tests
run: vendor/bin/phpunit tests/Unit
env:
DB_HOST: UNIT_NO_DB
SKIP_MIGRATIONS: true
- name: Integration tests
run: vendor/bin/phpunit tests/Integration

View File

@ -11,14 +11,20 @@ class DatabaseSettingsCommand extends Command
{ {
use EnvironmentWriterTrait; use EnvironmentWriterTrait;
public const DATABASE_DRIVERS = [
'sqlite' => 'SQLite (recommended)',
'mysql' => 'MySQL',
];
protected $description = 'Configure database settings for the Panel.'; protected $description = 'Configure database settings for the Panel.';
protected $signature = 'p:environment:database protected $signature = 'p:environment:database
{--driver= : The database driver backend to use.}
{--database= : The database to use.}
{--host= : The connection address for the MySQL server.} {--host= : The connection address for the MySQL server.}
{--port= : The connection port for the MySQL server.} {--port= : The connection port for the MySQL server.}
{--database= : The database to use.} {--username= : Username to use when connecting to the MySQL server.}
{--username= : Username to use when connecting.} {--password= : Password to use for the MySQL database.}';
{--password= : Password to use for this database.}';
protected array $variables = []; protected array $variables = [];
@ -35,6 +41,14 @@ class DatabaseSettingsCommand extends Command
*/ */
public function handle(): int public function handle(): int
{ {
$selected = config('database.default', 'sqlite');
$this->variables['DB_CONNECTION'] = $this->option('driver') ?? $this->choice(
'Database Driver',
self::DATABASE_DRIVERS,
array_key_exists($selected, self::DATABASE_DRIVERS) ? $selected : null
);
if ($this->variables['DB_CONNECTION'] === 'mysql') {
$this->output->note('It is highly recommended to not use "localhost" as your database host as we have seen frequent socket connection issues. If you want to use a local connection you should be using "127.0.0.1".'); $this->output->note('It is highly recommended to not use "localhost" as your database host as we have seen frequent socket connection issues. If you want to use a local connection you should be using "127.0.0.1".');
$this->variables['DB_HOST'] = $this->option('host') ?? $this->ask( $this->variables['DB_HOST'] = $this->option('host') ?? $this->ask(
'Database Host', 'Database Host',
@ -81,6 +95,12 @@ class DatabaseSettingsCommand extends Command
return 1; return 1;
} }
} elseif ($this->variables['DB_CONNECTION'] === 'sqlite') {
$this->variables['DB_DATABASE'] = $this->option('database') ?? $this->ask(
'Database Path',
config('database.connections.sqlite.database', database_path('database.sqlite'))
);
}
$this->writeToEnvironment($this->variables); $this->writeToEnvironment($this->variables);

View File

@ -131,6 +131,7 @@ class Egg extends Model
'config_logs' => null, 'config_logs' => null,
'config_files' => null, 'config_files' => null,
'update_url' => null, 'update_url' => null,
'tags' => '[]',
]; ];
protected function casts(): array protected function casts(): array

View File

@ -108,6 +108,7 @@ class Node extends Model
'daemon_sftp' => 2022, 'daemon_sftp' => 2022,
'daemon_listen' => 8080, 'daemon_listen' => 8080,
'maintenance_mode' => false, 'maintenance_mode' => false,
'tags' => '[]',
]; ];
protected function casts(): array protected function casts(): array
@ -120,6 +121,7 @@ class Node extends Model
'behind_proxy' => 'boolean', 'behind_proxy' => 'boolean',
'public' => 'boolean', 'public' => 'boolean',
'maintenance_mode' => 'boolean', 'maintenance_mode' => 'boolean',
'tags' => 'array',
]; ];
} }

View File

@ -121,10 +121,7 @@ class AllocationSelectionService
$discard = $this->getDiscardableDedicatedAllocations($nodes); $discard = $this->getDiscardableDedicatedAllocations($nodes);
if (!empty($discard)) { if (!empty($discard)) {
$query->whereNotIn( $query->whereNotIn('ip', $discard);
Allocation::query()->raw('CONCAT_WS("-", node_id, ip)'),
$discard
);
} }
} }
@ -132,7 +129,7 @@ class AllocationSelectionService
} }
/** /**
* Return a concatenated result set of node ips that already have at least one * Return a result set of node ips that already have at least one
* server assigned to that IP. This allows for filtering out sets for * server assigned to that IP. This allows for filtering out sets for
* dedicated allocation IPs. * dedicated allocation IPs.
* *
@ -141,16 +138,15 @@ class AllocationSelectionService
*/ */
private function getDiscardableDedicatedAllocations(array $nodes = []): array private function getDiscardableDedicatedAllocations(array $nodes = []): array
{ {
$query = Allocation::query()->selectRaw('CONCAT_WS("-", node_id, ip) as result'); $query = Allocation::query()->whereNotNull('server_id');
if (!empty($nodes)) { if (!empty($nodes)) {
$query->whereIn('node_id', $nodes); $query->whereIn('node_id', $nodes);
} }
return $query->whereNotNull('server_id') return $query->groupBy('ip')
->groupByRaw('CONCAT(node_id, ip)')
->get() ->get()
->pluck('result') ->pluck('ip')
->toArray(); ->toArray();
} }
} }

View File

@ -4,7 +4,17 @@ use App\Helpers\Time;
return [ return [
'default' => env('DB_CONNECTION', 'sqlite'),
'connections' => [ 'connections' => [
'sqlite' => [
'driver' => 'sqlite',
'url' => env('DB_URL'),
'database' => env('DB_DATABASE', database_path('database.sqlite')),
'prefix' => '',
'foreign_key_constraints' => env('DB_FOREIGN_KEYS', true),
],
'mysql' => [ 'mysql' => [
'driver' => 'mysql', 'driver' => 'mysql',
'url' => env('DB_URL', env('DATABASE_URL')), 'url' => env('DB_URL', env('DATABASE_URL')),

View File

@ -28,6 +28,7 @@ class BackupFactory extends Factory
'is_successful' => true, 'is_successful' => true,
'created_at' => CarbonImmutable::now(), 'created_at' => CarbonImmutable::now(),
'completed_at' => CarbonImmutable::now(), 'completed_at' => CarbonImmutable::now(),
'ignored_files' => [],
]; ];
} }
} }

View File

@ -209,6 +209,7 @@ DROP TABLE IF EXISTS `egg_variables`;
CREATE TABLE `egg_variables` ( CREATE TABLE `egg_variables` (
`id` int unsigned NOT NULL AUTO_INCREMENT, `id` int unsigned NOT NULL AUTO_INCREMENT,
`egg_id` int unsigned NOT NULL, `egg_id` int unsigned NOT NULL,
`sort` tinyint unsigned DEFAULT NULL,
`name` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL, `name` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL,
`description` text COLLATE utf8mb4_unicode_ci NOT NULL, `description` text COLLATE utf8mb4_unicode_ci NOT NULL,
`env_variable` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL, `env_variable` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL,
@ -250,6 +251,7 @@ CREATE TABLE `eggs` (
`created_at` timestamp NULL DEFAULT NULL, `created_at` timestamp NULL DEFAULT NULL,
`updated_at` timestamp NULL DEFAULT NULL, `updated_at` timestamp NULL DEFAULT NULL,
`force_outgoing_ip` tinyint(1) NOT NULL DEFAULT '0', `force_outgoing_ip` tinyint(1) NOT NULL DEFAULT '0',
`tags` text COLLATE utf8mb4_unicode_ci NOT NULL,
PRIMARY KEY (`id`), PRIMARY KEY (`id`),
UNIQUE KEY `service_options_uuid_unique` (`uuid`), UNIQUE KEY `service_options_uuid_unique` (`uuid`),
KEY `eggs_config_from_foreign` (`config_from`), KEY `eggs_config_from_foreign` (`config_from`),
@ -349,7 +351,6 @@ CREATE TABLE `nodes` (
`public` smallint unsigned NOT NULL, `public` smallint unsigned NOT NULL,
`name` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL, `name` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL,
`description` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci, `description` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci,
`location_id` int unsigned NOT NULL,
`fqdn` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL, `fqdn` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL,
`scheme` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'https', `scheme` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'https',
`behind_proxy` tinyint(1) NOT NULL DEFAULT '0', `behind_proxy` tinyint(1) NOT NULL DEFAULT '0',
@ -361,15 +362,15 @@ CREATE TABLE `nodes` (
`upload_size` int unsigned NOT NULL DEFAULT '100', `upload_size` int unsigned NOT NULL DEFAULT '100',
`daemon_token_id` char(16) COLLATE utf8mb4_unicode_ci NOT NULL, `daemon_token_id` char(16) COLLATE utf8mb4_unicode_ci NOT NULL,
`daemon_token` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, `daemon_token` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,
`daemonListen` smallint unsigned NOT NULL DEFAULT '8080', `daemon_listen` smallint unsigned NOT NULL DEFAULT '8080',
`daemonSFTP` smallint unsigned NOT NULL DEFAULT '2022', `daemon_sftp` smallint unsigned NOT NULL DEFAULT '2022',
`daemonBase` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '/home/daemon-files', `daemon_base` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL,
`created_at` timestamp NULL DEFAULT NULL, `created_at` timestamp NULL DEFAULT NULL,
`updated_at` timestamp NULL DEFAULT NULL, `updated_at` timestamp NULL DEFAULT NULL,
`tags` text COLLATE utf8mb4_unicode_ci NOT NULL,
PRIMARY KEY (`id`), PRIMARY KEY (`id`),
UNIQUE KEY `nodes_uuid_unique` (`uuid`), UNIQUE KEY `nodes_uuid_unique` (`uuid`),
UNIQUE KEY `nodes_daemon_token_id_unique` (`daemon_token_id`), UNIQUE KEY `nodes_daemon_token_id_unique` (`daemon_token_id`)
KEY `nodes_location_id_foreign` (`location_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
/*!40101 SET character_set_client = @saved_cs_client */; /*!40101 SET character_set_client = @saved_cs_client */;
DROP TABLE IF EXISTS `notifications`; DROP TABLE IF EXISTS `notifications`;
@ -481,7 +482,7 @@ CREATE TABLE `servers` (
`id` int unsigned NOT NULL AUTO_INCREMENT, `id` int unsigned NOT NULL AUTO_INCREMENT,
`external_id` varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL, `external_id` varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
`uuid` char(36) COLLATE utf8mb4_unicode_ci NOT NULL, `uuid` char(36) COLLATE utf8mb4_unicode_ci NOT NULL,
`uuidShort` char(8) COLLATE utf8mb4_unicode_ci NOT NULL, `uuid_short` char(8) COLLATE utf8mb4_unicode_ci NOT NULL,
`node_id` int unsigned NOT NULL, `node_id` int unsigned NOT NULL,
`name` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL, `name` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL,
`description` text COLLATE utf8mb4_unicode_ci NOT NULL, `description` text COLLATE utf8mb4_unicode_ci NOT NULL,
@ -507,7 +508,7 @@ CREATE TABLE `servers` (
`installed_at` timestamp NULL DEFAULT NULL, `installed_at` timestamp NULL DEFAULT NULL,
PRIMARY KEY (`id`), PRIMARY KEY (`id`),
UNIQUE KEY `servers_uuid_unique` (`uuid`), UNIQUE KEY `servers_uuid_unique` (`uuid`),
UNIQUE KEY `servers_uuidshort_unique` (`uuidShort`), UNIQUE KEY `servers_uuidshort_unique` (`uuid_short`),
UNIQUE KEY `servers_allocation_id_unique` (`allocation_id`), UNIQUE KEY `servers_allocation_id_unique` (`allocation_id`),
UNIQUE KEY `servers_external_id_unique` (`external_id`), UNIQUE KEY `servers_external_id_unique` (`external_id`),
KEY `servers_node_id_foreign` (`node_id`), KEY `servers_node_id_foreign` (`node_id`),
@ -839,5 +840,7 @@ INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (191,'2022_08_16_23
INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (192,'2022_12_12_213937_update_mail_settings_to_new_format',1); INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (192,'2022_12_12_213937_update_mail_settings_to_new_format',1);
INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (193,'2023_01_24_210051_add_uuid_column_to_failed_jobs_table',1); INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (193,'2023_01_24_210051_add_uuid_column_to_failed_jobs_table',1);
INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (194,'2023_02_23_191004_add_expires_at_column_to_api_keys_table',1); INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (194,'2023_02_23_191004_add_expires_at_column_to_api_keys_table',1);
INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (195,'2024_03_12_154408_remove_nests_table',2); INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (197,'2024_03_12_154408_remove_nests_table',2);
INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (196,'2024_03_14_055537_remove_locations_table',2); INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (198,'2024_03_14_055537_remove_locations_table',2);
INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (201,'2024_04_20_214441_add_egg_var_sort',3);
INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (203,'2024_04_14_002250_update_column_names',4);

View File

@ -0,0 +1,263 @@
CREATE TABLE IF NOT EXISTS "migrations" ("id" integer primary key autoincrement not null, "migration" varchar not null, "batch" integer not null);
CREATE TABLE IF NOT EXISTS "failed_jobs" ("id" integer primary key autoincrement not null, "connection" text not null, "queue" text not null, "payload" text not null, "failed_at" datetime not null, "exception" text not null, "uuid" varchar);
CREATE TABLE IF NOT EXISTS "jobs" ("id" integer primary key autoincrement not null, "queue" varchar not null, "payload" text not null, "attempts" integer not null, "reserved_at" integer, "available_at" integer not null, "created_at" integer not null);
CREATE TABLE IF NOT EXISTS "password_resets" ("email" varchar not null, "token" varchar not null, "created_at" datetime not null);
CREATE INDEX "password_resets_email_index" on "password_resets" ("email");
CREATE INDEX "password_resets_token_index" on "password_resets" ("token");
CREATE TABLE IF NOT EXISTS "subusers" ("id" integer primary key autoincrement not null, "user_id" integer not null, "server_id" integer not null, "created_at" datetime, "updated_at" datetime, "permissions" text);
CREATE TABLE IF NOT EXISTS "sessions" ("id" varchar not null, "user_id" integer, "ip_address" varchar, "user_agent" text, "payload" text not null, "last_activity" integer not null);
CREATE UNIQUE INDEX "sessions_id_unique" on "sessions" ("id");
CREATE TABLE IF NOT EXISTS "databases" ("id" integer primary key autoincrement not null, "server_id" integer not null, "database_host_id" integer not null, "database" varchar not null, "username" varchar not null, "remote" varchar not null default '%', "password" text not null, "created_at" datetime, "updated_at" datetime, "max_connections" integer default '0');
CREATE TABLE IF NOT EXISTS "database_hosts" ("id" integer primary key autoincrement not null, "name" varchar not null, "host" varchar not null, "port" integer not null, "username" varchar not null, "password" text not null, "max_databases" integer, "node_id" integer, "created_at" datetime, "updated_at" datetime);
CREATE TABLE IF NOT EXISTS "tasks_log" ("id" integer primary key autoincrement not null, "task_id" integer not null, "run_time" datetime not null, "run_status" integer not null, "response" text not null, "created_at" datetime, "updated_at" datetime);
CREATE INDEX "jobs_queue_reserved_at_index" on "jobs" ("queue", "reserved_at");
CREATE TABLE IF NOT EXISTS "notifications" ("id" varchar not null, "type" varchar not null, "notifiable_type" varchar not null, "notifiable_id" integer not null, "data" text not null, "read_at" datetime, "created_at" datetime, "updated_at" datetime, primary key ("id"));
CREATE INDEX "notifications_notifiable_type_notifiable_id_index" on "notifications" ("notifiable_type", "notifiable_id");
CREATE TABLE IF NOT EXISTS "api_logs" ("id" integer primary key autoincrement not null, "authorized" tinyint(1) not null, "error" text, "key" varchar, "method" varchar not null, "route" text not null, "content" text, "user_agent" text not null, "request_ip" varchar not null, "created_at" datetime, "updated_at" datetime);
CREATE TABLE IF NOT EXISTS "allocations" ("id" integer primary key autoincrement not null, "node_id" integer not null, "ip" varchar not null, "port" integer not null, "server_id" integer, "created_at" datetime, "updated_at" datetime, "ip_alias" text, "notes" varchar);
CREATE UNIQUE INDEX "allocations_node_id_ip_port_unique" on "allocations" ("node_id", "ip", "port");
CREATE TABLE IF NOT EXISTS "tasks" ("id" integer primary key autoincrement not null, "schedule_id" integer not null, "sequence_id" integer not null, "action" varchar not null, "payload" text not null, "time_offset" integer not null, "is_queued" tinyint(1) not null, "created_at" datetime, "updated_at" datetime, "continue_on_failure" integer not null default '0', foreign key("schedule_id") references "schedules"("id") on delete cascade);
CREATE INDEX "tasks_schedule_id_sequence_id_index" on "tasks" ("schedule_id", "sequence_id");
CREATE TABLE IF NOT EXISTS "settings" ("id" integer primary key autoincrement not null, "key" varchar not null, "value" text not null);
CREATE UNIQUE INDEX "settings_key_unique" on "settings" ("key");
CREATE TABLE IF NOT EXISTS "api_keys" ("id" integer primary key autoincrement not null, "token" text not null, "allowed_ips" text, "created_at" datetime, "updated_at" datetime, "user_id" integer not null, "memo" text, "r_servers" integer not null default '0', "r_nodes" integer not null default '0', "r_allocations" integer not null default '0', "r_users" integer not null default '0', "r_eggs" integer not null default '0', "r_database_hosts" integer not null default '0', "r_server_databases" integer not null default '0', "identifier" varchar, "key_type" integer not null default '0', "last_used_at" datetime, "expires_at" datetime);
CREATE UNIQUE INDEX "api_keys_identifier_unique" on "api_keys" ("identifier");
CREATE TABLE IF NOT EXISTS "users" ("id" integer primary key autoincrement not null, "uuid" varchar not null, "email" varchar not null, "password" text not null, "remember_token" varchar, "language" varchar not null default 'en', "root_admin" integer not null default '0', "use_totp" integer not null, "totp_secret" text, "created_at" datetime, "updated_at" datetime, "name_first" varchar, "name_last" varchar, "username" varchar not null, "gravatar" tinyint(1) not null default '1', "external_id" varchar, "totp_authenticated_at" datetime);
CREATE UNIQUE INDEX "users_email_unique" on "users" ("email");
CREATE UNIQUE INDEX "users_username_unique" on "users" ("username");
CREATE UNIQUE INDEX "users_uuid_unique" on "users" ("uuid");
CREATE INDEX "users_external_id_index" on "users" ("external_id");
CREATE TABLE IF NOT EXISTS "egg_variables" ("id" integer primary key autoincrement not null, "egg_id" integer not null, "name" varchar not null, "description" text not null, "env_variable" varchar not null, "default_value" text not null, "user_viewable" integer not null, "user_editable" integer not null, "rules" text not null, "created_at" datetime, "updated_at" datetime, "sort" integer);
CREATE TABLE IF NOT EXISTS "server_variables" ("id" integer primary key autoincrement not null, "server_id" integer, "variable_id" integer not null, "variable_value" text not null, "created_at" datetime, "updated_at" datetime);
CREATE TABLE IF NOT EXISTS "servers" ("id" integer primary key autoincrement not null, "uuid" varchar not null, "uuid_short" varchar not null, "node_id" integer not null, "name" varchar not null, "owner_id" integer not null, "memory" integer not null, "swap" integer not null, "disk" integer not null, "io" integer not null, "cpu" integer not null, "oom_disabled" integer not null default '0', "egg_id" integer not null, "startup" text not null, "created_at" datetime, "updated_at" datetime, "allocation_id" integer not null, "image" varchar not null, "description" text not null, "skip_scripts" tinyint(1) not null default '0', "external_id" varchar, "database_limit" integer default '0', "allocation_limit" integer, "threads" varchar, "backup_limit" integer not null default '0', "status" varchar, "installed_at" datetime);
CREATE UNIQUE INDEX "servers_allocation_id_unique" on "servers" ("allocation_id");
CREATE UNIQUE INDEX "servers_external_id_unique" on "servers" ("external_id");
CREATE UNIQUE INDEX "servers_uuid_unique" on "servers" ("uuid");
CREATE UNIQUE INDEX "servers_uuidshort_unique" on "servers" ("uuid_short");
CREATE UNIQUE INDEX "databases_database_host_id_username_unique" on "databases" ("database_host_id", "username");
CREATE TABLE IF NOT EXISTS "eggs" ("id" integer primary key autoincrement not null, "name" varchar not null, "description" text, "created_at" datetime, "updated_at" datetime, "startup" text, "config_from" integer, "config_stop" varchar, "config_logs" text, "config_startup" text, "config_files" text, "script_install" text, "script_is_privileged" tinyint(1) not null default '1', "script_entry" varchar not null default 'ash', "script_container" varchar not null default 'alpine:3.4', "copy_script_from" integer, "uuid" varchar not null, "author" varchar not null, "features" text, "docker_images" text, "update_url" text, "file_denylist" text, "force_outgoing_ip" tinyint(1) not null default '0', "tags" text not null);
CREATE UNIQUE INDEX "service_options_uuid_unique" on "eggs" ("uuid");
CREATE TABLE IF NOT EXISTS "mounts" ("id" integer primary key autoincrement not null, "uuid" varchar not null, "name" varchar not null, "description" text, "source" varchar not null, "target" varchar not null, "read_only" integer not null, "user_mountable" integer not null);
CREATE UNIQUE INDEX "mounts_id_unique" on "mounts" ("id");
CREATE UNIQUE INDEX "mounts_uuid_unique" on "mounts" ("uuid");
CREATE UNIQUE INDEX "mounts_name_unique" on "mounts" ("name");
CREATE TABLE IF NOT EXISTS "recovery_tokens" ("id" integer primary key autoincrement not null, "user_id" integer not null, "token" varchar not null, "created_at" datetime, foreign key("user_id") references "users"("id") on delete cascade);
CREATE UNIQUE INDEX "databases_database_host_id_server_id_database_unique" on "databases" ("database_host_id", "server_id", "database");
CREATE TABLE IF NOT EXISTS "schedules" ("id" integer primary key autoincrement not null, "server_id" integer not null, "name" varchar not null, "cron_day_of_week" varchar not null, "cron_day_of_month" varchar not null, "cron_hour" varchar not null, "cron_minute" varchar not null, "is_active" tinyint(1) not null, "is_processing" tinyint(1) not null, "last_run_at" datetime, "next_run_at" datetime, "created_at" datetime, "updated_at" datetime, "cron_month" varchar not null, "only_when_online" integer not null default '0', foreign key("server_id") references "servers"("id") on delete cascade on update no action);
CREATE TABLE IF NOT EXISTS "server_transfers" ("id" integer primary key autoincrement not null, "server_id" integer not null, "successful" tinyint(1), "old_node" integer not null, "new_node" integer not null, "old_allocation" integer not null, "new_allocation" integer not null, "old_additional_allocations" text, "new_additional_allocations" text, "created_at" datetime, "updated_at" datetime, "archived" tinyint(1) not null default '0', foreign key("server_id") references "servers"("id") on delete cascade on update no action);
CREATE TABLE IF NOT EXISTS "audit_logs" ("id" integer primary key autoincrement not null, "uuid" varchar not null, "is_system" tinyint(1) not null default '0', "user_id" integer, "server_id" integer, "action" varchar not null, "subaction" varchar, "device" text not null, "metadata" text not null, "created_at" datetime not null, foreign key("user_id") references "users"("id") on delete set null, foreign key("server_id") references "servers"("id") on delete cascade);
CREATE INDEX "audit_logs_action_server_id_index" on "audit_logs" ("action", "server_id");
CREATE TABLE IF NOT EXISTS "user_ssh_keys" ("id" integer primary key autoincrement not null, "user_id" integer not null, "name" varchar not null, "fingerprint" varchar not null, "public_key" text not null, "created_at" datetime, "updated_at" datetime, "deleted_at" datetime, foreign key("user_id") references "users"("id") on delete cascade);
CREATE TABLE IF NOT EXISTS "backups" ("id" integer primary key autoincrement not null, "server_id" integer not null, "uuid" varchar not null, "name" varchar not null, "ignored_files" text not null, "disk" varchar not null, "checksum" varchar, "bytes" integer not null default '0', "completed_at" datetime, "created_at" datetime, "updated_at" datetime, "deleted_at" datetime, "is_successful" tinyint(1) not null default '0', "upload_id" text, "is_locked" integer not null default '0', foreign key("server_id") references "servers"("id") on delete cascade on update no action);
CREATE UNIQUE INDEX "backups_uuid_unique" on "backups" ("uuid");
CREATE TABLE IF NOT EXISTS "mount_node" ("node_id" integer not null, "mount_id" integer not null);
CREATE UNIQUE INDEX "mount_node_node_id_mount_id_unique" on "mount_node" ("node_id", "mount_id");
CREATE TABLE IF NOT EXISTS "mount_server" ("server_id" integer not null, "mount_id" integer not null);
CREATE UNIQUE INDEX "mount_server_server_id_mount_id_unique" on "mount_server" ("server_id", "mount_id");
CREATE TABLE IF NOT EXISTS "egg_mount" ("egg_id" integer not null, "mount_id" integer not null);
CREATE UNIQUE INDEX "egg_mount_egg_id_mount_id_unique" on "egg_mount" ("egg_id", "mount_id");
CREATE TABLE IF NOT EXISTS "activity_logs" ("id" integer primary key autoincrement not null, "batch" varchar, "event" varchar not null, "ip" varchar not null, "description" text, "actor_type" varchar, "actor_id" integer, "properties" text not null, "timestamp" datetime not null default CURRENT_TIMESTAMP, "api_key_id" integer);
CREATE INDEX "activity_logs_actor_type_actor_id_index" on "activity_logs" ("actor_type", "actor_id");
CREATE INDEX "activity_logs_event_index" on "activity_logs" ("event");
CREATE TABLE IF NOT EXISTS "activity_log_subjects" ("id" integer primary key autoincrement not null, "activity_log_id" integer not null, "subject_type" varchar not null, "subject_id" integer not null, foreign key("activity_log_id") references "activity_logs"("id") on delete cascade);
CREATE INDEX "activity_log_subjects_subject_type_subject_id_index" on "activity_log_subjects" ("subject_type", "subject_id");
CREATE UNIQUE INDEX "failed_jobs_uuid_unique" on "failed_jobs" ("uuid");
CREATE TABLE IF NOT EXISTS "nodes" ("id" integer primary key autoincrement not null, "public" integer not null, "name" varchar not null, "fqdn" varchar not null, "scheme" varchar not null default 'https', "memory" integer not null, "memory_overallocate" integer not null default '0', "disk" integer not null, "disk_overallocate" integer not null default '0', "daemon_token" text not null, "daemon_listen" integer not null default '8080', "daemon_sftp" integer not null default '2022', "daemon_base" varchar not null, "created_at" datetime, "updated_at" datetime, "upload_size" integer not null default '100', "behind_proxy" tinyint(1) not null default '0', "description" text, "maintenance_mode" tinyint(1) not null default '0', "uuid" varchar not null, "daemon_token_id" varchar not null, "tags" text not null);
CREATE UNIQUE INDEX "nodes_daemon_token_id_unique" on "nodes" ("daemon_token_id");
CREATE UNIQUE INDEX "nodes_uuid_unique" on "nodes" ("uuid");
INSERT INTO migrations VALUES(1,'2016_01_23_195641_add_allocations_table',1);
INSERT INTO migrations VALUES(2,'2016_01_23_195851_add_api_keys',1);
INSERT INTO migrations VALUES(3,'2016_01_23_200044_add_api_permissions',1);
INSERT INTO migrations VALUES(4,'2016_01_23_200159_add_downloads',1);
INSERT INTO migrations VALUES(5,'2016_01_23_200421_create_failed_jobs_table',1);
INSERT INTO migrations VALUES(6,'2016_01_23_200440_create_jobs_table',1);
INSERT INTO migrations VALUES(7,'2016_01_23_200528_add_locations',1);
INSERT INTO migrations VALUES(8,'2016_01_23_200648_add_nodes',1);
INSERT INTO migrations VALUES(9,'2016_01_23_201433_add_password_resets',1);
INSERT INTO migrations VALUES(10,'2016_01_23_201531_add_permissions',1);
INSERT INTO migrations VALUES(11,'2016_01_23_201649_add_server_variables',1);
INSERT INTO migrations VALUES(12,'2016_01_23_201748_add_servers',1);
INSERT INTO migrations VALUES(13,'2016_01_23_202544_add_service_options',1);
INSERT INTO migrations VALUES(14,'2016_01_23_202731_add_service_varibles',1);
INSERT INTO migrations VALUES(15,'2016_01_23_202943_add_services',1);
INSERT INTO migrations VALUES(16,'2016_01_23_203119_create_settings_table',1);
INSERT INTO migrations VALUES(17,'2016_01_23_203150_add_subusers',1);
INSERT INTO migrations VALUES(18,'2016_01_23_203159_add_users',1);
INSERT INTO migrations VALUES(19,'2016_01_23_203947_create_sessions_table',1);
INSERT INTO migrations VALUES(20,'2016_01_25_234418_rename_permissions_column',1);
INSERT INTO migrations VALUES(21,'2016_02_07_172148_add_databases_tables',1);
INSERT INTO migrations VALUES(22,'2016_02_07_181319_add_database_servers_table',1);
INSERT INTO migrations VALUES(23,'2016_02_13_154306_add_service_option_default_startup',1);
INSERT INTO migrations VALUES(24,'2016_02_20_155318_add_unique_service_field',1);
INSERT INTO migrations VALUES(25,'2016_02_27_163411_add_tasks_table',1);
INSERT INTO migrations VALUES(26,'2016_02_27_163447_add_tasks_log_table',1);
INSERT INTO migrations VALUES(27,'2016_03_18_155649_add_nullable_field_lastrun',1);
INSERT INTO migrations VALUES(28,'2016_08_30_212718_add_ip_alias',1);
INSERT INTO migrations VALUES(29,'2016_08_30_213301_modify_ip_storage_method',1);
INSERT INTO migrations VALUES(30,'2016_09_01_193520_add_suspension_for_servers',1);
INSERT INTO migrations VALUES(31,'2016_09_01_211924_remove_active_column',1);
INSERT INTO migrations VALUES(32,'2016_09_02_190647_add_sftp_password_storage',1);
INSERT INTO migrations VALUES(33,'2016_09_04_171338_update_jobs_tables',1);
INSERT INTO migrations VALUES(34,'2016_09_04_172028_update_failed_jobs_table',1);
INSERT INTO migrations VALUES(35,'2016_09_04_182835_create_notifications_table',1);
INSERT INTO migrations VALUES(36,'2016_09_07_163017_add_unique_identifier',1);
INSERT INTO migrations VALUES(37,'2016_09_14_145945_allow_longer_regex_field',1);
INSERT INTO migrations VALUES(38,'2016_09_17_194246_add_docker_image_column',1);
INSERT INTO migrations VALUES(39,'2016_09_21_165554_update_servers_column_name',1);
INSERT INTO migrations VALUES(40,'2016_09_29_213518_rename_double_insurgency',1);
INSERT INTO migrations VALUES(41,'2016_10_07_152117_build_api_log_table',1);
INSERT INTO migrations VALUES(42,'2016_10_14_164802_update_api_keys',1);
INSERT INTO migrations VALUES(43,'2016_10_23_181719_update_misnamed_bungee',1);
INSERT INTO migrations VALUES(44,'2016_10_23_193810_add_foreign_keys_servers',1);
INSERT INTO migrations VALUES(45,'2016_10_23_201624_add_foreign_allocations',1);
INSERT INTO migrations VALUES(46,'2016_10_23_202222_add_foreign_api_keys',1);
INSERT INTO migrations VALUES(47,'2016_10_23_202703_add_foreign_api_permissions',1);
INSERT INTO migrations VALUES(48,'2016_10_23_202953_add_foreign_database_servers',1);
INSERT INTO migrations VALUES(49,'2016_10_23_203105_add_foreign_databases',1);
INSERT INTO migrations VALUES(50,'2016_10_23_203335_add_foreign_nodes',1);
INSERT INTO migrations VALUES(51,'2016_10_23_203522_add_foreign_permissions',1);
INSERT INTO migrations VALUES(52,'2016_10_23_203857_add_foreign_server_variables',1);
INSERT INTO migrations VALUES(53,'2016_10_23_204157_add_foreign_service_options',1);
INSERT INTO migrations VALUES(54,'2016_10_23_204321_add_foreign_service_variables',1);
INSERT INTO migrations VALUES(55,'2016_10_23_204454_add_foreign_subusers',1);
INSERT INTO migrations VALUES(56,'2016_10_23_204610_add_foreign_tasks',1);
INSERT INTO migrations VALUES(57,'2016_11_11_220649_add_pack_support',1);
INSERT INTO migrations VALUES(58,'2016_11_11_231731_set_service_name_unique',1);
INSERT INTO migrations VALUES(59,'2016_11_27_142519_add_pack_column',1);
INSERT INTO migrations VALUES(60,'2016_12_01_173018_add_configurable_upload_limit',1);
INSERT INTO migrations VALUES(61,'2016_12_02_185206_correct_service_variables',1);
INSERT INTO migrations VALUES(62,'2017_01_07_154228_create_node_configuration_tokens_table',1);
INSERT INTO migrations VALUES(63,'2017_01_12_135449_add_more_user_data',1);
INSERT INTO migrations VALUES(64,'2017_02_02_175548_UpdateColumnNames',1);
INSERT INTO migrations VALUES(65,'2017_02_03_140948_UpdateNodesTable',1);
INSERT INTO migrations VALUES(66,'2017_02_03_155554_RenameColumns',1);
INSERT INTO migrations VALUES(67,'2017_02_05_164123_AdjustColumnNames',1);
INSERT INTO migrations VALUES(68,'2017_02_05_164516_AdjustColumnNamesForServicePacks',1);
INSERT INTO migrations VALUES(69,'2017_02_09_174834_SetupPermissionsPivotTable',1);
INSERT INTO migrations VALUES(70,'2017_02_10_171858_UpdateAPIKeyColumnNames',1);
INSERT INTO migrations VALUES(71,'2017_03_03_224254_UpdateNodeConfigTokensColumns',1);
INSERT INTO migrations VALUES(72,'2017_03_05_212803_DeleteServiceExecutableOption',1);
INSERT INTO migrations VALUES(73,'2017_03_10_162934_AddNewServiceOptionsColumns',1);
INSERT INTO migrations VALUES(74,'2017_03_10_173607_MigrateToNewServiceSystem',1);
INSERT INTO migrations VALUES(75,'2017_03_11_215455_ChangeServiceVariablesValidationRules',1);
INSERT INTO migrations VALUES(76,'2017_03_12_150648_MoveFunctionsFromFileToDatabase',1);
INSERT INTO migrations VALUES(77,'2017_03_14_175631_RenameServicePacksToSingluarPacks',1);
INSERT INTO migrations VALUES(78,'2017_03_14_200326_AddLockedStatusToTable',1);
INSERT INTO migrations VALUES(79,'2017_03_16_181109_ReOrganizeDatabaseServersToDatabaseHost',1);
INSERT INTO migrations VALUES(80,'2017_03_16_181515_CleanupDatabasesDatabase',1);
INSERT INTO migrations VALUES(81,'2017_03_18_204953_AddForeignKeyToPacks',1);
INSERT INTO migrations VALUES(82,'2017_03_31_221948_AddServerDescriptionColumn',1);
INSERT INTO migrations VALUES(83,'2017_04_02_163232_DropDeletedAtColumnFromServers',1);
INSERT INTO migrations VALUES(84,'2017_04_15_125021_UpgradeTaskSystem',1);
INSERT INTO migrations VALUES(85,'2017_04_20_171943_AddScriptsToServiceOptions',1);
INSERT INTO migrations VALUES(86,'2017_04_21_151432_AddServiceScriptTrackingToServers',1);
INSERT INTO migrations VALUES(87,'2017_04_27_145300_AddCopyScriptFromColumn',1);
INSERT INTO migrations VALUES(88,'2017_04_27_223629_AddAbilityToDefineConnectionOverSSLWithDaemonBehindProxy',1);
INSERT INTO migrations VALUES(89,'2017_05_01_141528_DeleteDownloadTable',1);
INSERT INTO migrations VALUES(90,'2017_05_01_141559_DeleteNodeConfigurationTable',1);
INSERT INTO migrations VALUES(91,'2017_06_10_152951_add_external_id_to_users',1);
INSERT INTO migrations VALUES(92,'2017_06_25_133923_ChangeForeignKeyToBeOnCascadeDelete',1);
INSERT INTO migrations VALUES(93,'2017_07_08_152806_ChangeUserPermissionsToDeleteOnUserDeletion',1);
INSERT INTO migrations VALUES(94,'2017_07_08_154416_SetAllocationToReferenceNullOnServerDelete',1);
INSERT INTO migrations VALUES(95,'2017_07_08_154650_CascadeDeletionWhenAServerOrVariableIsDeleted',1);
INSERT INTO migrations VALUES(96,'2017_07_24_194433_DeleteTaskWhenParentServerIsDeleted',1);
INSERT INTO migrations VALUES(97,'2017_08_05_115800_CascadeNullValuesForDatabaseHostWhenNodeIsDeleted',1);
INSERT INTO migrations VALUES(98,'2017_08_05_144104_AllowNegativeValuesForOverallocation',1);
INSERT INTO migrations VALUES(99,'2017_08_05_174811_SetAllocationUnqiueUsingMultipleFields',1);
INSERT INTO migrations VALUES(100,'2017_08_15_214555_CascadeDeletionWhenAParentServiceIsDeleted',1);
INSERT INTO migrations VALUES(101,'2017_08_18_215428_RemovePackWhenParentServiceOptionIsDeleted',1);
INSERT INTO migrations VALUES(102,'2017_09_10_225749_RenameTasksTableForStructureRefactor',1);
INSERT INTO migrations VALUES(103,'2017_09_10_225941_CreateSchedulesTable',1);
INSERT INTO migrations VALUES(104,'2017_09_10_230309_CreateNewTasksTableForSchedules',1);
INSERT INTO migrations VALUES(105,'2017_09_11_002938_TransferOldTasksToNewScheduler',1);
INSERT INTO migrations VALUES(106,'2017_09_13_211810_UpdateOldPermissionsToPointToNewScheduleSystem',1);
INSERT INTO migrations VALUES(107,'2017_09_23_170933_CreateDaemonKeysTable',1);
INSERT INTO migrations VALUES(108,'2017_09_23_173628_RemoveDaemonSecretFromServersTable',1);
INSERT INTO migrations VALUES(109,'2017_09_23_185022_RemoveDaemonSecretFromSubusersTable',1);
INSERT INTO migrations VALUES(110,'2017_10_02_202000_ChangeServicesToUseAMoreUniqueIdentifier',1);
INSERT INTO migrations VALUES(111,'2017_10_02_202007_ChangeToABetterUniqueServiceConfiguration',1);
INSERT INTO migrations VALUES(112,'2017_10_03_233202_CascadeDeletionWhenServiceOptionIsDeleted',1);
INSERT INTO migrations VALUES(113,'2017_10_06_214026_ServicesToNestsConversion',1);
INSERT INTO migrations VALUES(114,'2017_10_06_214053_ServiceOptionsToEggsConversion',1);
INSERT INTO migrations VALUES(115,'2017_10_06_215741_ServiceVariablesToEggVariablesConversion',1);
INSERT INTO migrations VALUES(116,'2017_10_24_222238_RemoveLegacySFTPInformation',1);
INSERT INTO migrations VALUES(117,'2017_11_11_161922_Add2FaLastAuthorizationTimeColumn',1);
INSERT INTO migrations VALUES(118,'2017_11_19_122708_MigratePubPrivFormatToSingleKey',1);
INSERT INTO migrations VALUES(119,'2017_12_04_184012_DropAllocationsWhenNodeIsDeleted',1);
INSERT INTO migrations VALUES(120,'2017_12_12_220426_MigrateSettingsTableToNewFormat',1);
INSERT INTO migrations VALUES(121,'2018_01_01_122821_AllowNegativeValuesForServerSwap',1);
INSERT INTO migrations VALUES(122,'2018_01_11_213943_AddApiKeyPermissionColumns',1);
INSERT INTO migrations VALUES(123,'2018_01_13_142012_SetupTableForKeyEncryption',1);
INSERT INTO migrations VALUES(124,'2018_01_13_145209_AddLastUsedAtColumn',1);
INSERT INTO migrations VALUES(125,'2018_02_04_145617_AllowTextInUserExternalId',1);
INSERT INTO migrations VALUES(126,'2018_02_10_151150_remove_unique_index_on_external_id_column',1);
INSERT INTO migrations VALUES(127,'2018_02_17_134254_ensure_unique_allocation_id_on_servers_table',1);
INSERT INTO migrations VALUES(128,'2018_02_24_112356_add_external_id_column_to_servers_table',1);
INSERT INTO migrations VALUES(129,'2018_02_25_160152_remove_default_null_value_on_table',1);
INSERT INTO migrations VALUES(130,'2018_02_25_160604_define_unique_index_on_users_external_id',1);
INSERT INTO migrations VALUES(131,'2018_03_01_192831_add_database_and_port_limit_columns_to_servers_table',1);
INSERT INTO migrations VALUES(132,'2018_03_15_124536_add_description_to_nodes',1);
INSERT INTO migrations VALUES(133,'2018_05_04_123826_add_maintenance_to_nodes',1);
INSERT INTO migrations VALUES(134,'2018_09_03_143756_allow_egg_variables_to_have_longer_values',1);
INSERT INTO migrations VALUES(135,'2018_09_03_144005_allow_server_variables_to_have_longer_values',1);
INSERT INTO migrations VALUES(136,'2019_03_02_142328_set_allocation_limit_default_null',1);
INSERT INTO migrations VALUES(137,'2019_03_02_151321_fix_unique_index_to_account_for_host',1);
INSERT INTO migrations VALUES(138,'2020_03_22_163911_merge_permissions_table_into_subusers',1);
INSERT INTO migrations VALUES(139,'2020_03_22_164814_drop_permissions_table',1);
INSERT INTO migrations VALUES(140,'2020_04_03_203624_add_threads_column_to_servers_table',1);
INSERT INTO migrations VALUES(141,'2020_04_03_230614_create_backups_table',1);
INSERT INTO migrations VALUES(142,'2020_04_04_131016_add_table_server_transfers',1);
INSERT INTO migrations VALUES(143,'2020_04_10_141024_store_node_tokens_as_encrypted_value',1);
INSERT INTO migrations VALUES(144,'2020_04_17_203438_allow_nullable_descriptions',1);
INSERT INTO migrations VALUES(145,'2020_04_22_055500_add_max_connections_column',1);
INSERT INTO migrations VALUES(146,'2020_04_26_111208_add_backup_limit_to_servers',1);
INSERT INTO migrations VALUES(147,'2020_05_20_234655_add_mounts_table',1);
INSERT INTO migrations VALUES(148,'2020_05_21_192756_add_mount_server_table',1);
INSERT INTO migrations VALUES(149,'2020_07_02_213612_create_user_recovery_tokens_table',1);
INSERT INTO migrations VALUES(150,'2020_07_09_201845_add_notes_column_for_allocations',1);
INSERT INTO migrations VALUES(151,'2020_08_20_205533_add_backup_state_column_to_backups',1);
INSERT INTO migrations VALUES(152,'2020_08_22_132500_update_bytes_to_unsigned_bigint',1);
INSERT INTO migrations VALUES(153,'2020_08_23_175331_modify_checksums_column_for_backups',1);
INSERT INTO migrations VALUES(154,'2020_09_13_110007_drop_packs_from_servers',1);
INSERT INTO migrations VALUES(155,'2020_09_13_110021_drop_packs_from_api_key_permissions',1);
INSERT INTO migrations VALUES(156,'2020_09_13_110047_drop_packs_table',1);
INSERT INTO migrations VALUES(157,'2020_09_13_113503_drop_daemon_key_table',1);
INSERT INTO migrations VALUES(158,'2020_10_10_165437_change_unique_database_name_to_account_for_server',1);
INSERT INTO migrations VALUES(159,'2020_10_26_194904_remove_nullable_from_schedule_name_field',1);
INSERT INTO migrations VALUES(160,'2020_11_02_201014_add_features_column_to_eggs',1);
INSERT INTO migrations VALUES(161,'2020_12_12_102435_support_multiple_docker_images_and_updates',1);
INSERT INTO migrations VALUES(162,'2020_12_14_013707_make_successful_nullable_in_server_transfers',1);
INSERT INTO migrations VALUES(163,'2020_12_17_014330_add_archived_field_to_server_transfers_table',1);
INSERT INTO migrations VALUES(164,'2020_12_24_092449_make_allocation_fields_json',1);
INSERT INTO migrations VALUES(165,'2020_12_26_184914_add_upload_id_column_to_backups_table',1);
INSERT INTO migrations VALUES(166,'2021_01_10_153937_add_file_denylist_to_egg_configs',1);
INSERT INTO migrations VALUES(167,'2021_01_13_013420_add_cron_month',1);
INSERT INTO migrations VALUES(168,'2021_01_17_102401_create_audit_logs_table',1);
INSERT INTO migrations VALUES(169,'2021_01_17_152623_add_generic_server_status_column',1);
INSERT INTO migrations VALUES(170,'2021_01_26_210502_update_file_denylist_to_json',1);
INSERT INTO migrations VALUES(171,'2021_02_23_205021_add_index_for_server_and_action',1);
INSERT INTO migrations VALUES(172,'2021_02_23_212657_make_sftp_port_unsigned_int',1);
INSERT INTO migrations VALUES(173,'2021_03_21_104718_force_cron_month_field_to_have_value_if_missing',1);
INSERT INTO migrations VALUES(174,'2021_05_01_092457_add_continue_on_failure_option_to_tasks',1);
INSERT INTO migrations VALUES(175,'2021_05_01_092523_add_only_run_when_server_online_option_to_schedules',1);
INSERT INTO migrations VALUES(176,'2021_05_03_201016_add_support_for_locking_a_backup',1);
INSERT INTO migrations VALUES(177,'2021_07_12_013420_remove_userinteraction',1);
INSERT INTO migrations VALUES(178,'2021_07_17_211512_create_user_ssh_keys_table',1);
INSERT INTO migrations VALUES(179,'2021_08_03_210600_change_successful_field_to_default_to_false_on_backups_table',1);
INSERT INTO migrations VALUES(180,'2021_08_21_175111_add_foreign_keys_to_mount_node_table',1);
INSERT INTO migrations VALUES(181,'2021_08_21_175118_add_foreign_keys_to_mount_server_table',1);
INSERT INTO migrations VALUES(182,'2021_08_21_180921_add_foreign_keys_to_egg_mount_table',1);
INSERT INTO migrations VALUES(183,'2022_01_25_030847_drop_google_analytics',1);
INSERT INTO migrations VALUES(184,'2022_05_07_165334_migrate_egg_images_array_to_new_format',1);
INSERT INTO migrations VALUES(185,'2022_05_28_135717_create_activity_logs_table',1);
INSERT INTO migrations VALUES(186,'2022_05_29_140349_create_activity_log_actors_table',1);
INSERT INTO migrations VALUES(187,'2022_06_18_112822_track_api_key_usage_for_activity_events',1);
INSERT INTO migrations VALUES(188,'2022_08_16_214400_add_force_outgoing_ip_column_to_eggs_table',1);
INSERT INTO migrations VALUES(189,'2022_08_16_230204_add_installed_at_column_to_servers_table',1);
INSERT INTO migrations VALUES(190,'2022_12_12_213937_update_mail_settings_to_new_format',1);
INSERT INTO migrations VALUES(191,'2023_01_24_210051_add_uuid_column_to_failed_jobs_table',1);
INSERT INTO migrations VALUES(192,'2023_02_23_191004_add_expires_at_column_to_api_keys_table',1);
INSERT INTO migrations VALUES(193,'2024_03_12_154408_remove_nests_table',1);
INSERT INTO migrations VALUES(194,'2024_03_14_055537_remove_locations_table',1);
INSERT INTO migrations VALUES(195,'2024_04_14_002250_update_column_names',1);
INSERT INTO migrations VALUES(196,'2024_04_20_214441_add_egg_var_sort',1);

View File

@ -10,14 +10,13 @@ use App\Events\ActivityLogged;
use App\Tests\Assertions\AssertsActivityLogged; use App\Tests\Assertions\AssertsActivityLogged;
use App\Tests\Traits\Integration\CreatesTestModels; use App\Tests\Traits\Integration\CreatesTestModels;
use App\Transformers\Api\Application\BaseTransformer; use App\Transformers\Api\Application\BaseTransformer;
use Illuminate\Support\Facades\DB;
abstract class IntegrationTestCase extends TestCase abstract class IntegrationTestCase extends TestCase
{ {
use AssertsActivityLogged; use AssertsActivityLogged;
use CreatesTestModels; use CreatesTestModels;
protected array $connectionsToTransact = ['mysql'];
protected $defaultHeaders = [ protected $defaultHeaders = [
'Accept' => 'application/json', 'Accept' => 'application/json',
]; ];
@ -38,4 +37,14 @@ abstract class IntegrationTestCase extends TestCase
->setTimezone(BaseTransformer::RESPONSE_TIMEZONE) ->setTimezone(BaseTransformer::RESPONSE_TIMEZONE)
->toAtomString(); ->toAtomString();
} }
/**
* The database connections that should have transactions.
*
* @return array
*/
protected function connectionsToTransact()
{
return [DB::getDriverName()];
}
} }