76

Odp: Docker w OpenWrt

Dzięki Cezary, jak zwykle miałeś rację smile
Zmyliło mnie to, że po podmianie katalogu root dockera z /opt/docker na podkatalog na zamontowanym dysku nvme, zniknęły podstrony w menu luci-app-dockerman. Ale jak widać problem jest znany: https://github.com/openwrt/luci/issues/6885

77

Odp: Docker w OpenWrt

I tak jak dojdziesz do wprawy to tylko konsola , a jeżeli chcesz bardziej zaawansowane ustawienia to tylko docker compose  - he i  dalej konsola , ale tym razem plik  .yml

78

Odp: Docker w OpenWrt

krynio napisał/a:

Nie przepadam się za luci. Aczkolwiek ten dodatek dockerman wydaje się sporym ułatwieniem.
Mam czyste openwrt i easyconfig który uwielbiam. Pytanie czy nie mając luci jestem w stanie uruchomić sam dockerman.

polecam to:

https://github.com/portainer/portainer

79

Odp: Docker w OpenWrt

Czy jak się robi reboot, to dockerd się ładnie zamyka wcześniej, czy ubija po prostu proces?

80

Odp: Docker w OpenWrt

Jak jest z dockerem na openwrt pod kątem optymalizacji i nie ubijania flasha?
Czy domyślnie idzie to w kierunku tmpfs czy też lepiej zadbać o zewnętrzny nośnik już na starcie?

81

Odp: Docker w OpenWrt

Zewnętrzny. Jakoś specjalnie nie jest optymalizowane.

Masz niepotrzebny router, uszkodzony czy nie - chętnie przygarnę go.

82

Odp: Docker w OpenWrt

Cezary. W artykule Perfekcyjny router podróżny wspominasz o Immich - galeria zdjęć. Używasz?.
Poszukuję galerii zdjęć na docker, która spełnia pewne założenia.
1. Możliwość wskazania katalogu ze zdjęciami.
2. Udostępnianie publiczne z autoryzacją = hasło.
3. Możliwość dodawania opisów do zdjęć, najlepiej pod zdjęciem.
W weekend testowałem kilka galerii. Najbliżej mi do PhotoPrism. Jednak w nowej wersji nie ma możliwości udostępnienia publicznego z autoryzacją. Niby można to obejść w nginx proxy manager, ale mam z tym problem.
Trafiłem na opis Lychee, test w krótce.

TP-Link TL-WDR4300 Mod, CPU 700MHz, Flash 16 MB, Gargoyle 1.5.11.4, extroot + dysk zewnętrzny Samsung (S2), kamerka MS LifeCam HD-5000
TP-Link TL-WR1043ND Mod, RAM 64 MB, chłodzenie pasywne, Gargoyle 1.5.10.14, extroot, kamerka Logitech HD Webcam C270

83

Odp: Docker w OpenWrt

Uruchom sobie w dockerze to i zobaczysz czy ci pasuje.

1. W composerze się podaje
2. tak jest, zarówno zdjęcia jak i albumy
3. Tak, ale opis widać dopiero jak wyświetlisz szczegóły zdjęcia.

Masz niepotrzebny router, uszkodzony czy nie - chętnie przygarnę go.

84 (edytowany przez krynio 2026-02-04 18:30:18)

Odp: Docker w OpenWrt

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ę.

TP-Link TL-WDR4300 Mod, CPU 700MHz, Flash 16 MB, Gargoyle 1.5.11.4, extroot + dysk zewnętrzny Samsung (S2), kamerka MS LifeCam HD-5000
TP-Link TL-WR1043ND Mod, RAM 64 MB, chłodzenie pasywne, Gargoyle 1.5.10.14, extroot, kamerka Logitech HD Webcam C270

85 (edytowany przez krynio 2026-02-01 11:21:22)

Odp: Docker w OpenWrt

Galeria zdjęć PhotoPrism.

Live demo https://demo.photoprism.app/library/browse 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.

PhotoPrism to już taki kombajn. Wizualnie przyjazny. Ale nie ma kluczowej dla mnie funkcji udostępniania na hasło.
Jest możliwość zrobienia opisów pod zdjęciem oraz z boku. Domyślnie opis jest z boku, ale jak się schowa panel boczny to opis wyświetla się pod zdjęciem. Natomiast oferuje linki z terminem działania. Filmy mov tu też nie działają, natomiast avi jakiś przypadkowy działał.

