Compare commits

..

10 Commits

Author SHA1 Message Date
kj
b6dbe6a8b4 Update SSL Certificate. 2025-06-25 17:23:42 -03:00
kj
3315b48b5e Update to PHP 8.4 2025-06-07 14:10:39 -03:00
kj
0785a84d0f Update SSL certtificate. 2025-04-26 20:21:34 -03:00
kj
575f0e3629 Add instalation config. 2025-04-24 13:58:57 -03:00
kj
185132a409 Update Wildcard SSL. 2025-02-25 18:08:31 -03:00
kj
11398f0dd9 Update to PHP 8.4 2025-02-18 06:56:07 -03:00
kj
59e4c7426e Update SSL wilcard certificate for *.kj5.top. 2024-11-27 17:00:20 -04:00
kj
f68532f4bb Move SSL certificate to works as a volume. 2024-11-27 16:34:26 -04:00
kj
94cb984581 Fix database persistence. 2024-11-27 16:07:36 -04:00
kj
80c26eca05 Improve mysql_configure script. 2024-11-27 15:43:37 -04:00
9 changed files with 158 additions and 136 deletions

View File

@ -3,12 +3,12 @@ FROM docker.io/debian:trixie
# Instalamos systemd, mariadb, php, nginx, etc. # Instalamos systemd, mariadb, php, nginx, etc.
RUN apt-get update && \ 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 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-cli php-cgi libapache2-mod-fcgid apache2-suexec-pristine php-pear mcrypt imagemagick libruby 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 apt-get clean
# Mostrar los errores en PHP # Mostrar los errores en PHP
RUN sed -i 's/display_errors = Off/display_errors = On/' /etc/php/8.2/fpm/php.ini && \ RUN sed -i 's/display_errors = Off/display_errors = On/' /etc/php/8.4/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 sed -i 's/error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT/error_reporting = E_ALL/' /etc/php/8.4/fpm/php.ini
# Eliminamos los logs de apt # Eliminamos los logs de apt
@ -21,14 +21,14 @@ RUN rm -rf \
# Habilitar servicios # Habilitar servicios
RUN systemctl enable mariadb.service && \ RUN systemctl enable mariadb.service && \
systemctl enable php8.2-fpm.service && \ systemctl enable php8.4-fpm.service && \
systemctl enable nginx.service systemctl enable nginx.service
# Copiamos la configuración para un pool de PHP que corre como root # 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 COPY php-root.conf /etc/php/8.4/fpm/pool.d/root.conf
# Habilitamos que PHP pueda correr como root # 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 RUN sed -i 's/--nodaemonize/--nodaemonize --allow-to-run-as-root/' /usr/lib/systemd/system/php8.4-fpm.service
# Comandos para ejecutar dentro de docker y crear rápido configuraciones de dominios y subdominios # Comandos para ejecutar dentro de docker y crear rápido configuraciones de dominios y subdominios
COPY bin/adddomain /usr/local/bin/adddomain COPY bin/adddomain /usr/local/bin/adddomain
@ -38,9 +38,6 @@ RUN chmod +x /usr/local/bin/addsubdomain
COPY bin/mysql_configure /usr/local/bin/mysql_configure COPY bin/mysql_configure /usr/local/bin/mysql_configure
RUN chmod +x /usr/local/bin/mysql_configure RUN chmod +x /usr/local/bin/mysql_configure
# Colocamos dentro el certificado SSL
COPY ssl /etc/nginx/ssl
# Configuración de puertos # Configuración de puertos
EXPOSE 80 EXPOSE 80
EXPOSE 443 EXPOSE 443

View File

