From 41d6de7219d2e2b1efeec7ff3775bf9cdf60438a Mon Sep 17 00:00:00 2001 From: anthorob Date: Thu, 22 May 2025 13:09:36 +0000 Subject: [PATCH] Resolve "Flyway migrations" --- .env.example | 1 + Dockerfile | 2 +- docker-compose.yml | 3 +- flyway-dev.ps1 | 43 +++++++++++++++++ flyway-dev.sh | 34 +++++++++++++ pom.xml | 46 +++++++++++------- .../bobert/netneutrality/NetNeutrality.java | 3 +- .../core/db/DatabaseMigration.java | 4 +- .../netneutrality/core/db/SessionManager.java | 2 +- .../db/migration/V1__initial_schema.sql | 48 +++---------------- startup.sh | 24 +++++----- 11 files changed, 132 insertions(+), 78 deletions(-) create mode 100644 flyway-dev.ps1 create mode 100644 flyway-dev.sh rename sql/netneutrality_jpa.sql => src/main/resources/db/migration/V1__initial_schema.sql (83%) diff --git a/.env.example b/.env.example index cfd38d0..37f4a30 100644 --- a/.env.example +++ b/.env.example @@ -1,3 +1,4 @@ +NETNEUTRALITY_TAG=latest NETNEUTRALITY_BOT_ENV=dev NETNEUTRALITY_BOT_TOKEN= NETNEUTRALITY_BOT_PREFIX=$ diff --git a/Dockerfile b/Dockerfile index 474994c..e8e7d54 100644 --- a/Dockerfile +++ b/Dockerfile @@ -20,7 +20,7 @@ ARG API_PORT=9000 EXPOSE ${API_PORT} COPY startup.sh ./ -COPY --from=build /target/netneutrality-jar-with-dependencies.jar ./ +COPY --from=build /target/netneutrality.jar ./ RUN ["chmod", "+x", "./startup.sh"] CMD ["./startup.sh"] \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml index ec767f5..ca326a3 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -5,7 +5,6 @@ services: restart: unless-stopped volumes: - netneutrality-db:/var/lib/mysql - - ./sql:/docker-entrypoint-initdb.d environment: MYSQL_USER: 'java' MYSQL_PASSWORD: 'password' @@ -18,8 +17,8 @@ services: - internal bot: + image: registry.bobert.me/anthorob/netneutrality:${NETNEUTRALITY_TAG:-latest} container_name: bot - build: ./ restart: unless-stopped depends_on: - db diff --git a/flyway-dev.ps1 b/flyway-dev.ps1 new file mode 100644 index 0000000..09bda8c --- /dev/null +++ b/flyway-dev.ps1 @@ -0,0 +1,43 @@ +param ( + [ValidateSet("migrate", "info", "validate", "clean", "baseline", "repair")] + [string]$Command = "info" +) + +$envFile = ".env" +if (-not (Test-Path $envFile)) { + Write-Error ".env file not found in the current directory." + exit 1 +} + +Get-Content $envFile | ForEach-Object { + if ($_ -match "^\s*([A-Za-z_][A-Za-z0-9_]*)=(.*)$") { + $name = $matches[1] + $value = $matches[2] + [System.Environment]::SetEnvironmentVariable($name, $value) + } +} + +$MYSQL_HOST = $env:MYSQL_HOST +$MYSQL_PORT = $env:MYSQL_PORT +$MYSQL_DATABASE = $env:MYSQL_DATABASE + +if (-not $MYSQL_HOST -or -not $MYSQL_PORT -or -not $MYSQL_DATABASE) { + Write-Error "MYSQL_HOST, MYSQL_PORT, or MYSQL_DATABASE missing from .env" + exit 1 +} + +$env:LOCALDEV_FLYWAY_URL = "jdbc:mysql://${MYSQL_HOST}:${MYSQL_PORT}/${MYSQL_DATABASE}" +$env:FLYWAY_URL = $env:LOCALDEV_FLYWAY_URL +$env:FLYWAY_USER = $env:MYSQL_USER +$env:FLYWAY_PASSWORD = $env:MYSQL_PASSWORD + +Write-Host "Ensuring database '$MYSQL_DATABASE' exists..." +$mysqlCommand = "CREATE DATABASE IF NOT EXISTS $MYSQL_DATABASE CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;" +& mysql --host=$MYSQL_HOST --port=$MYSQL_PORT --user=$env:MYSQL_USER --password=$env:MYSQL_PASSWORD -e $mysqlCommand + +if ($LASTEXITCODE -ne 0) { + Write-Error "Failed to create database or connect to MySQL. Check your credentials or server status." + exit 1 +} + +.\mvnw flyway:$Command \ No newline at end of file diff --git a/flyway-dev.sh b/flyway-dev.sh new file mode 100644 index 0000000..ce3ae7d --- /dev/null +++ b/flyway-dev.sh @@ -0,0 +1,34 @@ +#!/bin/bash +set -e + +COMMAND=${1:-info} +ENV_FILE=".env" + +if [[ ! -f "$ENV_FILE" ]]; then + echo ".env file not found in the current directory." + exit 1 +fi + +# Export variables from .env +export $(grep -E '^[A-Za-z_][A-Za-z0-9_]*=' "$ENV_FILE" | xargs) + +if [[ -z "$MYSQL_HOST" || -z "$MYSQL_PORT" || -z "$MYSQL_DATABASE" ]]; then + echo "MYSQL_HOST, MYSQL_PORT, or MYSQL_DATABASE missing from .env" + exit 1 +fi + +export LOCALDEV_FLYWAY_URL="jdbc:mysql://${MYSQL_HOST}:${MYSQL_PORT}/${MYSQL_DATABASE}" +export FLYWAY_URL="$LOCALDEV_FLYWAY_URL" +export FLYWAY_USER="$MYSQL_USER" +export FLYWAY_PASSWORD="$MYSQL_PASSWORD" + +echo "Ensuring database '$MYSQL_DATABASE' exists..." +mysql -h"$MYSQL_HOST" -P"$MYSQL_PORT" -u"$MYSQL_USER" -p"$MYSQL_PASSWORD" \ + -e "CREATE DATABASE IF NOT EXISTS \`$MYSQL_DATABASE\` CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;" + +if [[ $? -ne 0 ]]; then + echo "Failed to create database or connect to MySQL. Check your credentials or server status." + exit 1 +fi + +./mvnw flyway:"$COMMAND" diff --git a/pom.xml b/pom.xml index 1e24129..fe6a373 100644 --- a/pom.xml +++ b/pom.xml @@ -33,9 +33,9 @@ flyway-maven-plugin 11.3.4 - jdbc:mysql://localhost:3306/netneutrality - root - + ${env.FLYWAY_URL} + ${env.FLYWAY_USER} + ${env.FLYWAY_PASSWORD} @@ -48,34 +48,45 @@ org.apache.maven.plugins - maven-assembly-plugin - 3.7.1 + maven-jar-plugin + 3.4.2 - - true - - true ${main.class} - - jar-with-dependencies - - netneutrality + + + + org.apache.maven.plugins + maven-shade-plugin + 3.6.0 - make-assembly - package + package - single + shade + + netneutrality + + + ${main.class} + + + + + true + + + + false + - org.apache.maven.plugins maven-checkstyle-plugin @@ -179,6 +190,7 @@ org.flywaydb flyway-mysql 11.3.4 + runtime diff --git a/src/main/java/me/bobert/netneutrality/NetNeutrality.java b/src/main/java/me/bobert/netneutrality/NetNeutrality.java index 67b7ebe..ddeddf3 100644 --- a/src/main/java/me/bobert/netneutrality/NetNeutrality.java +++ b/src/main/java/me/bobert/netneutrality/NetNeutrality.java @@ -9,6 +9,7 @@ package me.bobert.netneutrality; import io.sentry.Sentry; import me.bobert.netneutrality.core.LogHandler; import me.bobert.netneutrality.core.command.CommandManager; +import me.bobert.netneutrality.core.db.DatabaseMigration; import me.bobert.netneutrality.core.db.SessionManager; import me.bobert.netneutrality.core.tasks.TaskManager; import me.bobert.netneutrality.core.thread.ThreadManager; @@ -67,7 +68,7 @@ public class NetNeutrality { throw new RuntimeException("No bot token provided, exiting."); } - // DatabaseMigration.migrate(); + DatabaseMigration.migrate(); SessionManager.getSessionFactory(); CommandManager.init(); MusicManager.initPlayerManager(); diff --git a/src/main/java/me/bobert/netneutrality/core/db/DatabaseMigration.java b/src/main/java/me/bobert/netneutrality/core/db/DatabaseMigration.java index f0b49af..35a9563 100644 --- a/src/main/java/me/bobert/netneutrality/core/db/DatabaseMigration.java +++ b/src/main/java/me/bobert/netneutrality/core/db/DatabaseMigration.java @@ -18,11 +18,11 @@ public class DatabaseMigration { String dbUser = Settings.getInstance().get("MYSQL_USER", "root"); String dbPass = Settings.getInstance().get("MYSQL_PASSWORD", ""); String dbHost = Settings.getInstance().get("MYSQL_HOST", "localhost"); + String dbUrl = String.format("jdbc:mysql://%s:3306/%s", dbHost, dbName); try { Flyway flyway = Flyway.configure() - .dataSource(String.format("jdbc:mysql://%s:3306/%s", dbHost, dbName), dbUser, dbPass) - .baselineOnMigrate(true) + .dataSource(dbUrl, dbUser, dbPass) .load(); flyway.migrate(); diff --git a/src/main/java/me/bobert/netneutrality/core/db/SessionManager.java b/src/main/java/me/bobert/netneutrality/core/db/SessionManager.java index 110a13f..23ef222 100644 --- a/src/main/java/me/bobert/netneutrality/core/db/SessionManager.java +++ b/src/main/java/me/bobert/netneutrality/core/db/SessionManager.java @@ -33,7 +33,7 @@ public class SessionManager { String dbUser = Settings.getInstance().get("MYSQL_USER", "root"); String dbPass = Settings.getInstance().get("MYSQL_PASSWORD", ""); String dbHost = Settings.getInstance().get("MYSQL_HOST", "localhost"); - logger.info(String.format("Connecting to database '%s' at %s:3306 with user '%s'", dbName, dbHost, dbUser)); + logger.info("Connecting to database '{}' at {}:3306 with user '{}'", dbName, dbHost, dbUser); settings.put(Environment.JAKARTA_JDBC_URL, String.format("jdbc:mysql://%s:3306/%s", dbHost, dbName)); settings.put(Environment.JAKARTA_JDBC_USER, dbUser); diff --git a/sql/netneutrality_jpa.sql b/src/main/resources/db/migration/V1__initial_schema.sql similarity index 83% rename from sql/netneutrality_jpa.sql rename to src/main/resources/db/migration/V1__initial_schema.sql index 3ccf4f8..ac4661d 100644 --- a/sql/netneutrality_jpa.sql +++ b/src/main/resources/db/migration/V1__initial_schema.sql @@ -1,27 +1,14 @@ -SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO"; -START TRANSACTION; -SET time_zone = "+00:00"; - - -/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; -/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; -/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; -/*!40101 SET NAMES utf8mb4 */; - -- -- Database: `netneutrality` -- CREATE DATABASE IF NOT EXISTS `netneutrality` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -USE `netneutrality`; -- -------------------------------------------------------- -- -- Table structure for table `blacklist` -- - -DROP TABLE IF EXISTS `blacklist`; -CREATE TABLE IF NOT EXISTS `blacklist` ( +CREATE TABLE `blacklist` ( `id` int(11) NOT NULL AUTO_INCREMENT, `guild_id` varchar(255) NOT NULL, `word` varchar(255) NOT NULL, @@ -36,9 +23,7 @@ CREATE TABLE IF NOT EXISTS `blacklist` ( -- -- Table structure for table `guilds` -- - -DROP TABLE IF EXISTS `guilds`; -CREATE TABLE IF NOT EXISTS `guilds` ( +CREATE TABLE `guilds` ( `guild_id` varchar(255) NOT NULL, `logging` tinyint(1) NOT NULL DEFAULT 0, `debug` tinyint(1) NOT NULL DEFAULT 1, @@ -51,9 +36,7 @@ CREATE TABLE IF NOT EXISTS `guilds` ( -- -- Table structure for table `guild_settings` -- - -DROP TABLE IF EXISTS `guild_settings`; -CREATE TABLE IF NOT EXISTS `guild_settings` ( +CREATE TABLE `guild_settings` ( `id` int(11) NOT NULL AUTO_INCREMENT, `guild_id` varchar(255) NOT NULL, `name` varchar(255) NOT NULL, @@ -67,9 +50,7 @@ CREATE TABLE IF NOT EXISTS `guild_settings` ( -- -- Table structure for table `logging` -- - -DROP TABLE IF EXISTS `logging`; -CREATE TABLE IF NOT EXISTS `logging` ( +CREATE TABLE `logging` ( `guild_id` varchar(255) NOT NULL, `channel_id` varchar(255) NOT NULL, `enabled` tinyint(1) NOT NULL DEFAULT 0, @@ -81,9 +62,7 @@ CREATE TABLE IF NOT EXISTS `logging` ( -- -- Table structure for table `log_message` -- - -DROP TABLE IF EXISTS `log_message`; -CREATE TABLE IF NOT EXISTS `log_message` ( +CREATE TABLE `log_message` ( `id` int(11) NOT NULL AUTO_INCREMENT, `guild_id` varchar(255) NOT NULL, `channel_id` varchar(255) NOT NULL, @@ -102,9 +81,7 @@ CREATE TABLE IF NOT EXISTS `log_message` ( -- -- Table structure for table `tasks` -- - -DROP TABLE IF EXISTS `tasks`; -CREATE TABLE IF NOT EXISTS `tasks` ( +CREATE TABLE `tasks` ( `id` int(11) NOT NULL AUTO_INCREMENT, `task_id` varchar(255) NOT NULL, `task_class` varchar(255) NOT NULL, @@ -118,9 +95,7 @@ CREATE TABLE IF NOT EXISTS `tasks` ( -- -- Table structure for table `web_users` -- - -DROP TABLE IF EXISTS `web_users`; -CREATE TABLE IF NOT EXISTS `web_users` ( +CREATE TABLE `web_users` ( `id` varchar(255) NOT NULL, `email` mediumtext NOT NULL, `token` varchar(255) NOT NULL, @@ -130,10 +105,6 @@ CREATE TABLE IF NOT EXISTS `web_users` ( PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; --- --- Constraints for dumped tables --- - -- -- Constraints for table `blacklist` -- @@ -157,8 +128,3 @@ ALTER TABLE `logging` -- ALTER TABLE `log_message` ADD CONSTRAINT `fk_log_guilds` FOREIGN KEY (`guild_id`) REFERENCES `guilds` (`guild_id`) ON DELETE CASCADE ON UPDATE CASCADE; -COMMIT; - -/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; -/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; -/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; diff --git a/startup.sh b/startup.sh index 96f6dc0..3a9b0af 100644 --- a/startup.sh +++ b/startup.sh @@ -15,30 +15,28 @@ _term() { trap _term TERM trap _term INT +API_PORT="${API_PORT:-9000}" +MYSQL_HOST="${MYSQL_HOST:-localhost}" +MYSQL_PORT="${MYSQL_PORT:-3306}" +MYSQL_DATABASE="${MYSQL_DATABASE:-netneutrality}" + if [ ! -f /usr/bin/nc ]; then echo "nc not found. Exiting." exit 1 fi -if [ -z $API_PORT ]; then - API_PORT=9000; -fi - -if [ -z $MYSQL_HOST ]; then - MYSQL_HOST="localhost" -fi - -if [ -z $MYSQL_PORT ]; then - MYSQL_PORT=3306 -fi - echo "Waiting 10 seconds for database to start.." sleep 10 echo "Checking if MySQL / MariaDB is started.." if /usr/bin/nc -z $MYSQL_HOST $MYSQL_PORT; then echo "Database OK. Starting bot.."; - /opt/java/openjdk/bin/java -jar /app/netneutrality-jar-with-dependencies.jar & + + export FLYWAY_URL="jdbc:mysql://${MYSQL_HOST}:${MYSQL_PORT}/${MYSQL_DATABASE}" + export FLYWAY_USER="${MYSQL_USER}" + export FLYWAY_PASSWORD="${MYSQL_PASSWORD}" + + /opt/java/openjdk/bin/java -jar /app/netneutrality.jar & pid=$! wait "$pid"