diff --git a/Dockerfile b/Dockerfile index 3b21ba087..1588311c5 100755 --- a/Dockerfile +++ b/Dockerfile @@ -1,20 +1,13 @@ FROM php:8-apache +# use docker-php-extension-installer for automatically get the right packages installed +ADD --chmod=0755 https://github.com/mlocati/docker-php-extension-installer/releases/latest/download/install-php-extensions /usr/local/bin/ + + # Install extensions -RUN apt-get update && apt-get install -y --no-install-recommends \ - libfreetype6-dev \ - libjpeg62-turbo-dev \ - libpng-dev \ - libpq-dev \ - && docker-php-ext-install -j$(nproc) iconv \ - && docker-php-ext-configure gd --with-freetype=/usr/include/ --with-jpeg=/usr/include/ \ - && docker-php-ext-configure pgsql -with-pgsql=/usr/local/pgsql \ - && docker-php-ext-install -j$(nproc) gd pdo pdo_mysql pdo_pgsql pgsql \ - && rm -f /usr/src/php.tar.xz /usr/src/php.tar.xz.asc \ - && apt-get remove -y libfreetype6-dev \ - libjpeg62-turbo-dev \ - libpng-dev \ - libpq-dev \ +RUN install-php-extensions iconv gd pdo pdo_mysql pdo_pgsql pgsql + +RUN rm -f /usr/src/php.tar.xz /usr/src/php.tar.xz.asc \ && apt autoremove -y \ && rm -rf /var/lib/apt/lists/* @@ -43,11 +36,11 @@ ENV PASSWORD=password ENV TELEMETRY=false ENV ENABLE_ID_OBFUSCATION=false ENV REDACT_IP_ADDRESSES=false -ENV WEBPORT=80 +ENV WEBPORT=8080 # https://httpd.apache.org/docs/2.4/stopping.html#gracefulstop STOPSIGNAL SIGWINCH # Final touches -EXPOSE 80 +EXPOSE ${WEBPORT} CMD ["bash", "/entrypoint.sh"] diff --git a/Dockerfile.alpine b/Dockerfile.alpine index 0fbc59a08..89d8297cf 100755 --- a/Dockerfile.alpine +++ b/Dockerfile.alpine @@ -1,28 +1,26 @@ FROM php:8-alpine - -# Install extensions RUN apk add --quiet --no-cache \ bash \ apache2 \ - apache2-ssl \ - php83-apache2 \ - php83-ctype \ - php83-openssl \ - php-gd php-session php-sqlite3 \ - php-pdo php-pgsql php83-pdo_mysql php-pdo_pgsql php-pdo_sqlite \ - freetype-dev \ - libjpeg-turbo-dev \ - libpng-dev \ - libpq-dev \ - && docker-php-ext-configure gd --with-freetype=/usr/include/ --with-jpeg=/usr/include/ \ - && docker-php-ext-configure pgsql -with-pgsql=/usr/local/pgsql \ - && docker-php-ext-install -j$(nproc) gd pdo pdo_mysql pdo_pgsql pgsql \ - && rm -f /usr/src/php.tar.xz /usr/src/php.tar.xz.asc \ - && apk del --quiet --no-cache \ - freetype-dev \ - libjpeg-turbo-dev \ - libpng-dev \ - libpq-dev + php-apache2 \ + php-ctype \ + php-gd \ + php-openssl \ + php-pdo \ + php-pdo_mysql \ + php-pdo_pgsql \ + php-pdo_sqlite \ + php-pgsql \ + php-session \ + php-sqlite3 + +# use docker-php-extension-installer for automatically get the right packages installed +ADD --chmod=0755 https://github.com/mlocati/docker-php-extension-installer/releases/latest/download/install-php-extensions /usr/local/bin/ + + + +# Install extensions +RUN install-php-extensions iconv gd pdo pdo_mysql pdo_pgsql pgsql #RUN ln -sf /dev/stdout /var/log/apache2/access.log && \ # ln -sf /dev/stderr /var/log/apache2/error.log @@ -54,11 +52,13 @@ ENV PASSWORD=password ENV TELEMETRY=false ENV ENABLE_ID_OBFUSCATION=false ENV REDACT_IP_ADDRESSES=false -ENV WEBPORT=80 +ENV WEBPORT=8080 # https://httpd.apache.org/docs/2.4/stopping.html#gracefulstop STOPSIGNAL SIGWINCH +WORKDIR /var/www/html + # Final touches -EXPOSE 80 +EXPOSE ${WEBPORT} CMD ["bash", "/entrypoint.sh"] diff --git a/docker/entrypoint.sh b/docker/entrypoint.sh index da18255fb..8bcfbe8ab 100755 --- a/docker/entrypoint.sh +++ b/docker/entrypoint.sh @@ -3,6 +3,10 @@ set -e set -x +is_alpine() { + [ -f /etc/alpine-release ] +} + # Cleanup rm -rf /var/www/html/* @@ -13,7 +17,7 @@ cp /speedtest/*.js /var/www/html/ cp /speedtest/favicon.ico /var/www/html/ # Set custom webroot on alpine -if [ -f /etc/alpine-release ]; then +if is_alpine; then sed -i "s#\"/var/www/localhost/htdocs\"#\"/var/www/html\"#g" /etc/apache2/httpd.conf fi @@ -39,7 +43,7 @@ if [ "$MODE" != "backend" ]; then fi # Apply Telemetry settings when running in standalone or frontend mode and telemetry is enabled -if [[ "$TELEMETRY" == "true" && ( "$MODE" == "frontend" || "$MODE" == "standalone" || "$MODE" == "dual" ) ]]; then +if [[ "$TELEMETRY" == "true" && ("$MODE" == "frontend" || "$MODE" == "standalone" || "$MODE" == "dual") ]]; then cp -r /speedtest/results /var/www/html/results if [ "$MODE" == "frontend" ]; then @@ -47,16 +51,16 @@ if [[ "$TELEMETRY" == "true" && ( "$MODE" == "frontend" || "$MODE" == "standalon cp /speedtest/backend/getIP_util.php /var/www/html/backend fi - if [ "$DB_TYPE" == "mysql" ]; then + if [ "$DB_TYPE" == "mysql" ]; then sed -i 's/$db_type = '\''.*'\''/$db_type = '\'$DB_TYPE\''/g' /var/www/html/results/telemetry_settings.php sed -i 's/$MySql_username = '\''.*'\''/$MySql_username = '\'$DB_USERNAME\''/g' /var/www/html/results/telemetry_settings.php sed -i 's/$MySql_password = '\''.*'\''/$MySql_password = '\'$DB_PASSWORD\''/g' /var/www/html/results/telemetry_settings.php sed -i 's/$MySql_hostname = '\''.*'\''/$MySql_hostname = '\'$DB_HOSTNAME\''/g' /var/www/html/results/telemetry_settings.php sed -i 's/$MySql_databasename = '\''.*'\''/$MySql_databasename = '\'$DB_NAME\''/g' /var/www/html/results/telemetry_settings.php - if [ "$DB_PORT" != "" ]; then + if [ "$DB_PORT" != "" ]; then sed -i 's/$MySql_port = '\''.*'\''/$MySql_port = '\'$DB_PORT\''/g' /var/www/html/results/telemetry_settings.php fi - elif [ "$DB_TYPE" == "postgresql" ]; then + elif [ "$DB_TYPE" == "postgresql" ]; then sed -i 's/$db_type = '\''.*'\''/$db_type = '\'$DB_TYPE\''/g' /var/www/html/results/telemetry_settings.php sed -i 's/$PostgreSql_username = '\''.*'\''/$PostgreSql_username = '\'$DB_USERNAME\''/g' /var/www/html/results/telemetry_settings.php sed -i 's/$PostgreSql_password = '\''.*'\''/$PostgreSql_password = '\'$DB_PASSWORD\''/g' /var/www/html/results/telemetry_settings.php @@ -78,14 +82,22 @@ if [[ "$TELEMETRY" == "true" && ( "$MODE" == "frontend" || "$MODE" == "standalon fi mkdir -p /database/ - chown www-data /database/ + if is_alpine; then + chown apache /database/ + else + chown www-data /database/ + fi fi -chown -R www-data /var/www/html/* +if is_alpine; then + chown -R apache /var/www/html/* +else + chown -R www-data /var/www/html/* +fi # Allow selection of Apache port for network_mode: host if [ "$WEBPORT" != "80" ]; then - if [ -f /etc/alpine-release ]; then + if is_alpine; then sed -i "s/^Listen 80\$/Listen $WEBPORT/g" /etc/apache2/httpd.conf else sed -i "s/^Listen 80\$/Listen $WEBPORT/g" /etc/apache2/ports.conf @@ -96,7 +108,7 @@ fi echo "Done, Starting APACHE" # This runs apache -if [ -f /etc/alpine-release ]; then +if is_alpine; then exec httpd -DFOREGROUND else exec apache2-foreground diff --git a/docker/test/.env b/docker/test/.env new file mode 100644 index 000000000..68023f010 --- /dev/null +++ b/docker/test/.env @@ -0,0 +1 @@ +COMPOSE_PROJECT_NAME=speedtest-test diff --git a/docker/test/docker-compose.yml b/docker/test/docker-compose.yml new file mode 100644 index 000000000..918fe74a7 --- /dev/null +++ b/docker/test/docker-compose.yml @@ -0,0 +1,104 @@ +## this is a docker compose file used to test all scenarios +## do not use it in production + +services: + ###################### POSTGRESQL ################################ + pg: + image: postgres:alpine + environment: + POSTGRES_PASSWORD: Not4SecureProduction + POSTGRES_USER: librespeed + volumes: + # mount init script from source to create database tables + - ../../results/telemetry_postgresql.sql:/docker-entrypoint-initdb.d/01-init.sql + + speedtest-debian-pg: + build: + context: ../.. + dockerfile: Dockerfile + environment: &env_vars_pg + - PASSWORD=gimmeTheStats1337 + - DB_HOSTNAME=pg + - DB_NAME=librespeed + - DB_PASSWORD=Not4SecureProduction + - DB_TYPE=postgresql + - DB_USERNAME=librespeed + - EMAIL=test@example.com + - ENABLE_ID_OBFUSCATION=true + - MODE=standalone + - REDACT_IP_ADDRESSES=true + - TELEMETRY=true + ports: + - 9123:8080 + + speedtest-alpine-pg: + build: + context: ../.. + dockerfile: Dockerfile.alpine + environment: *env_vars_pg + ports: + - 9124:8080 + + ####################### MYSQL ############################## + + mysql: + image: mysql:lts + environment: + MYSQL_ROOT_PASSWORD: Not4SecureProduction + MYSQL_USER: librespeed + MYSQL_PASSWORD: Not4SecureProduction + MYSQL_DATABASE: librespeed + volumes: + # mount init script from source to create database tables + - ../../results/telemetry_mysql.sql:/docker-entrypoint-initdb.d/01-init.sql + + speedtest-debian-mysql: + # check at http://localhost:9125/results/sanitycheck.php + build: + context: ../.. + dockerfile: Dockerfile + environment: &env_vars_mysql + - PASSWORD=gimmeTheStats1337 + - DB_HOSTNAME=mysql + - DB_NAME=librespeed + - DB_PASSWORD=Not4SecureProduction + - DB_TYPE=mysql + - DB_USERNAME=librespeed + - EMAIL=test@example.com + - ENABLE_ID_OBFUSCATION=true + - MODE=standalone + - REDACT_IP_ADDRESSES=true + - TELEMETRY=true + ports: + - 9125:8080 + speedtest-alpine-mysql: + build: + context: ../.. + dockerfile: Dockerfile.alpine + environment: *env_vars_mysql + ports: + - 9126:8080 + + ###### SQLITE ###### + speedtest-debian-sqlite: + # check at http://localhost:9125/results/sanitycheck.php + build: + context: ../.. + dockerfile: Dockerfile + environment: &env_vars_sqlite + - PASSWORD=gimmeTheStats1337 + - EMAIL=test@example.com + - ENABLE_ID_OBFUSCATION=true + - MODE=standalone + - REDACT_IP_ADDRESSES=true + - TELEMETRY=true + ports: + - 9127:8080 + + speedtest-alpine-sqlite: + build: + context: ../.. + dockerfile: Dockerfile.alpine + environment: *env_vars_sqlite + ports: + - 9128:8080