Update README: Docker setup, artisan-in-container, Shopify commands
Deploy / deploy (push) Successful in 10s

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Malek TellissiandClaude Sonnet 4.6 committed 2026-09-12 04:30:04 +02:00
1 parent 2024f060f1
commit e34020e5bd
1 file changed
+115 -173
+115 -173
View File
@@ -1,226 +1,168 @@
# SpiceManagementSystem # SpiceManagementSystem
Dieses Projekt ermöglicht das Verwalten von Grundzutaten und Gewürzmischungen über ein Web-Panel.
Um die lokale Entwicklungsumgebung zu starten, müssen zunächst alle Abhängigkeiten per composer install nachinstalliert werden.
Ist das geschehehn, muss zudem MariaDB installiert werden. Warenwirtschafts-Panel für Gewürzmischungen — verwaltet Rohstoffe, Rezepte, Produkte, Lagerbestand und Shopify-Sync.
Anschließend muss die Datenbank migriert werden - siehe Datenbankstruktur. Built with [Laravel](https://laravel.com) + [Filament](https://filamentphp.com), deployed via Docker.
Um den lokalen Entwicklungsserver zu starten folgendes eingeben: ---
```` ## Lokale Entwicklung
**Voraussetzungen:** PHP 8.4, Composer, Node.js, MariaDB
```bash
composer install
npm install && npm run build
cp .env.example .env
php artisan key:generate
php artisan migrate
php artisan serve php artisan serve
```` ```
## Vision Die App läuft dann auf `http://localhost:8000`.
Dashboard:
- Füllstandsanzeigen (Rohstoffe)
- Produkte im Lager (Inventar)
- Produkt Sales in Zeitspanne (Todo: Warenausgang DB Tabelle)
**FOKUS: Warenwirtschaft (Lager, etc.)** ---
Todo: ## Produktion (Docker)
- [x] DB Schema abändern, sodass alle Änderungen an einem Produkt gespeichert werden und als Produkthistorie abgerufen werden können.
- [x] Recipes funktionsfähig machen (Prozentual?)
- [x] Garbage collector Produktbilder
- [x] Produktgröße und -preise kombinieren
- [x] Inventar (Unique items in inventar tabelle mit "ist noch da?" flag)
- [x] Bei Inventar anlegen automatisch füllstände der rohstoffe je prozent im rezept und verpackungsgröße anpassen
- [x] Warenausgang (Produktverkauf anlegen)
- [ ] Dashboard machen (s.o.)
- [x] Frontend schöner machen (Umsortieren der Sidebar Elemente, etc.)
- [x] Continious Deployment
## Cronjobs Der Deploy läuft automatisch via Gitea Actions bei jedem Push auf `main`:
Den folgenden Cronjob auf dem Server anlegen, um die Laravel jobs auszuführen:
`0 4 * * * /usr/bin/php8.3 /var/www/html/your_laravel_app/artisan uploads:cron > /tmp/cron_log.txt` 1. Dateien per SCP auf den VPS kopieren
2. `docker compose up -d --build` — baut das Image neu und startet die Container
3. `php artisan migrate --force` — läuft automatisch im Container
### Artisan-Befehle auf dem Server
Da die App in Docker mit PHP 8.4 läuft, müssen alle artisan-Befehle **im Container** ausgeführt werden:
```bash
cd ~/app && docker compose exec app php artisan <befehl>
```
---
## Shopify-Import
### Erstimport (Produkte + Lagerbestand)
```bash
cd ~/app && docker compose exec app php artisan shopify:import
```
Optionen:
- `--dry-run` — zeigt nur an was importiert würde, speichert nichts
### Produktbilder herunterladen
Für bereits importierte Produkte ohne Bilder:
```bash
cd ~/app && docker compose exec app php artisan shopify:images
```
Optionen:
- `--force` — lädt Bilder auch für Produkte neu, die bereits welche haben
### Lagerbestand synchronisieren
```bash
cd ~/app && docker compose exec app php artisan shopify:sync
```
---
## Cronjob
Auf dem Server einrichten, damit der Laravel-Scheduler läuft:
```
* * * * * cd ~/app && docker compose exec -T app php artisan schedule:run >> /dev/null 2>&1
```
---
## Datenbankstruktur ## Datenbankstruktur
Um die Tabellen in Filament anzulegen, folgenden Befehl ausführen:
```` Migrationen ausführen:
```bash
php artisan migrate php artisan migrate
````` ```
bzw. im DEV-Mode wenn grundstäzlich geändert wird zu erneuten migrieren und Migrations-Cache leeren:
````` Im Entwicklungsmodus komplett neu aufsetzen:
```bash
php artisan migrate:refresh php artisan migrate:refresh
````` ```
````
Table supplier {
id int [primary key]
name varchar [not null]
}
Table spices_suppliers { // delivery (i just try to use naming convetions)
id int [primary key]
spice_id int [ref: > spices.id]
supplier_id int [ref: > supplier.id]
amount decimal(10,2)
}
Table recipes {
id int [pk, increment]
name varchar(255) [not null]
description text
}
```
Table spices { Table spices {
id int [pk, increment] id int [pk]
name varchar(255) [not null] name varchar(255)
amount decimal(10,2) amount decimal(10,2)
unit text unit text
} }
Table recipes_spices { // meta for every ingredient column of a spice Table recipes {
spice_id int [ref: > spices.id] id int [pk]
name varchar(255)
description text
}
Table recipes_spices {
recipe_id int [ref: > recipes.id] recipe_id int [ref: > recipes.id]
spice_id int [ref: > spices.id]
amount_in_percent decimal(4,2) [not null] amount_in_percent decimal(4,2)
indexes { (recipe_id, spice_id) [pk] }
indexes {
(recipe_id, spice_id) [pk]
}
} }
Table packings { Table packings {
id inbt [pk, increment] id int [pk]
name varchar(255) name varchar(255)
size decimal(10,2) size decimal(10,2)
} }
Table products { Table products {
id int [pk, increment] id int [pk]
title text title text
images json images json
description text description text
package_content text package_content text
package_id int [ref: > packings.id] recipes_id int [ref: > recipes.id]
recipe_id int [ref: > recipes.id]
} }
Table products_sizes { Table products_sizes {
id int [pk, increment] id int [pk]
gtin int
description text
product_id int [ref: > products.id] product_id int [ref: > products.id]
packing_id int [ref: > packings.id] packing_id int [ref: > packings.id]
sku varchar
shopify_variant_id varchar
price float price float
description text
gtin varchar
} }
Table products_inventory { Table products_inventory {
id int [pk, increment] id int [pk]
product_id int [ref: > products.id] product_id int [ref: > products.id]
size_id int [ref: > products_sizes.id] size_id int [ref: > products_sizes.id]
out_at timestamp out_at timestamp
} }
```
````` ---
## IONOS-Shared Webhosting ## Vision & Todo
### Variablen für GH Action
Datenbank:
- DB_DATABASENAME
- DB_DATABASEUSER
- DB_HOSTNAME
MariaDB Version 10.11., Port 3306
SFTP: **Fokus: Warenwirtschaft (Lager, Rohstoffe, Produkte)**
- SFTP_HOSTNAME
- SFTP_USER
Domain: https://sms.bluefooted-booby-spices.com/, - [x] DB-Schema mit Produkthistorie
Short-Domain sms.spices.blue, PHP Version 8.3 - [x] Rezepte (prozentual)
Um die Applikation auf Ionos Shared Webhosting zu hosten, muss die .htaccess-Datei so aussehen: - [x] Produktgrößen und -preise
- [x] Inventar (eindeutige Items mit Ausgangs-Flag)
````` - [x] Füllstandsanpassung der Rohstoffe beim Inventar anlegen
<IfModule mod_rewrite.c> - [x] Warenausgang (Produktverkauf)
<IfModule mod_negotiation.c> - [x] Shopify-Import (Produkte, Varianten, Lagerbestand, Bilder)
Options -MultiViews - [x] Continuous Deployment via Gitea Actions + Docker
</IfModule> - [x] Frontend (Sidebar-Struktur, Navigation)
- [ ] Dashboard (Füllstände, Lager, Sales-Zeitspanne)
RewriteEngine On
RewriteBase /
RewriteCond %{HTTP:Authorization} ^(.*)
RewriteRule .* - [e=HTTP_AUTHORIZATION:%1]
# Redirect Trailing Slashes...
RewriteRule ^(.*)/$ /$1 [L,R=301]
# Handle Front Controller...
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ /index.php [L]
</IfModule>
`````
built with
<p align="center"><a href="https://laravel.com" target="_blank"><img src="https://raw.githubusercontent.com/laravel/art/master/logo-lockup/5%20SVG/2%20CMYK/1%20Full%20Color/laravel-logolockup-cmyk-red.svg" width="400" alt="Laravel Logo"></a></p>
<p align="center">
<a href="https://github.com/laravel/framework/actions"><img src="https://github.com/laravel/framework/workflows/tests/badge.svg" alt="Build Status"></a>
<a href="https://packagist.org/packages/laravel/framework"><img src="https://img.shields.io/packagist/dt/laravel/framework" alt="Total Downloads"></a>
<a href="https://packagist.org/packages/laravel/framework"><img src="https://img.shields.io/packagist/v/laravel/framework" alt="Latest Stable Version"></a>
<a href="https://packagist.org/packages/laravel/framework"><img src="https://img.shields.io/packagist/l/laravel/framework" alt="License"></a>
</p>
## About Laravel
Laravel is a web application framework with expressive, elegant syntax. We believe development must be an enjoyable and creative experience to be truly fulfilling. Laravel takes the pain out of development by easing common tasks used in many web projects, such as:
- [Simple, fast routing engine](https://laravel.com/docs/routing).
- [Powerful dependency injection container](https://laravel.com/docs/container).
- Multiple back-ends for [session](https://laravel.com/docs/session) and [cache](https://laravel.com/docs/cache) storage.
- Expressive, intuitive [database ORM](https://laravel.com/docs/eloquent).
- Database agnostic [schema migrations](https://laravel.com/docs/migrations).
- [Robust background job processing](https://laravel.com/docs/queues).
- [Real-time event broadcasting](https://laravel.com/docs/broadcasting).
Laravel is accessible, powerful, and provides tools required for large, robust applications.
## Learning Laravel
Laravel has the most extensive and thorough [documentation](https://laravel.com/docs) and video tutorial library of all modern web application frameworks, making it a breeze to get started with the framework.
You may also try the [Laravel Bootcamp](https://bootcamp.laravel.com), where you will be guided through building a modern Laravel application from scratch.
If you don't feel like reading, [Laracasts](https://laracasts.com) can help. Laracasts contains thousands of video tutorials on a range of topics including Laravel, modern PHP, unit testing, and JavaScript. Boost your skills by digging into our comprehensive video library.
## Laravel Sponsors
We would like to extend our thanks to the following sponsors for funding Laravel development. If you are interested in becoming a sponsor, please visit the [Laravel Partners program](https://partners.laravel.com).
### Premium Partners
- **[Vehikl](https://vehikl.com/)**
- **[Tighten Co.](https://tighten.co)**
- **[WebReinvent](https://webreinvent.com/)**
- **[Kirschbaum Development Group](https://kirschbaumdevelopment.com)**
- **[64 Robots](https://64robots.com)**
- **[Curotec](https://www.curotec.com/services/technologies/laravel/)**
- **[Cyber-Duck](https://cyber-duck.co.uk)**
- **[DevSquad](https://devsquad.com/hire-laravel-developers)**
- **[Jump24](https://jump24.co.uk)**
- **[Redberry](https://redberry.international/laravel/)**
- **[Active Logic](https://activelogic.com)**
- **[byte5](https://byte5.de)**
- **[OP.GG](https://op.gg)**
## Contributing
Thank you for considering contributing to the Laravel framework! The contribution guide can be found in the [Laravel documentation](https://laravel.com/docs/contributions).
## Code of Conduct
In order to ensure that the Laravel community is welcoming to all, please review and abide by the [Code of Conduct](https://laravel.com/docs/contributions#code-of-conduct).
## Security Vulnerabilities
If you discover a security vulnerability within Laravel, please send an e-mail to Taylor Otwell via [taylor@laravel.com](mailto:taylor@laravel.com). All security vulnerabilities will be promptly addressed.
## License
The Laravel framework is open-sourced software licensed under the [MIT license](https://opensource.org/licenses/MIT).