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:
2026-08-03 18:11:38 +02:00
commit b41dd1d3d7
6 changed files with 2028 additions and 0 deletions
+10
View File
@@ -0,0 +1,10 @@
.git
.gitignore
.env
data/
vendor/
.phpunit.cache/
build/
dist/
*.md
!README.md
+91
View File
@@ -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
View File
@@ -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
+38
View File
@@ -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
View File
File diff suppressed because it is too large Load Diff
+21
View File
@@ -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>