first commit

This commit is contained in:
KJ 2024-09-07 18:37:19 -04:00
commit f3d2a76dc3
9 changed files with 292 additions and 0 deletions

60
Dockerfile Normal file
View File

@ -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" ]

21
LICENSE Normal file
View File

@ -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.

45
bin/adddomain Normal file
View File

@ -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

56
bin/addsubdomain Normal file
View File

@ -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

2
build.sh Normal file
View File

@ -0,0 +1,2 @@
#!/bin/bash
podman image build -t localhost/debian-web:latest .

11
php-root.conf Normal file
View File

@ -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

44
readme.org Normal file
View File

@ -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.

5
ssl/certificate.key Normal file
View File

@ -0,0 +1,5 @@
-----BEGIN EC PRIVATE KEY-----
MHcCAQEEICwNmZf9mSvXJHuk1wuRSdTcRHWGmEqMgviO1Whvp3K4oAoGCCqGSM49
AwEHoUQDQgAEEcVfavQwO0/YTjJZxsn58TKa1wKMfW5UzU7jWYl1PayQhw/m18E6
e3ID46MYeuogcDsqKT7LnWAF9b9lirNUuw==
-----END EC PRIVATE KEY-----

48
ssl/fullchain.cer Normal file
View File

@ -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-----