Wersja z optymalizacją pod mini pc Intel Celeron N3160, 8 GB RAM, dysk SSD.

services:
  mariadb:
    image: mariadb:11
    container_name: photoprism-mariadb
    restart: unless-stopped
    stop_grace_period: 15s
    security_opt:
      - seccomp:unconfined
      - apparmor:unconfined
    # ========================
    # Zmienne srodowiskowe MariaDB
    # ========================
    environment:
      MARIADB_DATABASE: "photoprism"                 # Nazwa bazy danych PhotoPrism
      MARIADB_ROOT_PASSWORD: "haslo"                 # Twoje haslo root do bazy danych
      MARIADB_USER: "photoprism"                     # Uzytkownik bazy dla PhotoPrism
      MARIADB_PASSWORD: "haslo"                      # Haslo uzytkownika bazy
      MARIADB_AUTO_UPGRADE: "1"                      # Automatyczna aktualizacja bazy przy starcie
      MARIADB_INITDB_SKIP_TZINFO: "1"                # Pomija import stref czasowych przy inicjalizacji
    # ========================
    # Optymalizacja MariaDB dla OpenWrt i 8GB RAM
    # ========================
    command: >
      --innodb-buffer-pool-size=512M
      --transaction-isolation=READ-COMMITTED
      --character-set-server=utf8mb4
      --collation-server=utf8mb4_unicode_ci
      --max-connections=512
      --innodb-rollback-on-timeout=OFF
      --innodb-lock-wait-timeout=120
    # ========================
    # Volume z danymi MariaDB
    # ========================
    volumes:
      - "/mnt/sda3/multimedia/docker/photoprism/database:/var/lib/mysql"

  photoprism:
    image: photoprism/photoprism:latest
    container_name: photoprism
    restart: unless-stopped
    stop_grace_period: 15s
    depends_on:
      - mariadb
    security_opt:
      - seccomp:unconfined
      - apparmor:unconfined
    ports:
      - "2342:2342"
    working_dir: "/photoprism"
    # ========================
    # Zmienne srodowiskowe PhotoPrism
    # ========================
    environment:
      # Polaczenie do bazy danych
      PHOTOPRISM_DATABASE_DRIVER: mysql
      PHOTOPRISM_DATABASE_SERVER: mariadb:3306
      PHOTOPRISM_DATABASE_NAME: photoprism
      PHOTOPRISM_DATABASE_USER: photoprism
      PHOTOPRISM_DATABASE_PASSWORD: "haslo"

      # Konto administratora PhotoPrism
      PHOTOPRISM_ADMIN_USER: admin
      PHOTOPRISM_ADMIN_PASSWORD: "admin"

      # URL dostepu do PhotoPrism
      PHOTOPRISM_SITE_URL: "http://twoja_domena:2342/"

      # Stabilnosc i konfiguracja dla OpenWrt
      PHOTOPRISM_DISABLE_CHOWN: "true"       # Nie zmienia uprawnien plikow
      PHOTOPRISM_HTTP_COMPRESSION: "gzip"    # Kompresja HTTP
      PHOTOPRISM_LOG_LEVEL: "info"           # Poziom logow

      # Wydajnosc dla 8GB RAM
      PHOTOPRISM_WORKERS: 2
      PHOTOPRISM_INDEX_WORKERS: 2
      PHOTOPRISM_THUMB_WORKERS: 2

      # AI calkowicie wylaczone
      PHOTOPRISM_DISABLE_TENSORFLOW: "true"
      PHOTOPRISM_DISABLE_FACES: "true"
      PHOTOPRISM_DISABLE_CLASSIFICATION: "true"
      PHOTOPRISM_DISABLE_VECTORS: "true"

      # Tryb tylko-odczyt galerii. Wylaczylem to.
    # PHOTOPRISM_READONLY: "true"

      # ========================
      # Automatyczne indeksowanie
      # ========================
      PHOTOPRISM_INDEX_SCHEDULE: "0 3 * * 0"  # Automatyczne skanowanie w kazda niedziele, o 03:00 w nocy
    
    # ========================
    # Volumes PhotoPrism
    # ========================
    volumes:
      - "/mnt/sda3/multimedia/galeria:/photoprism/originals:ro"  # Galeria tylko do odczytu
      - "/mnt/sda3/multimedia/docker/photoprism/storage:/photoprism/storage" # Storage do miniatur, cache i bazy PhotoPrism
