diff --git a/Dockerfile b/Dockerfile index b6acaf1..dc6514d 100644 --- a/Dockerfile +++ b/Dockerfile @@ -11,19 +11,4 @@ RUN install-php-extensions \ zip \ opcache -#RUN apk add --no-cache \ -# php84-opcache \ -# php84-pdo_mysql \ -# php84-simplexml -# -#USER nobody -# -#COPY --chmod=0775 ./bash/entrypoint.sh /usr/local/bin/ -#COPY --chmod=0755 ./bash/nginx.conf /etc/nginx/conf.d/site.conf -#COPY --chmod=0755 ./docker/app/supervisord.conf /etc/supervisor/conf.d/async-queue.conf HEALTHCHECK --interval=3s --timeout=3s --retries=10 CMD [ "php", "/app/bin/console", "startup:status" ] -# -#ENTRYPOINT [ "/usr/local/bin/entrypoint.sh" ] -# -#WORKDIR /var/www - diff --git a/bash/entrypoint.sh b/bash/entrypoint.sh index 6a58091..31c36e4 100644 --- a/bash/entrypoint.sh +++ b/bash/entrypoint.sh @@ -6,7 +6,7 @@ echo "> Sleeping for ${SLEEP_TIME} seconds to wait for the database" sleep $SLEEP_TIME # Provision database -php /var/www/bin/console doctrine:migrations:migrate --no-interaction -php /var/www/bin/console db:seed +php /app/bin/console doctrine:migrations:migrate --no-interaction +php /app/bin/console db:seed -/usr/bin/supervisord -c /etc/supervisor/conf.d/supervisord.conf +exec docker-php-entrypoint "$@" diff --git a/deploy.compose.yml b/deploy.compose.yml index 71fb560..f1c97a5 100755 --- a/deploy.compose.yml +++ b/deploy.compose.yml @@ -1,38 +1,41 @@ services: - web: - image: code.caldwell.digital/home/torsearch/web:latest + app: + image: registry.caldwell.digital/home/torsearch-app:latest ports: - '8001:80' - volumes: - - $PWD/bash/nginx.conf:/etc/nginx/conf.d/default.conf - depends_on: - app: - condition: service_healthy - - app: - image: code.caldwell.digital/home/torsearch/app:${TAG} deploy: replicas: 2 + depends_on: + - database + worker: - image: code.caldwell.digital/home/torsearch/app:${TAG} + image: registry.caldwell.digital/home/torsearch-worker:latest volumes: - - /mnt/media/downloads:/var/download - command: php ./bin/console messenger:consume async -v --time-limit=3600 --limit=10 + - /mnt/media/downloads/movies:/var/download/movies + - /mnt/media/downloads/tvshows:/var/download/tvshows + restart: always + command: -vv deploy: - replicas: 2 + replicas: 4 + depends_on: + - app + scheduler: - image: code.caldwell.digital/home/torsearch/app:${TAG} + image: registry.caldwell.digital/home/torsearch-scheduler:latest volumes: - - /mnt/media/downloads:/var/download - command: php ./bin/console messenger:consume scheduler_monitor -vv --time-limit=3600 + - ./downloads:/var/download + restart: always + depends_on: + - app + mercure: image: dunglas/mercure restart: unless-stopped ports: - - "3000:80" + - "3001:80" environment: SERVER_NAME: ':80' MERCURE_PUBLISHER_JWT_KEY: '!ChangeThisMercureHubJWTSecretKey!' @@ -45,6 +48,34 @@ services: - mercure_data:/data - mercure_config:/config + + database: + image: mariadb:10.11.2 + volumes: + - mysql:/var/lib/mysql + environment: + MYSQL_DATABASE: app + MYSQL_USERNAME: app + MYSQL_PASSWORD: password + MYSQL_ROOT_PASSWORD: password + healthcheck: + test: [ "CMD", "mysqladmin" ,"ping", "-h", "localhost" ] + interval: 5s + timeout: 5s + retries: 10 + + + redis: + image: redis:latest + volumes: + - redis_data:/data + command: redis-server --maxmemory 512MB + restart: unless-stopped + + volumes: + mysql: mercure_config: mercure_data: + redis_data: + diff --git a/docker/Dockerfile.app b/docker/Dockerfile.app index 5598f31..583e340 100644 --- a/docker/Dockerfile.app +++ b/docker/Dockerfile.app @@ -1,6 +1,6 @@ FROM dunglas/frankenphp -ENV FRANKENPHP_CONFIG="worker /app/public/index.php" +ENV FRANKENPHP_CONFIG="worker /app/public/index.php 20" ENV SERVER_NAME=":80" ENV CADDY_GLOBAL_OPTIONS="auto_https off" ENV APP_RUNTIME="Runtime\\FrankenPhpSymfony\\Runtime" @@ -13,5 +13,10 @@ RUN install-php-extensions \ opcache COPY . /app +COPY --chmod=775 ./bash/entrypoint.sh /usr/local/bin/docker-entrypoint + +ENTRYPOINT [ "/usr/local/bin/docker-entrypoint" ] + +CMD [ "frankenphp", "run", "--config", "/etc/caddy/Caddyfile" ] HEALTHCHECK --interval=3s --timeout=3s --retries=10 CMD [ "php", "/app/bin/console", "startup:status" ] diff --git a/docker/Dockerfile.scheduler b/docker/Dockerfile.scheduler index eaaf26e..16728f6 100644 --- a/docker/Dockerfile.scheduler +++ b/docker/Dockerfile.scheduler @@ -13,4 +13,4 @@ RUN install-php-extensions \ COPY . /app -ENTRYPOINT [ "php", "/app/bin/console", "messenger:consume", "schedule_monitor", "-vv" ] +ENTRYPOINT [ "php", "/app/bin/console", "messenger:consume", "schedule_monitor" ] diff --git a/docker/Dockerfile.worker b/docker/Dockerfile.worker index 89788ab..7869b10 100644 --- a/docker/Dockerfile.worker +++ b/docker/Dockerfile.worker @@ -1,4 +1,4 @@ -FROM dunglas/frankenphp +FROM dunglas/frankenphp:php8.4-alpine ENV SERVER_NAME=":80" ENV CADDY_GLOBAL_OPTIONS="auto_https off" @@ -9,8 +9,10 @@ RUN install-php-extensions \ gd \ intl \ zip \ - opcache \ + opcache COPY . /app -ENTRYPOINT [ "php", "/app/bin/console", "messenger:consume", "async", "-vv" ] +ENTRYPOINT [ "php", "/app/bin/console", "messenger:consume", "async" ] + +HEALTHCHECK --interval=3s --timeout=3s --retries=10 CMD return 0 diff --git a/docs/examples/.env b/docs/examples/.env index 6049a7c..31de7de 100644 --- a/docs/examples/.env +++ b/docs/examples/.env @@ -19,13 +19,17 @@ DATABASE_URL="mysql://root:password@database:3306/app?serverVersion=10.6.19.2-Ma # This key is never saved anywhere # else and is passed to Torrentio # to retrieve download options -REAL_DEBRID_KEY="" +#REAL_DEBRID_KEY="" # Enter you TMDB API key # This is used to provide rich search results # when searching for media and rendering the # Popular Movies and TV Shows section. -TMDB_API= +#TMDB_API= + +REAL_DEBRID_KEY="QYYBR7OSQ4VEFKWASDEZ2B4VO67KHUJY6IWOT7HHA7ATXO7QCYDQ" +TMDB_API=eyJhbGciOiJIUzI1NiJ9.eyJhdWQiOiI0ZTJjYjJhOGUzOGJhNjdiNjVhOGU1NGM0ZWI1MzhmOCIsIm5iZiI6MTczNzkyNjA0NC41NjQsInN1YiI6IjY3OTZhNTljYzdiMDFiNzJjNzIzZWM5YiIsInNjb3BlcyI6WyJhcGlfcmVhZCJdLCJ2ZXJzaW9uIjoxfQ.e8DbNe9qrSBC1y-ANRv-VWBAtls-ZS2r7aNCiI68mpw + MERCURE_JWT_SECRET="!ChangeThisMercureHubJWTSecretKey!" diff --git a/docs/examples/compose.yml b/docs/examples/compose.yml index 7f80f53..4bd8d11 100644 --- a/docs/examples/compose.yml +++ b/docs/examples/compose.yml @@ -27,7 +27,7 @@ services: volumes: - /mnt/media/downloads/movies:/var/download/movies - /mnt/media/downloads/tvshows:/var/download/tvshows - command: --time-limit=3600 --limit=10 + command: -vvv env_file: - .env restart: always diff --git a/docs/examples/swarm.compose.yml b/docs/examples/swarm.compose.yml new file mode 100644 index 0000000..1d6da94 --- /dev/null +++ b/docs/examples/swarm.compose.yml @@ -0,0 +1,115 @@ +services: + # The "entrypoint" into the application. This reverse proxy + # proxies traffic back to their respective services. If not + # running behind a reverse proxy inject your SSL certificates + # into this container. + # This container runs the actual web app in a php:8.4-fpm + # base container. + app: + image: code.caldwell.digital/home/torsearch-app:latest + ports: + - '8006:80' + configs: + - env_file + deploy: + replicas: 2 + depends_on: + - database + + # Downloads happen in this container. Replicate this + # container to run multiple downloads simultaneously. + # Map your "movies" folder to /var/download/movies + # Map your "TV shows" folder to /var/download/tvshows + # If your folders are on another machine, use an NFS volume. + # This container runs a Symfony worker process. + # See: https://symfony.com/doc/current/messenger.html + worker: + image: code.caldwell.digital/home/torsearch-worker:latest + configs: + - source: env_file + target: /app/bin/.env.local + volumes: + - /mnt/media/downloads/movies:/var/download/movies + - /mnt/media/downloads/tvshows:/var/download/tvshows + restart: always + command: -vv + deploy: + replicas: 4 + depends_on: + - app + + # This container handles the monitoring for new media. When new + # monitors are added, jobs are periodically dispatched to this + # container, and the desired media is searched for and downloaded. + # This container runs a Symfony worker process. + # See: https://symfony.com/doc/current/messenger.html + scheduler: + image: code.caldwell.digital/home/torsearch-scheduler:latest + configs: + - env_file + volumes: + - ./downloads:/var/download + restart: always + depends_on: + - app + + # This container facilitates viewing the progress of downloads + # in realtime. It also handles sending alerts and notifications. + # The MERCURE_PUBLISHER_JWT key & MERCURE_SUBSCRIBER_JWT_KEY should + # match the MERCURE_JWT_SECRET environment variable. + mercure: + image: dunglas/mercure + restart: unless-stopped + ports: + - "3001:80" + environment: + SERVER_NAME: ':80' + MERCURE_PUBLISHER_JWT_KEY: '!ChangeThisMercureHubJWTSecretKey!' + MERCURE_SUBSCRIBER_JWT_KEY: '!ChangeThisMercureHubJWTSecretKey!' + MERCURE_EXTRA_DIRECTIVES: | + cors_origins * + anonymous + command: /usr/bin/caddy run --config /etc/caddy/dev.Caddyfile + volumes: + - mercure_data:/data + - mercure_config:/config + + database: + image: mariadb:10.11.2 + volumes: + - mysql:/var/lib/mysql + environment: + MYSQL_DATABASE: app + MYSQL_USERNAME: app + MYSQL_PASSWORD: password + MYSQL_ROOT_PASSWORD: password + healthcheck: + test: [ "CMD", "mysqladmin" ,"ping", "-h", "localhost" ] + interval: 5s + timeout: 5s + retries: 10 + + redis: + image: redis:latest + volumes: + - redis_data:/data + command: redis-server --maxmemory 512MB + restart: unless-stopped + + # **Optional** + # Provides a simple method of viewing the database + adminer: + image: adminer + ports: + - "8081:8080" + +volumes: + mysql: + mercure_config: + mercure_data: + redis_data: + +configs: + env_file: + file: $PWD/.env +