Update README: Docker setup, artisan-in-container, Shopify commands
Deploy / deploy (push) Successful in 10s
Deploy / deploy (push) Successful in 10s
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
1 parent
2024f060f1
commit
e34020e5bd
1 file changed
+124
-182
@@ -1,226 +1,168 @@
|
||||
# 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
|
||||
````
|
||||
```
|
||||
|
||||
## Vision
|
||||
Dashboard:
|
||||
- Füllstandsanzeigen (Rohstoffe)
|
||||
- Produkte im Lager (Inventar)
|
||||
- Produkt Sales in Zeitspanne (Todo: Warenausgang DB Tabelle)
|
||||
Die App läuft dann auf `http://localhost:8000`.
|
||||
|
||||
**FOKUS: Warenwirtschaft (Lager, etc.)**
|
||||
---
|
||||
|
||||
Todo:
|
||||
- [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
|
||||
## Produktion (Docker)
|
||||
|
||||
## Cronjobs
|
||||
Den folgenden Cronjob auf dem Server anlegen, um die Laravel jobs auszuführen:
|
||||
Der Deploy läuft automatisch via Gitea Actions bei jedem Push auf `main`:
|
||||
|
||||
`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
|
||||
Um die Tabellen in Filament anzulegen, folgenden Befehl ausführen:
|
||||
|
||||
````
|
||||
Migrationen ausführen:
|
||||
|
||||
```bash
|
||||
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
|
||||
`````
|
||||
|
||||
````
|
||||
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 {
|
||||
id int [pk, increment]
|
||||
name varchar(255) [not null]
|
||||
id int [pk]
|
||||
name varchar(255)
|
||||
amount decimal(10,2)
|
||||
unit text
|
||||
}
|
||||
|
||||
Table recipes_spices { // meta for every ingredient column of a spice
|
||||
spice_id int [ref: > spices.id]
|
||||
Table recipes {
|
||||
id int [pk]
|
||||
name varchar(255)
|
||||
description text
|
||||
}
|
||||
|
||||
Table recipes_spices {
|
||||
recipe_id int [ref: > recipes.id]
|
||||
|
||||
amount_in_percent decimal(4,2) [not null]
|
||||
|
||||
indexes {
|
||||
(recipe_id, spice_id) [pk]
|
||||
}
|
||||
spice_id int [ref: > spices.id]
|
||||
amount_in_percent decimal(4,2)
|
||||
indexes { (recipe_id, spice_id) [pk] }
|
||||
}
|
||||
|
||||
Table packings {
|
||||
id inbt [pk, increment]
|
||||
name varchar(255)
|
||||
size decimal(10,2)
|
||||
id int [pk]
|
||||
name varchar(255)
|
||||
size decimal(10,2)
|
||||
}
|
||||
|
||||
Table products {
|
||||
id int [pk, increment]
|
||||
title text
|
||||
images json
|
||||
description text
|
||||
package_content text
|
||||
package_id int [ref: > packings.id]
|
||||
recipe_id int [ref: > recipes.id]
|
||||
id int [pk]
|
||||
title text
|
||||
images json
|
||||
description text
|
||||
package_content text
|
||||
recipes_id int [ref: > recipes.id]
|
||||
}
|
||||
|
||||
Table products_sizes {
|
||||
id int [pk, increment]
|
||||
gtin int
|
||||
description text
|
||||
product_id int [ref: > products.id]
|
||||
packing_id int [ref: > packings.id]
|
||||
price float
|
||||
id int [pk]
|
||||
product_id int [ref: > products.id]
|
||||
packing_id int [ref: > packings.id]
|
||||
sku varchar
|
||||
shopify_variant_id varchar
|
||||
price float
|
||||
description text
|
||||
gtin varchar
|
||||
}
|
||||
|
||||
Table products_inventory {
|
||||
id int [pk, increment]
|
||||
id int [pk]
|
||||
product_id int [ref: > products.id]
|
||||
size_id int [ref: > products_sizes.id]
|
||||
out_at timestamp
|
||||
}
|
||||
```
|
||||
|
||||
`````
|
||||
---
|
||||
|
||||
## IONOS-Shared Webhosting
|
||||
### Variablen für GH Action
|
||||
Datenbank:
|
||||
- DB_DATABASENAME
|
||||
- DB_DATABASEUSER
|
||||
- DB_HOSTNAME
|
||||
MariaDB Version 10.11., Port 3306
|
||||
## Vision & Todo
|
||||
|
||||
SFTP:
|
||||
- SFTP_HOSTNAME
|
||||
- SFTP_USER
|
||||
**Fokus: Warenwirtschaft (Lager, Rohstoffe, Produkte)**
|
||||
|
||||
Domain: https://sms.bluefooted-booby-spices.com/,
|
||||
Short-Domain sms.spices.blue, PHP Version 8.3
|
||||
Um die Applikation auf Ionos Shared Webhosting zu hosten, muss die .htaccess-Datei so aussehen:
|
||||
|
||||
`````
|
||||
<IfModule mod_rewrite.c>
|
||||
<IfModule mod_negotiation.c>
|
||||
Options -MultiViews
|
||||
</IfModule>
|
||||
|
||||
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).
|
||||
- [x] DB-Schema mit Produkthistorie
|
||||
- [x] Rezepte (prozentual)
|
||||
- [x] Produktgrößen und -preise
|
||||
- [x] Inventar (eindeutige Items mit Ausgangs-Flag)
|
||||
- [x] Füllstandsanpassung der Rohstoffe beim Inventar anlegen
|
||||
- [x] Warenausgang (Produktverkauf)
|
||||
- [x] Shopify-Import (Produkte, Varianten, Lagerbestand, Bilder)
|
||||
- [x] Continuous Deployment via Gitea Actions + Docker
|
||||
- [x] Frontend (Sidebar-Struktur, Navigation)
|
||||
- [ ] Dashboard (Füllstände, Lager, Sales-Zeitspanne)
|
||||
Reference in new issue
Block a user