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 0000000..b40b3b8
Binary files /dev/null and b/data/qaffee.db differ
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