summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Dockerfile4
-rwxr-xr-xdocker/docker-entrypoint.sh19
-rw-r--r--docker/gen_config.php31
-rw-r--r--docs/docker.md138
4 files changed, 156 insertions, 36 deletions
diff --git a/Dockerfile b/Dockerfile
index 62638c9..bb0e98b 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -2,7 +2,7 @@ FROM alpine:latest
WORKDIR /var/www/html/4get
RUN apk update && apk upgrade
-RUN apk add php apache2-ssl php82-fileinfo php82-openssl php82-iconv php82-common php82-dom php82-curl curl php82-pecl-apcu php82-apache2 imagemagick php82-pecl-imagick php-mbstring imagemagick-webp imagemagick-jpeg
+RUN apk add php apache2-ssl php83-fileinfo php83-openssl php83-iconv php83-common php83-dom php83-curl curl php83-pecl-apcu php83-apache2 imagemagick php83-pecl-imagick php-mbstring imagemagick-webp imagemagick-jpeg
COPY ./docker/apache/ /etc/apache2/
COPY . .
@@ -12,4 +12,6 @@ RUN chmod 777 /var/www/html/4get/icons
EXPOSE 80
EXPOSE 443
+ENV FOURGET_PROTO=http
+
CMD ["./docker/docker-entrypoint.sh"]
diff --git a/docker/docker-entrypoint.sh b/docker/docker-entrypoint.sh
index 0a41ddd..bdb706a 100755
--- a/docker/docker-entrypoint.sh
+++ b/docker/docker-entrypoint.sh
@@ -1,14 +1,23 @@
#!/bin/sh
set -e
-if [ ! -f /etc/4get/certs/fullchain.pem ] || [ ! -f /etc/4get/certs/privkey.pem ]; then
- echo "Using http configuration"
- cp /etc/apache2/http.conf /etc/apache2/httpd.conf
-else
+
+# remove quotes from variable if present
+FOURGET_PROTO="${FOURGET_PROTO%\"}"
+FOURGET_PROTO="${FOURGET_PROTO#\"}"
+
+# make lowercase
+FOURGET_PROTO=`echo $FOURGET_PROTO | awk '{print tolower($0)}'`
+
+
+if [ "$FOURGET_PROTO" = "https" ] || [ -f /etc/4get/certs/fullchain.pem ] || [ -f /etc/4get/certs/privkey.pem ]; then
echo "Using https configuration"
cp /etc/apache2/https.conf /etc/apache2/httpd.conf
+else
+ echo "Using http configuration"
+ cp /etc/apache2/http.conf /etc/apache2/httpd.conf
fi
-php82 ./docker/gen_config.php
+php ./docker/gen_config.php
echo "4get is running"
diff --git a/docker/gen_config.php b/docker/gen_config.php
index cb12e3a..cc43916 100644
--- a/docker/gen_config.php
+++ b/docker/gen_config.php
@@ -3,19 +3,21 @@
include "/var/www/html/4get/data/config.php";
$refl = new ReflectionClass('config');
-$config = ($refl->getConstants());
+$from_config = ($refl->getConstants());
+$from_env = array();
$env = getenv();
$fourget_env = array_filter($env, function($v, $k) {
return str_starts_with($k, "FOURGET");
}, ARRAY_FILTER_USE_BOTH);
-
foreach($fourget_env as $key => $val) {
$target_key = preg_replace('/^FOURGET_/', '', $key);
- $config[$target_key] = trim($val, '\'"');
+ $from_env[$target_key] = trim($val, '\'"');
};
+$merged_config = array_merge($from_config, $from_env);
+
function type_to_string($n) {
$type = gettype($n);
if ($type === "NULL") {
@@ -52,26 +54,31 @@ function detect_captcha_dirs() {
}
-$special_keys = ["CAPTCHA_DATASET", "INSTANCES"];
+$special_keys = ["PROTO", "CAPTCHA_DATASET"];
$output = "<?php\n // This file was generated by docker/gen_config.php\n";
$output = $output . "class config {\n";
-foreach(($config) as $key => $val){
+foreach(($merged_config) as $key => $val){
if(!in_array($key, $special_keys)) {
-$output = $output . "\tconst " . $key . " = " . type_to_string($val) . ";\n";
-continue;
+
+ // conversion between arrays and comma separated env value.
+ // If original type of field is array and there is a type mismatch such as when a comma separted string is passed,
+ // then split on comma if string and not numeric
+ if(gettype($from_config[$key]) != gettype($val) && !is_numeric($val)) {
+ $data = gettype($val) === "string" ? explode(",", $val) : $val;
+ $output = $output . "\tconst " . $key . " = " . type_to_string($data) . ";\n";
+ } else {
+ $output = $output . "\tconst " . $key . " = " . type_to_string($val) . ";\n";
+ }
+
+ continue;
}
if($key === "CAPTCHA_DATASET") {
$output = $output . "\tconst " . $key . " = " . type_to_string(detect_captcha_dirs()) . ";\n";
}
- if($key === "INSTANCES") {
- $instances_list = gettype($val) === "string" ? explode(",", $val) : $val;
- $output = $output . "\tconst " . $key . " = " . type_to_string($instances_list) . ";\n";
- }
-
}
$output = $output . "}\n";
diff --git a/docs/docker.md b/docs/docker.md
index 2aabd9f..e56b5ca 100644
--- a/docs/docker.md
+++ b/docs/docker.md
@@ -1,50 +1,152 @@
-# Install guide for Docker
+#### Install guide for Docker
+
+When using docker container any environment variables prefixed with `FOURGET_` will be added to the generated config located at `/var/www/html/4get/data/config.php`
+
+When lists of data is expected in [data/config.php](../data/config.php), such as `INSTANCES`, you can pass in a comma separated string via environment variable.
+
+Example:
+`FOURGET_INSTANCES="https://4get.ca,https://domain.tld"`
+
+#### Special environment variables
+
+| Name | value | Example |
+| - | - | - |
+| FOURGET_PROTO | "http" or "https" | "https" |
+
+
+#### Important directories
+
+| Mountpoint | Description |
+| - | - |
+| /etc/4get/certs | SSL certificate directory |
+| /var/www/html/4get/banner | Custom Banners directory |
+| /var/www/html/4get/data/captcha | Captcha dataset |
+
+
+the certificate directory `/etc/4get/certs` expects files named `fullchain.pem` and `privkey.pem`
+
+The captcha dataset should have a subdirectory for each category. In each category, images should be named from 1.png to X.png, and be 100x100 in size.
+
+example directory structure:
```
-docker run -d -p 80:80 -e FOURGET_SERVER_NAME="4get.ca" luuul/4get:latest
+captcha/
+ birds/
+ 1.png
+ 2.png
+ 3.png
+ anime/
+ 1.png
+ 2.png
```
-...Or with SSL:
+For more information on configuration view [data/config.php](../data/config.php)
+
+#### Usage
+
+You can start 4get with
+
```
-docker run -d -p 443:443 -v /etc/letsencrypt/live/domain.tld:/etc/4get/certs -e FOURGET_SERVER_NAME="4get.ca" luuul/4get:latest
+docker run -d -p 80:80 -e FOURGET_SERVER_NAME="4get.ca" -e FOURGET_PROTO="http" luuul/4get:latest
```
-if the certificate files are not mounted to /etc/4get/certs the service listens to port 80
+...Or with SSL:
-the certificate directory expects files named `fullchain.pem` and `privkey.pem`
+```
+docker run -d -p 443:443 -e FOURGET_SERVER_NAME="4get.ca" -e FOURGET_PROTO="https" -v /etc/letsencrypt/live/domain.tld:/etc/4get/certs luuul/4get:latest
+```
-# Install using Docker Compose
-copy `docker-compose.yaml`
+#### With Docker Compose
+
+Replace relevant values and start with `docker compose up -d`
-to serve custom banners create a directory named `banners` for example with images and mount to `/var/www/html/4get/banner`
+##### HTTP
-to serve captcha images create a directory named `captchas` for example containing subfolders with images and mount to `/var/www/html/4get/data/captcha`
+```
+# docker-compose.yaml
+version: "3.7"
-any environment variables prefixed with `FOURGET_` will be added to the generated config
+services:
+ fourget:
+ image: luuul/4get:latest
+ restart: unless-stopped
+ environment:
+ - FOURGET_VERSION=6
+ - FOURGET_PROTO=http
+ - FOURGET_SERVER_NAME=4get.ca
-the entrypoint will automatically set the `CAPTCHA_DATASET` value for you based on directory names and number of files in each
+ ports:
+ - "80:80"
+```
-to set `INSTANCES` pass a comma separated string of urls (FOURGET_INSTANCES = "https://4get.ca,https://domain.tld")
+##### HTTPS
```
+# docker-compose.yaml
version: "3.7"
services:
fourget:
image: luuul/4get:latest
- restart: always
+ restart: unless-stopped
environment:
+ - FOURGET_VERSION=6
+ - FOURGET_PROTO=https
- FOURGET_SERVER_NAME=4get.ca
ports:
- "80:80"
- "443:443"
-
+
volumes:
- /etc/letsencrypt/live/domain.tld:/etc/4get/certs
- - ./banners:/var/www/html/4get/banner
- - ./captchas:/var/www/html/4get/data/captcha
```
-Replace relevant values and start with `docker compose up -d`
+##### Captcha Enabled
+
+Set `FOURGET_BOT_PROTECTION=1` and mount a directory containing captcha files to `/var/www/html/4get/data/captcha`
+
+
+```
+# docker-compose.yaml
+version: "3.7"
+
+services:
+ fourget:
+ image: luuul/4get:latest
+ restart: unless-stopped
+ environment:
+ - FOURGET_VERSION=6
+ - FOURGET_PROTO=http
+ - FOURGET_SERVER_NAME=4get.ca
+ - FOURGET_BOT_PROTECTION=1
+
+ ports:
+ - "80:80"
+
+ volumes:
+ - ./captcha:/var/www/html/4get/data/captcha
+```
+
+##### Custom Banners
+
+```
+# docker-compose.yaml
+version: "3.7"
+
+services:
+ fourget:
+ image: luuul/4get:latest
+ restart: unless-stopped
+ environment:
+ - FOURGET_VERSION=6
+ - FOURGET_PROTO=http
+ - FOURGET_SERVER_NAME=4get.ca
+
+ ports:
+ - "80:80"
+
+ volumes:
+ - ./banners:/var/www/html/4get/banner
+```