mirror of
https://github.com/louislam/uptime-kuma.git
synced 2024-11-27 16:54:04 +00:00
Improve the setup database
This commit is contained in:
parent
d286c534bd
commit
e26abc3156
11 changed files with 122 additions and 136 deletions
|
@ -350,6 +350,103 @@ async function createTables() {
|
||||||
table.string("domain").notNullable().unique().collate("utf8_general_ci");
|
table.string("domain").notNullable().unique().collate("utf8_general_ci");
|
||||||
});
|
});
|
||||||
|
|
||||||
|
/*********************
|
||||||
|
* Converted Patch here
|
||||||
|
*********************/
|
||||||
|
|
||||||
|
// 2023-06-30-1348-http-body-encoding.js
|
||||||
|
// ALTER TABLE monitor ADD http_body_encoding VARCHAR(25);
|
||||||
|
// UPDATE monitor SET http_body_encoding = 'json' WHERE (type = 'http' or type = 'keyword') AND http_body_encoding IS NULL;
|
||||||
|
await knex.schema.table("monitor", function (table) {
|
||||||
|
table.string("http_body_encoding", 25);
|
||||||
|
});
|
||||||
|
|
||||||
|
await knex("monitor")
|
||||||
|
.where(function () {
|
||||||
|
this.where("type", "http").orWhere("type", "keyword");
|
||||||
|
})
|
||||||
|
.whereNull("http_body_encoding")
|
||||||
|
.update({
|
||||||
|
http_body_encoding: "json",
|
||||||
|
});
|
||||||
|
|
||||||
|
// 2023-06-30-1354-add-description-monitor.js
|
||||||
|
// ALTER TABLE monitor ADD description TEXT default null;
|
||||||
|
await knex.schema.table("monitor", function (table) {
|
||||||
|
table.text("description").defaultTo(null);
|
||||||
|
});
|
||||||
|
|
||||||
|
// 2023-06-30-1357-api-key-table.js
|
||||||
|
/*
|
||||||
|
CREATE TABLE [api_key] (
|
||||||
|
[id] INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
|
||||||
|
[key] VARCHAR(255) NOT NULL,
|
||||||
|
[name] VARCHAR(255) NOT NULL,
|
||||||
|
[user_id] INTEGER NOT NULL,
|
||||||
|
[created_date] DATETIME DEFAULT (DATETIME('now')) NOT NULL,
|
||||||
|
[active] BOOLEAN DEFAULT 1 NOT NULL,
|
||||||
|
[expires] DATETIME DEFAULT NULL,
|
||||||
|
CONSTRAINT FK_user FOREIGN KEY ([user_id]) REFERENCES [user]([id]) ON DELETE CASCADE ON UPDATE CASCADE
|
||||||
|
);
|
||||||
|
*/
|
||||||
|
await knex.schema.createTable("api_key", function (table) {
|
||||||
|
table.increments("id").primary();
|
||||||
|
table.string("key", 255).notNullable();
|
||||||
|
table.string("name", 255).notNullable();
|
||||||
|
table.integer("user_id").unsigned().notNullable()
|
||||||
|
.references("id").inTable("user")
|
||||||
|
.onDelete("CASCADE")
|
||||||
|
.onUpdate("CASCADE");
|
||||||
|
table.dateTime("created_date").defaultTo(knex.fn.now()).notNullable();
|
||||||
|
table.boolean("active").defaultTo(1).notNullable();
|
||||||
|
table.dateTime("expires").defaultTo(null);
|
||||||
|
});
|
||||||
|
|
||||||
|
// 2023-06-30-1400-monitor-tls.js
|
||||||
|
/*
|
||||||
|
ALTER TABLE monitor
|
||||||
|
ADD tls_ca TEXT default null;
|
||||||
|
|
||||||
|
ALTER TABLE monitor
|
||||||
|
ADD tls_cert TEXT default null;
|
||||||
|
|
||||||
|
ALTER TABLE monitor
|
||||||
|
ADD tls_key TEXT default null;
|
||||||
|
*/
|
||||||
|
await knex.schema.table("monitor", function (table) {
|
||||||
|
table.text("tls_ca").defaultTo(null);
|
||||||
|
table.text("tls_cert").defaultTo(null);
|
||||||
|
table.text("tls_key").defaultTo(null);
|
||||||
|
});
|
||||||
|
|
||||||
|
// 2023-06-30-1401-maintenance-cron.js
|
||||||
|
/*
|
||||||
|
-- 999 characters. https://stackoverflow.com/questions/46134830/maximum-length-for-cron-job
|
||||||
|
DROP TABLE maintenance_timeslot;
|
||||||
|
ALTER TABLE maintenance ADD cron TEXT;
|
||||||
|
ALTER TABLE maintenance ADD timezone VARCHAR(255);
|
||||||
|
ALTER TABLE maintenance ADD duration INTEGER;
|
||||||
|
*/
|
||||||
|
await knex.schema
|
||||||
|
.dropTableIfExists("maintenance_timeslot")
|
||||||
|
.table("maintenance", function (table) {
|
||||||
|
table.text("cron");
|
||||||
|
table.string("timezone", 255);
|
||||||
|
table.integer("duration");
|
||||||
|
});
|
||||||
|
|
||||||
|
// 2023-06-30-1413-add-parent-monitor.js.
|
||||||
|
/*
|
||||||
|
ALTER TABLE monitor
|
||||||
|
ADD parent INTEGER REFERENCES [monitor] ([id]) ON DELETE SET NULL ON UPDATE CASCADE;
|
||||||
|
*/
|
||||||
|
await knex.schema.table("monitor", function (table) {
|
||||||
|
table.integer("parent").unsigned()
|
||||||
|
.references("id").inTable("monitor")
|
||||||
|
.onDelete("SET NULL")
|
||||||
|
.onUpdate("CASCADE");
|
||||||
|
});
|
||||||
|
|
||||||
log.info("mariadb", "Created basic tables for MariaDB");
|
log.info("mariadb", "Created basic tables for MariaDB");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,22 +0,0 @@
|
||||||
// ALTER TABLE monitor ADD http_body_encoding VARCHAR(25);
|
|
||||||
// UPDATE monitor SET http_body_encoding = 'json' WHERE (type = 'http' or type = 'keyword') AND http_body_encoding IS NULL;
|
|
||||||
exports.up = function (knex) {
|
|
||||||
return knex.schema.table("monitor", function (table) {
|
|
||||||
table.string("http_body_encoding", 25);
|
|
||||||
}).then(function () {
|
|
||||||
knex("monitor")
|
|
||||||
.where(function () {
|
|
||||||
this.where("type", "http").orWhere("type", "keyword");
|
|
||||||
})
|
|
||||||
.whereNull("http_body_encoding")
|
|
||||||
.update({
|
|
||||||
http_body_encoding: "json",
|
|
||||||
});
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
exports.down = function (knex) {
|
|
||||||
return knex.schema.table("monitor", function (table) {
|
|
||||||
table.dropColumn("http_body_encoding");
|
|
||||||
});
|
|
||||||
};
|
|
|
@ -1,12 +0,0 @@
|
||||||
// ALTER TABLE monitor ADD description TEXT default null;
|
|
||||||
exports.up = function (knex) {
|
|
||||||
return knex.schema.table("monitor", function (table) {
|
|
||||||
table.text("description").defaultTo(null);
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
exports.down = function (knex) {
|
|
||||||
return knex.schema.table("monitor", function (table) {
|
|
||||||
table.dropColumn("description");
|
|
||||||
});
|
|
||||||
};
|
|
|
@ -1,30 +0,0 @@
|
||||||
/*
|
|
||||||
CREATE TABLE [api_key] (
|
|
||||||
[id] INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
|
|
||||||
[key] VARCHAR(255) NOT NULL,
|
|
||||||
[name] VARCHAR(255) NOT NULL,
|
|
||||||
[user_id] INTEGER NOT NULL,
|
|
||||||
[created_date] DATETIME DEFAULT (DATETIME('now')) NOT NULL,
|
|
||||||
[active] BOOLEAN DEFAULT 1 NOT NULL,
|
|
||||||
[expires] DATETIME DEFAULT NULL,
|
|
||||||
CONSTRAINT FK_user FOREIGN KEY ([user_id]) REFERENCES [user]([id]) ON DELETE CASCADE ON UPDATE CASCADE
|
|
||||||
);
|
|
||||||
*/
|
|
||||||
exports.up = function (knex) {
|
|
||||||
return knex.schema.createTable("api_key", function (table) {
|
|
||||||
table.increments("id").primary();
|
|
||||||
table.string("key", 255).notNullable();
|
|
||||||
table.string("name", 255).notNullable();
|
|
||||||
table.integer("user_id").unsigned().notNullable()
|
|
||||||
.references("id").inTable("user")
|
|
||||||
.onDelete("CASCADE")
|
|
||||||
.onUpdate("CASCADE");
|
|
||||||
table.dateTime("created_date").defaultTo(knex.fn.now()).notNullable();
|
|
||||||
table.boolean("active").defaultTo(1).notNullable();
|
|
||||||
table.dateTime("expires").defaultTo(null);
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
exports.down = function (knex) {
|
|
||||||
return knex.schema.dropTable("api_key");
|
|
||||||
};
|
|
|
@ -1,25 +0,0 @@
|
||||||
/*
|
|
||||||
ALTER TABLE monitor
|
|
||||||
ADD tls_ca TEXT default null;
|
|
||||||
|
|
||||||
ALTER TABLE monitor
|
|
||||||
ADD tls_cert TEXT default null;
|
|
||||||
|
|
||||||
ALTER TABLE monitor
|
|
||||||
ADD tls_key TEXT default null;
|
|
||||||
*/
|
|
||||||
exports.up = function (knex) {
|
|
||||||
return knex.schema.table("monitor", function (table) {
|
|
||||||
table.text("tls_ca").defaultTo(null);
|
|
||||||
table.text("tls_cert").defaultTo(null);
|
|
||||||
table.text("tls_key").defaultTo(null);
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
exports.down = function (knex) {
|
|
||||||
return knex.schema.table("monitor", function (table) {
|
|
||||||
table.dropColumn("tls_ca");
|
|
||||||
table.dropColumn("tls_cert");
|
|
||||||
table.dropColumn("tls_key");
|
|
||||||
});
|
|
||||||
};
|
|
|
@ -1,25 +0,0 @@
|
||||||
/*
|
|
||||||
-- 999 characters. https://stackoverflow.com/questions/46134830/maximum-length-for-cron-job
|
|
||||||
DROP TABLE maintenance_timeslot;
|
|
||||||
ALTER TABLE maintenance ADD cron TEXT;
|
|
||||||
ALTER TABLE maintenance ADD timezone VARCHAR(255);
|
|
||||||
ALTER TABLE maintenance ADD duration INTEGER;
|
|
||||||
*/
|
|
||||||
exports.up = function (knex) {
|
|
||||||
return knex.schema
|
|
||||||
.dropTableIfExists("maintenance_timeslot")
|
|
||||||
.table("maintenance", function (table) {
|
|
||||||
table.text("cron");
|
|
||||||
table.string("timezone", 255);
|
|
||||||
table.integer("duration");
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
exports.down = function (knex) {
|
|
||||||
return knex.schema
|
|
||||||
.table("maintenance", function (table) {
|
|
||||||
table.dropColumn("cron");
|
|
||||||
table.dropColumn("timezone");
|
|
||||||
table.dropColumn("duration");
|
|
||||||
});
|
|
||||||
};
|
|
|
@ -1,18 +0,0 @@
|
||||||
/*
|
|
||||||
ALTER TABLE monitor
|
|
||||||
ADD parent INTEGER REFERENCES [monitor] ([id]) ON DELETE SET NULL ON UPDATE CASCADE;
|
|
||||||
*/
|
|
||||||
exports.up = function (knex) {
|
|
||||||
return knex.schema.table("monitor", function (table) {
|
|
||||||
table.integer("parent").unsigned()
|
|
||||||
.references("id").inTable("monitor")
|
|
||||||
.onDelete("SET NULL")
|
|
||||||
.onUpdate("CASCADE");
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
exports.down = function (knex) {
|
|
||||||
return knex.schema.table("monitor", function (table) {
|
|
||||||
table.dropColumn("parent");
|
|
||||||
});
|
|
||||||
};
|
|
|
@ -37,6 +37,11 @@ exports.up = function(knex) {
|
||||||
table.increments('id');
|
table.increments('id');
|
||||||
table.decimal('price').notNullable();
|
table.decimal('price').notNullable();
|
||||||
table.string('name', 1000).notNullable();
|
table.string('name', 1000).notNullable();
|
||||||
|
}).then(() => {
|
||||||
|
knex("products").insert([
|
||||||
|
{ price: 10, name: "Apple" },
|
||||||
|
{ price: 20, name: "Orange" },
|
||||||
|
]);
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -209,6 +209,7 @@ class Database {
|
||||||
});
|
});
|
||||||
|
|
||||||
await connection.execute("CREATE DATABASE IF NOT EXISTS " + dbConfig.dbName + " CHARACTER SET utf8mb4");
|
await connection.execute("CREATE DATABASE IF NOT EXISTS " + dbConfig.dbName + " CHARACTER SET utf8mb4");
|
||||||
|
connection.end();
|
||||||
|
|
||||||
config = {
|
config = {
|
||||||
client: "mysql2",
|
client: "mysql2",
|
||||||
|
|
|
@ -5,6 +5,7 @@ const fs = require("fs");
|
||||||
const path = require("path");
|
const path = require("path");
|
||||||
const Database = require("./database");
|
const Database = require("./database");
|
||||||
const { allowDevAllOrigin } = require("./util-server");
|
const { allowDevAllOrigin } = require("./util-server");
|
||||||
|
const mysql = require("mysql2/promise");
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A standalone express app that is used to setup database
|
* A standalone express app that is used to setup database
|
||||||
|
@ -145,6 +146,7 @@ class SetupDatabase {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// External MariaDB
|
||||||
if (dbConfig.type === "mariadb") {
|
if (dbConfig.type === "mariadb") {
|
||||||
if (!dbConfig.hostname) {
|
if (!dbConfig.hostname) {
|
||||||
response.status(400).json("Hostname is required");
|
response.status(400).json("Hostname is required");
|
||||||
|
@ -175,6 +177,22 @@ class SetupDatabase {
|
||||||
this.runningSetup = false;
|
this.runningSetup = false;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Test connection
|
||||||
|
try {
|
||||||
|
const connection = await mysql.createConnection({
|
||||||
|
host: dbConfig.hostname,
|
||||||
|
port: dbConfig.port,
|
||||||
|
user: dbConfig.username,
|
||||||
|
password: dbConfig.password,
|
||||||
|
});
|
||||||
|
await connection.execute("SELECT 1");
|
||||||
|
connection.end();
|
||||||
|
} catch (e) {
|
||||||
|
response.status(400).json("Cannot connect to the database: " + e.message);
|
||||||
|
this.runningSetup = false;
|
||||||
|
return;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Write db-config.json
|
// Write db-config.json
|
||||||
|
|
|
@ -90,8 +90,6 @@
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<button v-if="dbConfig.type === 'mariadb'" class="btn btn-warning mt-3" @submit.prevent="test">{{ $t("Test") }}</button>
|
|
||||||
|
|
||||||
<button class="btn btn-primary mt-4 short" type="submit" :disabled="disabledButton">
|
<button class="btn btn-primary mt-4 short" type="submit" :disabled="disabledButton">
|
||||||
{{ $t("Next") }}
|
{{ $t("Next") }}
|
||||||
</button>
|
</button>
|
||||||
|
@ -145,10 +143,9 @@ export default {
|
||||||
this.info.runningSetup = true;
|
this.info.runningSetup = true;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
let res = await axios.post("/setup-database", {
|
await axios.post("/setup-database", {
|
||||||
dbConfig: this.dbConfig,
|
dbConfig: this.dbConfig,
|
||||||
});
|
});
|
||||||
|
|
||||||
await sleep(2000);
|
await sleep(2000);
|
||||||
await this.goToMainServerWhenReady();
|
await this.goToMainServerWhenReady();
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
|
|
Loading…
Reference in a new issue