TP-Link TL-WDR4300 Mod, CPU 700MHz, Flash 16 MB, Gargoyle 1.5.11.4, extroot + dysk zewnętrzny Samsung (S2), kamerka MS LifeCam HD-5000
TP-Link TL-WR1043ND Mod, RAM 64 MB, chłodzenie pasywne, Gargoyle 1.5.10.14, extroot, kamerka Logitech HD Webcam C270

86

Odp: Docker w OpenWrt

Po upgradzie routera do 25.12 mam dziwny problem z dockerem:

[11 lut 2026, 18:25:56 CET] daemon.err: modprobe: failed to find a module named aufs
[11 lut 2026, 18:25:57 CET] daemon.err: dockerd[14392]: time="2026-02-11T17:25:57.951131216Z" level=warning msg="Could not load necessary modules for IPSEC rules: protocol not supported"
[11 lut 2026, 18:25:57 CET] daemon.info: modprobe: nf_conntrack is already loaded
[11 lut 2026, 18:25:58 CET] daemon.info: modprobe: nf_conntrack_netlink is already loaded
[11 lut 2026, 18:25:58 CET] daemon.err: dockerd[14392]: time="2026-02-11T17:25:58.194081424Z" level=warning msg="could not create bridge network for id c44f778fac9e1e7df3e5368ffd1df481e33509c3cc01e460c6044f35f7a85c8b bridge name docker0 while booting up from persistent state: Failed to Setup IP tables: Unable to enable NAT rule:  (iptables failed: iptables --wait -t nat -I POSTROUTING -s 172.17.0.0/16 ! -o docker0 -j MASQUERADE: iptables v1.8.10 (nf_tables):  CHAIN_ADD failed (No such file or directory): chain POSTROUTING\n (exit status 4))"
[11 lut 2026, 18:25:59 CET] daemon.err: dockerd[14392]: failed to start daemon: Error initializing network controller: error creating default "bridge" network: Failed to Setup IP tables: Unable to enable NAT rule:  (iptables failed: iptables --wait -t nat -I POSTROUTING -s 172.17.0.0/16 ! -o docker0 -j MASQUERADE: iptables v1.8.10 (nf_tables):  CHAIN_ADD failed (No such file or directory): chain POSTROUTING
[11 lut 2026, 18:25:59 CET] daemon.err: dockerd[14392]:  (exit status 4))

Demon dockera nie chce się uruchomić i wyrzuca powyższy błąd, może ktoś z forumowiczów będzie wiedział w czym rzecz?

87

Odp: Docker w OpenWrt

Czy masz zainstalowany iptables-nft? Uzywasz firewall4?

Masz niepotrzebny router, uszkodzony czy nie - chętnie przygarnę go.

88

Odp: Docker w OpenWrt

Mam zainstalowane iptables-nft i nie używam firewall4....

89

Odp: Docker w OpenWrt

Problem poniekąd rozwiązany: odinstalowałem Dockera, zainstalowałem Podmana, obydwa kontenery z których korzystam na BPI-R4 działają bez pudła smile Chyba brakuje tylko coś pod Luci dla Podmana, dla wersji 25.12...

90

Odp: Docker w OpenWrt

jaketherake napisał/a:

Chyba brakuje tylko coś pod Luci dla Podmana, dla wersji 25.12...

https://github.com/Zerogiven-OpenWRT-Pa … app-podman

Używasz moich pakietów/obrazów z github?
Chcesz abym dalej je rozwijał i tworzył nowe?
Postaw kawę

91

Odp: Docker w OpenWrt

Nie mają jeszcze pakietu dla apk...

92

Odp: Docker w OpenWrt

Dopóki to nie jest binarka to możesz skopiować wszystko w odpowiednie katalogi

Masz niepotrzebny router, uszkodzony czy nie - chętnie przygarnę go.

93

Odp: Docker w OpenWrt

Mam problem z Dockerem na openwrt.

A problem polega na tym, ze docker traci sieć, gdyż zmienia się nazwa interfejsu vethxxxxx i interfejs wylatuje z bridge dockera.

Pojawia sie wpis w logu kernela

