diff --git a/apps/librephotos/config.json b/apps/librephotos/config.json new file mode 100644 index 00000000..6737ca50 --- /dev/null +++ b/apps/librephotos/config.json @@ -0,0 +1,49 @@ +{ + "$schema": "../schema.json", + "name": "LibrePhotos", + "port": 8132, + "available": true, + "exposable": true, + "id": "librephotos", + "tipi_version": 1, + "version": "2022w36", + "categories": ["photography"], + "description": "", + "short_desc": "", + "author": "Niaz Faridani-Rad", + "source": "https://github.com/LibrePhotos/librephotos", + "form_fields": [ + { + "type": "email", + "label": "LibrePhotos admin email", + "required": true, + "env_variable": "LIBREPHOTOS_EMAIL" + }, + { + "type": "text", + "label": "LibrePhotos admin username", + "max": 50, + "min": 3, + "required": true, + "env_variable": "LIBREPHOTOS_USERNAME" + }, + { + "type": "password", + "label": "LibrePhotos admin password", + "max": 50, + "min": 8, + "required": true, + "env_variable": "LIBREPHOTOS_PASSWORD" + }, + { + "type": "random", + "label": "DB password", + "env_variable": "LIBREPHOTOS_DB_PASSWORD" + }, + { + "type": "random", + "label": "Secret key", + "env_variable": "LIBREPHOTOS_SECRET_KEY" + } + ] +} diff --git a/apps/librephotos/data/cache/.gitkeep b/apps/librephotos/data/cache/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/apps/librephotos/data/db/.gitkeep b/apps/librephotos/data/db/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/apps/librephotos/data/logs/.gitkeep b/apps/librephotos/data/logs/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/apps/librephotos/data/protected_media/.gitkeep b/apps/librephotos/data/protected_media/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/apps/librephotos/data/proxy/nginx.conf b/apps/librephotos/data/proxy/nginx.conf new file mode 100644 index 00000000..e324b37b --- /dev/null +++ b/apps/librephotos/data/proxy/nginx.conf @@ -0,0 +1,62 @@ +user nginx; +worker_processes 1; + +error_log /var/log/nginx/error.log debug; + +events { + worker_connections 1024; +} + +http { + server { + listen 80; + + location / { + # React routes are entirely on the App side in the web broswer + # Always proxy to root with the same page request when nginx 404s + error_page 404 /; + proxy_intercept_errors on; + proxy_set_header Host $host; + proxy_pass http://librephotos-frontend:3000/; + } + location ~ ^/(api|media)/ { + proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header Host librephotos-backend; + include uwsgi_params; + proxy_pass http://librephotos-backend:8001; + } + # needed for webpack-dev-server + location /ws { + proxy_pass http://librephotos-frontend:3000; + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection "upgrade"; + } + # Django media + location /protected_media { + internal; + alias /protected_media/; + } + + location /static/drf-yasg { + proxy_pass http://librephotos-backend:8001; + } + + location /data { + internal; + alias /data/; + } + + # Original Photos + location /original { + internal; + alias /data/; + } + # Nextcloud Original Photos + location /nextcloud_original { + internal; + alias /data/nextcloud_media/; + } + } +} \ No newline at end of file diff --git a/apps/librephotos/data/scan/.gitkeep b/apps/librephotos/data/scan/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/apps/librephotos/docker-compose.yml b/apps/librephotos/docker-compose.yml new file mode 100644 index 00000000..7814beb2 --- /dev/null +++ b/apps/librephotos/docker-compose.yml @@ -0,0 +1,86 @@ +version: "3.7" +services: + librephotos: + image: reallibrephotos/librephotos-proxy:2022w36 + container_name: librephotos + restart: unless-stopped + volumes: + - ${APP_DATA_DIR}/data/scan:/data + - ${APP_DATA_DIR}/data/protected_media:/protected_media + - ${APP_DATA_DIR}/data/proxy/nginx.conf:/etc/nginx/nginx.conf:ro + ports: + - ${APP_PORT}:80 + depends_on: + - librephotos-backend + - librephotos-frontend + networks: + - tipi_main_network + + librephotos-db: + image: postgres:14 + container_name: librephotos-db + restart: unless-stopped + environment: + POSTGRES_PASSWORD: ${LIBREPHOTOS_DB_PASSWORD} + POSTGRES_USER: tipi + POSTGRES_DB: librephotos + volumes: + - ${APP_DATA_DIR}/data/db:/var/lib/postgresql/data + command: postgres -c fsync=off -c synchronous_commit=off -c full_page_writes=off -c random_page_cost=1.0 + #Checking health of Postgres db + healthcheck: + # test: psql -U tipi -d librephotos -c "SELECT 1;" + test: ["CMD-SHELL", "pg_isready -U $$POSTGRES_USER -d $$POSTGRES_DB"] + interval: 5s + timeout: 5s + retries: 5 + networks: + - tipi_main_network + + librephotos-frontend: + image: reallibrephotos/librephotos-frontend:2022w36 + container_name: librephotos-frontend + restart: unless-stopped + depends_on: + - librephotos-backend + networks: + - tipi_main_network + + librephotos-backend: + image: reallibrephotos/librephotos:2022w36 + container_name: librephotos-backend + restart: unless-stopped + volumes: + - ${APP_DATA_DIR}/data/scan:/data + - ${APP_DATA_DIR}/data/protected_media:/protected_media + - ${APP_DATA_DIR}/data/logs:/logs + - ${APP_DATA_DIR}/data/cache:/root/.cache + environment: + - SECRET_KEY=${LIBREPHOTOS_SECRET_KEY} + - BACKEND_HOST=librephotos-backend + - ADMIN_EMAIL=${LIBREPHOTOS_EMAIL} + - ADMIN_USERNAME=${LIBREPHOTOS_USERNAME} + - ADMIN_PASSWORD=${LIBREPHOTOS_PASSWORD} + - DB_BACKEND=postgresql + - DB_NAME=librephotos + - DB_USER=tipi + - DB_PASS=${LIBREPHOTOS_DB_PASSWORD} + - DB_HOST=librephotos-db + - DB_PORT=5432 + - REDIS_HOST=librephotos-redis + - REDIS_PORT=6379 + - ALLOW_UPLOAD=true + - DEBUG=0 + # Wait for Postgres + depends_on: + librephotos-db: + condition: service_healthy + networks: + - tipi_main_network + + librephotos-redis: + image: redis:6 + container_name: librephotos-redis + restart: unless-stopped + networks: + - tipi_main_network \ No newline at end of file diff --git a/apps/librephotos/metadata/description.md b/apps/librephotos/metadata/description.md new file mode 100644 index 00000000..3ca6df28 --- /dev/null +++ b/apps/librephotos/metadata/description.md @@ -0,0 +1,24 @@ +- The [demo is available here](https://demo2.librephotos.com/). User is ```demo```, password is ```demo1234```. +- You can watch development videos on [Niaz Faridani-Rad's channel](https://www.youtube.com/channel/UCZJ2pk2BPKxwbuCV9LWDR0w) +- You can join our [Discord](https://discord.gg/xwRvtSDGWb). + +![](https://github.com/LibrePhotos/librephotos/blob/dev/screenshots/mockups_main_fhd.png?raw=true) +Mockup designed by rawpixel.com / Freepik + +## Installation + +Step-by-step installation instructions are available in our [documentation](https://docs.librephotos.com/1/) + +## Features + + - Support for all types of photos including raw photos + - Support for videos + - Timeline view + - Scans pictures on the file system + - Multiuser support + - Generate albums based on events like "Thursday in Berlin" + - Face recognition / Face classification + - Reverse geocoding + - Object / Scene detection + - Semantic image search + - Search by metadata \ No newline at end of file diff --git a/apps/librephotos/metadata/logo.jpg b/apps/librephotos/metadata/logo.jpg new file mode 100644 index 00000000..6744a658 Binary files /dev/null and b/apps/librephotos/metadata/logo.jpg differ