Compare commits

...

13 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
kj
fb21761379 Add gitignore. 2024-11-27 15:32:45 -04:00
kj
e36bc4a083 Update SSL files. 2024-11-27 15:31:54 -04:00
kj
ce0f70d648 Migrate to a docker-compose config with a few persistence.
./data/nginx/ for nginx host configurations.
./data/mysql/ for mysql databases.
2024-11-27 15:28:36 -04:00
15 changed files with 212 additions and 49 deletions

1
.gitignore vendored Normal file
View File

@ -0,0 +1 @@
/data/*

View File

@ -3,25 +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
# 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 # 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
@ -34,23 +21,22 @@ 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
RUN chmod +x /usr/local/bin/adddomain RUN chmod +x /usr/local/bin/adddomain
COPY bin/addsubdomain /usr/local/bin/addsubdomain COPY bin/addsubdomain /usr/local/bin/addsubdomain
RUN chmod +x /usr/local/bin/addsubdomain RUN chmod +x /usr/local/bin/addsubdomain
COPY bin/mysql_configure /usr/local/bin/mysql_configure
# Colocamos dentro el certificado SSL RUN chmod +x /usr/local/bin/mysql_configure
COPY ssl /etc/nginx/ssl
# Configuración de puertos # Configuración de puertos
EXPOSE 80 EXPOSE 80

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

44
bin/mysql_configure Normal file
View File

@ -0,0 +1,44 @@
#!/bin/bash
# Inicializando la base de datos
if test -f /var/lib/mysql/mysql; then
echo "Base de datos ya inicialiada (se hace nada)."
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
# Definiendo una contraseña vacía para root
echo "Definiendo contraseña para root (contraseña en blanco)."
systemctl start mariadb
mysql -e "SET PASSWORD FOR 'root'@'localhost' = PASSWORD(''); FLUSH PRIVILEGES;"
# Verificamos si ya está todo configurado
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
if grep -e "phpmyadmin" /etc/nginx/sites-available/default >/dev/null
then
echo "Se detectó que nginx ya tiene una configuración para PHPmyadmin (se hace nada)"
else
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.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
echo "Recargado configuración de nginx"
nginx -t && systemctl reload nginx
echo "Finalizado :)."

View File

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

View File

@ -0,0 +1,40 @@
server {
listen 80 default_server;
listen [::]:80 default_server;
root /var/www/html;
index index.html index.htm index.nginx-debian.html;
server_name _;
location /phpmyadmin {
root /usr/share/;
index index.php index.html index.htm;
location ~ ^/phpmyadmin/(.+.php)$ {
try_files $uri =404;
root /usr/share/;
fastcgi_pass unix:/var/run/php/php8.2-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $request_filename;
include /etc/nginx/fastcgi_params;
fastcgi_param PATH_INFO $fastcgi_script_name;
fastcgi_buffer_size 128k;
fastcgi_buffers 256 4k;
fastcgi_busy_buffers_size 256k;
fastcgi_temp_file_write_size 256k;
fastcgi_intercept_errors on;
}
location ~* ^/phpmyadmin/(.+.(jpg|jpeg|gif|css|png|js|ico|html|xml|txt))$ {
root /usr/share/;
}
}
location /phpMyAdmin {
rewrite ^/* /phpmyadmin last;
}
location / {
try_files $uri $uri/ =404;
}
}

View File

@ -0,0 +1 @@
/etc/nginx/sites-available/default

15
docker-compose.yml Normal file
View File

@ -0,0 +1,15 @@
version: '3'
services:
nginx:
image: nginx-dev
network_mode: host
build: .
container_name: nginx
hostname: nginx
volumes:
- ~/.mnt/Nginx:/var/www:Z
- ./data/nginx/sites-available:/etc/nginx/sites-available:Z
- ./data/nginx/sites-enabled:/etc/nginx/sites-enabled:Z
- ./data/mysql/:/var/lib/mysql/:Z
- ./ssl:/etc/nginx/ssl:Z

3
install.sh Executable file
View File

@ -0,0 +1,3 @@
#!/bin/bash
podman-compose up -d
podman exec -it nginx /usr/local/bin/mysql_configure

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,5 +1,5 @@
-----BEGIN EC PRIVATE KEY----- -----BEGIN EC PRIVATE KEY-----
MHcCAQEEICwNmZf9mSvXJHuk1wuRSdTcRHWGmEqMgviO1Whvp3K4oAoGCCqGSM49 MHcCAQEEIHxEbISIm9JgkuNJ4ZiaHYzynT5SxpwMS40HUDl/Y6kooAoGCCqGSM49
AwEHoUQDQgAEEcVfavQwO0/YTjJZxsn58TKa1wKMfW5UzU7jWYl1PayQhw/m18E6 AwEHoUQDQgAE7EGxW9b2H6HD1CuzspHHFKUp9VC9igLSmFqGHUZDwFYuWDvRL6XA
e3ID46MYeuogcDsqKT7LnWAF9b9lirNUuw== CHi/wGpJkju2YVRpBm+gfP6jJq15md4YDA==
-----END EC PRIVATE KEY----- -----END EC PRIVATE KEY-----

View File

@ -1,23 +1,23 @@
-----BEGIN CERTIFICATE----- -----BEGIN CERTIFICATE-----
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
jZQqESbV7bBW1KlnMSnH9AS2DBXvzZA= 0XbYYi2wcxpSrSqTilcEgkuKbmPOPqkMgCh+1QHXROdmnLFGLmtTu5Dc
-----END CERTIFICATE----- -----END CERTIFICATE-----
-----BEGIN CERTIFICATE----- -----BEGIN CERTIFICATE-----

2
uninstall.sh Executable file
View File

@ -0,0 +1,2 @@
#!/bin/bash
podman-compose down