[  283.210379] eth0: renamed from veth034e4e5
[  283.290956] eth0: renamed from veth5656f60

i w bridge docker urzadzenie veth staje się absent device, a nowe się nie dodają.

I po jakimś czasie docker i kontenery tracą sieć.

Trzeba zaktualizowac bridge o nowe interfejsy i zrestartować serwis dockerd i kontenery.

I działa to jakiś czas, tylko znowu zmienia się nazwa urzadzenia veth i w kółko to samo.

Co ciekawe, problem jest na Zyxel EX5601-T0 ubootmod, a na innym urządzeniu czyli Bananapi BPI-R2 nie ma tego problemu.
Na obu urządzeniach build stabilny OpenWrt 25.12.0 r32713-f919e7899d

Jakieś wskazówki lub pomysły co i gdzie drążyć?

94 (edytowany przez ad2014 2026-03-29 09:06:42)

Odp: Docker w OpenWrt

nie  będzie to czasem powiązane ze zmianą nazwy intefejsów  tz. eth0 == wan   i teraz  docker cos tego nie "trybi"  , albo  gdzies to trzeba zmienić ,  warto  też zajrzeć do firewala  jak tam wygladaja reguły

95

Odp: Docker w OpenWrt

krynio  napisał/a:

Poszukuję galerii zdjęć na docker, która spełnia pewne założenia.
1. Możliwość wskazania katalogu ze zdjęciami.
2. Udostępnianie publiczne z autoryzacją = hasło.
3. Możliwość dodawania opisów do zdjęć, najlepiej pod zdjęciem.
W weekend testowałem kilka galerii. Najbliżej mi do PhotoPrism. Jednak w nowej wersji nie ma możliwości udostępnienia publicznego z autoryzacją. Niby można to obejść w nginx proxy manager, ale mam z tym problem.
Trafiłem na opis Lychee, test w krótce.

Ja proponuje   FileBrowser Quantum    = moze wydawać sie  "inna" niż wszystkie  ale  jest szybka i prosta bez zbędnych bajerów

96

Odp: Docker w OpenWrt

ad2014 napisał/a:

nie  będzie to czasem powiązane ze zmianą nazwy intefejsów  tz. eth0 == wan   i teraz  docker cos tego nie "trybi"  , albo  gdzies to trzeba zmienić ,  warto  też zajrzeć do firewala  jak tam wygladaja reguły

I tak miało by się to zmieniać samo?

A FW to inna warstwa.

97

Odp: Docker w OpenWrt

Mam takie pytanie, w zeszłym miesiącu zrobiłem sobie w dokerze dwa kontenery jeden Caps połączonym z Avahi dameon(żeby mieć drukowanie AirPrint w iPhone do niewspieranej drukarki Brother) a drugi qbittorent - zrobiłem aktualizacje przez lucynę z zachowaniem configa a tu dzisiaj chcę drukować- drukarki nie ma i kontenerów też…eh. Czy mogę się jakoś zabezpieczyć na przyszłość zanim skonfiguruję to od nowa na przyszłość, czy za każdym updatem zabawa od nowa? Kontenery miałem na dysku usb ssd na jednej z partycji.

Zyxel T56, TP Link Archer C6 v3, Netgear R6220, Raspberry Pi4, ZTE MF286/D

98

Odp: Docker w OpenWrt

sysupgrade zachowuje tylko konfigi. Więc jeżeli robisz takie rzeczy to całość łącznie w dockerem musisz sobie backupować osobno. I także konfigurację w dokerze, storage itd.

Masz niepotrzebny router, uszkodzony czy nie - chętnie przygarnę go.

99 (edytowany przez przemciol 2026-07-10 22:40:27)

Odp: Docker w OpenWrt

Czyli jak sobie do konfiguracji w zakładce backup dopiszę np:
/etc/config/dockerman
/etc/docker/daemon.json
/etc/config/fstab

To mi będzie zachowywać czy za każdym razem muszę o tym pamiętać, czy muszę ręcznie kopiować te pliki?

Zyxel T56, TP Link Archer C6 v3, Netgear R6220, Raspberry Pi4, ZTE MF286/D

100

Odp: Docker w OpenWrt

Te pliki ci zachowa. Ale tylko te, nie całe kontenery

Masz niepotrzebny router, uszkodzony czy nie - chętnie przygarnę go.