@ -3,7 +3,7 @@
function main() { function main() {
bold=$(tput bold) bold=$(tput bold)
normal=$(tput sgr0) normal=$(tput sgr0)
phpsocket="/run/php/root8.2.sock" phpsocket="/run/php/root8.4.sock"
echo -n "${bold}Ingresa el dominio nombre del subdominio: $normal" echo -n "${bold}Ingresa el dominio nombre del subdominio: $normal"
read -r domain read -r domain

View File

@ -4,7 +4,7 @@ function main() {
bold=$(tput bold) bold=$(tput bold)
normal=$(tput sgr0) normal=$(tput sgr0)
mainDomain="kj5.top" mainDomain="kj5.top"
phpsocket="/run/php/root8.2.sock" phpsocket="/run/php/root8.4.sock"
echo -n "${bold}Ingresa el dominio nombre del subdominio: $normal" echo -n "${bold}Ingresa el dominio nombre del subdominio: $normal"
read -r domain read -r domain

View File

@ -1,30 +1,44 @@
#!/bin/bash #!/bin/bash
# Verificamos si ya está todo configurado # Inicializando la base de datos
if test -f /etc/phpmyadmin/config.inc.php; then if test -f /var/lib/mysql/mysql; then
echo "Parece que ya está todo configurado (se hace nada)." echo "Base de datos ya inicialiada (se hace nada)."
exit chown -R mysql:mysql /var/lib/mysql
else
echo "Inicializando la base de datos..."
mkdir -p /var/lib/mysql/mysql
chown -R mysql:mysql /var/lib/mysql
mariadb-install-db
fi fi
# Definiendo una contraseña vacía para root # Definiendo una contraseña vacía para root
echo "Definiendo contraseña para root (contraseña en blanco)." echo "Definiendo contraseña para root (contraseña en blanco)."
systemctl start mariadb systemctl start mariadb
export DEBIAN_FRONTEND=noninteractive
apt-get update
apt-get -yq install phpmyadmin
mysql -e "SET PASSWORD FOR 'root'@'localhost' = PASSWORD(''); FLUSH PRIVILEGES;" mysql -e "SET PASSWORD FOR 'root'@'localhost' = PASSWORD(''); FLUSH PRIVILEGES;"
# Permitimos el que se pueda loguear sin contraseña para usar el usuario root en phpmyadmin # Verificamos si ya está todo configurado
sed -i "s/ \/\/ \$cfg\['Servers'\]\[\$i\]\['AllowNoPassword'\]/ \$cfg\['Servers'\]\[\$i\]\['AllowNoPassword'\]/" /etc/phpmyadmin/config.inc.php if test -f /etc/phpmyadmin/config.inc.php; then
echo "Se ha detectado que phpmyadmin ya esta instalado"
else
echo "Instalando phpmyadmin..."
export DEBIAN_FRONTEND=noninteractive
apt-get update
apt-get -yq install phpmyadmin
# Permitimos el que se pueda loguear sin contraseña para usar el usuario root en phpmyadmin
sed -i "s/ \/\/ \$cfg\['Servers'\]\[\$i\]\['AllowNoPassword'\]/ \$cfg\['Servers'\]\[\$i\]\['AllowNoPassword'\]/" /etc/phpmyadmin/config.inc.php
fi
# Añadimos las reglas nginx para poder ver phpmyadmin en http://localhost/phpmyadmin # Añadimos las reglas nginx para poder ver phpmyadmin en http://localhost/phpmyadmin
if grep -e "phpmyadmin" /etc/nginx/sites-available/default >/dev/null if grep -e "phpmyadmin" /etc/nginx/sites-available/default >/dev/null
then then
echo "Se detectó que nginx ya tiene una configuración para PHPmyadmin (se hace nada)" echo "Se detectó que nginx ya tiene una configuración para PHPmyadmin (se hace nada)"
else else
echo "Configurando Nginx..." echo "Configurando Nginx para phpmyadmin..."
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 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.4-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
fi fi
echo "Recargado configuración de nginx"
nginx -t && systemctl reload nginx
echo "Finalizado :)." echo "Finalizado :)."

View File

@ -11,4 +11,5 @@ services:
- ~/.mnt/Nginx:/var/www:Z - ~/.mnt/Nginx:/var/www:Z
- ./data/nginx/sites-available:/etc/nginx/sites-available:Z - ./data/nginx/sites-available:/etc/nginx/sites-available:Z
- ./data/nginx/sites-enabled:/etc/nginx/sites-enabled:Z - ./data/nginx/sites-enabled:/etc/nginx/sites-enabled:Z
- ./data/mysql/data:/var/lib/mysql/data:Z - ./data/mysql/:/var/lib/mysql/:Z
- ./ssl:/etc/nginx/ssl:Z

View File

@ -2,7 +2,7 @@
user = root user = root
group = root group = root
listen = /run/php/root8.2.sock listen = /run/php/root8.4.sock
listen.owner = www-data listen.owner = www-data
listen.group = www-data listen.group = www-data

View File

@ -5,9 +5,82 @@ Este contenedor tiene el objetivo de proveer un contenedor que facilite tener un
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. 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.
* Requerimientos
- Docker / podman
En caso de usar podman, también se necesitara podman-compose y también puedo recomendar tener podman-docker. También puede que sea necesario reiniciar el ordenador justo luego de instalar para que inicien correctamente los controladores que requieren los contenedores.
** Rootless
En caso de usarlo en formato rootless (sin sudo por delante, para los neofitos), que suele ser la manera usual y más cómoda hoy en día, también es necesario permitir que los usuarios que no son root puedan bindear el puerto 80. Para ello, camos a corret este comando:
#+begin_src bash
sudo sysctl net.ipv4.ip_unprivileged_port_start=80
#+end_src
Con esto sólo vamos a tener habilitado el pueto 80 hasta reinciar el PC, para hacerlo permamente hay que editar el archivo =/etc/sysctl.d/99-sysctl.conf= o el archivo =/etc/sysctl.conf= para algunas otras distros y añadimos al final esta línea:
#+begin_src
net.ipv4.ip_unprivileged_port_start=80
#+end_src
Y con eso ya se podría usar el puerto 80 como rootless, hasta que el servidor se reinicie.
* Instalación * Instalación
(documentación pendiente...) Solo es necesario correr:
#+begin_src bash
docker compose up -d
#+end_src
O en caso de usar podman también se puede usar:
#+begin_src bash
podman compose up -d
#+end_src
Puede que en distros con paquetería muy vieja (Debian 12 o inferiores) sea necesario instalar podman-compose desde pip para tener la última versión (obtienes mejor compatibilidad) y el comando debe ser =podman-compose= (guión en lugar de espacio).
** Iniciar/Detener contenedor
Luego de "instalado", puedes solo iniciar el contenedor o detenerlo usando los comandos usuales de podman/docker
#+begin_src bash
# Con Docker
docker start nginx # Inicia el contendor
docker stop nginx # Detiene el contenedor
# Con podman
podman start nginx # Inicia el contendor
podman stop nginx # Detiene el contenedor
#+end_src
** Desinstalar
En caso de que quieras eliminar los contenedores
#+begin_src bash
docker compose down
#+end_src
o si tienes podman:
#+begin_src bash
podman compose down
#+end_src
** Mover/Copiar con datos persistentes
Debido a que la carpeta mysql termina bajo otro nombre de usuario distintos, antes de copiar/mover los archivos, es necesario primero cambiar eso a nuestro usuario o nos dará error:
#+begin_src bash
sudo chown -R $USER:$USER data/mysql/
#+end_src
Luego de eso solo es copiar/mover los archivos y volver a correr los comandos de instalación.
* Características * Características

View File

@ -1,51 +1,5 @@
-----BEGIN RSA PRIVATE KEY----- -----BEGIN EC PRIVATE KEY-----
MIIJKAIBAAKCAgEAtxj3/Pb8hWl3TTPSV3BXr1ybIUoUQppM5m+PHFHe2OFD8Ap3 MHcCAQEEIHxEbISIm9JgkuNJ4ZiaHYzynT5SxpwMS40HUDl/Y6kooAoGCCqGSM49
mkJ0dg2dv8Pw7E6/hO38syt9LXDYoncaBlLz918l5lw6l7WvLiVSv4SHUf0ncAgm AwEHoUQDQgAE7EGxW9b2H6HD1CuzspHHFKUp9VC9igLSmFqGHUZDwFYuWDvRL6XA
wYvRaMzUiJwypjv3iB+rstBqeYdck7GxSlAuQqnC8TzEeIO5b8++ED1Fpw2mxnEn CHi/wGpJkju2YVRpBm+gfP6jJq15md4YDA==
Znfi75O/529SGcV6mYhZPkdtOd2FKXoyucA/Ccr7xPJo8tPhcQfMQ7dUFhT6i4bs -----END EC PRIVATE KEY-----
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
-----END RSA PRIVATE KEY-----

View File

@ -1,65 +1,48 @@
-----BEGIN CERTIFICATE----- -----BEGIN CERTIFICATE-----
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
LmkubGVuY3Iub3JnLzAdBgNVHREEFjAUggkqLmtqNS50b3CCB2tqNS50b3AwEwYD
VR0gBAwwCjAIBgZngQwBAgEwggEFBgorBgEEAdZ5AgQCBIH2BIHzAPEAdgCi4wrk
Re+9rZt+OO1HZ3dT14JbhJTXK14bLMS5UKRH5wAAAZNPMd+8AAAEAwBHMEUCIQD0
I97BWtbR3G8RloVnXBSaHgj4l9Xi+SW0LhPoJ+bAwAIgBNxExM8O7iOUwmJJXLVF
EXpCyrS49sdE7yWzpSzMzHsAdwATSt8atZhCCXgMb+9MepGkFrcjSc5YV2rfrtqn
wqvgIgAAAZNPMeDMAAAEAwBIMEYCIQDr5YOvmAV0diZcnof9iCrfIaFl8ftQGdWo
yG66t1EvPAIhAIWyX4cq2GiQfv4CR9ly/aJmGc026M4+N1IqXoJhB9rwMBEGCCsG
AQUFBwEYBAUwAwIBBTANBgkqhkiG9w0BAQsFAAOCAQEAbIP3WDK32DEsaOExl4Mn
h4zlCCFBEi9uvS6S7PliBnmaYC8oEzhn6pqAyUiL/ZPosx8Q/68sNwu40GgYNAHF
6wxweuk1inK3Z2AiB3OBrAHnAeiUg8wxWCGGwT6UtGvnNgMZvAbRVky0haL26zhY
qjrzTaVyES8pA7HqwZ5MjeaId09vwvy6eZ6zRgUbMm7TQWDQ5F0oWeglD/Yw8ojV
aJKs3bNZ+yEnvvJgE5FWZiMT7xd4CPC50QhBkGls7Y202O9xdW8pr56/IqmqdzJi
Tbp7ER1mxmQ+XkUzdDtsPIRggNemJXe+G/vVIkzMlM2oSE+bNMbl79mZkAvWNEPT
VA==
-----END CERTIFICATE----- -----END CERTIFICATE-----
-----BEGIN CERTIFICATE----- -----BEGIN CERTIFICATE-----
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 VQD9F6Na/+zmXCc=
rsnnlFXCb5s8HKn5LsUgGvB24L7sGNZP2CX7dhHov+YhD+jozLW2p9W4959Bz2Ei
RmqDtmiXLnzqTpXbI+suyCsohKRg6Un0RC47+cpiVwHiXZAW+cn8eiNIjqbVgXLx
KPpdzvvtTnOPlC7SQZSYmdunr3Bf9b77AiC/ZidstK36dRILKz7OA54=
-----END CERTIFICATE----- -----END CERTIFICATE-----