diff --git a/.env.example b/.env.example index 8e459397..4af6c61a 100644 --- a/.env.example +++ b/.env.example @@ -53,7 +53,8 @@ MYSQL_PASSWORD=vichan! MYSQL_ROOT_PASSWORD=vichan!! -# Redis -VICHAN_REDIS_HOST=redis -VICHAN_REDIS_PORT=6379 -VICHAN_REDIS_PASSWORD=redis! +# Cache Settings +VICHAN_CACHE_ENGINE=redis +VICHAN_CACHE_HOST=redis +VICHAN_CACHE_PORT=6379 +VICHAN_CACHE_PASSWORD=redis! diff --git a/compose.yml b/compose.yml index 49809abe..2e7077df 100644 --- a/compose.yml +++ b/compose.yml @@ -39,10 +39,11 @@ services: VICHAN_MYSQL_PASSWORD: ${VICHAN_MYSQL_PASSWORD} # Security VICHAN_SECURE_LOGIN_ONLY: ${VICHAN_SECURE_LOGIN_ONLY} - # Redis settings - VICHAN_REDIS_HOST: ${VICHAN_REDIS_HOST} - VICHAN_REDIS_PORT: ${VICHAN_REDIS_PORT} - VICHAN_REDIS_PASSWORD: ${VICHAN_REDIS_PASSWORD} + # Cache settings + VICHAN_CACHE_ENGINE: ${VICHAN_CACHE_ENGINE} + VICHAN_CACHE_HOST: ${VICHAN_CACHE_HOST} + VICHAN_CACHE_PORT: ${VICHAN_CACHE_PORT} + VICHAN_CACHE_PASSWORD: ${VICHAN_CACHE_PASSWORD} # Cookies VICHAN_COOKIES_MOD: ${VICHAN_COOKIES_MOD} # Flood Control @@ -88,10 +89,10 @@ services: volumes: - ./local-instances/${INSTANCE:-0}/redis:/data environment: - REDIS_PASSWORD: ${VICHAN_REDIS_PASSWORD} - command: redis-server --requirepass ${VICHAN_REDIS_PASSWORD} + REDIS_PASSWORD: ${VICHAN_CACHE_PASSWORD} + command: redis-server --requirepass ${VICHAN_CACHE_PASSWORD} healthcheck: - test: ["CMD", "redis-cli", "-a", "${VICHAN_REDIS_PASSWORD}", "ping"] + test: ["CMD", "redis-cli", "-a", "${VICHAN_CACHE_PASSWORD}", "ping"] interval: 10s timeout: 5s retries: 5 diff --git a/docker/php/Dockerfile b/docker/php/Dockerfile index c3e855ac..86c161d1 100644 --- a/docker/php/Dockerfile +++ b/docker/php/Dockerfile @@ -47,7 +47,7 @@ RUN apk add --no-cache \ && pecl install -o -f igbinary \ && pecl install redis \ && pecl install imagick \ - $$ docker-php-ext-enable \ + && docker-php-ext-enable \ igbinary \ redis \ imagick \ diff --git a/inc/cache.php b/inc/cache.php index 293660fd..ba9c35a7 100644 --- a/inc/cache.php +++ b/inc/cache.php @@ -20,12 +20,22 @@ class Cache { $config['cache']['memcached'] ); case 'redis': + $host = $config['cache']['redis'][0] ?? 'localhost'; + $port = $config['cache']['redis'][1] ?? 6379; + $password = $config['cache']['redis'][2] ?? ''; + $database = $config['cache']['redis'][3] ?? 1; + + $host = getenv('VICHAN_CACHE_HOST') ?: $host; + $port = getenv('VICHAN_CACHE_PORT') ?: $port; + $password = getenv('VICHAN_CACHE_PASSWORD') ?: $password; + $database = getenv('VICHAN_CACHE_DATABASE') ?: $database; + return new RedisCacheDriver( $config['cache']['prefix'], - $config['cache']['redis'][0], - $config['cache']['redis'][1], - $config['cache']['redis'][2], - $config['cache']['redis'][3] + $host, + $port, + $password, + $database ); case 'apcu': return new ApcuCacheDriver; diff --git a/inc/config.php b/inc/config.php index e7655634..897eab5f 100644 --- a/inc/config.php +++ b/inc/config.php @@ -137,32 +137,16 @@ * ==================== */ + $config['cache']['enabled'] = 'php'; + $config['cache']['redis'] = array( + 'host' => 'localhost', + 'port' => 6379, + 'password' => '', + 'database' => 1 + ); + // Determine if Redis is configured via environment variables - $redis_enabled = getenv('VICHAN_REDIS_HOST') !== false && getenv('VICHAN_REDIS_PORT') !== false; - - // Configure cache - if ($redis_enabled) { - $config['cache']['enabled'] = 'redis'; - $config['cache']['redis'] = [ - 'host' => getenv('VICHAN_REDIS_HOST') ?: 'localhost', - 'port' => (int)(getenv('VICHAN_REDIS_PORT') ?: 6379), - 'password' => getenv('VICHAN_REDIS_PASSWORD') ?: '', - 'database' => 1, - ]; - } else { - $config['cache']['enabled'] = 'php'; - } - - // Configure sessions to use Redis if enabled - if ($redis_enabled) { - $config['session']['enabled'] = 'redis'; - $config['session']['redis'] = [ - 'host' => getenv('VICHAN_REDIS_HOST') ?: 'localhost', - 'port' => (int)(getenv('VICHAN_REDIS_PORT') ?: 6379), - 'password' => getenv('VICHAN_REDIS_PASSWORD') ?: '', - 'database' => 1, - ]; - } + getenv('VICHAN_CACHE_ENGINE') && $config['cache']['enabled'] = getenv('VICHAN_CACHE_ENGINE'); // Cache timeout for cached objects $config['cache']['timeout'] = 60 * 60 * 48; // 48 hours @@ -1869,6 +1853,18 @@ // Enable public logs? 0: NO, 1: YES, 2: YES, but drop names $config['public_logs'] = 0; +/* + * ==================== + * Container settings + * =================== + */ + + $isDocker = is_file("/.dockerenv") || is_file("/run/.containerenv"); + $isKubernetes = is_file("/var/run/secrets/kubernetes.io/serviceaccount/namespace"); + $config['is_container'] = $isDocker || $isKubernetes ? true : false; + $config['is_docker'] = $isDocker; + $config['is_kubernetes'] = $isKubernetes; + /* * ==================== * Events (PHP 5.3.0+) diff --git a/install.php b/install.php index 1dce4154..e3649c2d 100644 --- a/install.php +++ b/install.php @@ -684,7 +684,7 @@ if ($step == 0) { $page['body'] = '
- + I have read and understood the agreement. Proceed to installation.
'; echo Element('page.html', $page); @@ -914,67 +914,67 @@ if ($step == 0) { 'config' => $config, )); } elseif ($step == 2) { - $page['title'] = 'Configuration'; - $sg = new SaltGen(); + $page['title'] = 'Configuration'; + $sg = new SaltGen(); - // Initialize configuration with defaults and override with environment variables + // Initialize configuration with defaults and override with environment variables $config['cookies'] = array( - 'mod' => getenv('VICHAN_COOKIES_MOD') !== false ? getenv('VICHAN_COOKIES_MOD') : 'mod', - 'salt' => $sg->generate(), - ); - - $config['flood_time'] = getenv('VICHAN_FLOOD_TIME') !== false ? (int)getenv('VICHAN_FLOOD_TIME') : 30; - $config['flood_time_ip'] = getenv('VICHAN_FLOOD_TIME_IP') !== false ? (int)getenv('VICHAN_FLOOD_TIME_IP') : 120; - $config['flood_time_same'] = getenv('VICHAN_FLOOD_TIME_SAME') !== false ? (int)getenv('VICHAN_FLOOD_TIME_SAME') : 3600; - $config['max_body'] = getenv('VICHAN_MAX_BODY') !== false ? (int)getenv('VICHAN_MAX_BODY') : 1800; - $config['reply_limit'] = getenv('VICHAN_REPLY_LIMIT') !== false ? (int)getenv('VICHAN_REPLY_LIMIT') : 250; - $config['max_links'] = getenv('VICHAN_MAX_LINKS') !== false ? (int)getenv('VICHAN_MAX_LINKS') : 20; - - $config['max_filesize'] = getenv('VICHAN_IMAGES_MAX_FILESIZE') !== false ? (int)getenv('VICHAN_IMAGES_MAX_FILESIZE') : 10485760; // This is 10MB - $config['thumb_width'] = getenv('VICHAN_IMAGES_THUMB_WIDTH') !== false ? (int)getenv('VICHAN_IMAGES_THUMB_WIDTH') : 250; - $config['thumb_height'] = getenv('VICHAN_IMAGES_THUMB_HEIGHT') !== false ? (int)getenv('VICHAN_IMAGES_THUMB_HEIGHT') : 250; - $config['max_width'] = getenv('VICHAN_IMAGES_MAX_WIDTH') !== false ? (int)getenv('VICHAN_IMAGES_MAX_WIDTH') : 10000; - $config['max_height'] = getenv('VICHAN_IMAGES_MAX_HEIGHT') !== false ? (int)getenv('VICHAN_IMAGES_MAX_HEIGHT') : 10000; - - $config['threads_per_page'] = getenv('VICHAN_DISPLAY_THREADS_PER_PAGE') !== false ? (int)getenv('VICHAN_DISPLAY_THREADS_PER_PAGE') : 10; - $config['max_pages'] = getenv('VICHAN_DISPLAY_MAX_PAGES') !== false ? (int)getenv('VICHAN_DISPLAY_MAX_PAGES') : 11; - $config['threads_preview'] = getenv('VICHAN_DISPLAY_THREADS_PREVIEW') !== false ? (int)getenv('VICHAN_DISPLAY_THREADS_PREVIEW') : 5; - - $config['root'] = getenv('VICHAN_DIRECTORIES_ROOT') !== false ? getenv('VICHAN_DIRECTORIES_ROOT') : '/'; - - $config['secure_trip_salt'] = $sg->generate(); - $config['secure_password_salt'] = $sg->generate(); + 'mod' => getenv('VICHAN_COOKIES_MOD') !== false ? getenv('VICHAN_COOKIES_MOD') : 'mod', + 'salt' => $sg->generate(), + ); + + $config['flood_time'] = getenv('VICHAN_FLOOD_TIME') !== false ? (int)getenv('VICHAN_FLOOD_TIME') : 30; + $config['flood_time_ip'] = getenv('VICHAN_FLOOD_TIME_IP') !== false ? (int)getenv('VICHAN_FLOOD_TIME_IP') : 120; + $config['flood_time_same'] = getenv('VICHAN_FLOOD_TIME_SAME') !== false ? (int)getenv('VICHAN_FLOOD_TIME_SAME') : 3600; + $config['max_body'] = getenv('VICHAN_MAX_BODY') !== false ? (int)getenv('VICHAN_MAX_BODY') : 1800; + $config['reply_limit'] = getenv('VICHAN_REPLY_LIMIT') !== false ? (int)getenv('VICHAN_REPLY_LIMIT') : 250; + $config['max_links'] = getenv('VICHAN_MAX_LINKS') !== false ? (int)getenv('VICHAN_MAX_LINKS') : 20; + + $config['max_filesize'] = getenv('VICHAN_IMAGES_MAX_FILESIZE') !== false ? (int)getenv('VICHAN_IMAGES_MAX_FILESIZE') : 10485760; // This is 10MB + $config['thumb_width'] = getenv('VICHAN_IMAGES_THUMB_WIDTH') !== false ? (int)getenv('VICHAN_IMAGES_THUMB_WIDTH') : 250; + $config['thumb_height'] = getenv('VICHAN_IMAGES_THUMB_HEIGHT') !== false ? (int)getenv('VICHAN_IMAGES_THUMB_HEIGHT') : 250; + $config['max_width'] = getenv('VICHAN_IMAGES_MAX_WIDTH') !== false ? (int)getenv('VICHAN_IMAGES_MAX_WIDTH') : 10000; + $config['max_height'] = getenv('VICHAN_IMAGES_MAX_HEIGHT') !== false ? (int)getenv('VICHAN_IMAGES_MAX_HEIGHT') : 10000; + + $config['threads_per_page'] = getenv('VICHAN_DISPLAY_THREADS_PER_PAGE') !== false ? (int)getenv('VICHAN_DISPLAY_THREADS_PER_PAGE') : 10; + $config['max_pages'] = getenv('VICHAN_DISPLAY_MAX_PAGES') !== false ? (int)getenv('VICHAN_DISPLAY_MAX_PAGES') : 11; + $config['threads_preview'] = getenv('VICHAN_DISPLAY_THREADS_PREVIEW') !== false ? (int)getenv('VICHAN_DISPLAY_THREADS_PREVIEW') : 5; + + $config['root'] = getenv('VICHAN_DIRECTORIES_ROOT') !== false ? getenv('VICHAN_DIRECTORIES_ROOT') : '/'; + + $config['secure_trip_salt'] = $sg->generate(); + $config['secure_password_salt'] = $sg->generate(); // Set database configuration from Docker environment variables, leave empty if not found - $config['db'] = array( - 'type' => 'mysql', // Default, required for MySQL - 'server' => getenv('VICHAN_MYSQL_HOST') !== false ? getenv('VICHAN_MYSQL_HOST') : '', - 'database' => getenv('VICHAN_MYSQL_NAME') !== false ? getenv('VICHAN_MYSQL_NAME') : '', - 'user' => getenv('VICHAN_MYSQL_USER') !== false ? getenv('VICHAN_MYSQL_USER') : '', - 'password' => getenv('VICHAN_MYSQL_PASSWORD') !== false ? getenv('VICHAN_MYSQL_PASSWORD') : '', - ); + $config['db'] = array( + 'type' => 'mysql', // Default, required for MySQL + 'server' => getenv('VICHAN_MYSQL_HOST') !== false ? getenv('VICHAN_MYSQL_HOST') : '', + 'database' => getenv('VICHAN_MYSQL_NAME') !== false ? getenv('VICHAN_MYSQL_NAME') : '', + 'user' => getenv('VICHAN_MYSQL_USER') !== false ? getenv('VICHAN_MYSQL_USER') : '', + 'password' => getenv('VICHAN_MYSQL_PASSWORD') !== false ? getenv('VICHAN_MYSQL_PASSWORD') : '', + ); - // Append secure_login_only to $_SESSION['more'] if VICHAN_SECURE_LOGIN_ONLY is set - if (getenv('VICHAN_SECURE_LOGIN_ONLY') !== false) { - $secure_login_only = (int)getenv('VICHAN_SECURE_LOGIN_ONLY'); - $_SESSION['more'] .= "\n\$config['cookies']['secure_login_only'] = $secure_login_only;"; - } + // Append secure_login_only to $_SESSION['more'] if VICHAN_SECURE_LOGIN_ONLY is set + if (getenv('VICHAN_SECURE_LOGIN_ONLY') !== false) { + $secure_login_only = (int)getenv('VICHAN_SECURE_LOGIN_ONLY'); + $_SESSION['more'] .= "\n\$config['cookies']['secure_login_only'] = $secure_login_only;"; + } // Configuration notice at the top - $page['body'] = 'The following settings can still be configured later. For more customization options, check the Vichan configuration wiki.
The following settings can still be configured later. For more customization options, check the Vichan configuration wiki.
Thank you for using vichan. Please report any bugs you discover.
' . - 'If you are new to vichan, please check out the documentation.
'; + $page['title'] = 'Installation complete'; + $page['body'] = 'Thank you for using vichan. Please report any bugs you discover.
' . + 'If you are new to vichan, please check out the documentation.
'; // Admin panel notice - $page['body'] .= 'You can now log in to the admin panel at /mod.php using the default credentials:
' . - 'Username: admin
' . - 'Password: password
' . - 'Important: For security, please change the administrator password immediately after logging in.
' . - 'You can now log in to the admin panel at /mod.php using the default credentials:
' . + 'Username: admin
' . + 'Password: password
' . + 'Important: For security, please change the administrator password immediately after logging in.
' . + 'SQL errors were encountered when trying to install the database. This may be the result of using a database which is already occupied with a vichan installation; if so, you can probably ignore this.
The errors encountered were:
Warning: Ignoring errors is not recommended and may cause installation issues.
' . - 'SQL errors were encountered when trying to install the database. This may be the result of using a database which is already occupied with a vichan installation; if so, you can probably ignore this.
The errors encountered were:
Warning: Ignoring errors is not recommended and may cause installation issues.
' . + 'I couldn\'t remove install.php. You will have to remove it manually.
I couldn\'t remove install.php. You will have to remove it manually.
Thank you for using vichan. Please report any bugs you discover.
' . - 'If you are new to vichan, please check out the documentation.
'; + $page['title'] = 'Installation complete'; + $page['body'] = 'Thank you for using vichan. Please report any bugs you discover.
' . + 'If you are new to vichan, please check out the documentation.
'; - // Admin panel notice - $page['body'] .= 'You can now log in to the admin panel at /mod.php using the default credentials:
' . - 'Username: admin
' . - 'Password: password
' . - 'Important: For security, please change the administrator password immediately after logging in.
' . - 'You can now log in to the admin panel at /mod.php using the default credentials:
' . + 'Username: admin
' . + 'Password: password
' . + 'Important: For security, please change the administrator password immediately after logging in.
' . + 'I couldn\'t remove install.php. You will have to remove it manually.
I couldn\'t remove install.php. You will have to remove it manually.