From 41aea49762182c244413df5f0a3bfa0141397202 Mon Sep 17 00:00:00 2001 From: Philipp Ostmeyer Date: Fri, 8 May 2026 13:07:47 +0200 Subject: [PATCH] Migrated sources from mariadb to sqlite --- backend/pom.xml | 13 ++-- .../src/main/resources/application.properties | 22 ++++--- .../db/migration/V1__initial_schema.sql | 59 +++++++++--------- .../db/migration/V3__company_logo.sql | 2 +- data/qaffee.db | Bin 0 -> 114688 bytes docker-compose.yml | 47 +------------- 6 files changed, 54 insertions(+), 89 deletions(-) create mode 100644 data/qaffee.db diff --git a/backend/pom.xml b/backend/pom.xml index 913a07f..d367cca 100644 --- a/backend/pom.xml +++ b/backend/pom.xml @@ -40,17 +40,18 @@ quarkus-hibernate-orm-panache - io.quarkus - quarkus-jdbc-mariadb + org.xerial + sqlite-jdbc + 3.47.1.0 + + + org.hibernate.orm + hibernate-community-dialects io.quarkus quarkus-flyway - - org.flywaydb - flyway-mysql - io.quarkus quarkus-arc diff --git a/backend/src/main/resources/application.properties b/backend/src/main/resources/application.properties index e96afc2..434bd7a 100644 --- a/backend/src/main/resources/application.properties +++ b/backend/src/main/resources/application.properties @@ -1,19 +1,23 @@ -# Datasource -quarkus.datasource.db-kind=mariadb -quarkus.datasource.username=strichliste -quarkus.datasource.password=strichliste -quarkus.datasource.jdbc.url=jdbc:mariadb://localhost:3306/strichliste +# Datasource – SQLite +quarkus.datasource.db-kind=other +quarkus.datasource.jdbc.driver=org.sqlite.JDBC +quarkus.datasource.jdbc.url=jdbc:sqlite:${DB_PATH:/data/qaffee.db} -# Agroal connection pool – evict stale connections after a DB restart -quarkus.datasource.jdbc.background-validation-interval=30S -quarkus.datasource.jdbc.idle-removal-interval=5M -quarkus.datasource.jdbc.max-lifetime=10M +# Connection Pool (SQLite: single writer) +quarkus.datasource.jdbc.min-size=1 +quarkus.datasource.jdbc.max-size=1 # Hibernate +quarkus.hibernate-orm.dialect=org.hibernate.community.dialect.SQLiteDialect quarkus.hibernate-orm.database.generation=none # Flyway quarkus.flyway.migrate-at-start=true +# Baseline: treat V1-V4 as already applied when no history table exists (post-migration start) +quarkus.flyway.baseline-on-migrate=true +quarkus.flyway.baseline-version=4 +# Checksums der MariaDB-Dateien passen nicht mehr zu den SQLite-kompatiblen Versionen +quarkus.flyway.validate-on-migrate=false # CORS ist deaktiviert, da alle Anfragen über den SvelteKit-Proxy laufen quarkus.http.cors=false diff --git a/backend/src/main/resources/db/migration/V1__initial_schema.sql b/backend/src/main/resources/db/migration/V1__initial_schema.sql index b6cdbe4..b0435af 100644 --- a/backend/src/main/resources/db/migration/V1__initial_schema.sql +++ b/backend/src/main/resources/db/migration/V1__initial_schema.sql @@ -1,49 +1,50 @@ CREATE TABLE company ( - id BIGINT AUTO_INCREMENT PRIMARY KEY, + id INTEGER PRIMARY KEY, name VARCHAR(255) NOT NULL, - active BOOLEAN NOT NULL DEFAULT TRUE, - created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + active TINYINT(1) NOT NULL DEFAULT 1, + created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP +); CREATE TABLE employee ( - id BIGINT AUTO_INCREMENT PRIMARY KEY, + id INTEGER PRIMARY KEY, company_id BIGINT NOT NULL, first_name VARCHAR(255) NOT NULL, last_name VARCHAR(255) NOT NULL, - active BOOLEAN NOT NULL DEFAULT TRUE, - created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, - CONSTRAINT fk_employee_company FOREIGN KEY (company_id) REFERENCES company(id) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + active TINYINT(1) NOT NULL DEFAULT 1, + created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, + FOREIGN KEY (company_id) REFERENCES company(id) +); CREATE TABLE product ( - id BIGINT AUTO_INCREMENT PRIMARY KEY, + id INTEGER PRIMARY KEY, name VARCHAR(255) NOT NULL, price_cents INT NOT NULL DEFAULT 0, - icon_placeholder VARCHAR(50) DEFAULT 'coffee', - active BOOLEAN NOT NULL DEFAULT TRUE, - created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + icon_placeholder VARCHAR(255) DEFAULT 'coffee', + active TINYINT(1) NOT NULL DEFAULT 1, + created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP +); CREATE TABLE tally_entry ( - id BIGINT AUTO_INCREMENT PRIMARY KEY, + id INTEGER PRIMARY KEY, employee_id BIGINT NOT NULL, product_id BIGINT NOT NULL, month_key VARCHAR(7) NOT NULL, - created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, - CONSTRAINT fk_tally_employee FOREIGN KEY (employee_id) REFERENCES employee(id), - CONSTRAINT fk_tally_product FOREIGN KEY (product_id) REFERENCES product(id), - INDEX idx_tally_month (month_key), - INDEX idx_tally_employee_month (employee_id, month_key) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, + FOREIGN KEY (employee_id) REFERENCES employee(id), + FOREIGN KEY (product_id) REFERENCES product(id) +); + +CREATE INDEX idx_tally_month ON tally_entry(month_key); +CREATE INDEX idx_tally_employee_month ON tally_entry(employee_id, month_key); CREATE TABLE access_link ( - id BIGINT AUTO_INCREMENT PRIMARY KEY, + id INTEGER PRIMARY KEY, token VARCHAR(64) NOT NULL UNIQUE, - role VARCHAR(20) NOT NULL, + role VARCHAR(50) NOT NULL, company_id BIGINT, - description VARCHAR(255), - active BOOLEAN NOT NULL DEFAULT TRUE, - created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, - CONSTRAINT fk_access_link_company FOREIGN KEY (company_id) REFERENCES company(id), - CONSTRAINT chk_role CHECK (role IN ('COMPANY_ADMIN', 'PROVIDER_ADMIN')) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + description TEXT, + active TINYINT(1) NOT NULL DEFAULT 1, + created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, + FOREIGN KEY (company_id) REFERENCES company(id), + CHECK (role IN ('COMPANY_ADMIN', 'PROVIDER_ADMIN')) +); diff --git a/backend/src/main/resources/db/migration/V3__company_logo.sql b/backend/src/main/resources/db/migration/V3__company_logo.sql index b35f674..581fc9b 100644 --- a/backend/src/main/resources/db/migration/V3__company_logo.sql +++ b/backend/src/main/resources/db/migration/V3__company_logo.sql @@ -1,2 +1,2 @@ ALTER TABLE company ADD COLUMN logo MEDIUMBLOB; -ALTER TABLE company ADD COLUMN logo_content_type VARCHAR(50); +ALTER TABLE company ADD COLUMN logo_content_type VARCHAR(255); diff --git a/data/qaffee.db b/data/qaffee.db new file mode 100644 index 0000000000000000000000000000000000000000..b40b3b8fedf8f0eaa3ac3e4d7d78382c21bc8194 GIT binary patch literal 114688 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 H_W%C}eR_;` literal 0 HcmV?d00001 diff --git a/docker-compose.yml b/docker-compose.yml index f3dfab0..cbe9c44 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,34 +1,12 @@ version: "3" -volumes: - db-data: services: - db: - image: mariadb:11.4.4 - container_name: qaffee-db - restart: always - command: --log-warnings=3 - environment: - - "MARIADB_ROOT_PASSWORD=rootpassword" - - "MARIADB_DATABASE=strichliste" - - "MARIADB_USER=strichliste" - - "MARIADB_PASSWORD=strichliste" - volumes: - - db-data:/var/lib/mysql - healthcheck: - test: ["CMD", "healthcheck.sh", "--connect", "--innodb_initialized"] - interval: 10s - timeout: 5s - retries: 5 - networks: - - traefik-net backend: build: ./backend container_name: qaffee-backend environment: - - "QUARKUS_DATASOURCE_JDBC_URL=jdbc:mariadb://db:3306/strichliste" - - "QUARKUS_DATASOURCE_USERNAME=strichliste" - - "QUARKUS_DATASOURCE_PASSWORD=strichliste" - "QUARKUS_HTTP_CORS_ORIGINS=https://qaffee.cloud.aquantico.de" + volumes: + - ./data:/data labels: traefik.enable: "true" traefik.docker.network: "traefik-net" @@ -37,9 +15,6 @@ services: traefik.http.routers.qaffee-backend.tls: "true" traefik.http.routers.qaffee-backend.tls.certresolver: "myresolver" traefik.http.services.qaffee-backend.loadbalancer.server.port: 8080 - depends_on: - db: - condition: service_healthy networks: - traefik-net frontend: @@ -61,22 +36,6 @@ services: - backend networks: - traefik-net - backup: - image: mariadb:11.4.4 - container_name: qaffee-backup - environment: - - "MARIADB_HOST=db" - - "MARIADB_USER=strichliste" - - "MARIADB_PASSWORD=strichliste" - volumes: - - ./backups:/backups - - ./db/backup.sh:/backup.sh - entrypoint: ["/bin/bash", "/backup.sh"] - depends_on: - db: - condition: service_healthy - networks: - - traefik-net networks: traefik-net: - external: false \ No newline at end of file + external: false