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.
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
# 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
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.4/fpm/php.ini
# Eliminamos los logs de apt
@ -21,14 +21,14 @@ RUN rm -rf \
# Habilitar servicios
RUN systemctl enable mariadb.service && \
systemctl enable php8.2-fpm.service && \
systemctl enable php8.4-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
COPY php-root.conf /etc/php/8.4/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
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
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
RUN chmod +x /usr/local/bin/mysql_configure
# Colocamos dentro el certificado SSL
COPY ssl /etc/nginx/ssl
# Configuración de puertos
EXPOSE 80
EXPOSE 443

View File

@ -3,7 +3,7 @@
function main() {
bold=$(tput bold)
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"
read -r domain

View File

@ -4,7 +4,7 @@ function main() {
bold=$(tput bold)
normal=$(tput sgr0)
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"
read -r domain

View File

@ -1,30 +1,44 @@
#!/bin/bash
# Verificamos si ya está todo configurado
if test -f /etc/phpmyadmin/config.inc.php; then
echo "Parece que ya está todo configurado (se hace nada)."
exit
# 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
export DEBIAN_FRONTEND=noninteractive
apt-get update
apt-get -yq install phpmyadmin
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
sed -i "s/ \/\/ \$cfg\['Servers'\]\[\$i\]\['AllowNoPassword'\]/ \$cfg\['Servers'\]\[\$i\]\['AllowNoPassword'\]/" /etc/phpmyadmin/config.inc.php
# 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..."
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
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

@ -11,4 +11,5 @@ services:
- ~/.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/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
group = root
listen = /run/php/root8.2.sock
listen = /run/php/root8.4.sock
listen.owner = 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.
* 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
(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

View File

@ -1,51 +1,5 @@
-----BEGIN RSA PRIVATE KEY-----
MIIJKAIBAAKCAgEAtxj3/Pb8hWl3TTPSV3BXr1ybIUoUQppM5m+PHFHe2OFD8Ap3
mkJ0dg2dv8Pw7E6/hO38syt9LXDYoncaBlLz918l5lw6l7WvLiVSv4SHUf0ncAgm
wYvRaMzUiJwypjv3iB+rstBqeYdck7GxSlAuQqnC8TzEeIO5b8++ED1Fpw2mxnEn
Znfi75O/529SGcV6mYhZPkdtOd2FKXoyucA/Ccr7xPJo8tPhcQfMQ7dUFhT6i4bs
pKadI6PEMFYFqB/DRZ8uTvs+FgX4kxWIJ1KkjSZwZf+PVcuGAblQQ0ZAMD1vzn/U
pnd5GC6SAQJqdapFYDMBI54vmgmVkWyEyqnqPgXZ9JP7TYxb5NtbNw4VzpUZLgap
jZiDg25/g1SGY4hUuYQUl/Hs9s7FHSBaE77E1gbun40InYCEQV6W5YNyF5Rl88bp
uKnhL664mJWx1iX32/YECAc7o7flBpDjlq5uKOdBqWYXG+ISwb+V84hcUTwQZnlk
LRgBMm1txgUuHGUCigQBgGszPyDy6i2SOvKxgd7It6DyBtE4iT+1GDB67bbNNbp0
JuQSnAICUYKuGqDpP8iRj2MT0Xpb7hnt/dZ2TIF5XYC1fOgEN/nr6RNtnLhzMScb
B9Qs3A0CP8jh23p95huQs/09DfL6pGwp5ikX1SN7oIzrEGIfz7CeOOEru98CAwEA
AQKCAgBPAj9AsXOWPkR00//YK2orCdMHMmg7tUmpxkoC9nErNUmTs3CY6ERJDOcd
cPftgK20Nt3skr+ZdDCHKs3YHMOZ4zz/gpzmCkhlqUVjz1R1VMBH37yZmDPs/TZZ
HM3eXdIas0/sAXNwrbCNKwhOAPt1WLv+TTKarny+eu6RI1+DDqkAyKMv3FvY9fDB
dY///u9AgU3BSiEf7y8fDtQEw6hwGV87RT90SWnm1G6Yaeum+7aBrt8+zYbRckGe
egBG5C3nRSE+g7vu1PTGw2vVTBwlrIij+vtnEkPpSoYQAaiBKIGuogqpKrTecnoe
ZWR7EdaOBHRhYkk4NxqLfkBvE5M4JK2bttWM8M81/YqgrNzd0vnH5eisquE7W6zo
yldphafwT0Gcut3nlVTCG7byXpUBDoeEnNag6bqFthLLHM04Q8O3I7E663vejuls
aTwvXl0hqn6DU5MVrH4BvKdKGSAAZW8LdU+gCiED4CTC0sg23d/QDw1XqNQB3o5a
/5CT1jmOvYFsxqwAi5sxA4P7OTPVNvbEHeYPPWttXLY4zDhXx9OP6442hXrWgtm/
V5+gkRn8FOF2qcffb1o9iXHd0ZJa4+Fh1n1s0Wkof4CqrFEpEQSc5xdoAYR9J+lK
ywPFgEKFa0dVd9PAFqb9JPNmdytUvQ5sTawpXki8L6ASnUZDQQKCAQEA7gqN88hJ
TNqUry2GCdtDvwyQge5Wd6Nqc80sfvgWEI7FTh2ppvyHTmZ032a8lyJ8CzVm85vB
8KD4K+Sox5SHlQO1g7R+5uiOgSS4H2JyBctxAz7pZDO8vRSNL2AFkh17/UFS9y/+
mziErMfgFfBzy2ZOZwheTyBmL6ebHsqlMgOTdv7KBikK2RopucFpPhJYsi39yWyl
HZ4NNz7gbilKxYSZMtQ9v7Eq8AmXG2ihng417bmWl75E62CfZuULvuVW4SIoR9kC
U0SUqHP7GS6zDlLa0na35JVZalUvHMbXsDzNs0hQjYf5jFB0PFoRoP/UANMlmsgp
kr5lj3Vz07Jl3QKCAQEAxOlANCOhMbU/i7Fv6q/onqcO7c489k/tjlsbUBYgA/Zr
ou/xSzR8pwCEnpQOCMoc1HenXEZHY+YK/CkQx4WZsVpSwysZfhys9QTR4cYm+zMB
8dOyD/aCrwf2fw0sceUetP70HyRVBfSwf5Jy05Rnj086MPFdLSUQb72uNr2rIlz9
cGdakSLC4GYkw5NrZ0mA/iXjAYEP+1iheOVCF8M5pOyR0d7lalMjmmfxgGj0xJ/4
aYfYP7lnRRl2NOMTzts4fBe3pjhZIlhskFE9A3sLP0HiyhDgQgk4OL3XfrZGmJMq
rUE2U74h/nZyaggRjqroEzRO81z9dHnepd03f4aC6wKCAQAvDRMF7r7eXA4rmhn2
dMqtRrSBmjSpLTnrbdCvwCXMXAwP5rkT8rJkAshzKAF69iwCoymYWV86SvcC5g2e
dXNfNv537ANxbOJOEI38Vh8nmhDajWLglYFm9lr51EcFnKJXasQVa/0tfTxsUo2u
iHq655vzranGhibsoHp+2ZtRiXdqe+4+zXoBc7RvrRU6WbICdijF2Z3Bfu4pz1nZ
LHxFEnKdo2oZK9HK5Hpjxoi7jx+Fv7tOfyNsSwr28asirn4/vdqsaO6WuuWPbm1h
iuOFn0b1dtXebs7fv7qyO3OCuGIIX/DcKNZgr75p93uokSi8iP/T2mCtSskUVCjy
3T5ZAoIBABB4mmBCIrevu5MJ0pzE/iZXPw5xU/Qel3Zy9IPsdd0e/b3xaDOsPkkR
6AYDyHC/x02WfK9hSZN3qK+TF844xLRrI8Ujk8xSxbzxHEVQd+5HRABgfuKK8j+F
4P6bsX4NdlYZhX4dYedPonvpWiWMomUAcZOqfOrL0OYn7ayyjOAg+yot2wuM5tQy
dxzM9gz7vwiDTsvPafDSZx9fvfmS4P2EtGXjyTjtn2rJCxB8twzDfNoG/PXHonXL
PXILFJsXB1CKA1iqGfqffuVLhlkGL9iowDm606dycft9FcuJn7ofhVBcxhiXLOzG
J6fq6N0QOr1wgLImsyTNFOy25m+KZuUCggEBAJjlHuq4tBb9c5HbSE3tJpOoSbHe
h+2MjTwTpiiDzovEh/beDWSuxBTtm09I7yt+shAjSjcFc9mSAFx2EV5ZK930wnDz
tkfarWUZXPmXPcF3bpoWYTm8Rh/gacy17Fp2CkZBToWEQJEm8381gN2ZH/IcldCs
r/vHoF98DlhMQTs5ZVl7VolFC2bhw0g5s/qqb1m/dUy/PvY1+MFy7syrpDGYSenJ
jd27/p5fIbiwUzxpq8XMPuR/yuHSVxW1aW9GCEU8oqqUd7fhtKzDvDlhQR9RN8Hj
qGY87MElodWPLLpXEO8eya7QyXdVek60hCe6hOYDzr9FthFiU7UbHR3bbco=
-----END RSA PRIVATE KEY-----
-----BEGIN EC PRIVATE KEY-----
MHcCAQEEIHxEbISIm9JgkuNJ4ZiaHYzynT5SxpwMS40HUDl/Y6kooAoGCCqGSM49
AwEHoUQDQgAE7EGxW9b2H6HD1CuzspHHFKUp9VC9igLSmFqGHUZDwFYuWDvRL6XA
CHi/wGpJkju2YVRpBm+gfP6jJq15md4YDA==
-----END EC PRIVATE KEY-----

View File

@ -1,65 +1,48 @@
-----BEGIN CERTIFICATE-----
MIIF/TCCBOWgAwIBAgISBDExhtRh6MprjO8/O1jtnzEtMA0GCSqGSIb3DQEBCwUA
MDMxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MQwwCgYDVQQD
EwNSMTAwHhcNMjQxMTIxMTM0OTM4WhcNMjUwMjE5MTM0OTM3WjASMRAwDgYDVQQD
EwdrajUudG9wMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAtxj3/Pb8
hWl3TTPSV3BXr1ybIUoUQppM5m+PHFHe2OFD8Ap3mkJ0dg2dv8Pw7E6/hO38syt9
LXDYoncaBlLz918l5lw6l7WvLiVSv4SHUf0ncAgmwYvRaMzUiJwypjv3iB+rstBq
eYdck7GxSlAuQqnC8TzEeIO5b8++ED1Fpw2mxnEnZnfi75O/529SGcV6mYhZPkdt
Od2FKXoyucA/Ccr7xPJo8tPhcQfMQ7dUFhT6i4bspKadI6PEMFYFqB/DRZ8uTvs+
FgX4kxWIJ1KkjSZwZf+PVcuGAblQQ0ZAMD1vzn/Upnd5GC6SAQJqdapFYDMBI54v
mgmVkWyEyqnqPgXZ9JP7TYxb5NtbNw4VzpUZLgapjZiDg25/g1SGY4hUuYQUl/Hs
9s7FHSBaE77E1gbun40InYCEQV6W5YNyF5Rl88bpuKnhL664mJWx1iX32/YECAc7
o7flBpDjlq5uKOdBqWYXG+ISwb+V84hcUTwQZnlkLRgBMm1txgUuHGUCigQBgGsz
PyDy6i2SOvKxgd7It6DyBtE4iT+1GDB67bbNNbp0JuQSnAICUYKuGqDpP8iRj2MT
0Xpb7hnt/dZ2TIF5XYC1fOgEN/nr6RNtnLhzMScbB9Qs3A0CP8jh23p95huQs/09
DfL6pGwp5ikX1SN7oIzrEGIfz7CeOOEru98CAwEAAaOCAiowggImMA4GA1UdDwEB
/wQEAwIFoDAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwDAYDVR0TAQH/
BAIwADAdBgNVHQ4EFgQUaNmbK+JXw4v/gW0LoXUE1sWtVkkwHwYDVR0jBBgwFoAU
u7zDR6XkvKnGw6RyDBCNojXhyOgwVwYIKwYBBQUHAQEESzBJMCIGCCsGAQUFBzAB
hhZodHRwOi8vcjEwLm8ubGVuY3Iub3JnMCMGCCsGAQUFBzAChhdodHRwOi8vcjEw
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==
MIIDhjCCAw2gAwIBAgISBcc9IpUdAOCg+ZWOlWXNpka5MAoGCCqGSM49BAMDMDIx
CzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MQswCQYDVQQDEwJF
NTAeFw0yNTA1MjYwNTI0NDBaFw0yNTA4MjQwNTI0MzlaMBIxEDAOBgNVBAMTB2tq
NS50b3AwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAATsQbFb1vYfocPUK7OykccU
pSn1UL2KAtKYWoYdRkPAVi5YO9EvpcAIeL/AakmSO7ZhVGkGb6B8/qMmrXmZ3hgM
o4ICITCCAh0wDgYDVR0PAQH/BAQDAgeAMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggr
BgEFBQcDAjAMBgNVHRMBAf8EAjAAMB0GA1UdDgQWBBScEeTg0ldCzWox/93VdsA8
0kcSJTAfBgNVHSMEGDAWgBSfK1/PPCFPnQS37SssxMZwi9LXDTAyBggrBgEFBQcB
AQQmMCQwIgYIKwYBBQUHMAKGFmh0dHA6Ly9lNS5pLmxlbmNyLm9yZy8wHQYDVR0R
BBYwFIIJKi5rajUudG9wggdrajUudG9wMBMGA1UdIAQMMAowCAYGZ4EMAQIBMC0G
A1UdHwQmMCQwIqAgoB6GHGh0dHA6Ly9lNS5jLmxlbmNyLm9yZy81OC5jcmwwggEF
BgorBgEEAdZ5AgQCBIH2BIHzAPEAdgDM+w9qhXEJZf6Vm1PO6bJ8IumFXA2Xjbap
flTA/kwNsAAAAZcLQmXLAAAEAwBHMEUCIQCocOfcpd9n38reJCiCNboImPvypk+8
oKjsLeLkRD/PbAIgLLa2JLx1/C9QHqtFQxYWHVwcoG1EWc0t2KECIfrE9rcAdwAN
4fIwK9MNwUBiEgnqVS78R3R8sdfpMO8OQh60fk6qNAAAAZcLQmW+AAAEAwBIMEYC
IQCWHfppEFs9u9zHQzAj3iiRAeugj4q+M+WieCKW/rG+WwIhAKnhLV78Bj6CzbPm
e78jTDGfQpkYNzdcAY1WWsrMzQKXMAoGCCqGSM49BAMDA2cAMGQCMEk9jbzyK6pH
APfGktIFfYBG4yzf+L7EJ4vhQlB0DDrQiH3SOc4HXfHXozNaujRRwwIwQ9LrwWbA
0XbYYi2wcxpSrSqTilcEgkuKbmPOPqkMgCh+1QHXROdmnLFGLmtTu5Dc
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
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
VQD9F6Na/+zmXCc=
-----END CERTIFICATE-----