Merge pull request #1672 from PyRowMan/dockerfilev2

Add a prod Dockerfile
This commit is contained in:
DariusIII
2024-12-26 21:19:17 +01:00
committed by GitHub
9 changed files with 609 additions and 44 deletions
+3 -2
View File
@@ -2,5 +2,6 @@ vendor/
docker/mariadb-data
docker/redis-data
docker/manticore-data
storage
resources
.env
storage/nzb
storage/covers
+209
View File
@@ -0,0 +1,209 @@
DB_CONNECTION=${DB_CONNECTION}
DB_HOST=${DB_HOST}
DB_PORT=${DB_PORT}
DB_ROOTPASSWORD=${DB_ROOTPASSWORD}
DB_SOCKET=${DB_SOCKET}
DB_USERNAME=${DB_USERNAME}
DB_PASSWORD=${DB_PASSWORD}
DB_DATABASE=${DB_DATABASE}
COMPOSER_AUTH='${COMPOSER_AUTH}'
MANTICORESEARCH_HOST=${MANTICORESEARCH_HOST}
MANTICORESEARCH_PORT=${MANTICORESEARCH_PORT}
ELASTICSEARCH_HOST=${ELASTICSEARCH_HOST}
ELASTICSEARCH_PORT=${ELASTICSEARCH_PORT}
ELASTICSEARCH_SCHEME=${ELASTICSEARCH_SCHEME}
ELASTICSEARCH_USER=${ELASTICSEARCH_USER}
ELASTICSEARCH_PASS=${ELASTICSEARCH_PASS}
ELASTICSEARCH_LOGGING=${ELASTICSEARCH_LOGGING}
ELASTICSEARCH_ENABLED=${ELASTICSEARCH_ENABLED}
NNTP_COMPRESSED_HEADERS=${NNTP_COMPRESSED_HEADERS}
USE_ALTERNATE_NNTP_SERVER=${USE_ALTERNATE_NNTP_SERVER}
NNTP_USERNAME=${NNTP_USERNAME}
NNTP_PASSWORD=${NNTP_PASSWORD}
NNTP_SERVER=${NNTP_SERVER}
NNTP_PORT=${NNTP_PORT}
NNTP_CONNECTIONS=${NNTP_CONNECTIONS}
NNTP_SSLENABLED=${NNTP_SSLENABLED}
NNTP_SOCKET_TIMEOUT=${NNTP_SOCKET_TIMEOUT}
NNTP_USERNAME_A=${NNTP_USERNAME_A}
NNTP_PASSWORD_A=${NNTP_PASSWORD_A}
NNTP_SERVER_A=${NNTP_SERVER_A}
NNTP_PORT_A=${NNTP_PORT_A}
NNTP_CONNECTIONS_A=${NNTP_CONNECTIONS_A}
NNTP_SSLENABLED_A=${NNTP_SSLENABLED_A}
NNTP_SOCKET_TIMEOUT_A=${NNTP_SOCKET_TIMEOUT_A}
NN_MULTIPROCESSING_MAX_CHILD_TIME=${NN_MULTIPROCESSING_MAX_CHILD_TIME}
ADMIN_USER=${ADMIN_USER}
ADMIN_PASS=${ADMIN_PASS}
ADMIN_EMAIL=${ADMIN_EMAIL}
APP_NAME=${APP_NAME}
APP_ENV=${APP_ENV}
APP_DEBUG=${APP_DEBUG}
APP_TIMEZONE=${APP_TIMEZONE}
APP_URL=${APP_URL}
APP_LOCALE=${APP_LOCALE}
APP_FALLBACK_LOCALE=${APP_FALLBACK_LOCALE}
APP_FAKER_LOCALE=${APP_FAKER_LOCALE}
APP_MAINTENANCE_DRIVER=${APP_MAINTENANCE_DRIVER}
APP_MAINTENANCE_STORE=${APP_MAINTENANCE_STORE}
BCRYPT_ROUNDS=${BCRYPT_ROUNDS}
APP_KEY=${APP_KEY}
LOG_CHANNEL=${LOG_CHANNEL}
LOG_STACK=${LOG_STACK}
PASSWORD_HASH=${PASSWORD_HASH}
BROADCAST_CONNECTION=${BROADCAST_CONNECTION}
CACHE_STORE=${CACHE_STORE}
QUEUE_CONNECTION=${QUEUE_CONNECTION}
REDIS_HOST=${REDIS_HOST}
REDIS_PASSWORD=${REDIS_PASSWORD}
REDIS_PORT=${REDIS_PORT}
REDIS_CLIENT=${REDIS_CLIENT}
SESSION_DRIVER=${SESSION_DRIVER}
SESSION_DOMAIN=${SESSION_DOMAIN}
SESSION_SECURE_COOKIE=${SESSION_SECURE_COOKIE}
SESSION_ENCRYPT=${SESSION_ENCRYPT}
SESSION_COOKIE=${SESSION_COOKIE}
SESSION_PATH=${SESSION_PATH}
MAIL_DRIVER=${MAIL_DRIVER}
MAIL_HOST=${MAIL_HOST}
MAIL_PORT=${MAIL_PORT}
MAIL_USERNAME=${MAIL_USERNAME}
MAIL_PASSWORD=${MAIL_PASSWORD}
MAIL_ENCRYPTION=${MAIL_ENCRYPTION}
MAIL_FROM_ADDRESS=${MAIL_FROM_ADDRESS}
MAIL_FROM_NAME=${MAIL_FROM_NAME}
AWS_ACCESS_KEY_ID=${AWS_ACCESS_KEY_ID}
AWS_SECRET_ACCESS_KEY=${AWS_SECRET_ACCESS_KEY}
AWS_DEFAULT_REGION=${AWS_DEFAULT_REGION}
AWS_BUCKET=${AWS_BUCKET}
PUSHER_APP_ID=${PUSHER_APP_ID}
PUSHER_APP_KEY=${PUSHER_APP_KEY}
PUSHER_APP_SECRET=${PUSHER_APP_SECRET}
PUSHER_APP_CLUSTER=${PUSHER_APP_CLUSTER}
MIX_PUSHER_APP_KEY=${PUSHER_APP_KEY}
MIX_PUSHER_APP_CLUSTER=${PUSHER_APP_CLUSTER}
NOCAPTCHA_ENABLED=${NOCAPTCHA_ENABLED}
NOCAPTCHA_SITEKEY=${NOCAPTCHA_SITEKEY}
NOCAPTCHA_SECRET=${NOCAPTCHA_SECRET}
SCOUT_DRIVER=${SCOUT_DRIVER}
SCOUT_QUEUE=${SCOUT_QUEUE}
ITEMS_PER_PAGE=${ITEMS_PER_PAGE}
ITEMS_PER_COVER_PAGE=${ITEMS_PER_COVER_PAGE}
MAX_PAGER_RESULTS=${MAX_PAGER_RESULTS}
ECHOCLI=${ECHOCLI}
RENAME_PAR2=${RENAME_PAR2}
ADD_PAR2=${ADD_PAR2}
RENAME_MUSIC_MEDIAINFO=${RENAME_MUSIC_MEDIAINFO}
CACHE_EXPIRY_SHORT=${CACHE_EXPIRY_SHORT}
CACHE_EXPIRY_MEDIUM=${CACHE_EXPIRY_MEDIUM}
CACHE_EXPIRY_LONG=${CACHE_EXPIRY_LONG}
SSL_CAFILE=${SSL_CAFILE}
SSL_CAPATH=${SSL_CAPATH}
SSL_VERIFY_PEER=${SSL_VERIFY_PEER}
SSL_VERIFY_HOST=${SSL_VERIFY_HOST}
SSL_ALLOW_SELF_SIGNED=${SSL_ALLOW_SELF_SIGNED}
SCRAPE_IRC_USERNAME=${SCRAPE_IRC_USERNAME}
SCRAPE_IRC_SERVER=${SCRAPE_IRC_SERVER}
SCRAPE_IRC_PORT=${SCRAPE_IRC_PORT}
SCRAPE_IRC_TLS=${SCRAPE_IRC_TLS}
SCRAPE_IRC_PASSWORD=${SCRAPE_IRC_PASSWORD}
SMARTY_DEBUG=${SMARTY_DEBUG}
SMARTY_CACHING=${SMARTY_CACHING}
SMARTY_CACHE_LIFE=${SMARTY_CACHE_LIFE}
SMARTY_COMPILE_CHECK=${SMARTY_COMPILE_CHECK}
SMARTY_FORCE_COMPILE=${SMARTY_FORCE_COMPILE}
SMARTY_CACHE_DRIVER=${SMARTY_CACHE_DRIVER}
TWITCH_CLIENT_ID=${TWITCH_CLIENT_ID}
TWITCH_CLIENT_SECRET=${TWITCH_CLIENT_SECRET}
IGDB_CACHE_LIFETIME=${IGDB_CACHE_LIFETIME}
TMDB_APIKEY=${TMDB_APIKEY}
TMDB_CACHE=${TMDB_CACHE}
TMDB_LOG=${TMDB_LOG}
TVDB_APIKEY=${TVDB_APIKEY}
TVDB_PIN=${TVDB_PIN}
GIANTBOMB_APIKEY=${GIANTBOMB_APIKEY}
ANIDB_APIKEY=${ANIDB_APIKEY}
FANARTTV_APIKEY=${FANARTTV_APIKEY}
OMDB_APIKEY=${OMDB_APIKEY}
TRAKTTV_APIKEY=${TRAKTTV_APIKEY}
TEMP_UNRAR_PATH=${TEMP_UNRAR_PATH}
TEMP_UNZIP_PATH=${TEMP_UNZIP_PATH}
VIEW_COMPILED_PATH=${VIEW_COMPILED_PATH}
UNRAR_PATH=${UNRAR_PATH}
UNZIP_PATH=${UNZIP_PATH}
FFMPEG_PATH=${FFMPEG_PATH}
LAME_PATH=${LAME_PATH}
MEDIAINFO_PATH=${MEDIAINFO_PATH}
TIIMEOUT_PATH=${TIIMEOUT_PATH}
MAGIC_FILE_PATH=${MAGIC_FILE_PATH}
COVERS_PATH=${COVERS_PATH}
PATH_TO_NZBS=${PATH_TO_NZBS}
ASSET_URL=${ASSET_URL}
TELESCOPE_DRIVER=${TELESCOPE_DRIVER}
TELESCOPE_ENABLED=${TELESCOPE_ENABLED}
TELESCOPE_FULL_IN_PRODUCTION=${TELESCOPE_FULL_IN_PRODUCTION}
TELESCOPE_CACHE_WATCHER=${TELESCOPE_CACHE_WATCHER}
TELESCOPE_COMMAND_WATCHER=${TELESCOPE_COMMAND_WATCHER}
TELESCOPE_DUMP_WATCHER=${TELESCOPE_DUMP_WATCHER}
TELESCOPE_EVENT_WATCHER=${TELESCOPE_EVENT_WATCHER}
TELESCOPE_EXCEPTION_WATCHER=${TELESCOPE_EXCEPTION_WATCHER}
TELESCOPE_JOB_WATCHER=${TELESCOPE_JOB_WATCHER}
TELESCOPE_LOG_WATCHER=${TELESCOPE_LOG_WATCHER}
TELESCOPE_MAIL_WATCHER=${TELESCOPE_MAIL_WATCHER}
TELESCOPE_MODEL_WATCHER=${TELESCOPE_MODEL_WATCHER}
TELESCOPE_NOTIFICATION_WATCHER=${TELESCOPE_NOTIFICATION_WATCHER}
TELESCOPE_QUERY_WATCHER=${TELESCOPE_QUERY_WATCHER}
TELESCOPE_REDIS_WATCHER=${TELESCOPE_REDIS_WATCHER}
TELESCOPE_REQUEST_WATCHER=${TELESCOPE_REQUEST_WATCHER}
TELESCOPE_RESPONSE_SIZE_LIMIT=${TELESCOPE_RESPONSE_SIZE_LIMIT}
TELESCOPE_GATE_WATCHER=${TELESCOPE_GATE_WATCHER}
TELESCOPE_SCHEDULE_WATCHER=${TELESCOPE_SCHEDULE_WATCHER}
HORIZON_PREFIX=${HORIZON_PREFIX}
POSTMARK_TOKEN=${POSTMARK_TOKEN}
PURGE_INACTIVE_USERS=${PURGE_INACTIVE_USERS}
OTP_ENABLED=${OTP_ENABLED}
FLARE_KEY=${FLARE_KEY}
CHECK_PASSWORDED_RARS=${CHECK_PASSWORDED_RARS}
DELETE_PASSWORDED_RELEASES=${DELETE_PASSWORDED_RELEASES}
DELETE_POSSIBLE_PASSWORDED_RELEASES=${DELETE_POSSIBLE_PASSWORDED_RELEASES}
EXTRACT_USING_RARINFO=${EXTRACT_USING_RARINFO}
PRIVATE_PROFILES=${PRIVATE_PROFILES}
STORE_USER_IP=${STORE_USER_IP}
FORUM_FRONTEND_ENABLED=${FORUM_FRONTEND_ENABLED}
+10 -9
View File
@@ -157,6 +157,16 @@ TEMP_UNRAR_PATH='/var/www/nntmux/resources/tmp/unrar/'
TEMP_UNZIP_PATH='/var/www/nntmux/resources/tmp/unzip/'
VIEW_COMPILED_PATH=/var/www/NNTmux/storage/framework/views
UNRAR_PATH=
UNZIP_PATH=
PATH_TO_NZBS=
FFMPEG_PATH=
LAME_PATH=
MEDIAINFO_PATH=
TIIMEOUT_PATH=
MAGIC_FILE_PATH=
COVERS_PATH=
ASSET_URL=
TELESCOPE_DRIVER=database
@@ -189,20 +199,11 @@ OTP_ENABLED=false
FLARE_KEY=
UNRAR_PATH=
UNZIP_PATH=
CHECK_PASSWORDED_RARS=false
DELETE_PASSWORDED_RELEASES=false
DELETE_POSSIBLE_PASSWORDED_RELEASES=false
EXTRACT_USING_RARINFO=false
PATH_TO_NZBS=
PRIVATE_PROFILES=true
STORE_USER_IP=false
FFMPEG_PATH=
LAME_PATH=
MEDIAINFO_PATH=
TIIMEOUT_PATH=
MAGIC_FILE_PATH=
COVERS_PATH=
FORUM_FRONTEND_ENABLED=false
+2 -1
View File
@@ -11,6 +11,7 @@ failed-login.log
php_errors.log
php-errors.log
test.php
.php-cs-fixer.cache
# Editor temp files
*#
@@ -39,4 +40,4 @@ node_modules/
# Stores VSCode versions used for testing VSCode extensions
.vscode-test
/.phpunit.cache
/.phpunit.cache
+73
View File
@@ -0,0 +1,73 @@
FROM composer:latest AS composer-base
FROM dunglas/frankenphp:1-php8.3
LABEL maintainer="PyRowMan"
ENV SERVER_NAME=:80
ARG MYSQL_CLIENT="mariadb-client"
ARG SEVENZIP_VERSION=2407
WORKDIR /app
COPY --from=node:21 /usr/local/ /usr/local/
COPY --from=composer-base --link /usr/bin/composer /usr/bin/composer
RUN apt update \
&& apt install -y --no-install-recommends \
unrar-free 7zip lame libcap2-bin python3 gettext-base \
curl zip unzip git nano bash-completion sudo wget tmux time fonts-powerline \
gnupg libpng-dev dnsutils jq htop iputils-ping net-tools ffmpeg \
jpegoptim webp optipng pngquant libavif-bin watch iproute2 nmon \
libonig-dev libxml2-dev libicu-dev libjpeg-dev libfreetype6-dev libxslt-dev $MYSQL_CLIENT libcurl4-openssl-dev \
&& wget https://mediaarea.net/repo/deb/repo-mediaarea_1.0-24_all.deb \
&& dpkg -i repo-mediaarea_1.0-24_all.deb \
&& apt update \
&& apt install -y libmediainfo0v5 mediainfo libzen0v5
RUN install-php-extensions imagick/imagick@master
RUN docker-php-ext-install \
bcmath \
exif \
gd \
intl \
pdo_mysql \
sockets \
pcntl \
&& pecl install redis \
&& docker-php-ext-enable redis \
&& apt clean \
&& rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
# Determine ARCH and download and extract the appropriate version of 7-Zip
RUN ARCH="$(dpkg --print-architecture)" && \
if [ "$ARCH" = "amd64" ]; then \
SZIP_URL="https://www.7-zip.org/a/7z$SEVENZIP_VERSION-linux-x64.tar.xz"; \
fi && \
if [ "$ARCH" = "arm64" ]; then \
SZIP_URL="https://www.7-zip.org/a/7z$SEVENZIP_VERSION-linux-arm64.tar.xz"; \
fi && \
wget "$SZIP_URL" -O /tmp/7z.tar.xz && \
tar -xf /tmp/7z.tar.xz -C /tmp/ && \
mv /tmp/7zz /usr/bin/7zz && \
rm -f /tmp/7z.tar.xz && rm -f /tmp/7zzs
RUN mv "$PHP_INI_DIR/php.ini-production" "$PHP_INI_DIR/php.ini"
COPY ./docker/8.3/php.ini "$PHP_INI_DIR/conf.d/custom-conf.ini"
COPY --chmod=755 ./docker-entrypoint.sh /usr/local/bin/docker-entrypoint
COPY . /app
RUN rm -Rf tests/
RUN composer install
RUN chmod -R 755 /app/vendor/
RUN chmod -R 777 /app/storage/
RUN chmod -R 777 /app/resources/
RUN chmod -R 777 /app/public/
EXPOSE 80
CMD ["--config", "/etc/caddy/Caddyfile", "--adapter", "caddyfile"]
ENTRYPOINT ["docker-entrypoint"]
+41 -32
View File
@@ -14,7 +14,7 @@ class InstallNntmux extends Command
*
* @var string
*/
protected $signature = 'nntmux:install';
protected $signature = 'nntmux:install {--y|yes : Skip confirmation prompts and proceed with installation}';
/**
* The console command description.
@@ -35,45 +35,53 @@ class InstallNntmux extends Command
public function handle(): void
{
$error = false;
if ($this->confirm('Are you sure you want to install NNTmux? This will wipe your database!!')) {
if (File::exists(base_path().'/_install/install.lock')) {
if ($this->confirm('Do you want to remove install.lock file so you can continue with install?')) {
$this->info('Removing install.lock file so we can continue with install process');
$yesMode = $this->option('yes');
if (File::exists(base_path().'/_install/install.lock')) {
if ($yesMode) {
$this->info('Install is locked. The file "install.lock" is present. Use interactive mode to remove it.');
exit;
} else {
if ($this->confirm('Install is locked. Do you want to remove the "install.lock" file to continue?')) {
$this->info('Removing install.lock file so we can continue with install process...');
$remove = Process::timeout(600)->run('rm _install/install.lock');
echo $remove->output();
echo $remove->errorOutput();
} else {
$this->info('Not removing install.lock, stopping install process');
$this->info('Installation aborted. The file "install.lock" was not removed.');
exit;
}
}
$this->info('Migrating tables and seeding them with initial data');
if (config('app.env') !== 'production') {
$this->call('migrate:fresh', ['--seed' => true]);
} else {
$this->call('migrate:fresh', ['--force' => true, '--seed' => true]);
}
$paths = $this->updatePaths();
if ($paths !== false) {
$this->info('Paths checked successfully');
}
if (! $error && $this->addAdminUser()) {
File::put(base_path().'/_install/install.lock', 'application install locked on '.now());
$this->info('Generating application key');
$this->call('key:generate', ['--force' => true]);
$this->info('NNTmux installation completed successfully');
exit();
}
$this->error('NNTmux installation failed. Fix reported problems and try again');
} else {
$this->info('Stopping install process');
exit;
}
if (! $yesMode) {
if (! $this->confirm('Are you sure you want to install NNTmux? This will wipe your database!!')) {
$this->info('Installation aborted by user.');
exit;
}
}
$this->info('Migrating tables and seeding them with initial data');
if (config('app.env') !== 'production') {
$this->call('migrate:fresh', ['--seed' => true]);
} else {
$this->call('migrate:fresh', ['--force' => true, '--seed' => true]);
}
$paths = $this->updatePaths();
if ($paths !== false) {
$this->info('Paths checked successfully');
}
if ($this->addAdminUser()) {
File::put(base_path().'/_install/install.lock', 'application install locked on '.now());
$this->info('Generating application key');
$this->call('key:generate', ['--force' => true]);
$this->info('NNTmux installation completed successfully');
exit();
}
$this->error('NNTmux installation failed. Fix reported problems and try again');
}
/**
@@ -118,6 +126,7 @@ class InstallNntmux extends Command
if (! File::isWritable($zip_path)) {
$this->warn($zip_path.' is not writable. Please fix folder permissions');
return false;
}
+173
View File
@@ -0,0 +1,173 @@
services:
webapp:
build:
context: .
dockerfile: Dockerfile
image: pyrowman/nntmux
extra_hosts:
- 'host.docker.internal:host-gateway'
ports:
- '${APP_PORT:-80}:80'
environment:
TZ: ${APP_TIMEZONE}
healthcheck:
test: [ "CMD", "curl", "-f", "http://localhost:80" ]
interval: 10s
timeout: 5s
retries: 5
env_file:
- .env
volumes:
- 'install:/app/_install'
- 'storage:/app/storage'
# - 'resources:/var/www/html/resources'
networks:
- nntmux
depends_on:
- mariadb
- redis
- mailpit
- elasticsearch
- manticore
worker:
command: >
sh -c "php artisan tmux-ui:start & php artisan horizon"
image: pyrowman/nntmux
extra_hosts:
- 'host.docker.internal:host-gateway'
tty: true
environment:
TZ: ${APP_TIMEZONE}
env_file:
- .env
volumes:
- 'install:/app/_install'
- 'storage:/app/storage'
networks:
- nntmux
depends_on:
webapp:
condition: service_healthy
scheduler:
image: pyrowman/nntmux
extra_hosts:
- 'host.docker.internal:host-gateway'
tty: true
env_file:
- .env
environment:
TZ: ${APP_TIMEZONE}
volumes:
- 'install:/app/_install'
- 'storage:/app/storage'
networks:
- nntmux
depends_on:
webapp:
condition: service_healthy
command: >
sh -c "while [ true ]; do php artisan schedule:run; sleep 60;done"
mariadb:
image: 'mariadb:11'
ports:
- '${FORWARD_DB_PORT:-3306}:3306'
environment:
TZ: ${APP_TIMEZONE}
MYSQL_ROOT_PASSWORD: '${DB_PASSWORD}'
MYSQL_ROOT_HOST: '%'
MYSQL_DATABASE: '${DB_DATABASE}'
MYSQL_USER: '${DB_USERNAME}'
MYSQL_PASSWORD: '${DB_PASSWORD}'
MYSQL_ALLOW_EMPTY_PASSWORD: 'yes'
command:
--max_allowed_packet=128M
--group_concat_max_len=16384
--max_connections=200
volumes:
- 'mariadb:/var/lib/mysql'
- './vendor/laravel/sail/database/mariadb/create-testing-database.sh:/docker-entrypoint-initdb.d/10-create-testing-database.sh'
networks:
- nntmux
healthcheck:
test:
- CMD
- mysqladmin
- ping
- '-p${DB_PASSWORD}'
retries: 3
timeout: 5s
redis:
image: 'redis:alpine'
ports:
- '${FORWARD_REDIS_PORT:-6379}:6379'
environment:
TZ: ${APP_TIMEZONE}
volumes:
- 'redis:/data'
networks:
- nntmux
healthcheck:
test:
- CMD
- redis-cli
- ping
retries: 3
timeout: 5s
manticore:
image: manticoresearch/manticore
environment:
TZ: ${APP_TIMEZONE}
EXTRA: 1 # Activates extra features
restart: always
ports:
- 9306:9306
- 9308:9308
ulimits:
nproc: 65535
nofile:
soft: 65535
hard: 65535
memlock:
soft: -1
hard: -1
volumes:
- 'manticore:/var/lib/manticore'
# - ./misc/manticoresearch/manticore.conf:/etc/manticoresearch/manticore.conf
networks:
- nntmux
mailpit:
image: 'axllent/mailpit:latest'
ports:
- '${FORWARD_MAILPIT_PORT:-1025}:1025'
- '${FORWARD_MAILPIT_DASHBOARD_PORT:-8025}:8025'
networks:
- nntmux
elasticsearch:
image: docker.elastic.co/elasticsearch/elasticsearch:8.17.0
environment:
- TZ=${APP_TIMEZONE}
- discovery.type=single-node
- xpack.security.enabled=false
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
ports:
- 9200:9200
- 9300:9300
volumes:
- elasticsearch:/usr/share/elasticsearch/data
networks:
- nntmux
deploy:
resources:
limits:
memory: 1g
networks:
nntmux:
driver: bridge
volumes:
mariadb:
redis:
elasticsearch:
manticore:
storage:
resources:
install:
+94
View File
@@ -0,0 +1,94 @@
#!/bin/sh
set -e
# Create .env file if it doesn't exist
if [ ! -f .env ]; then
echo "Creating .env file from environment variables..."
envsubst < .env.dist > .env
fi
if [ "$1" != 'php' ] && [ "$1" != 'sh' ]; then
# Install dependencies if not already installed
if [ ! -d 'vendor/' ]; then
echo "Installing dependencies via Composer..."
composer install --prefer-dist --no-progress --no-interaction
fi
# Check and wait for the database to be ready
if grep -q ^DB_HOST= .env; then
echo "Waiting for the database to be ready..."
ATTEMPTS_LEFT_TO_REACH_DATABASE=60
until [ $ATTEMPTS_LEFT_TO_REACH_DATABASE -eq 0 ] || DATABASE_ERROR=$(php artisan db:show 2>&1); do
if [ $? -ne 0 ]; then
# Stop attempting in case of an error
ATTEMPTS_LEFT_TO_REACH_DATABASE=$((ATTEMPTS_LEFT_TO_REACH_DATABASE - 1))
echo "Database not ready yet. Attempts left: $ATTEMPTS_LEFT_TO_REACH_DATABASE."
sleep 1
else
break
fi
done
if [ $ATTEMPTS_LEFT_TO_REACH_DATABASE -eq 0 ]; then
echo "Failed to connect to the database:"
echo "$DATABASE_ERROR"
exit 1
else
echo "Database is now ready."
fi
fi
if [ ! -f '_install/install.lock' ]; then
echo "Creating folders structure"
mkdir -p /app/storage/app/public
mkdir -p "$COVERS_PATH/anime"
mkdir -p "$COVERS_PATH/audio"
mkdir -p "$COVERS_PATH/audiosample"
mkdir -p "$COVERS_PATH/book"
mkdir -p "$COVERS_PATH/console"
mkdir -p "$COVERS_PATH/games"
mkdir -p "$COVERS_PATH/movies"
mkdir -p "$COVERS_PATH/music"
mkdir -p "$COVERS_PATH/preview"
mkdir -p "$COVERS_PATH/sample"
mkdir -p "$COVERS_PATH/tvrage"
mkdir -p "$COVERS_PATH/tvshows"
mkdir -p "$COVERS_PATH/video"
mkdir -p "$COVERS_PATH/xxx"
mkdir -p "$PATH_TO_NZBS"
mkdir -p "$TEMP_UNRAR_PATH"
mkdir -p "$TEMP_UNZIP_PATH"
# Set permissions for storage and bootstrap/cache directories
echo "Setting permissions on storage and bootstrap/cache directories..."
chmod -R 775 bootstrap/cache
chmod -R 777 storage resources
chown -R www-data:www-data storage bootstrap/cache resources
echo "Clearing application cache..."
php artisan cache:clear
php artisan config:clear
php artisan route:clear
php artisan view:clear
echo "Caching configuration and routes..."
php artisan config:cache
php artisan route:cache
# Run Laravel-specific post-installation commands
echo "NNTmux installation..."
php artisan nntmux:install --yes
if [ "${ELASTICSEARCH_ENABLED}" == "true" ]; then
echo "Elasticsearch initialisation"
php artisan nntmux:create-es-indexes
php artisan nntmux:populate --elastic --releases
php artisan nntmux:populate --elastic --predb
else
echo "Manticore initialisation"
php artisan nntmux:populate --manticore --releases
php artisan nntmux:populate --manticore --predb
fi
fi
fi
# Run the PHP entry point with arguments
exec docker-php-entrypoint "$@"
@@ -0,0 +1,4 @@
<!-- resources/views/components/application-logo.blade.php -->
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" class="w-6 h-6">
<path d="M12 0L24 24H0z"/>
</svg>

After

Width:  |  Height:  |  Size: 198 B