wip - container setup cli and fixed some issues with docker compose yml (still buggy)

This commit is contained in:
pushrbx 2023-08-20 22:35:02 +01:00
parent 9b56d7b397
commit 309e1d6402
7 changed files with 117 additions and 51 deletions

View File

@ -23,3 +23,7 @@ db_username.txt
db_password.txt db_password.txt
redis_password.txt redis_password.txt
typesense_api_key.txt typesense_api_key.txt
.phpunit.result.cache
.env
.env.dist
docker-compose.yml

View File

@ -1,6 +1,6 @@
FROM spiralscout/roadrunner:2.12.2 as roadrunner FROM docker.io/spiralscout/roadrunner:2.12.2 as roadrunner
FROM composer:2.5.1 as composer FROM docker.io/composer:2.5.1 as composer
FROM mlocati/php-extension-installer:1.5.52 as php-ext-installer FROM docker.io/mlocati/php-extension-installer:1.5.52 as php-ext-installer
FROM php:8.1.16-bullseye FROM php:8.1.16-bullseye
COPY --from=composer /usr/bin/composer /usr/bin/composer COPY --from=composer /usr/bin/composer /usr/bin/composer
COPY --from=php-ext-installer /usr/bin/install-php-extensions /usr/local/bin/ COPY --from=php-ext-installer /usr/bin/install-php-extensions /usr/local/bin/

View File

