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