2015-07-20 00:09:47 -07:00
|
|
|
#### WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING
|
|
|
|
|
#### This file is not used by any code and is here to document the latest schema
|
|
|
|
|
|
|
|
|
|
#### General ideas
|
|
|
|
|
#### Default char set is utf8 and DEFAULT COLLATE is utf8_bin. Collate affects comparisons in WHERE and ORDER
|
|
|
|
|
#### Strict mode is enabled
|
|
|
|
|
#### VARCHAR - stored as part of table row (use for strings)
|
|
|
|
|
#### TEXT - stored offline from table row (use for strings)
|
|
|
|
|
#### BLOB - stored offline from table row (use for binary data)
|
|
|
|
|
#### https://dev.mysql.com/doc/refman/5.0/en/storage-requirements.html
|
2019-03-23 09:46:04 -07:00
|
|
|
#### Times are stored in the database in UTC. And precision is seconds
|
2015-07-20 00:09:47 -07:00
|
|
|
|
2017-11-19 12:36:05 -08:00
|
|
|
# The code uses zero dates. Make sure sql_mode does NOT have NO_ZERO_DATE
|
|
|
|
|
# http://johnemb.blogspot.com/2014/09/adding-or-removing-individual-sql-modes.html
|
|
|
|
|
# SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'NO_ZERO_DATE',''));
|
|
|
|
|
|
2015-07-20 00:09:47 -07:00
|
|
|
CREATE TABLE IF NOT EXISTS users(
|
|
|
|
|
id VARCHAR(128) NOT NULL UNIQUE,
|
2016-04-05 10:54:09 +02:00
|
|
|
username VARCHAR(254) UNIQUE,
|
2015-07-20 00:09:47 -07:00
|
|
|
email VARCHAR(254) NOT NULL UNIQUE,
|
|
|
|
|
password VARCHAR(1024) NOT NULL,
|
|
|
|
|
salt VARCHAR(512) NOT NULL,
|
|
|
|
|
createdAt VARCHAR(512) NOT NULL,
|
|
|
|
|
modifiedAt VARCHAR(512) NOT NULL,
|
2018-04-25 16:33:18 +02:00
|
|
|
displayName VARCHAR(512) DEFAULT "",
|
|
|
|
|
fallbackEmail VARCHAR(512) DEFAULT "",
|
|
|
|
|
twoFactorAuthenticationSecret VARCHAR(128) DEFAULT "",
|
|
|
|
|
twoFactorAuthenticationEnabled BOOLEAN DEFAULT false,
|
2019-08-29 17:52:00 +02:00
|
|
|
source VARCHAR(128) DEFAULT "",
|
2020-02-21 12:17:06 -08:00
|
|
|
role VARCHAR(32),
|
2020-03-30 16:32:28 -07:00
|
|
|
resetToken VARCHAR(128) DEFAULT "",
|
2020-03-30 16:47:18 -07:00
|
|
|
resetTokenCreationTime TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
2020-03-30 16:32:28 -07:00
|
|
|
active BOOLEAN DEFAULT 1,
|
2018-01-21 14:25:39 +01:00
|
|
|
|
2015-07-20 00:09:47 -07:00
|
|
|
PRIMARY KEY(id));
|
|
|
|
|
|
2018-12-01 00:38:00 +01:00
|
|
|
CREATE TABLE IF NOT EXISTS userGroups(
|
2016-02-07 19:24:07 -08:00
|
|
|
id VARCHAR(128) NOT NULL UNIQUE,
|
2016-09-27 21:11:41 +02:00
|
|
|
name VARCHAR(254) NOT NULL UNIQUE,
|
2020-06-04 13:25:55 +02:00
|
|
|
source VARCHAR(128) DEFAULT "",
|
2016-02-07 19:24:07 -08:00
|
|
|
PRIMARY KEY(id));
|
|
|
|
|
|
2016-02-08 08:55:37 -08:00
|
|
|
CREATE TABLE IF NOT EXISTS groupMembers(
|
|
|
|
|
groupId VARCHAR(128) NOT NULL,
|
|
|
|
|
userId VARCHAR(128) NOT NULL,
|
2018-12-01 00:38:00 +01:00
|
|
|
FOREIGN KEY(groupId) REFERENCES userGroups(id),
|
2016-02-08 08:55:37 -08:00
|
|
|
FOREIGN KEY(userId) REFERENCES users(id));
|
|
|
|
|
|
2015-07-20 00:09:47 -07:00
|
|
|
CREATE TABLE IF NOT EXISTS tokens(
|
2019-02-15 13:57:18 -08:00
|
|
|
id VARCHAR(128) NOT NULL UNIQUE,
|
2018-08-27 14:50:41 -07:00
|
|
|
name VARCHAR(64) DEFAULT "", // description
|
2015-07-20 00:09:47 -07:00
|
|
|
accessToken VARCHAR(128) NOT NULL UNIQUE,
|
2019-02-15 13:57:18 -08:00
|
|
|
identifier VARCHAR(128) NOT NULL, // resourceId: app id or user id
|
2015-07-20 00:09:47 -07:00
|
|
|
clientId VARCHAR(128),
|
|
|
|
|
scope VARCHAR(512) NOT NULL,
|
2016-06-03 10:07:30 -07:00
|
|
|
expires BIGINT NOT NULL, // FIXME: make this a timestamp
|
2015-07-20 00:09:47 -07:00
|
|
|
PRIMARY KEY(accessToken));
|
|
|
|
|
|
|
|
|
|
CREATE TABLE IF NOT EXISTS apps(
|
|
|
|
|
id VARCHAR(128) NOT NULL UNIQUE,
|
2019-11-16 10:31:32 -08:00
|
|
|
appStoreId VARCHAR(128) NOT NULL, // empty for custom apps
|
2019-09-22 00:20:12 -07:00
|
|
|
installationState VARCHAR(512) NOT NULL, // the active task on the app
|
2019-09-22 22:07:14 -07:00
|
|
|
runState VARCHAR(512) NOT NULL, // if the app is stopped
|
2015-07-20 00:09:47 -07:00
|
|
|
health VARCHAR(128),
|
2019-02-12 16:03:12 -08:00
|
|
|
healthTime TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, // when the app last responded
|
2015-07-20 00:09:47 -07:00
|
|
|
containerId VARCHAR(128),
|
2015-11-13 10:15:27 +01:00
|
|
|
manifestJson TEXT,
|
2015-07-20 00:09:47 -07:00
|
|
|
httpPort INTEGER, // this is the nginx proxy port and not manifest.httpPort
|
2017-10-30 00:16:33 +01:00
|
|
|
location VARCHAR(128) NOT NULL,
|
|
|
|
|
domain VARCHAR(128) NOT NULL,
|
2016-05-27 11:10:36 -07:00
|
|
|
accessRestrictionJson TEXT, // { users: [ ], groups: [ ] }
|
2018-12-03 13:39:52 +01:00
|
|
|
creationTime TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, // when the app was installed
|
|
|
|
|
updateTime TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, // when the last app update was done
|
2018-06-26 18:09:04 -07:00
|
|
|
ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, // when this db record was updated (useful for UI caching)
|
2016-02-05 15:03:45 +01:00
|
|
|
memoryLimit BIGINT DEFAULT 0,
|
2020-01-28 21:30:35 -08:00
|
|
|
cpuShares INTEGER DEFAULT 512,
|
2016-07-14 15:04:52 +02:00
|
|
|
xFrameOptions VARCHAR(512),
|
2016-11-11 10:48:33 +05:30
|
|
|
sso BOOLEAN DEFAULT 1, // whether user chose to enable SSO
|
2017-01-20 05:48:25 -08:00
|
|
|
debugModeJson TEXT, // options for development mode
|
2019-10-14 16:59:22 -07:00
|
|
|
reverseProxyConfigJson TEXT, // { robotsTxt, csp }
|
2017-11-21 18:09:44 -08:00
|
|
|
enableBackup BOOLEAN DEFAULT 1, // misnomer: controls automatic daily backups
|
2018-12-07 09:03:28 -08:00
|
|
|
enableAutomaticUpdate BOOLEAN DEFAULT 1,
|
2020-03-30 22:18:39 -07:00
|
|
|
mailboxName VARCHAR(128), // mailbox of this app
|
|
|
|
|
mailboxDomain VARCHAR(128), // mailbox domain of this apps
|
2019-03-22 14:09:31 -07:00
|
|
|
label VARCHAR(128), // display name
|
|
|
|
|
tagsJson VARCHAR(2048), // array of tags
|
2019-08-12 22:16:32 -07:00
|
|
|
dataDir VARCHAR(256) UNIQUE,
|
2019-08-26 14:12:36 -07:00
|
|
|
taskId INTEGER, // current task
|
2019-08-30 09:45:43 -07:00
|
|
|
errorJson TEXT,
|
2020-04-29 21:55:21 -07:00
|
|
|
bindsJson TEXT, // bind mounts
|
2015-07-20 00:09:47 -07:00
|
|
|
|
2019-11-14 21:43:14 -08:00
|
|
|
FOREIGN KEY(mailboxDomain) REFERENCES domains(domain),
|
2019-08-26 14:12:36 -07:00
|
|
|
FOREIGN KEY(taskId) REFERENCES tasks(id),
|
2015-07-20 00:09:47 -07:00
|
|
|
PRIMARY KEY(id));
|
|
|
|
|
|
|
|
|
|
CREATE TABLE IF NOT EXISTS appPortBindings(
|
|
|
|
|
hostPort INTEGER NOT NULL UNIQUE,
|
2018-08-12 22:08:19 -07:00
|
|
|
type VARCHAR(8) NOT NULL DEFAULT "tcp",
|
2015-07-20 00:09:47 -07:00
|
|
|
environmentVariable VARCHAR(128) NOT NULL,
|
|
|
|
|
appId VARCHAR(128) NOT NULL,
|
|
|
|
|
FOREIGN KEY(appId) REFERENCES apps(id),
|
|
|
|
|
PRIMARY KEY(hostPort));
|
|
|
|
|
|
|
|
|
|
CREATE TABLE IF NOT EXISTS settings(
|
|
|
|
|
name VARCHAR(128) NOT NULL UNIQUE,
|
2017-09-11 15:35:55 +02:00
|
|
|
value TEXT,
|
2015-07-20 00:09:47 -07:00
|
|
|
PRIMARY KEY(name));
|
|
|
|
|
|
|
|
|
|
CREATE TABLE IF NOT EXISTS appAddonConfigs(
|
|
|
|
|
appId VARCHAR(128) NOT NULL,
|
|
|
|
|
addonId VARCHAR(32) NOT NULL,
|
2017-03-25 13:35:28 -07:00
|
|
|
name VARCHAR(128) NOT NULL,
|
2015-07-20 00:09:47 -07:00
|
|
|
value VARCHAR(512) NOT NULL,
|
|
|
|
|
FOREIGN KEY(appId) REFERENCES apps(id));
|
|
|
|
|
|
2018-10-11 14:07:43 -07:00
|
|
|
CREATE TABLE IF NOT EXISTS appEnvVars(
|
|
|
|
|
appId VARCHAR(128) NOT NULL,
|
|
|
|
|
name TEXT NOT NULL,
|
|
|
|
|
value TEXT NOT NULL,
|
|
|
|
|
FOREIGN KEY(appId) REFERENCES apps(id));
|
|
|
|
|
|
2016-03-07 09:26:26 -08:00
|
|
|
CREATE TABLE IF NOT EXISTS backups(
|
2017-05-26 22:23:24 -07:00
|
|
|
id VARCHAR(128) NOT NULL,
|
2018-12-03 13:39:52 +01:00
|
|
|
creationTime TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
2020-05-13 22:09:33 -07:00
|
|
|
packageVersion VARCHAR(128) NOT NULL, /* app version or box version */
|
|
|
|
|
encryptionVersion INTEGER, /* when null, unencrypted backup */
|
2016-03-07 09:26:26 -08:00
|
|
|
type VARCHAR(16) NOT NULL, /* 'box' or 'app' */
|
2020-06-14 11:29:07 -07:00
|
|
|
identifier VARCHAR(128) NOT NULL, /* 'box' or the app id */
|
2017-02-23 17:56:32 +01:00
|
|
|
dependsOn TEXT, /* comma separate list of objects this backup depends on */
|
2016-03-07 09:26:26 -08:00
|
|
|
state VARCHAR(16) NOT NULL,
|
2017-11-16 11:22:09 -08:00
|
|
|
manifestJson TEXT, /* to validate if the app can be installed in this version of box */
|
2017-10-12 17:46:15 -07:00
|
|
|
format VARCHAR(16) DEFAULT "tgz",
|
2019-04-13 17:09:15 -07:00
|
|
|
preserveSecs INTEGER DEFAULT 0,
|
2016-03-07 09:26:26 -08:00
|
|
|
|
2017-05-26 22:23:24 -07:00
|
|
|
PRIMARY KEY (id));
|
2016-04-29 23:28:54 -07:00
|
|
|
|
|
|
|
|
CREATE TABLE IF NOT EXISTS eventlog(
|
|
|
|
|
id VARCHAR(128) NOT NULL,
|
|
|
|
|
action VARCHAR(128) NOT NULL,
|
2017-07-31 09:44:28 +02:00
|
|
|
source TEXT, /* { userId, username, ip }. userId can be null for cron,sysadmin */
|
|
|
|
|
data TEXT, /* free flowing json based on action */
|
2018-12-03 13:39:52 +01:00
|
|
|
creationTime TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
2016-04-29 23:28:54 -07:00
|
|
|
|
|
|
|
|
PRIMARY KEY (id));
|
2016-05-26 18:02:22 -07:00
|
|
|
|
2017-10-27 23:39:53 +02:00
|
|
|
CREATE TABLE IF NOT EXISTS domains(
|
2017-10-30 00:16:33 +01:00
|
|
|
domain VARCHAR(128) NOT NULL UNIQUE, /* if this needs to be larger, InnoDB has a limit of 767 bytes for PRIMARY KEY values! */
|
2017-10-27 23:39:53 +02:00
|
|
|
zoneName VARCHAR(128) NOT NULL, /* this mostly contains the domain itself again */
|
2018-01-09 14:46:38 -08:00
|
|
|
provider VARCHAR(16) NOT NULL,
|
2017-10-27 23:39:53 +02:00
|
|
|
configJson TEXT, /* JSON containing the dns backend provider config */
|
2018-01-31 16:51:53 +01:00
|
|
|
tlsConfigJson TEXT, /* JSON containing the tls provider config */
|
2017-10-27 23:39:53 +02:00
|
|
|
|
2017-10-30 00:16:33 +01:00
|
|
|
PRIMARY KEY (domain))
|
|
|
|
|
|
|
|
|
|
/* the default db collation is utf8mb4_unicode_ci but for the app table domain constraint we have to use the old one */
|
|
|
|
|
CHARACTER SET utf8 COLLATE utf8_bin;
|
2018-01-20 22:17:53 -08:00
|
|
|
|
2018-01-23 15:45:30 +01:00
|
|
|
CREATE TABLE IF NOT EXISTS mail(
|
2018-01-20 22:17:53 -08:00
|
|
|
domain VARCHAR(128) NOT NULL UNIQUE,
|
|
|
|
|
|
|
|
|
|
enabled BOOLEAN DEFAULT 0, /* MDA enabled */
|
|
|
|
|
mailFromValidation BOOLEAN DEFAULT 1,
|
|
|
|
|
catchAllJson TEXT,
|
|
|
|
|
relayJson TEXT,
|
|
|
|
|
|
2019-06-10 12:23:29 -07:00
|
|
|
dkimSelector VARCHAR(128) NOT NULL DEFAULT "cloudron",
|
|
|
|
|
|
2018-01-20 22:17:53 -08:00
|
|
|
FOREIGN KEY(domain) REFERENCES domains(domain),
|
|
|
|
|
PRIMARY KEY(domain))
|
|
|
|
|
|
|
|
|
|
CHARACTER SET utf8 COLLATE utf8_bin;
|
|
|
|
|
|
2018-02-10 21:29:10 -08:00
|
|
|
/* Future fields:
|
|
|
|
|
* accessRestriction - to determine who can access it. So this has foreign keys
|
|
|
|
|
* quota - per mailbox quota
|
2018-12-06 21:08:19 -08:00
|
|
|
|
|
|
|
|
NOTE: this table exists only real mailboxes. And has unique constraint to handle
|
|
|
|
|
conflict with aliases and mailbox names
|
2018-02-10 21:29:10 -08:00
|
|
|
*/
|
|
|
|
|
CREATE TABLE IF NOT EXISTS mailboxes(
|
|
|
|
|
name VARCHAR(128) NOT NULL,
|
2018-04-07 19:12:07 -07:00
|
|
|
type VARCHAR(16) NOT NULL, /* 'mailbox', 'alias', 'list' */
|
2018-12-06 21:08:19 -08:00
|
|
|
ownerId VARCHAR(128) NOT NULL, /* user id */
|
2020-04-19 18:44:16 -07:00
|
|
|
aliasName VARCHAR(128), /* the target name type is an alias */
|
|
|
|
|
aliasDomain VARCHAR(128), /* the target domain */
|
2019-09-11 12:44:15 -07:00
|
|
|
membersJson TEXT, /* members of a group. fully qualified */
|
2020-04-17 16:55:23 -07:00
|
|
|
membersOnly BOOLEAN DEFAULT false,
|
2018-12-03 13:39:52 +01:00
|
|
|
creationTime TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
2018-02-10 21:29:10 -08:00
|
|
|
domain VARCHAR(128),
|
|
|
|
|
|
|
|
|
|
FOREIGN KEY(domain) REFERENCES mail(domain),
|
2020-04-19 18:44:16 -07:00
|
|
|
FOREIGN KEY(aliasDomain) REFERENCES mail(domain),
|
2018-02-10 21:29:10 -08:00
|
|
|
UNIQUE (name, domain));
|
2018-01-20 22:17:53 -08:00
|
|
|
|
2018-06-28 19:39:15 +02:00
|
|
|
CREATE TABLE IF NOT EXISTS subdomains(
|
|
|
|
|
appId VARCHAR(128) NOT NULL,
|
|
|
|
|
domain VARCHAR(128) NOT NULL,
|
|
|
|
|
subdomain VARCHAR(128) NOT NULL,
|
2019-09-03 19:04:12 -07:00
|
|
|
type VARCHAR(128) NOT NULL, /* primary or redirect */
|
2018-06-29 11:29:30 +02:00
|
|
|
|
2018-06-28 19:39:15 +02:00
|
|
|
FOREIGN KEY(domain) REFERENCES domains(domain),
|
|
|
|
|
FOREIGN KEY(appId) REFERENCES apps(id),
|
2018-11-16 11:13:03 -08:00
|
|
|
UNIQUE (subdomain, domain));
|
|
|
|
|
|
|
|
|
|
CREATE TABLE IF NOT EXISTS tasks(
|
2018-12-08 18:50:06 -08:00
|
|
|
id int NOT NULL AUTO_INCREMENT,
|
|
|
|
|
type VARCHAR(32) NOT NULL,
|
2018-11-16 11:13:03 -08:00
|
|
|
percent INTEGER DEFAULT 0,
|
|
|
|
|
message TEXT,
|
2019-08-30 13:46:55 -07:00
|
|
|
errorJson TEXT,
|
|
|
|
|
resultJson TEXT,
|
2018-11-16 11:13:03 -08:00
|
|
|
creationTime TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
|
|
|
ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
|
|
|
|
PRIMARY KEY (id));
|
2018-06-29 11:04:14 +02:00
|
|
|
|
2018-12-17 15:52:52 +01:00
|
|
|
CREATE TABLE IF NOT EXISTS notifications(
|
|
|
|
|
id int NOT NULL AUTO_INCREMENT,
|
|
|
|
|
userId VARCHAR(128) NOT NULL,
|
2019-02-28 14:59:33 -08:00
|
|
|
eventId VARCHAR(128), // reference to eventlog. can be null
|
2018-12-17 15:52:52 +01:00
|
|
|
title VARCHAR(512) NOT NULL,
|
|
|
|
|
message TEXT,
|
|
|
|
|
acknowledged BOOLEAN DEFAULT false,
|
|
|
|
|
creationTime TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
2020-05-30 12:57:25 -07:00
|
|
|
UNIQUE KEY appPasswords_name_appId_identifier (name, userId, identifier),
|
2018-12-17 15:52:52 +01:00
|
|
|
PRIMARY KEY (id)
|
|
|
|
|
);
|
2018-11-16 11:13:03 -08:00
|
|
|
|
2020-01-31 15:28:42 -08:00
|
|
|
CREATE TABLE IF NOT EXISTS appPasswords(
|
|
|
|
|
id VARCHAR(128) NOT NULL UNIQUE,
|
|
|
|
|
name VARCHAR(128) NOT NULL,
|
|
|
|
|
userId VARCHAR(128) NOT NULL,
|
|
|
|
|
identifier VARCHAR(128) NOT NULL, // resourceId: app id or mail or webadmin
|
|
|
|
|
hashedPassword VARCHAR(1024) NOT NULL,
|
|
|
|
|
creationTime TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
|
|
|
FOREIGN KEY(userId) REFERENCES users(id),
|
2020-05-30 12:57:25 -07:00
|
|
|
|
2020-01-31 15:28:42 -08:00
|
|
|
PRIMARY KEY (id)
|
|
|
|
|
);
|
|
|
|
|
|
2018-12-17 15:52:52 +01:00
|
|
|
CHARACTER SET utf8 COLLATE utf8_bin;
|