commit f3d2a76dc307ad3d6b7dbf908ab63571f92147ba Author: KJ Date: Sat Sep 7 18:37:19 2024 -0400 first commit diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..87994c2 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,60 @@ +# Usamos Debian 13 como base +FROM docker.io/debian:trixie + +# Instalamos systemd, mariadb, php, nginx, etc. +RUN apt-get update && \ + apt-get install -y systemd systemd-sysv cron anacron nano wget curl git mariadb-server mariadb-client nginx php-fpm php-common php-gd php-mysql php-imap php-cli php-cgi libapache2-mod-fcgid apache2-suexec-pristine php-pear mcrypt imagemagick libruby libapache2-mod-python php-curl php-intl php-pspell php-sqlite3 php-tidy php-xmlrpc php-xsl memcached php-memcache php-imagick php-zip php-mbstring memcached libapache2-mod-passenger php-soap php-opcache php-apcu libapache2-reload-perl php-mcrypt && \ + apt-get clean + +# Instalamos phpmyadmin y definimos la contraseña de root de mariadb en blanco para @localhost. +RUN service mariadb start && \ + export DEBIAN_FRONTEND=noninteractive && \ + apt-get -yq install phpmyadmin && \ + mysql -e "SET PASSWORD FOR 'root'@'localhost' = PASSWORD(''); FLUSH PRIVILEGES;" && \ + service mariadb stop + +# Permitimos el que se pueda loguear sin contraseña para usar el usuario root de ese modo +RUN sed -i "s/ \/\/ \$cfg\['Servers'\]\[\$i\]\['AllowNoPassword'\]/ \$cfg\['Servers'\]\[\$i\]\['AllowNoPassword'\]/" /etc/phpmyadmin/config.inc.php + +# Añadimos las reglas nginx para poder ver phpmyadmin en http://localhost/phpmyadmin +RUN sed -i "s/server_name _;/server_name _;\n\nlocation \/phpmyadmin {\n root \/usr\/share\/;\n index index.php index.html index.htm;\n location ~ \^\/phpmyadmin\/\(.+\.php\)\$ {\n try_files \$uri =404;\n root \/usr\/share\/;\n fastcgi_pass unix:\/var\/run\/php\/php8.2-fpm.sock;\n fastcgi_index index.php;\n fastcgi_param SCRIPT_FILENAME \$request_filename;\n include \/etc\/nginx\/fastcgi_params;\n fastcgi_param PATH_INFO \$fastcgi_script_name;\n fastcgi_buffer_size 128k;\n fastcgi_buffers 256 4k;\n fastcgi_busy_buffers_size 256k;\n fastcgi_temp_file_write_size 256k;\n fastcgi_intercept_errors on;\n }\n location ~* \^\/phpmyadmin\/\(.+\\.\(jpg\|jpeg\|gif\|css\|png\|js\|ico\|html\|xml\|txt\)\)\$ {\n root \/usr\/share\/;\n }\n}\nlocation \/phpMyAdmin {\n rewrite \^\/* \/phpmyadmin last;\n}/g" /etc/nginx/sites-available/default + +# Mostrar los errores en PHP +RUN sed -i 's/display_errors = Off/display_errors = On/' /etc/php/8.2/fpm/php.ini && \ + sed -i 's/error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT/error_reporting = E_ALL/' /etc/php/8.2/fpm/php.ini + + +# Eliminamos los logs de apt +RUN rm -rf \ + /var/lib/apt/lists/* \ + /var/log/alternatives.log \ + /var/log/apt/history.log \ + /var/log/apt/term.log \ + /var/log/dpkg.log + +# Habilitar servicios +RUN systemctl enable mariadb.service && \ + systemctl enable php8.2-fpm.service && \ + systemctl enable nginx.service + +# Copiamos la configuración para un pool de PHP que corre como root +COPY php-root.conf /etc/php/8.2/fpm/pool.d/root.conf + +# Habilitamos que PHP pueda correr como root +RUN sed -i 's/--nodaemonize/--nodaemonize --allow-to-run-as-root/' /usr/lib/systemd/system/php8.2-fpm.service + +# Comandos para ejecutar dentro de docker y crear rápido configuraciones de dominios y subdominios +COPY bin/adddomain /usr/local/bin/adddomain +RUN chmod +x /usr/local/bin/adddomain +COPY bin/addsubdomain /usr/local/bin/addsubdomain +RUN chmod +x /usr/local/bin/addsubdomain + +# Colocamos dentro el certificado SSL +COPY ssl /etc/nginx/ssl + +# Configuración de puertos +EXPOSE 80 +EXPOSE 443 + +# Use systemd as command +CMD [ "/sbin/init" ] diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..8aa2645 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) [year] [fullname] + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/bin/adddomain b/bin/adddomain new file mode 100644 index 0000000..777b19e --- /dev/null +++ b/bin/adddomain @@ -0,0 +1,45 @@ +#!/bin/bash + +function main() { + bold=$(tput bold) + normal=$(tput sgr0) + phpsocket="/run/php/root8.2.sock" + + echo -n "${bold}Ingresa el dominio nombre del subdominio: $normal" + read -r domain + echo -e "Creando configración para \"$domain\" \U2705" + + mkdir "/var/www/$domain" + + echo "server { + listen 80; + + index index.html index.php; + + server_name $domain; + + root /var/www/$domain; + + location ~ \\.php\$ { + include snippets/fastcgi-php.conf; + fastcgi_pass unix:$phpsocket; + } + + location / { + try_files \$uri \$uri/ /index.php?\$args; + } +}"> "/etc/nginx/sites-available/$domain" + + ln -s "/etc/nginx/sites-available/$domain" "/etc/nginx/sites-enabled/" + + if nginx -t && service nginx reload; + then + echo "${bold}Instalación finalizada con éxito $normal \U2705 " + echo "" + echo "URL: http://$domain/" + else + echo "${bold} Error al instalar la configuración nginx $normal \U274C" + fi +} + +main \ No newline at end of file diff --git a/bin/addsubdomain b/bin/addsubdomain new file mode 100644 index 0000000..63c2962 --- /dev/null +++ b/bin/addsubdomain @@ -0,0 +1,56 @@ +#!/bin/bash + +function main() { + bold=$(tput bold) + normal=$(tput sgr0) + mainDomain="kj5.top" + phpsocket="/run/php/root8.2.sock" + + echo -n "${bold}Ingresa el dominio nombre del subdominio: $normal" + read -r domain + domain=$domain.$mainDomain + echo -e "Creando configración para \"$domain\" \U2705" + + mkdir "/var/www/$domain" + + echo "server { + listen 80; + server_name $domain; + return 301 https://\$server_name\$request_uri; +} + +server { + listen 443 ssl; + + ssl_certificate /etc/nginx/ssl/fullchain.cer; + ssl_certificate_key /etc/nginx/ssl/certificate.key; + + index index.html index.php; + + server_name $domain; + + root /var/www/$domain; + + location ~ \\.php\$ { + include snippets/fastcgi-php.conf; + fastcgi_pass unix:$phpsocket; + } + + location / { + try_files \$uri \$uri/ /index.php?\$args; + } +}"> "/etc/nginx/sites-available/$domain" + + ln -s "/etc/nginx/sites-available/$domain" "/etc/nginx/sites-enabled/" + + if nginx -t && service nginx reload; + then + echo "${bold}Instalación finalizada con éxito $normal \U2705" + echo "" + echo "URL: https://$domain/" + else + echo "${bold} Error al instalar la configuración nginx $normal \U274C" + fi +} + +main diff --git a/build.sh b/build.sh new file mode 100644 index 0000000..7350372 --- /dev/null +++ b/build.sh @@ -0,0 +1,2 @@ +#!/bin/bash +podman image build -t localhost/debian-web:latest . diff --git a/php-root.conf b/php-root.conf new file mode 100644 index 0000000..ad35346 --- /dev/null +++ b/php-root.conf @@ -0,0 +1,11 @@ +[www-root] +user = root +group = root + +listen = /run/php/root8.2.sock + +listen.owner = www-data +listen.group = www-data + +pm = ondemand +pm.max_children = 5 diff --git a/readme.org b/readme.org new file mode 100644 index 0000000..b16e391 --- /dev/null +++ b/readme.org @@ -0,0 +1,44 @@ +#+TITLE: Contenedor para desarrollo web +#+AUTHOR: KJ + +Este contenedor tiene el objetivo de proveer un contenedor que facilite tener un entorno de desarrollo con Nginx, PHP y MariaDB. + +Debo resaltar el hecho de que es de *DESARROLLO* puesto que en esta configuración priorizo mostrar errores fácilmente, evitar algunos otros que requieren configuraciones extra y en general facilitar el uso en la etapa de desarrollo. Po lo mismo, no recomiendo el uso de este contenedor en entornos de producción. + +* Instalación + +(documentación pendiente...) + +* Características + +** Nginx + +Como webserver es de lo mejor y aunque también podría ser viable usar taefik, caddy u otros, nginx suele ser más común en entornos de producción y aunque en la configuración priorizo que sea una configuración útil para desarrollo, igual busco que se parezca en lo posible a lo que tendría en un entorno de producción. + +** MariaBD + +La contraseña de root está en blanco. + +** PHP + +Tiene por defecto habilitado el mostrar todos los errores y tiene un pool que corre como root (repito, esto es para pruebas de desarrollo). + +** SSL + +Trae archivos para poder tener certificados SSL (=/etc/nginx/ssl=) en cualquier subdominio que terminie en =.kj5.top=, el dominio es de mi propiedad y he apuntado todos los subdominios (wildcard) hacia =127.0.0.1= para poder usarlo como dominio en localhost. + +Usando esto podemos simplificar la tarea de tener https en localhost para aquellas tareas que así lo requieren como acceder mediante javascript a la cámara o sencillamente para, nuevamente, parecernos lo más posible a un entorno de producción. + +** Comandos internos + +Ingresando dentro del contenedor, hay 2 comandos personalizados: + +*** adddomain + +Este comando creará la configuración del dominio indicado para nginx, además de la una carpeta en =/var/www/= con el nombre del mismo como raíz de dicho dominio. + +Cabe mencionar que esta configurción no tiene SSL. + +*** addsubdomain + +Crea la configuración nginx y la carpeta raíz en =/var/www/= de un subdominio que termina =.kj5.top= agregando también a nginx la configuración para tener SSL. diff --git a/ssl/certificate.key b/ssl/certificate.key new file mode 100644 index 0000000..d9ba404 --- /dev/null +++ b/ssl/certificate.key @@ -0,0 +1,5 @@ +-----BEGIN EC PRIVATE KEY----- +MHcCAQEEICwNmZf9mSvXJHuk1wuRSdTcRHWGmEqMgviO1Whvp3K4oAoGCCqGSM49 +AwEHoUQDQgAEEcVfavQwO0/YTjJZxsn58TKa1wKMfW5UzU7jWYl1PayQhw/m18E6 +e3ID46MYeuogcDsqKT7LnWAF9b9lirNUuw== +-----END EC PRIVATE KEY----- diff --git a/ssl/fullchain.cer b/ssl/fullchain.cer new file mode 100644 index 0000000..9afe999 --- /dev/null +++ b/ssl/fullchain.cer @@ -0,0 +1,48 @@ +-----BEGIN CERTIFICATE----- +MIIDczCCAvmgAwIBAgISA5/lI800ye9jHaYtywYsyw7iMAoGCCqGSM49BAMDMDIx +CzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MQswCQYDVQQDEwJF +NTAeFw0yNDA4MjcyMTU4MjhaFw0yNDExMjUyMTU4MjdaMBQxEjAQBgNVBAMMCSou +a2o1LnRvcDBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABBHFX2r0MDtP2E4yWcbJ ++fEymtcCjH1uVM1O41mJdT2skIcP5tfBOntyA+OjGHrqIHA7Kik+y51gBfW/ZYqz +VLujggILMIICBzAOBgNVHQ8BAf8EBAMCB4AwHQYDVR0lBBYwFAYIKwYBBQUHAwEG +CCsGAQUFBwMCMAwGA1UdEwEB/wQCMAAwHQYDVR0OBBYEFFIzIiPJAdVQ3M0xs1YJ +7HzDK+ebMB8GA1UdIwQYMBaAFJ8rX888IU+dBLftKyzExnCL0tcNMFUGCCsGAQUF +BwEBBEkwRzAhBggrBgEFBQcwAYYVaHR0cDovL2U1Lm8ubGVuY3Iub3JnMCIGCCsG +AQUFBzAChhZodHRwOi8vZTUuaS5sZW5jci5vcmcvMBQGA1UdEQQNMAuCCSoua2o1 +LnRvcDATBgNVHSAEDDAKMAgGBmeBDAECATCCAQQGCisGAQQB1nkCBAIEgfUEgfIA +8AB2AEiw42vapkc0D+VqAvqdMOscUgHLVt0sgdm7v6s52IRzAAABkZYOgpYAAAQD +AEcwRQIgPu03POjDQNV98t87HQ/9cZC73unefPUvAglkPkBScGcCIQDr57+HxfQP +aDSAffbiZJ2g8fnVYCgc65VqW+wH22vABwB2AN/hVuuqBa+1nA+GcY2owDJOrlbZ +bqf1pWoB0cE7vlJcAAABkZYOg4EAAAQDAEcwRQIhAP6/fjuFcQBW4lZ0NK+DgRsB +VoETY51LuBUkvM11359tAiAicW0xHTZOwhXTVMAaAGZuH9hH+7RknGOJs4niptO0 +bDAKBggqhkjOPQQDAwNoADBlAjAYHqQaMGH8ClssO6QfO9NVHs1mx5Vi1AfF8mFB +uvxG+tP+iS6GyipPiz8fAn7t92ECMQCmnpT/GobtsWgDj1oLrYGPeVl3V8I87Uuv +jZQqESbV7bBW1KlnMSnH9AS2DBXvzZA= +-----END CERTIFICATE----- + +-----BEGIN CERTIFICATE----- +MIIEVzCCAj+gAwIBAgIRAIOPbGPOsTmMYgZigxXJ/d4wDQYJKoZIhvcNAQELBQAw +TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh +cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMjQwMzEzMDAwMDAw +WhcNMjcwMzEyMjM1OTU5WjAyMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNTGV0J3Mg +RW5jcnlwdDELMAkGA1UEAxMCRTUwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQNCzqK +a2GOtu/cX1jnxkJFVKtj9mZhSAouWXW0gQI3ULc/FnncmOyhKJdyIBwsz9V8UiBO +VHhbhBRrwJCuhezAUUE8Wod/Bk3U/mDR+mwt4X2VEIiiCFQPmRpM5uoKrNijgfgw +gfUwDgYDVR0PAQH/BAQDAgGGMB0GA1UdJQQWMBQGCCsGAQUFBwMCBggrBgEFBQcD +ATASBgNVHRMBAf8ECDAGAQH/AgEAMB0GA1UdDgQWBBSfK1/PPCFPnQS37SssxMZw +i9LXDTAfBgNVHSMEGDAWgBR5tFnme7bl5AFzgAiIyBpY9umbbjAyBggrBgEFBQcB +AQQmMCQwIgYIKwYBBQUHMAKGFmh0dHA6Ly94MS5pLmxlbmNyLm9yZy8wEwYDVR0g +BAwwCjAIBgZngQwBAgEwJwYDVR0fBCAwHjAcoBqgGIYWaHR0cDovL3gxLmMubGVu +Y3Iub3JnLzANBgkqhkiG9w0BAQsFAAOCAgEAH3KdNEVCQdqk0LKyuNImTKdRJY1C +2uw2SJajuhqkyGPY8C+zzsufZ+mgnhnq1A2KVQOSykOEnUbx1cy637rBAihx97r+ +bcwbZM6sTDIaEriR/PLk6LKs9Be0uoVxgOKDcpG9svD33J+G9Lcfv1K9luDmSTgG +6XNFIN5vfI5gs/lMPyojEMdIzK9blcl2/1vKxO8WGCcjvsQ1nJ/Pwt8LQZBfOFyV +XP8ubAp/au3dc4EKWG9MO5zcx1qT9+NXRGdVWxGvmBFRAajciMfXME1ZuGmk3/GO +koAM7ZkjZmleyokP1LGzmfJcUd9s7eeu1/9/eg5XlXd/55GtYjAM+C4DG5i7eaNq +cm2F+yxYIPt6cbbtYVNJCGfHWqHEQ4FYStUyFnv8sjyqU8ypgZaNJ9aVcWSICLOI +E1/Qv/7oKsnZCWJ926wU6RqG1OYPGOi1zuABhLw61cuPVDT28nQS/e6z95cJXq0e +K1BcaJ6fJZsmbjRgD5p3mvEf5vdQM7MCEvU0tHbsx2I5mHHJoABHb8KVBgWp/lcX +GWiWaeOyB7RP+OfDtvi2OsapxXiV7vNVs7fMlrRjY1joKaqmmycnBvAq14AEbtyL +sVfOS66B8apkeFX2NY4XPEYV4ZSCe8VHPrdrERk2wILG3T/EGmSIkCYVUMSnjmJd +VQD9F6Na/+zmXCc= +-----END CERTIFICATE-----