Galeria zdjęć Lychee.
Live demo https://demo.lycheeorg.dev Także można przetestować bez konieczności instalowania.
Udostępniam gotowy stack dla portainer. Aczkolwiek pewnie ręcznie z pliku docker-compose.yml też ruszy.
Stack utworzony przy pomocy Ai, modyfikowany testowany kilkanaście razy. Tak żeby uruchamiało się i działało bez błędów itp.
Kryteria wyboru galerii to.
1. Możliwość wskazania katalogu ze zdjęciami.
2. Udostępnianie publiczne z autoryzacją = hasło.
3. Możliwość dodawania opisów pod zdjęciem.
Lychee nie jest moim wymarzonym wyborem. Nie działają pliki wideo np. mov, czy niektóre avi. Ale to raczej problem wielu innych galerii / przeglądarek. Nie ma też możliwości ustawienia wygaśnięcia linku. Jednak galeria wydaje się być "lekka", co może być korzystne na słabszych maszynkach.
Trzeba utworzyć katalogi, pliki, które są wskazane w volumes: dostosować stack pod siebie.
1. Wersja BEZ optymalizacji pod urządzenie.
services:
# Glowny serwis aplikacji Lychee (interfejs webowy i API)
lychee_api:
image: ghcr.io/lycheeorg/lychee:latest # Pobiera najnowsza oficjalna wersje obrazu Lychee
container_name: lychee-api # Nazwa kontenera widoczna w systemie
restart: unless-stopped # Automatyczny restart kontenera, chyba ze zostanie recznie zatrzymany
security_opt:
- no-new-privileges:true # Blokuje mozliwosc uzyskania wyzszych uprawnien przez procesy w kontenerze
cap_add:
- CHOWN # Pozwala na zmiane wlasciciela plikow
- SETGID # Pozwala na ustawianie ID grupy procesow
- SETUID # Pozwala na ustawianie ID uzytkownika procesow
- DAC_OVERRIDE # Pomija kontrole uprawnien do odczytu/zapisu plikow
- NET_BIND_SERVICE # Pozwala na bindowanie portow ponizej 1024
volumes:
- /mnt/sda3/multimedia/docker/lychee/uploads:/app/public/uploads # Folder na przeslane zdjecia i miniatury
- /mnt/sda3/multimedia/docker/lychee/logs:/app/storage/logs # Przechowywanie logow aplikacji
- /mnt/sda3/multimedia/docker/lychee/tmp:/app/storage/tmp # Pliki tymczasowe (np. podczas przetwarzania)
- /mnt/sda3/multimedia/moja_galeria:/app/import/moja_galeria:ro # Folder do importu zdjec w trybie tylko do odczytu
- /mnt/sda3/multimedia/docker/lychee/storage/app:/app/storage/app # Do trwalego przechowywania danych aplikacji, zapewnienia trwalosc danych
- /mnt/sda3/multimedia/docker/lychee/dist/user.css:/app/public/dist/user.css # Plik user.css sluzy do personalizacji wygladu galerii bez koniecznosci modyfikowania plikow zrodlowych
- /mnt/sda3/multimedia/docker/lychee/dist/custom.js:/app/public/dist/custom.js # Plik custom.js wlasne skrypty JavaScript, ktore sa automatycznie ladowane przez galerie
- /mnt/sda3/multimedia/docker/lychee/php-timezone.ini:/usr/local/etc/php/conf.d/99-timezone.ini # Wymuszenie date.timezone w PHP
ports:
- "8090:8000" # Mapowanie portu zewnetrznego 8090 na port kontenera 8000
environment:
PUID: 1000 # ID uzytkownika systemowego dla uprawnien plikow
PGID: 1000 # ID grupy systemowej dla uprawnien plikow
APP_NAME: Lychee # Nazwa wyswietlana aplikacji
APP_ENV: production # Tryb pracy aplikacji (produkcyjny)
TZ: Europe/Warsaw # Ustawienie strefy czasowej
APP_TIMEZONE: Europe/Warsaw # Ustawienie strefy czasowej
APP_KEY: base64:c0OEXPo/uKBi6N8+kv19k6yKqZBRjJAuHm8S9HgEVF0=
APP_URL: "https://twoja_domena" # Adres URL pod ktorym dostepna jest galeria
APP_FORCE_HTTPS: true # Wymus HTTPS, true lub false
TRUSTED_PROXIES: "*" # Zaufanie do reverse proxy (wymagane przy SSL poza kontenerem)
DB_CONNECTION: mysql # Typ polaczenia z baza danych
DB_HOST: lychee_db # Nazwa hosta bazy danych (zgodna z nazwa serwisu)
DB_PORT: 3306 # Port bazy danych
DB_DATABASE: lychee # Nazwa bazy (musi byc taka sama jak MYSQL_DATABASE, sekcja lychee_db)
DB_USERNAME: lychee # Nazwa uzytkownika (musi byc taka sama jak MYSQL_USER, sekcja lychee_db)
DB_PASSWORD: password # Haslo uzytkownika (musi byc takie samo jak MYSQL_PASSWORD, sekcja lychee_db)
QUEUE_CONNECTION: database # Obsluga kolejki zadan przez baze danych
depends_on:
- lychee_db # Uruchamia API dopiero po wystartowaniu bazy danych
# Serwis wykonawczy przetwarzajacy zadania w tle (np. tworzenie miniatur)
lychee_worker:
image: ghcr.io/lycheeorg/lychee:latest # Wykorzystuje ten sam obraz co API
container_name: lychee-worker
restart: unless-stopped
healthcheck:
disable: true # Wylaczenie sprawdzania stanu dla workera
volumes:
- /mnt/sda3/multimedia/docker/lychee/uploads:/app/public/uploads # Folder na przeslane zdjecia i miniatury
- /mnt/sda3/multimedia/docker/lychee/logs:/app/storage/logs # Przechowywanie logow aplikacji
- /mnt/sda3/multimedia/docker/lychee/tmp:/app/storage/tmp # Pliki tymczasowe (np. podczas przetwarzania)
- /mnt/sda3/multimedia/moja_galeria:/app/import/moja_galeria:ro # Folder do importu zdjec w trybie tylko do odczytu
- /mnt/sda3/multimedia/docker/lychee/storage/app:/app/storage/app # Do trwalego przechowywania danych aplikacji, zapewnienia trwalosc danych
- /mnt/sda3/multimedia/docker/lychee/dist/user.css:/app/public/dist/user.css # Plik user.css sluzy do personalizacji wygladu galerii bez koniecznosci modyfikowania plikow zrodlowych
- /mnt/sda3/multimedia/docker/lychee/dist/custom.js:/app/public/dist/custom.js # Plik custom.js wlasne skrypty JavaScript, ktore sa automatycznie ladowane przez galerie
- /mnt/sda3/multimedia/docker/lychee/php-timezone.ini:/usr/local/etc/php/conf.d/99-timezone.ini # Wymuszenie date.timezone w PHP
environment:
LYCHEE_MODE: worker # Definiuje kontener jako proces roboczy (nie serwer www)
PUID: 1000
PGID: 1000
TZ: Europe/Warsaw
APP_TIMEZONE: Europe/Warsaw
APP_KEY: base64:c0OEXPo/uKBi6N8+kv19k6yKqZBRjJAuHm8S9HgEVF0=
DB_CONNECTION: mysql
DB_HOST: lychee_db
DB_PORT: 3306
# Te dane musza byc identyczne jak w sekcji lychee-api, aby worker widzial te sama baze
DB_DATABASE: lychee
DB_USERNAME: lychee
DB_PASSWORD: password
QUEUE_CONNECTION: database
depends_on:
- lychee_api # Uruchamia workera po starcie glownego API
# Serwis bazy danych MariaDB
lychee_db:
image: mariadb:10 # Obraz bazy danych MariaDB w wersji 10
container_name: lychee_db
restart: unless-stopped
environment:
MYSQL_ROOT_PASSWORD: rootpassword # Haslo administratora Root - calkowicie inne, uzywane tylko do zarzadzania serwerem bazy
MYSQL_DATABASE: lychee # Nazwa bazy tworzonej przy starcie
MYSQL_USER: lychee # Nazwa uzytkownika tworzonego dla aplikacji Lychee
MYSQL_PASSWORD: password # Haslo dla uzytkownika aplikacji Lychee
volumes:
- /mnt/sda3/multimedia/docker/lychee/db_mysql:/var/lib/mysql # Trwale przechowywanie plikow bazy danych
networks:
default: # Definicja domyslnej sieci mostkowej dla komunikacji miedzy kontenerami
2. Wersja z optymalizacją pod mini pc Intel Celeron N3160, 8 GB RAM, dysk SSD.
services:
# Glowny serwis aplikacji Lychee (interfejs webowy i API)
lychee_api:
image: ghcr.io/lycheeorg/lychee:latest # Pobiera najnowsza oficjalna wersje obrazu Lychee
container_name: lychee-api # Nazwa kontenera widoczna w systemie
restart: unless-stopped # Automatyczny restart kontenera, chyba ze zostanie recznie zatrzymany
# Dodano limity zasobow, aby PHP nie "zjadlo" calego CPU podczas ladowania galerii. Opcjonalnie.
deploy:
resources:
limits:
memory: 2G
security_opt:
- no-new-privileges:true # Blokuje mozliwosc uzyskania wyzszych uprawnien przez procesy w kontenerze
cap_add:
- CHOWN # Pozwala na zmiane wlasciciela plikow
- SETGID # Pozwala na ustawianie ID grupy procesow
- SETUID # Pozwala na ustawianie ID uzytkownika procesow
- DAC_OVERRIDE # Pomija kontrole uprawnien do odczytu/zapisu plikow
- NET_BIND_SERVICE # Pozwala na bindowanie portow ponizej 1024
volumes:
- /mnt/sda3/multimedia/docker/lychee/uploads:/app/public/uploads # Folder na przeslane zdjecia i miniatury
- /mnt/sda3/multimedia/docker/lychee/logs:/app/storage/logs # Przechowywanie logow aplikacji
- /mnt/sda3/multimedia/docker/lychee/tmp:/app/storage/tmp # Pliki tymczasowe (np. podczas przetwarzania)
- /mnt/sda3/multimedia/moja_galeria:/app/import/moja_galeria:ro # Folder do importu zdjec w trybie tylko do odczytu
- /mnt/sda3/multimedia/docker/lychee/storage/app:/app/storage/app # Do trwalego przechowywania danych aplikacji, zapewnienia trwalosc danych
- /mnt/sda3/multimedia/docker/lychee/dist/user.css:/app/public/dist/user.css # Plik user.css sluzy do personalizacji wygladu galerii bez koniecznosci modyfikowania plikow zrodlowych
- /mnt/sda3/multimedia/docker/lychee/dist/custom.js:/app/public/dist/custom.js # Plik custom.js wlasne skrypty JavaScript, ktore sa automatycznie ladowane przez galerie
- /mnt/sda3/multimedia/docker/lychee/php-timezone.ini:/usr/local/etc/php/conf.d/99-timezone.ini # Wymuszenie date.timezone w PHP
ports:
- "8090:8000" # Mapowanie portu zewnetrznego 8090 na port kontenera 8000
environment:
PUID: 1000 # ID uzytkownika systemowego dla uprawnien plikow
PGID: 1000 # ID grupy systemowej dla uprawnien plikow
APP_NAME: Lychee # Nazwa wyswietlana aplikacji
APP_ENV: production # Tryb pracy aplikacji (produkcyjny)
TZ: Europe/Warsaw # Ustawienie strefy czasowej
APP_TIMEZONE: Europe/Warsaw # Ustawienie strefy czasowej
APP_KEY: base64:c0OEXPo/uKBi6N8+kv19k6yKqZBRjJAuHm8S9HgEVF0=
APP_URL: "https://twoja_domena" # Adres URL pod ktorym dostepna jest galeria
APP_FORCE_HTTPS: true # Wymus HTTPS, true lub false
TRUSTED_PROXIES: "*" # Zaufanie do reverse proxy (wymagane przy SSL poza kontenerem)
DB_CONNECTION: mysql # Typ polaczenia z baza danych
DB_HOST: lychee_db # Nazwa hosta bazy danych (zgodna z nazwa serwisu)
DB_PORT: 3306 # Port bazy danych
DB_DATABASE: lychee # Nazwa bazy (musi byc taka sama jak MYSQL_DATABASE, sekcja lychee_db)
DB_USERNAME: lychee # Nazwa uzytkownika (musi byc taka sama jak MYSQL_USER, sekcja lychee_db)
DB_PASSWORD: password # Haslo uzytkownika (musi byc takie samo jak MYSQL_PASSWORD, sekcja lychee_db)
QUEUE_CONNECTION: database # Obsluga kolejki zadan przez baze danych
# Zwiekszenie pamieci dla PHP, co przyspieszy generowanie miniatur na SSD. Opcjonalnie.
PHP_MEMORY_LIMIT: 1G
depends_on:
- lychee_db # Uruchamia API dopiero po wystartowaniu bazy danych
# Serwis wykonawczy przetwarzajacy zadania w tle (np. tworzenie miniatur)
lychee_worker:
image: ghcr.io/lycheeorg/lychee:latest # Wykorzystuje ten sam obraz co API
container_name: lychee-worker
restart: unless-stopped
# Ograniczenie CPU dla workera, aby tlo nie zamulilo interfejsu OpenWrt. Opcjonalnie.
deploy:
resources:
limits:
cpus: '2.0'
memory: 2G
healthcheck:
disable: true # Wylaczenie sprawdzania stanu dla workera
volumes:
- /mnt/sda3/multimedia/docker/lychee/uploads:/app/public/uploads # Folder na przeslane zdjecia i miniatury
- /mnt/sda3/multimedia/docker/lychee/logs:/app/storage/logs # Przechowywanie logow aplikacji
- /mnt/sda3/multimedia/docker/lychee/tmp:/app/storage/tmp # Pliki tymczasowe (np. podczas przetwarzania)
- /mnt/sda3/multimedia/moja_galeria:/app/import/moja_galeria:ro # Folder do importu zdjec w trybie tylko do odczytu
- /mnt/sda3/multimedia/docker/lychee/storage/app:/app/storage/app # Do trwalego przechowywania danych aplikacji, zapewnienia trwalosc danych
- /mnt/sda3/multimedia/docker/lychee/dist/user.css:/app/public/dist/user.css # Plik user.css sluzy do personalizacji wygladu galerii bez koniecznosci modyfikowania plikow zrodlowych
- /mnt/sda3/multimedia/docker/lychee/dist/custom.js:/app/public/dist/custom.js # Plik custom.js wlasne skrypty JavaScript, ktore sa automatycznie ladowane przez galerie
- /mnt/sda3/multimedia/docker/lychee/php-timezone.ini:/usr/local/etc/php/conf.d/99-timezone.ini # Wymuszenie date.timezone w PHP
environment:
LYCHEE_MODE: worker # Definiuje kontener jako proces roboczy (nie serwer www)
PUID: 1000
PGID: 1000
TZ: Europe/Warsaw
APP_TIMEZONE: Europe/Warsaw
APP_KEY: base64:c0OEXPo/uKBi6N8+kv19k6yKqZBRjJAuHm8S9HgEVF0=
DB_CONNECTION: mysql
DB_HOST: lychee_db
DB_PORT: 3306
# Te dane musza byc identyczne jak w sekcji lychee-api, aby worker widzial te sama baze
DB_DATABASE: lychee
DB_USERNAME: lychee
DB_PASSWORD: password
QUEUE_CONNECTION: database
depends_on:
- lychee_api # Uruchamia workera po starcie glownego API
# Serwis bazy danych MariaDB
lychee_db:
image: mariadb:10 # Obraz bazy danych MariaDB w wersji 10
container_name: lychee_db
restart: unless-stopped
# Optymalizacja MariaDB pod 8GB RAM (wiekszy bufor przyspiesza wyszukiwanie i ladowanie albumow). Opcjonalnie.
command: [
"mysqld",
"--innodb-buffer-pool-size=1G",
"--innodb-log-file-size=256M",
"--innodb-flush-log-at-trx-commit=2",
"--skip-name-resolve"
]
environment:
MYSQL_ROOT_PASSWORD: rootpassword # Haslo administratora Root - calkowicie inne, uzywane tylko do zarzadzania serwerem bazy
MYSQL_DATABASE: lychee # Nazwa bazy tworzonej przy starcie
MYSQL_USER: lychee # Nazwa uzytkownika tworzonego dla aplikacji Lychee
MYSQL_PASSWORD: password # Haslo dla uzytkownika aplikacji Lychee
volumes:
- /mnt/sda3/multimedia/docker/lychee/db_mysql:/var/lib/mysql # Trwale przechowywanie plikow bazy danych
networks:
default: # Definicja domyslnej sieci mostkowej dla komunikacji miedzy kontenerami
3. Wersja z optymalizacją bardziej zaawansowaną z użyciem Redis pod mini pc Intel Celeron N3160, 8 GB RAM, dysk SSD.
services:
# Serwis Redis - szybka kolejka w pamieci RAM. Co jest znacznie szybsze niz ciagle zapisywanie i odczytywanie ich z bazy MariaDB
# Redis nie zastepuje bazy MariaDB calkowicie, lecz wyrecza ja w jednym, konkretnym zadaniu - obsludze kolejki zadan (Queue).
lychee_redis:
image: redis:alpine
container_name: lychee-redis
restart: unless-stopped
# Redis jest bardzo lekki, ograniczenie do 300MB RAM w zupelnosci wystarczy
deploy:
resources:
limits:
memory: 300M
tmpfs:
- /data # Dane Redis przechowywane w RAM (tmpfs), brak wolumenu na dysku i brak anonimowych volume
# Uruchomienie Redis z bezpiecznymi limitami pamieci dla OpenWrt
command:
- redis-server
- --maxmemory 250mb # maxmemory ustawia soft limit pamieci Redis ponizej limitu Dockera
- --maxmemory-policy allkeys-lru # allkeys-lru usuwa najrzadziej uzywane zadania z kolejki zeby nie doprowadzic do OOM
# Glowny serwis aplikacji Lychee (interfejs webowy i API)
lychee_api:
image: ghcr.io/lycheeorg/lychee:latest # Pobiera najnowsza oficjalna wersje obrazu Lychee
container_name: lychee-api # Nazwa kontenera widoczna w systemie
restart: unless-stopped # Automatyczny restart kontenera, chyba ze zostanie recznie zatrzymany
# Dodano limity zasobow, aby PHP nie "zjadlo" calego CPU podczas ladowania galerii. Opcjonalnie.
deploy:
resources:
limits:
memory: 2.5G
security_opt:
- no-new-privileges:true # Blokuje mozliwosc uzyskania wyzszych uprawnien przez procesy w kontenerze
cap_add:
- CHOWN # Pozwala na zmiane wlasciciela plikow
- SETGID # Pozwala na ustawianie ID grupy procesow
- SETUID # Pozwala na ustawianie ID uzytkownika procesow
- DAC_OVERRIDE # Pomija kontrole uprawnien do odczytu/zapisu plikow
- NET_BIND_SERVICE # Pozwala na bindowanie portow ponizej 1024
volumes:
- /mnt/sda3/multimedia/docker/lychee/uploads:/app/public/uploads # Folder na przeslane zdjecia i miniatury
- /mnt/sda3/multimedia/docker/lychee/logs:/app/storage/logs # Przechowywanie logow aplikacji
- /mnt/sda3/multimedia/docker/lychee/tmp:/app/storage/tmp # Pliki tymczasowe (np. podczas przetwarzania)
- /mnt/sda3/multimedia/moja_galeria:/app/import/moja_galeria:ro # Folder do importu zdjec w trybie tylko do odczytu
- /mnt/sda3/multimedia/docker/lychee/storage/app:/app/storage/app # Do trwalego przechowywania danych aplikacji, zapewnienia trwalosc danych
- /mnt/sda3/multimedia/docker/lychee/dist/user.css:/app/public/dist/user.css # Plik user.css sluzy do personalizacji wygladu galerii bez koniecznosci modyfikowania plikow zrodlowych
- /mnt/sda3/multimedia/docker/lychee/dist/custom.js:/app/public/dist/custom.js # Plik custom.js wlasne skrypty JavaScript, ktore sa automatycznie ladowane przez galerie
- /mnt/sda3/multimedia/docker/lychee/php-timezone.ini:/usr/local/etc/php/conf.d/99-timezone.ini # Wymuszenie date.timezone w PHP
ports:
- "8090:8000" # Mapowanie portu zewnetrznego 8090 na port kontenera 8000
environment:
PUID: 1000 # ID uzytkownika systemowego dla uprawnien plikow
PGID: 1000 # ID grupy systemowej dla uprawnien plikow
APP_NAME: Lychee # Nazwa wyswietlana aplikacji
APP_ENV: production # Tryb pracy aplikacji (produkcyjny)
# TZ: Europe/Warsaw # Ustawienie strefy czasowej
# APP_TIMEZONE: Europe/Warsaw # Ustawienie strefy czasowej
# PHP_TZ: Europe/Warsaw # Ustawienie strefy czasowej
APP_KEY: base64:c0OEXPo/uKBi6N8+kv19k6yKqZBRjJAuHm8S9HgEVF0=
APP_URL: "https://twoja_domena" # Adres URL pod ktorym dostepna jest galeria
APP_FORCE_HTTPS: true # Wymus HTTPS, true lub false
TRUSTED_PROXIES: "*" # Zaufanie do reverse proxy (wymagane przy SSL poza kontenerem)
DB_CONNECTION: mysql # Typ polaczenia z baza danych
DB_HOST: lychee_db # Nazwa hosta bazy danych (zgodna z nazwa serwisu)
DB_PORT: 3306 # Port bazy danych
DB_DATABASE: lychee # Nazwa bazy (musi byc taka sama jak MYSQL_DATABASE, sekcja lychee_db)
DB_USERNAME: lychee # Nazwa uzytkownika (musi byc taka sama jak MYSQL_USER, sekcja lychee_db)
DB_PASSWORD: password # Haslo uzytkownika (musi byc takie samo jak MYSQL_PASSWORD, sekcja lychee_db)
# Zmiana z database na Redis dla lepszej wydajnosci na OpenWrt
QUEUE_CONNECTION: redis # Obsluga kolejki zadan przez Redis zamiast bazy danych
REDIS_HOST: lychee_redis
# Zwiekszenie pamieci dla PHP, co przyspieszy generowanie miniatur na SSD. Opcjonalnie.
PHP_MEMORY_LIMIT: 1536M # 1.5G
depends_on:
- lychee_db # Uruchamia API dopiero po wystartowaniu bazy danych
- lychee_redis # Redis wymagany do obslugi kolejki zadan
# Serwis wykonawczy przetwarzajacy zadania w tle (np. tworzenie miniatur)
lychee_worker:
image: ghcr.io/lycheeorg/lychee:latest # Wykorzystuje ten sam obraz co API
container_name: lychee-worker
restart: unless-stopped
# Ograniczenie CPU dla workera, aby tlo nie zamulilo interfejsu OpenWrt. Opcjonalnie.
deploy:
resources:
limits:
cpus: '2.0'
memory: 2G
healthcheck:
disable: true # Wylaczenie sprawdzania stanu dla workera
volumes:
- /mnt/sda3/multimedia/docker/lychee/uploads:/app/public/uploads # Folder na przeslane zdjecia i miniatury
- /mnt/sda3/multimedia/docker/lychee/logs:/app/storage/logs # Przechowywanie logow aplikacji
- /mnt/sda3/multimedia/docker/lychee/tmp:/app/storage/tmp # Pliki tymczasowe (np. podczas przetwarzania)
- /mnt/sda3/multimedia/moja_galeria:/app/import/moja_galeria:ro # Folder do importu zdjec w trybie tylko do odczytu
- /mnt/sda3/multimedia/docker/lychee/storage/app:/app/storage/app # Do trwalego przechowywania danych aplikacji, zapewnienia trwalosc danych
- /mnt/sda3/multimedia/docker/lychee/dist/user.css:/app/public/dist/user.css # Plik user.css sluzy do personalizacji wygladu galerii bez koniecznosci modyfikowania plikow zrodlowych
- /mnt/sda3/multimedia/docker/lychee/dist/custom.js:/app/public/dist/custom.js # Plik custom.js wlasne skrypty JavaScript, ktore sa automatycznie ladowane przez galerie
- /mnt/sda3/multimedia/docker/lychee/php-timezone.ini:/usr/local/etc/php/conf.d/99-timezone.ini # Wymuszenie date.timezone w PHP
environment:
LYCHEE_MODE: worker # Definiuje kontener jako proces roboczy (nie serwer www)
PUID: 1000
PGID: 1000
# TZ: Europe/Warsaw
# APP_TIMEZONE: Europe/Warsaw
# PHP_TZ: Europe/Warsaw
APP_KEY: base64:c0OEXPo/uKBi6N8+kv19k6yKqZBRjJAuHm8S9HgEVF0=
DB_CONNECTION: mysql
DB_HOST: lychee_db
DB_PORT: 3306
# Te dane musza byc identyczne jak w sekcji lychee-api, aby worker widzial te sama baze
DB_DATABASE: lychee
DB_USERNAME: lychee
DB_PASSWORD: password
# Worker musi polaczyc sie z tym samym serwisem Redis
QUEUE_CONNECTION: redis
REDIS_HOST: lychee_redis
depends_on:
- lychee_api # Uruchamia workera po starcie glownego API
- lychee_redis # Redis wymagany do odbierania zadan z kolejki
# Serwis bazy danych MariaDB
lychee_db:
image: mariadb:10 # Obraz bazy danych MariaDB w wersji 10
container_name: lychee_db
restart: unless-stopped
# Optymalizacja MariaDB pod 8GB RAM (wiekszy bufor przyspiesza wyszukiwanie i ladowanie albumow). Opcjonalnie.
command: [
"mysqld",
"--innodb-buffer-pool-size=2G",
"--innodb-log-file-size=512M",
"--innodb-flush-log-at-trx-commit=2",
"--skip-name-resolve"
]
environment:
MYSQL_ROOT_PASSWORD: rootpassword # Haslo administratora Root - calkowicie inne, uzywane tylko do zarzadzania serwerem bazy
MYSQL_DATABASE: lychee # Nazwa bazy tworzonej przy starcie
MYSQL_USER: lychee # Nazwa uzytkownika tworzonego dla aplikacji Lychee
MYSQL_PASSWORD: password # Haslo dla uzytkownika aplikacji Lychee
volumes:
- /mnt/sda3/multimedia/docker/lychee/db_mysql:/var/lib/mysql # Trwale przechowywanie plikow bazy danych
networks:
default: # Definicja domyslnej sieci mostkowej dla komunikacji miedzy kontenerami
4. Wersja z MAX optymalizacją z użyciem Redis i przekierowaniem plików tymczasowych (np. podczas przetwarzania miniatur) do tmp w RAM. Pod mini pc Intel Celeron N3160, 8 GB RAM, dysk SSD.
Według Ai niby najbardziej wydajna, ale też najbardziej hardkorowa. A czy rzeczywiście tak jest?, czas pokaże.
services:
# Serwis Redis - szybka kolejka w pamieci RAM. Co jest znacznie szybsze niz ciagle zapisywanie i odczytywanie ich z bazy MariaDB
# Redis nie zastepuje bazy MariaDB calkowicie, lecz wyrecza ja w jednym, konkretnym zadaniu - obsludze kolejki zadan (Queue).
lychee_redis:
image: redis:alpine # Lekki oficjalny obraz Redis
container_name: lychee-redis # Stala nazwa kontenera Redis
restart: unless-stopped # Automatyczny restart po bledzie
# Redis jest bardzo lekki, ograniczenie do 300MB RAM w zupelnosci wystarczy
deploy:
resources:
limits:
memory: 300M # Twardy limit RAM dla kontenera Redis
tmpfs:
- /data # Dane Redis przechowywane w RAM (tmpfs), brak zapisu na dysk
# Uruchomienie Redis z bezpiecznymi limitami pamieci dla OpenWrt
command:
- redis-server
- --maxmemory 250mb # Soft limit pamieci Redis ponizej limitu Dockera
- --maxmemory-policy allkeys-lru # Usuwanie najrzadziej uzywanych kluczy przy braku RAM
# Glowny serwis aplikacji Lychee (interfejs webowy i API)
lychee_api:
image: ghcr.io/lycheeorg/lychee:latest # Pobiera najnowsza oficjalna wersje obrazu Lychee
container_name: lychee-api # Glowny kontener API i UI, nazwa kontenera widoczna w systemie
restart: unless-stopped # Automatyczny restart kontenera przy awarii
volumes:
- /mnt/sda3/multimedia/docker/lychee/init-tmp.sh:/init-tmp.sh:ro # Skrypt inicjalizujacy prawa katalogow
- /mnt/sda3/multimedia/docker/lychee/uploads:/app/public/uploads # Folder na przeslane zdjecia i miniatury
- /mnt/sda3/multimedia/docker/lychee/logs:/app/storage/logs # Przechowywanie logow aplikacji
# - /mnt/sda3/multimedia/docker/lychee/tmp:/app/storage/tmp # Pliki tymczasowe (np. podczas przetwarzania)
- /mnt/sda3/multimedia/moja_galeria:/app/import/moja_galeria:ro # Folder do importu zdjec w trybie tylko do odczytu
- /mnt/sda3/multimedia/docker/lychee/storage/app:/app/storage/app # Do trwalego przechowywania danych aplikacji, zapewnienia trwalosc danych
- /mnt/sda3/multimedia/docker/lychee/dist/user.css:/app/public/dist/user.css # Plik user.css sluzy do personalizacji wygladu galerii bez koniecznosci modyfikowania plikow zrodlowych
- /mnt/sda3/multimedia/docker/lychee/dist/custom.js:/app/public/dist/custom.js # Plik custom.js wlasne skrypty JavaScript, ktore sa automatycznie ladowane przez galerie
- /mnt/sda3/multimedia/docker/lychee/php-timezone.ini:/usr/local/etc/php/conf.d/99-timezone.ini # Wymuszenie date.timezone w PHP
tmpfs:
- /app/storage/tmp # Pliki tymczasowe (np. podczas przetwarzania). Katalog tmp w RAM dla szybszego przetwarzania miniatur
command: ["/bin/sh", "-c", "/init-tmp.sh && php -S 0.0.0.0:8000 -t /app/public"]
ports:
- "8090:8000" # Mapowanie portu zewnetrznego 8090 na port kontenera 8000
environment:
PUID: 1000 # ID uzytkownika systemowego dla uprawnien plikow
PGID: 1000 # ID grupy systemowej dla uprawnien plikow
APP_NAME: Lychee # Nazwa wyswietlana aplikacji
APP_ENV: production # Tryb pracy aplikacji (produkcyjny)
# TZ: Europe/Warsaw # Ustawienie strefy czasowej
# APP_TIMEZONE: Europe/Warsaw # Ustawienie strefy czasowej
# PHP_TZ: Europe/Warsaw # Ustawienie strefy czasowej
APP_KEY: base64:c0OEXPo/uKBi6N8+kv19k6yKqZBRjJAuHm8S9HgEVF0=
APP_URL: "https://krynio.noip.pl" # Adres URL pod ktorym dostepna jest galeria
APP_FORCE_HTTPS: true # Wymus HTTPS, true lub false
TRUSTED_PROXIES: "*" # Zaufanie do reverse proxy (wymagane przy SSL poza kontenerem)
DB_CONNECTION: mysql # Typ polaczenia z baza danych
DB_HOST: lychee_db # Nazwa hosta bazy danych (zgodna z nazwa serwisu)
DB_PORT: 3306 # Port bazy danych
DB_DATABASE: lychee # Nazwa bazy (musi byc taka sama jak MYSQL_DATABASE, sekcja lychee_db)
DB_USERNAME: lychee # Nazwa uzytkownika (musi byc taka sama jak MYSQL_USER, sekcja lychee_db)
DB_PASSWORD: password # Haslo uzytkownika (musi byc takie samo jak MYSQL_PASSWORD, sekcja lychee_db)
# Zmiana z database na Redis dla lepszej wydajnosci na OpenWrt
QUEUE_CONNECTION: redis # Obsluga kolejki zadan przez Redis zamiast bazy danych
REDIS_HOST: lychee_redis
# Zwiekszenie pamieci dla PHP, co przyspieszy generowanie miniatur na SSD. Opcjonalnie.
PHP_MEMORY_LIMIT: 1536M # 1.5G
depends_on:
- lychee_db # Uruchamia API dopiero po wystartowaniu bazy danych
- lychee_redis # Redis wymagany do obslugi kolejki zadan
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8000/"] # Sprawdzenie dostepnosci API
interval: 30s # Czas miedzy kolejnymi testami
timeout: 10s # Timeout sprawdzenia
retries: 3 # Liczba prob przed uznaniem kontenera za niezdrowy
start_period: 30s # Jesli w ciagu 30 sekund test healthcheck sie nie powiedzie, Docker nie zaliczy go jako bledu
# Serwis wykonawczy przetwarzajacy zadania w tle (np. tworzenie miniatur)
lychee_worker:
image: ghcr.io/lycheeorg/lychee:latest # Wykorzystuje ten sam obraz co API
container_name: lychee-worker # Kontener workera
restart: unless-stopped
volumes:
- /mnt/sda3/multimedia/docker/lychee/init-tmp.sh:/init-tmp.sh:ro # Skrypt inicjalizujacy prawa katalogow
- /mnt/sda3/multimedia/docker/lychee/uploads:/app/public/uploads # Folder na przeslane zdjecia i miniatury
- /mnt/sda3/multimedia/docker/lychee/logs:/app/storage/logs # Przechowywanie logow aplikacji
# - /mnt/sda3/multimedia/docker/lychee/tmp:/app/storage/tmp # Pliki tymczasowe (np. podczas przetwarzania)
- /mnt/sda3/multimedia/moja_galeria:/app/import/moja_galeria:ro # Folder do importu zdjec w trybie tylko do odczytu
- /mnt/sda3/multimedia/docker/lychee/storage/app:/app/storage/app # Do trwalego przechowywania danych aplikacji, zapewnienia trwalosc danych
- /mnt/sda3/multimedia/docker/lychee/dist/user.css:/app/public/dist/user.css # Plik user.css sluzy do personalizacji wygladu galerii bez koniecznosci modyfikowania plikow zrodlowych
- /mnt/sda3/multimedia/docker/lychee/dist/custom.js:/app/public/dist/custom.js # Plik custom.js wlasne skrypty JavaScript, ktore sa automatycznie ladowane przez galerie
- /mnt/sda3/multimedia/docker/lychee/php-timezone.ini:/usr/local/etc/php/conf.d/99-timezone.ini # Wymuszenie date.timezone w PHP
tmpfs:
- /app/storage/tmp # Pliki tymczasowe (np. podczas przetwarzania). Katalog tmp w RAM dla szybszego przetwarzania miniatur
command: ["/bin/sh", "-c", "/init-tmp.sh && php /app/artisan queue:work --verbose"]
environment:
LYCHEE_MODE: worker # Definiuje kontener jako proces roboczy (nie serwer www)
PUID: 1000
PGID: 1000
# TZ: Europe/Warsaw
# APP_TIMEZONE: Europe/Warsaw
# PHP_TZ: Europe/Warsaw
APP_KEY: base64:c0OEXPo/uKBi6N8+kv19k6yKqZBRjJAuHm8S9HgEVF0=
DB_CONNECTION: mysql
DB_HOST: lychee_db
DB_PORT: 3306
# Te dane musza byc identyczne jak w sekcji lychee-api, aby worker widzial te sama baze
DB_DATABASE: lychee
DB_USERNAME: lychee
DB_PASSWORD: password
# Worker musi polaczyc sie z tym samym serwisem Redis
QUEUE_CONNECTION: redis
REDIS_HOST: lychee_redis
depends_on:
- lychee_api # Uruchamia workera po starcie glownego API
- lychee_redis # Redis wymagany do odbierania zadan z kolejki
healthcheck:
test: ["CMD-SHELL", "pgrep -f artisan || exit 1"] # Sprawdzenie czy proces workera dziala
interval: 30s # Czas miedzy kolejnymi testami
timeout: 5s # Timeout sprawdzenia
retries: 3 # Liczba prob przed uznaniem kontenera za niezdrowy
# Serwis bazy danych MariaDB
lychee_db:
image: mariadb:10 # Obraz bazy danych MariaDB w wersji 10
container_name: lychee_db
restart: unless-stopped
# Optymalizacja MariaDB pod 8GB RAM (wiekszy bufor przyspiesza wyszukiwanie i ladowanie albumow). Opcjonalnie.
command: [
"mysqld",
"--innodb-buffer-pool-size=2G", # Bufor InnoDB w RAM
"--innodb-log-file-size=512M", # Rozmiar logow transakcji
"--innodb-flush-log-at-trx-commit=2", # Lepsza wydajnosc kosztem minimalnego ryzyka
"--skip-name-resolve" # Szybsze laczenie bez DNS
]
environment:
MYSQL_ROOT_PASSWORD: rootpassword # Haslo administratora Root - calkowicie inne, uzywane tylko do zarzadzania serwerem bazy
MYSQL_DATABASE: lychee # Nazwa bazy tworzonej przy starcie
MYSQL_USER: lychee # Nazwa uzytkownika tworzonego dla aplikacji Lychee
MYSQL_PASSWORD: password # Haslo dla uzytkownika aplikacji Lychee
volumes:
- /mnt/sda3/multimedia/docker/lychee/db_mysql:/var/lib/mysql # Trwale przechowywanie plikow bazy danych
networks:
default: # Definicja domyslnej sieci mostkowej dla komunikacji miedzy kontenerami
Wymagane jest utworzenie skryptu o nazwie "init-tmp.sh" o uprawnieniach rwxr-xr-x
Moja lokalizacja skryptu /mnt/sda3/multimedia/docker/lychee/init-tmp.sh
Zawartość skryptu. Jest on potrzebny aby wyeliminować Warningi w GUI, Diagnostyka, Auto-diagnoza.
#!/bin/sh
# Tworzenie katalogow tmpfs dla Lychee
set -e
echo "[init-tmp] Tworzenie katalogow tmpfs..."
mkdir -p /app/storage/tmp/jobs
mkdir -p /app/storage/tmp/uploads
chmod 0775 /app/storage/tmp
chmod 0775 /app/storage/tmp/jobs
chmod 0775 /app/storage/tmp/uploads
chown -R www-data:www-data /app/storage/tmp
echo "[init-tmp] tmpfs gotowe"
# Koniec skryptu – nie wywolujemy php-fpm ani entrypoint
5. Eliminacja Warning dotyczący timezone, w GUI, Diagnostyka, Auto-diagnoza.
Należy utworzyć plik "php-timezone.ini" z zawartością "date.timezone = Europe/Warsaw" lokalizacja dowolna, u mnie:
echo 'date.timezone = Europe/Warsaw' > /mnt/sda3/multimedia/docker/lychee/php-timezone.ini
chmod -R 0644 /mnt/sda3/multimedia/docker/lychee/php-timezone.ini
W sekcjach volumes: dodać lokalizację pliku php-timezone.ini
- /mnt/sda3/multimedia/docker/lychee/php-timezone.ini:/usr/local/etc/php/conf.d/99-timezone.ini # Wymuszenie date.timezone w PHP
chmod -R 0644 /mnt/sda3/multimedia/docker/lychee/php-timezone.ini dodać również do /etc/rc.local
6. Opcjonalnie dodanie wpisów do /etc/rc.local Bez tego też działa, lecz w Auto-diagnoza pokazuje warningi.
# Naprawa uprawnień dla kontenera Lychee po 60 sekundach
(
sleep 60
# Naprawa uprawnień dla kontenera Lychee, galeria zdjęć
chown 1000:1000 /mnt/sda3/multimedia/docker/lychee
chown -R 1000:1000 /mnt/sda3/multimedia/docker/lychee/dist
chown -R 1000:1000 /mnt/sda3/multimedia/docker/lychee/logs
chown -R 1000:1000 /mnt/sda3/multimedia/docker/lychee/storage
chown -R 1000:1000 /mnt/sda3/multimedia/docker/lychee/tmp
chown 1000:1000 /mnt/sda3/multimedia/docker/lychee/uploads
chmod -R 0755 /mnt/sda3/multimedia/docker/lychee
chmod -R 0775 /mnt/sda3/multimedia/docker/lychee/storage
chmod -R 0775 /mnt/sda3/multimedia/docker/lychee/tmp
chmod -R 0775 /mnt/sda3/multimedia/docker/lychee/uploads
chmod -R 0644 /mnt/sda3/multimedia/docker/lychee/php-timezone.ini
) &
exit 0
7. Prowizoryczne pozbycie się masowego logowania WARNING do pliku deprecations.log (co jest spowodowane niezgodnością PHP).
Po instalacji lychee, z konsoli wykonać.
docker exec -it lychee-api sh -c '
rm -f /app/storage/logs/deprecations.log &&
ln -s /dev/null /app/storage/logs/deprecations.log
'
docker exec -it lychee-worker sh -c '
rm -f /app/storage/logs/deprecations.log &&
ln -s /dev/null /app/storage/logs/deprecations.log
'
Następnie
docker restart lychee-api lychee-worker
8. Skrypt do synchronizowania galerii z katalogiem "moja_galeria", uruchamiany z crona wg uznania.
Lokalizacja /usr/bin/lychee_sync_moja_galeria.sh
#!/bin/sh
# Nazwa kontenera zgodnie z Twoim stackiem (docker-compose.yml)
CONTAINER_NAME="lychee-api"
# Sciezka wewnatrz kontenera do Twoich zdjec na dysku SSD
IMPORT_PATH="/app/import/moja_galeria"
echo "Rozpoczynam inteligentna synchronizacje galerii zgodna ze specyfikacja Lychee v7"
# Wywolanie z uzyciem wartosci =1 dla aktywacji opcji. Opis funkcji
# --import_via_symlink=1: Nie kopiuje plikow, tworzy tylko linki (oszczedza Twoj dysk SSD)
# --skip_duplicates=1: Pomin zdjecia i albumy, jesli juz znajduja sie w galerii.
# --delete_missing_photos=1: Usun zdjecia z albumu, ktorych nie ma w zsynchronizowanym katalogu "moja_galeria"
# --delete_missing_albums=1: Usuwa z galerii foldery skasowane ktorych nie ma w katalogu synchronizowanym "moja_galeria"
# --dry_run=0: Musimy ustawic na 0, aby faktycznie wprowadzic zmiany (domyslnie jest 1 - tylko test)
# docker exec -u 1000: Skrypt wykonuje polecenie jako uzytkownik o ID 1000 (Twoje PUID), co zapobiega problemom z uprawnieniami do plikow w /app/storage/logs
docker exec -u 1000 $CONTAINER_NAME php artisan lychee:sync "$IMPORT_PATH" \
--import_via_symlink=1 \
--skip_duplicates=1 \
--delete_missing_photos=1 \
--delete_missing_albums=1 \
--dry_run=0
# Sprawdzenie poprawnosci wykonania synchronizacji
if [ $? -eq 0 ]; then
echo "Synchronizacja zakonczona: Twoja galeria jest teraz identyczna jak folder "moja_galeria" na dysku."
else
echo "Blad: Synchronizacja przerwana. Sprawdz logi w /mnt/sda3/multimedia/docker/lychee/logs"
fi
9. Lychee ma wbudowaną Diagnostykę dostępną w GUI. Czego efektem jest generowanie podsumowania Auto-diagnoza.
Mogą się tam pojawiać komunikaty Info typu small2x i medium – co w skrócie oznacza brakujące miniatury.
Mogło do tego dojść np. w sytuacji gdy została przerwana synchronizacja z naszym katalogiem ze zdjęciami "moja_galeria", np. z powodu reboot itp. Żeby to naprawić zbiorczo wystarczy zrobić.
docker exec -it lychee-api php artisan lychee:generate_thumbs small
docker exec -it lychee-api php artisan lychee:generate_thumbs small2x
docker exec -it lychee-api php artisan lychee:generate_thumbs medium
docker exec -it lychee-api php artisan lychee:encode_placeholders
Lub wersja okrojona (szybsza?), ale może nie być skuteczna, np.
docker exec -it lychee-api php artisan lychee:generate_thumbs small 1
docker exec -it lychee-api php artisan lychee:generate_thumbs small2x 1
docker exec -it lychee-api php artisan lychee:generate_thumbs medium 1
docker exec -it lychee-api php artisan lychee:encode_placeholders 2
Również można zrobić skrypt, który systematycznie przeprowadzi tego typu konserwację.