This commit is contained in:
@@ -0,0 +1,44 @@
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
|
||||
if [ "${EUID}" -ne 0 ]; then
|
||||
echo "Run as root: sudo bash tools/db/install-db-setup.sh" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
|
||||
MYSQL_ROOT_USER="${MYSQL_ROOT_USER:-root}"
|
||||
MYSQL_ROOT_PASSWORD="${MYSQL_ROOT_PASSWORD:-}"
|
||||
MYSQL_HOST="${MYSQL_HOST:-127.0.0.1}"
|
||||
MYSQL_PORT="${MYSQL_PORT:-3306}"
|
||||
MYSQL_DATABASE="${MYSQL_DATABASE:-photobooth}"
|
||||
MYSQL_APP_USER="${MYSQL_APP_USER:-photobooth_app}"
|
||||
MYSQL_APP_PASSWORD="${MYSQL_APP_PASSWORD:-}"
|
||||
|
||||
if [ -z "$MYSQL_ROOT_PASSWORD" ] || [ -z "$MYSQL_APP_PASSWORD" ]; then
|
||||
echo "Set MYSQL_ROOT_PASSWORD and MYSQL_APP_PASSWORD before running." >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
install -m 0755 "$SCRIPT_DIR/setup-db.sh" /usr/local/bin/photobooth-db-setup
|
||||
install -m 0644 "$SCRIPT_DIR/photobooth-db.service" /etc/systemd/system/photobooth-db.service
|
||||
install -m 0644 "$SCRIPT_DIR/photobooth-db.timer" /etc/systemd/system/photobooth-db.timer
|
||||
|
||||
cat > /etc/photobooth-db.env <<EOF
|
||||
MYSQL_ROOT_USER=${MYSQL_ROOT_USER}
|
||||
MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}
|
||||
MYSQL_HOST=${MYSQL_HOST}
|
||||
MYSQL_PORT=${MYSQL_PORT}
|
||||
MYSQL_DATABASE=${MYSQL_DATABASE}
|
||||
MYSQL_APP_USER=${MYSQL_APP_USER}
|
||||
MYSQL_APP_PASSWORD=${MYSQL_APP_PASSWORD}
|
||||
EOF
|
||||
|
||||
chmod 600 /etc/photobooth-db.env
|
||||
|
||||
systemctl daemon-reload
|
||||
systemctl enable --now photobooth-db.timer
|
||||
systemctl start photobooth-db.service
|
||||
|
||||
echo "DB setup installed. It will run once and then stay idle."
|
||||
@@ -0,0 +1,7 @@
|
||||
MYSQL_ROOT_USER=root
|
||||
MYSQL_ROOT_PASSWORD=replace_me
|
||||
MYSQL_HOST=127.0.0.1
|
||||
MYSQL_PORT=3306
|
||||
MYSQL_DATABASE=photobooth
|
||||
MYSQL_APP_USER=photobooth_app
|
||||
MYSQL_APP_PASSWORD=replace_me
|
||||
@@ -0,0 +1,14 @@
|
||||
[Unit]
|
||||
Description=Photobooth database setup
|
||||
After=network-online.target mysql.service
|
||||
Wants=network-online.target
|
||||
ConditionPathExists=!/var/lib/photobooth/db-setup.done
|
||||
|
||||
[Service]
|
||||
Type=oneshot
|
||||
EnvironmentFile=/etc/photobooth-db.env
|
||||
ExecStart=/usr/local/bin/photobooth-db-setup
|
||||
RemainAfterExit=yes
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
@@ -0,0 +1,9 @@
|
||||
[Unit]
|
||||
Description=Photobooth database setup timer
|
||||
|
||||
[Timer]
|
||||
OnBootSec=1min
|
||||
Persistent=true
|
||||
|
||||
[Install]
|
||||
WantedBy=timers.target
|
||||
@@ -0,0 +1,83 @@
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
|
||||
MYSQL_ROOT_USER="${MYSQL_ROOT_USER:-root}"
|
||||
MYSQL_ROOT_PASSWORD="${MYSQL_ROOT_PASSWORD:-}"
|
||||
MYSQL_HOST="${MYSQL_HOST:-127.0.0.1}"
|
||||
MYSQL_PORT="${MYSQL_PORT:-3306}"
|
||||
MYSQL_DATABASE="${MYSQL_DATABASE:-photobooth}"
|
||||
MYSQL_APP_USER="${MYSQL_APP_USER:-photobooth_app}"
|
||||
MYSQL_APP_PASSWORD="${MYSQL_APP_PASSWORD:-}"
|
||||
MARKER_FILE="${MARKER_FILE:-/var/lib/photobooth/db-setup.done}"
|
||||
|
||||
if [ -z "$MYSQL_ROOT_PASSWORD" ]; then
|
||||
echo "MYSQL_ROOT_PASSWORD is required." >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ -z "$MYSQL_APP_PASSWORD" ]; then
|
||||
echo "MYSQL_APP_PASSWORD is required." >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ -f "$MARKER_FILE" ]; then
|
||||
echo "Database already initialized: $MARKER_FILE"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
mkdir -p "$(dirname "$MARKER_FILE")"
|
||||
|
||||
MYSQL_PWD="$MYSQL_ROOT_PASSWORD" mysql \
|
||||
--protocol=TCP \
|
||||
-h "$MYSQL_HOST" \
|
||||
-P "$MYSQL_PORT" \
|
||||
-u "$MYSQL_ROOT_USER" <<SQL
|
||||
CREATE DATABASE IF NOT EXISTS \`$MYSQL_DATABASE\`
|
||||
CHARACTER SET utf8mb4
|
||||
COLLATE utf8mb4_0900_ai_ci;
|
||||
|
||||
CREATE USER IF NOT EXISTS '$MYSQL_APP_USER'@'%' IDENTIFIED BY '$MYSQL_APP_PASSWORD';
|
||||
GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, ALTER, INDEX ON \`$MYSQL_DATABASE\`.* TO '$MYSQL_APP_USER'@'%';
|
||||
FLUSH PRIVILEGES;
|
||||
|
||||
USE \`$MYSQL_DATABASE\`;
|
||||
|
||||
CREATE TABLE IF NOT EXISTS users (
|
||||
id CHAR(36) PRIMARY KEY,
|
||||
email VARCHAR(255) NOT NULL,
|
||||
password_hash VARCHAR(255) NOT NULL,
|
||||
name VARCHAR(120) NULL,
|
||||
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
||||
UNIQUE KEY uq_users_email (email)
|
||||
) ENGINE=InnoDB;
|
||||
|
||||
CREATE TABLE IF NOT EXISTS refresh_tokens (
|
||||
id CHAR(36) PRIMARY KEY,
|
||||
user_id CHAR(36) NOT NULL,
|
||||
token_hash VARCHAR(255) NOT NULL,
|
||||
expires_at DATETIME NOT NULL,
|
||||
revoked_at DATETIME NULL,
|
||||
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
UNIQUE KEY uq_refresh_token_hash (token_hash),
|
||||
KEY idx_refresh_user (user_id),
|
||||
CONSTRAINT fk_refresh_user FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
|
||||
) ENGINE=InnoDB;
|
||||
|
||||
CREATE TABLE IF NOT EXISTS media (
|
||||
id CHAR(36) PRIMARY KEY,
|
||||
user_id CHAR(36) NOT NULL,
|
||||
type ENUM('shot','strip') NOT NULL,
|
||||
url VARCHAR(2048) NOT NULL,
|
||||
thumb_url VARCHAR(2048) NULL,
|
||||
theme_id VARCHAR(64) NULL,
|
||||
meta JSON NULL,
|
||||
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
KEY idx_media_user_created (user_id, created_at),
|
||||
KEY idx_media_type (type),
|
||||
CONSTRAINT fk_media_user FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
|
||||
) ENGINE=InnoDB;
|
||||
SQL
|
||||
|
||||
touch "$MARKER_FILE"
|
||||
echo "Database initialized."
|
||||
Reference in New Issue
Block a user