chore: Projektgeruest, Abhaengigkeiten und Werkzeuge
Plain PHP 8.2+ ohne Framework. Einzige Laufzeit-Abhaengigkeit ist endroid/qr-code; intl und imagick sind optional (es gibt jeweils einen Rueckfallweg). Konfiguration ueber .env oder Umgebungsvariablen, damit dieselbe Anwendung per FTP und per Docker deploybar ist.
This commit is contained in:
@@ -0,0 +1,10 @@
|
|||||||
|
.git
|
||||||
|
.gitignore
|
||||||
|
.env
|
||||||
|
data/
|
||||||
|
vendor/
|
||||||
|
.phpunit.cache/
|
||||||
|
build/
|
||||||
|
dist/
|
||||||
|
*.md
|
||||||
|
!README.md
|
||||||
@@ -0,0 +1,91 @@
|
|||||||
|
# =============================================================
|
||||||
|
# urlshort-qr-gen – Konfiguration
|
||||||
|
# Diese Datei nach ".env" kopieren und anpassen.
|
||||||
|
# Alle Werte koennen alternativ als echte Umgebungsvariablen
|
||||||
|
# gesetzt werden (Docker); die .env hat dann Vorrang, wenn der
|
||||||
|
# Schluessel dort vorhanden ist.
|
||||||
|
# =============================================================
|
||||||
|
|
||||||
|
# --- Anwendung -----------------------------------------------
|
||||||
|
# Basis-URL OHNE abschliessenden Slash. Wird fuer die Kurzlinks
|
||||||
|
# und die QR-Codes verwendet.
|
||||||
|
APP_BASE_URL=http://localhost:8080
|
||||||
|
|
||||||
|
# production | development (development zeigt Fehlermeldungen an)
|
||||||
|
APP_ENV=production
|
||||||
|
|
||||||
|
APP_TIMEZONE=Europe/Berlin
|
||||||
|
|
||||||
|
# HTTP-Status fuer Weiterleitungen: 301 (permanent, wird vom
|
||||||
|
# Browser gecacht -> weniger Klicks werden gezaehlt) oder
|
||||||
|
# 302 / 307 (temporaer, empfohlen fuer korrekte Statistik).
|
||||||
|
REDIRECT_STATUS=302
|
||||||
|
|
||||||
|
# --- Datenbank ------------------------------------------------
|
||||||
|
# sqlite | mysql
|
||||||
|
DB_DRIVER=sqlite
|
||||||
|
|
||||||
|
# Nur fuer sqlite: Pfad zur Datenbankdatei.
|
||||||
|
# Relative Pfade werden vom Projekt-Stammverzeichnis aus aufgeloest.
|
||||||
|
DB_SQLITE_PATH=data/database.sqlite
|
||||||
|
|
||||||
|
# Nur fuer mysql:
|
||||||
|
DB_HOST=127.0.0.1
|
||||||
|
DB_PORT=3306
|
||||||
|
DB_NAME=urlshort
|
||||||
|
DB_USER=urlshort
|
||||||
|
DB_PASSWORD=
|
||||||
|
DB_CHARSET=utf8mb4
|
||||||
|
|
||||||
|
# --- Admin-Zugang ---------------------------------------------
|
||||||
|
ADMIN_USER=admin
|
||||||
|
# bcrypt-Hash des Passworts. Leer lassen -> beim ersten Aufruf startet
|
||||||
|
# der Setup-Assistent. Dieser verlangt zusaetzlich ein Einmal-Token,
|
||||||
|
# das in data/setup-token.txt steht (und im Serverprotokoll), damit
|
||||||
|
# niemand anderes die frische Installation uebernehmen kann.
|
||||||
|
# Hash erzeugen: php -r "echo password_hash('geheim', PASSWORD_DEFAULT), PHP_EOL;"
|
||||||
|
ADMIN_PASSWORD_HASH=
|
||||||
|
|
||||||
|
# --- Sessions / Sicherheit ------------------------------------
|
||||||
|
SESSION_NAME=urlshort_session
|
||||||
|
# Abmeldung nach Inaktivitaet (Sekunden)
|
||||||
|
SESSION_LIFETIME=7200
|
||||||
|
# Harte Obergrenze je Sitzung, unabhaengig von Aktivitaet (0 = aus)
|
||||||
|
SESSION_ABSOLUTE_LIFETIME=43200
|
||||||
|
# Cookies nur ueber HTTPS senden. Wird bei einer HTTPS-Anfrage
|
||||||
|
# automatisch aktiviert; hier auf true setzen, wenn die Anwendung
|
||||||
|
# ausschliesslich ueber HTTPS erreichbar ist.
|
||||||
|
SESSION_SECURE=false
|
||||||
|
|
||||||
|
# --- Betrieb hinter einem Proxy / Loadbalancer ----------------
|
||||||
|
# Nur IPs und CIDR-Bereiche aus dieser Liste duerfen X-Forwarded-For
|
||||||
|
# und X-Forwarded-Proto setzen. LEER LASSEN, wenn kein Proxy davor
|
||||||
|
# steht - sonst koennte jeder die Client-IP faelschen und damit die
|
||||||
|
# Login-Sperre umgehen.
|
||||||
|
# Beispiel: TRUSTED_PROXIES=10.0.0.0/8,172.18.0.1
|
||||||
|
TRUSTED_PROXIES=
|
||||||
|
|
||||||
|
# HTTP Strict Transport Security in Sekunden (0 = aus).
|
||||||
|
# Wird nur bei HTTPS-Anfragen gesendet.
|
||||||
|
HSTS_MAX_AGE=31536000
|
||||||
|
|
||||||
|
# Login-Ratenbegrenzung
|
||||||
|
LOGIN_MAX_ATTEMPTS=5
|
||||||
|
LOGIN_LOCKOUT_SECONDS=900
|
||||||
|
|
||||||
|
# --- Datenschutz ----------------------------------------------
|
||||||
|
# none = IP wird gar nicht gespeichert (Standard, DSGVO-freundlich)
|
||||||
|
# hash = nur ein gesalzener, gekuerzter Hash (fuer Unique-Zaehlung)
|
||||||
|
TRACK_IP=none
|
||||||
|
# Zufaelliger Salt, nur relevant bei TRACK_IP=hash
|
||||||
|
IP_HASH_SALT=
|
||||||
|
|
||||||
|
# Tage, nach denen einzelne Besuchsdatensaetze automatisch geloescht
|
||||||
|
# werden (0 = nie loeschen). Die Gesamt-Klickzahl bleibt erhalten.
|
||||||
|
VISIT_RETENTION_DAYS=365
|
||||||
|
|
||||||
|
# --- Uploads (QR-Logos) ---------------------------------------
|
||||||
|
# Ablage der Logos, relativ zum Projekt-Stammverzeichnis.
|
||||||
|
# Liegt bewusst ausserhalb des Webroots.
|
||||||
|
UPLOAD_DIR=data/uploads
|
||||||
|
UPLOAD_MAX_BYTES=2097152
|
||||||
+14
@@ -0,0 +1,14 @@
|
|||||||
|
/.env
|
||||||
|
/data/*
|
||||||
|
!/data/.gitkeep
|
||||||
|
# Schutzdatei muss mit ausgeliefert werden
|
||||||
|
!/data/.htaccess
|
||||||
|
/data/setup-token.txt
|
||||||
|
/public/uploads/*
|
||||||
|
!/public/uploads/.gitkeep
|
||||||
|
/vendor/
|
||||||
|
/.phpunit.cache/
|
||||||
|
/build/
|
||||||
|
/dist/
|
||||||
|
.DS_Store
|
||||||
|
Thumbs.db
|
||||||
@@ -0,0 +1,38 @@
|
|||||||
|
{
|
||||||
|
"name": "wildeflorian/urlshort-qr-gen",
|
||||||
|
"description": "Schlanker, selbst gehosteter URL-Shortener mit QR-Code-Generator",
|
||||||
|
"type": "project",
|
||||||
|
"license": "MIT",
|
||||||
|
"require": {
|
||||||
|
"php": ">=8.2",
|
||||||
|
"ext-json": "*",
|
||||||
|
"ext-pdo": "*",
|
||||||
|
"ext-gd": "*",
|
||||||
|
"ext-mbstring": "*",
|
||||||
|
"endroid/qr-code": "^5.0"
|
||||||
|
},
|
||||||
|
"suggest": {
|
||||||
|
"ext-intl": "Umlaut-Domains (IDN) nach UTS-46 umwandeln; ohne intl greift ein eigener Punycode-Rueckfallweg",
|
||||||
|
"ext-imagick": "SVG-Logos auch in PNG-Downloads einbetten"
|
||||||
|
},
|
||||||
|
"require-dev": {
|
||||||
|
"phpunit/phpunit": "^10.5"
|
||||||
|
},
|
||||||
|
"autoload": {
|
||||||
|
"psr-4": {
|
||||||
|
"App\\": "src/"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"autoload-dev": {
|
||||||
|
"psr-4": {
|
||||||
|
"App\\Tests\\": "tests/"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"config": {
|
||||||
|
"optimize-autoloader": true,
|
||||||
|
"sort-packages": true
|
||||||
|
},
|
||||||
|
"scripts": {
|
||||||
|
"test": "phpunit"
|
||||||
|
}
|
||||||
|
}
|
||||||
Generated
+1854
File diff suppressed because it is too large
Load Diff
+21
@@ -0,0 +1,21 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xsi:noNamespaceSchemaLocation="vendor/phpunit/phpunit/phpunit.xsd"
|
||||||
|
bootstrap="vendor/autoload.php"
|
||||||
|
cacheDirectory=".phpunit.cache"
|
||||||
|
colors="true"
|
||||||
|
failOnWarning="true"
|
||||||
|
failOnRisky="true"
|
||||||
|
beStrictAboutOutputDuringTests="true">
|
||||||
|
<testsuites>
|
||||||
|
<testsuite name="urlshort-qr-gen">
|
||||||
|
<directory>tests</directory>
|
||||||
|
</testsuite>
|
||||||
|
</testsuites>
|
||||||
|
|
||||||
|
<source>
|
||||||
|
<include>
|
||||||
|
<directory>src</directory>
|
||||||
|
</include>
|
||||||
|
</source>
|
||||||
|
</phpunit>
|
||||||
Reference in New Issue
Block a user