- Add category filters with dynamic counts that reduce as filters applied - Add ?filter[category]=value URL params for filterable links - Add ?img= timestamp param that bypasses filters to show specific image - Update URL when opening/navigating/closing modal for shareable links - Backend: add /api/portfolio/filters endpoint with filter logic - Backend: add timestamp lookup fallback for GetImage endpoint Frontend: - Portfolio page: filter dropdowns, keyboard nav, mobile improvements - ImageUpload: live tag suggestions from API, arrow/Tab navigation, confirmation modal before upload, mobile-optimized touch targets - Add scrollbar-hide utility and fix filter dropdown overflow - Move Clear all button, add vertical separator on desktop
100 lines
2.4 KiB
YAML
100 lines
2.4 KiB
YAML
services:
|
|
postgres:
|
|
image: postgres:17
|
|
container_name: postgres
|
|
restart: always
|
|
environment:
|
|
POSTGRES_USER: ${POSTGRES_USER}
|
|
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
|
|
POSTGRES_DB: ${POSTGRES_DB}
|
|
ports:
|
|
- "5432:5432" # locally, do not push to prod
|
|
volumes:
|
|
- pgdata:/var/lib/postgresql/data
|
|
- ./init-scripts/init-script.sql:/docker-entrypoint-initdb.d/init-script.sql:ro
|
|
networks:
|
|
- appnet
|
|
|
|
backend:
|
|
build:
|
|
context: ./backend
|
|
dockerfile: Dockerfile
|
|
container_name: backend
|
|
restart: always
|
|
env_file:
|
|
- ./backend/.env
|
|
volumes:
|
|
- ./backend/bin:/app/bin # Mount your compiled binary
|
|
depends_on:
|
|
- postgres
|
|
networks:
|
|
- appnet
|
|
|
|
sabredav:
|
|
image: php:8.2-fpm
|
|
container_name: sabredav
|
|
restart: always
|
|
working_dir: /var/www/dav
|
|
environment:
|
|
POSTGRES_HOST: postgres
|
|
POSTGRES_PORT: 5432
|
|
POSTGRES_DB: ${POSTGRES_DB}
|
|
POSTGRES_USER: ${POSTGRES_USER}
|
|
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
|
|
volumes:
|
|
- ./sabredav:/var/www/dav
|
|
depends_on:
|
|
- postgres
|
|
networks:
|
|
- appnet
|
|
command: >
|
|
bash -c " apt-get update && apt-get install -y git unzip libzip-dev libpq-dev && docker-php-ext-install pdo pdo_pgsql zip && curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer && if [ ! -f /var/www/dav/vendor/autoload.php ]; then
|
|
cd /var/www/dav && composer install --no-dev --optimize-autoloader;
|
|
fi && php-fpm "
|
|
|
|
nginx:
|
|
image: nginx:stable
|
|
container_name: nginx
|
|
restart: always
|
|
ports:
|
|
- "80:80"
|
|
- "443:443"
|
|
- "9000:9000" # Rustfs S3 API
|
|
volumes:
|
|
- ./nginx/conf.d:/etc/nginx/conf.d
|
|
- ./nginx/certs:/etc/nginx/certs
|
|
- ./frontend/build:/usr/share/nginx/html # Serve frontend
|
|
- ./sabredav:/var/www/dav
|
|
- rustfs_data:/data
|
|
depends_on:
|
|
- backend
|
|
- sabredav
|
|
networks:
|
|
- appnet
|
|
|
|
rustfs:
|
|
image: rustfs/rustfs:latest
|
|
container_name: rustfs
|
|
restart: always
|
|
ports:
|
|
- "9000:9000"
|
|
- "9001:9001"
|
|
environment:
|
|
- RUSTFS_ADMIN_ACCESS_KEY=rustfsadmin
|
|
- RUSTFS_ADMIN_SECRET_KEY=rustfsadmin
|
|
- RUSTFS_ACCESS_KEY=rustfsadmin
|
|
- RUSTFS_SECRET_KEY=rustfsadmin
|
|
- RUSTFS_BUCKET=crussell
|
|
volumes:
|
|
- rustfs_data:/data
|
|
networks:
|
|
- appnet
|
|
|
|
volumes:
|
|
pgdata:
|
|
rustfs_data:
|
|
|
|
|
|
networks:
|
|
appnet:
|