@ -2,20 +2,8 @@
namespace App\Console; namespace App\Console;
use App\Console\Commands\ClearQueuedJobs;
use App\Console\Commands\CacheRemove; use App\Console\Commands\CacheRemove;
use App\Console\Commands\Indexer\AnimeIndexer; use App\Console\Commands\Indexer;
use App\Console\Commands\Indexer\AnimeSweepIndexer;
use App\Console\Commands\Indexer\AnimeScheduleIndexer;
use App\Console\Commands\Indexer\CommonIndexer;
use App\Console\Commands\Indexer\CurrentSeasonIndexer;
use App\Console\Commands\Indexer\GenreIndexer;
use App\Console\Commands\Indexer\MangaIndexer;
use App\Console\Commands\Indexer\MangaSweepIndexer;
use App\Console\Commands\Indexer\ProducersIndexer;
use App\Console\Commands\ManageMicrocaching;
use App\Console\Commands\ModifyCacheDriver;
use App\Console\Commands\ModifyCacheMethod;
use Illuminate\Console\Scheduling\Schedule; use Illuminate\Console\Scheduling\Schedule;
use Laravel\Lumen\Console\Kernel as ConsoleKernel; use Laravel\Lumen\Console\Kernel as ConsoleKernel;
@ -28,15 +16,15 @@ class Kernel extends ConsoleKernel
*/ */
protected $commands = [ protected $commands = [
CacheRemove::class, CacheRemove::class,
CommonIndexer::class, Indexer\CommonIndexer::class,
AnimeScheduleIndexer::class, Indexer\AnimeScheduleIndexer::class,
CurrentSeasonIndexer::class, Indexer\CurrentSeasonIndexer::class,
AnimeIndexer::class, Indexer\AnimeIndexer::class,
MangaIndexer::class, Indexer\MangaIndexer::class,
GenreIndexer::class, Indexer\GenreIndexer::class,
ProducersIndexer::class, Indexer\ProducersIndexer::class,
AnimeSweepIndexer::class, Indexer\AnimeSweepIndexer::class,
MangaSweepIndexer::class, Indexer\MangaSweepIndexer::class
]; ];
/** /**

101
container-setup.sh Normal file → Executable file
View File

@ -1,14 +1,22 @@
#!/bin/bash #!/bin/bash
JIKAN_API_VERSION=v4.0.0-rc.11 _JIKAN_API_VERSION=v4.0.0
DOCKER_COMPOSE_PROJECT_NAME=jikan-api-$JIKAN_API_VERSION SUBSTITUTE_VERSION=$_JIKAN_API_VERSION
if [ -x "$(command -v git)" ]; then
SUBSTITUTE_VERSION=$(git describe --tags | sed -e "s/-[a-z0-9]\{8\}/-$(git rev-parse --short HEAD)/g")
fi
export _JIKAN_API_VERSION=${JIKAN_API_VERSION:-$SUBSTITUTE_VERSION}
DOCKER_COMPOSE_PROJECT_NAME=jikan-api-$_JIKAN_API_VERSION
DOCKER_CMD="docker"
DOCKER_COMPOSE_CMD="docker-compose"
display_help() { display_help() {
echo "============================================================" echo "============================================================"
echo "Jikan API Container Setup CLI" echo "Jikan API Container Setup CLI"
echo "============================================================" echo "============================================================"
echo "Syntax: ./container-setup.sh [command]" echo "Syntax: ./container-setup.sh [command]"
echo "Jikan API Version: $JIKAN_API_VERSION" echo "Jikan API Version: $_JIKAN_API_VERSION"
echo "---commands---" echo "---commands---"
echo "help Print CLI help" echo "help Print CLI help"
echo "build-image Build Image Locally" echo "build-image Build Image Locally"
@ -19,27 +27,80 @@ display_help() {
} }
validate_prereqs() { validate_prereqs() {
docker -v >/dev/null 2>&1 docker_exists=$(command -v docker)
if [ $? -ne 0 ]; then docker_compose_exists=$(command -v docker-compose)
echo -e "'docker' is not installed or not runnable without sudo. \xE2\x9D\x8C" podman_exists=$(command -v podman)
podman_compose_exists=$(command -v podman-compose)
if [ -x "$docker_exists" ] && [ -x "$podman_exists" ]; then
echo -e "'docker' is not installed. \xE2\x9D\x8C"
exit 1
else else
echo -e "Docker is Installed. \xE2\x9C\x94" echo -e "Docker is Installed. \xE2\x9C\x94"
fi fi
docker-compose -v >/dev/null 2>&1 if [ -x "$docker_exists" ]; then
if [ $? -ne 0 ]; then DOCKER_CMD="docker"
echo -e "'docker-compose' is not installed. \xE2\x9D\x8C" docker -v >/dev/null 2>&1
else if [ $? -ne 0 ]; then
echo -e "Docker compose is Installed. \xE2\x9C\x94" echo -e "'docker' is not executable without sudo. \xE2\x9D\x8C"
exit 1
fi
elif [ -n "$podman_exists" ]; then
DOCKER_CMD="podman"
fi fi
if [ -x "$docker_compose_exists" ] && [ -x "$docker_compose_exists" ]; then
echo -e "'docker-compose' is not installed. \xE2\x9D\x8C"
exit 1
else
echo -e "Docker compose is Installed. \xE2\x9C\x94"
fi
if [ -x "$docker_compose_exists" ]; then
DOCKER_COMPOSE_CMD="docker-compose"
elif [ -x "$podman_compose_exists" ]; then
DOCKER_COMPOSE_CMD="podman-compose"
else
echo "Error"
exit 1
fi
} }
build_image() { build_image() {
docker build --rm --compress -t jikanme/jikan-rest:$JIKAN_API_VERSION . validate_prereqs
$DOCKER_CMD build --rm --compress -t jikanme/jikan-rest:"$_JIKAN_API_VERSION" .
$DOCKER_CMD tag jikanme/jikan-rest:"$_JIKAN_API_VERSION" jikanme/jikan-rest:latest
}
ensure_secrets() {
declare -a secrets=("db_password" "db_username" "redis_password" "typesense_api_key")
for secret_name in "${secrets[@]}"
do
if [ ! -f "$secret_name.txt" ]; then
if [ "$secret_name" == "db_username" ]; then
generated_secret="jikan"
else
generated_secret=$(LC_ALL=c tr -dc 'A-Za-z0-9!"#$%&'\''()*+,-./:;<=>?@[\]^_{|}~' </dev/urandom | head -c 16 ; echo)
fi
echo "$secret_name.txt not found, please provide a $secret_name [default is $generated_secret]:"
# prompt for secret and save it in file
read -r secret_value
if [ -z "$secret_value" ]; then
secret_value=$generated_secret
fi
echo "$secret_value" > "$secret_name.txt"
else
echo -e "$secret_name.txt found, using it's value. \xE2\x9C\x94"
fi
done
} }
start() { start() {
docker-compose -p $DOCKER_COMPOSE_PROJECT_NAME up -d validate_prereqs
ensure_secrets
exec $DOCKER_COMPOSE_CMD -p "$DOCKER_COMPOSE_PROJECT_NAME" up -d
} }
case "$1" in case "$1" in
@ -55,17 +116,21 @@ case "$1" in
"start") "start")
start start
;; ;;
"stop")
validate_prereqs
$DOCKER_COMPOSE_CMD -p "$DOCKER_COMPOSE_PROJECT_NAME" down
;;
"execute-indexers") "execute-indexers")
echo "Indexing anime..." echo "Indexing anime..."
docker-compose -p $DOCKER_COMPOSE_PROJECT_NAME exec jikan_rest php /app/artisan indexer:anime $DOCKER_COMPOSE_CMD -p "$DOCKER_COMPOSE_PROJECT_NAME" exec jikan_rest php /app/artisan indexer:anime
echo "Indexing manga..." echo "Indexing manga..."
docker-compose -p $DOCKER_COMPOSE_PROJECT_NAME exec jikan_rest php /app/artisan indexer:manga $DOCKER_COMPOSE_CMD -p "$DOCKER_COMPOSE_PROJECT_NAME" exec jikan_rest php /app/artisan indexer:manga
echo "Indexing characters and people..." echo "Indexing characters and people..."
docker-compose -p $DOCKER_COMPOSE_PROJECT_NAME exec jikan_rest php /app/artisan indexer:common $DOCKER_COMPOSE_CMD -p "$DOCKER_COMPOSE_PROJECT_NAME" exec jikan_rest php /app/artisan indexer:common
echo "Indexing genres..." echo "Indexing genres..."
docker-compose -p $DOCKER_COMPOSE_PROJECT_NAME exec jikan_rest php /app/artisan indexer:genres $DOCKER_COMPOSE_CMD -p "$DOCKER_COMPOSE_PROJECT_NAME" exec jikan_rest php /app/artisan indexer:genres
echo "Indexing producers..." echo "Indexing producers..."
docker-compose -p $DOCKER_COMPOSE_PROJECT_NAME exec jikan_rest php /app/artisan indexer:producers $DOCKER_COMPOSE_CMD -p "$DOCKER_COMPOSE_PROJECT_NAME" exec jikan_rest php /app/artisan indexer:producers
echo "Indexing done!" echo "Indexing done!"
;; ;;
*) *)

View File

@ -19,7 +19,7 @@ secrets:
services: services:
jikan_rest: jikan_rest:
image: jikanme/jikan-rest:v4.0.0-rc.11 image: "jikanme/jikan-rest:${_JIKAN_API_VERSION:-latest}"
user: "${APP_UID:-10001}:${APP_GID:-10001}" user: "${APP_UID:-10001}:${APP_GID:-10001}"
networks: networks:
- jikan_network - jikan_network
@ -34,6 +34,7 @@ services:
- ./docker/config/.env.compose - ./docker/config/.env.compose
ports: ports:
- '8080:8080/tcp' - '8080:8080/tcp'
hostname: jikan-rest-api
healthcheck: healthcheck:
test: [ 'CMD-SHELL', 'wget --spider -q "http://127.0.0.1:2114/health?plugin=http"' ] test: [ 'CMD-SHELL', 'wget --spider -q "http://127.0.0.1:2114/health?plugin=http"' ]
interval: 2s interval: 2s
@ -44,18 +45,20 @@ services:
typesense: { condition: service_healthy } typesense: { condition: service_healthy }
mongodb: mongodb:
image: mongo:focal image: docker.io/mongo:focal
hostname: mongodb
volumes: volumes:
- mongo-data:/data/db - mongo-data:/data/db
ports: ports:
- '27017/tcp' - '27017/tcp'
command: --wiredTigerCacheSizeGB ${MONGO_CACHE_SIZE_GB:1} command: "--wiredTigerCacheSizeGB ${MONGO_CACHE_SIZE_GB:1}"
networks: networks:
- jikan_network - jikan_network
secrets: secrets:
- db_username
- db_password - db_password
environment: environment:
MONGO_INITDB_ROOT_USERNAME: "${DB_USERNAME:-root}" MONGO_INITDB_ROOT_USERNAME_FILE: /run/secrets/db_username
MONGO_INITDB_ROOT_PASSWORD_FILE: /run/secrets/db_password MONGO_INITDB_ROOT_PASSWORD_FILE: /run/secrets/db_password
healthcheck: healthcheck:
test: echo 'db.runCommand("ping").ok' | mongo mongodb://localhost:27017 --quiet test: echo 'db.runCommand("ping").ok' | mongo mongodb://localhost:27017 --quiet
@ -64,7 +67,8 @@ services:
retries: 5 retries: 5
redis: redis:
image: redis:7-alpine image: docker.io/redis:7-alpine
hostname: redis
secrets: secrets:
- redis_password - redis_password
environment: environment:
@ -74,7 +78,7 @@ services:
command: command:
- /bin/sh - /bin/sh
- -c - -c
- redis-server --requirepass "$${cat /run/secrets/redis_password}" - redis-server --requirepass "$$(cat /run/secrets/redis_password)"
volumes: volumes:
- redis-data:/data:rw - redis-data:/data:rw
ports: ports:
@ -85,7 +89,8 @@ services:
timeout: 1s timeout: 1s
typesense: typesense:
image: typesense/typesense:0.24.1 image: docker.io/typesense/typesense:0.24.1
hostname: typesense
entrypoint: /bin/sh entrypoint: /bin/sh
secrets: secrets:
- typesense_api_key - typesense_api_key
@ -100,6 +105,6 @@ services:
ports: ports:
- "8108/tcp" - "8108/tcp"
healthcheck: healthcheck:
test: [ 'CMD-SHELL', 'curl', '-s', '-f', 'http://localhost:8108/health' ] test: [ 'CMD-SHELL', '{ ! [ -f "curl_created" ] && apt -qq update -y && apt -qq install -y curl && touch curl_created && curl -s -f http://localhost:8108/health; } || { curl -s -f http://localhost:8108/health; }' ]
interval: 5s interval: 5s
timeout: 2s timeout: 2s

View File

@ -37,6 +37,7 @@ if (!file_exists(".env")) {
$envWriter = new \MirazMac\DotEnv\Writer(__DIR__ . '/' . '.env'); $envWriter = new \MirazMac\DotEnv\Writer(__DIR__ . '/' . '.env');
$itemsWritten = 0; $itemsWritten = 0;
foreach (array_keys($current_env) as $env_key) { foreach (array_keys($current_env) as $env_key) {
echo $env_key;
if (!str_contains($env_key, "__FILE")) { if (!str_contains($env_key, "__FILE")) {
continue; continue;
} }
@ -51,6 +52,7 @@ foreach (array_keys($current_env) as $env_key) {
if ($itemsWritten > 0) { if ($itemsWritten > 0) {
$envWriter->write(); $envWriter->write();
echo "Secrets loaded successfully.";
} }
$dotenv = Dotenv::createImmutable(__DIR__); $dotenv = Dotenv::createImmutable(__DIR__);

View File

@ -2,3 +2,5 @@
failovers.json failovers.json
source_failover.lock source_failover.lock
jikan_model_classes.json jikan_model_classes.json
container_compose_runtime
container_runtime