Este proyecto muestra el proceso de administración y configuración de una máquina virtual para alojar un servidor web.
1. Actualización del Sistema e Instalación de Python y Mysql
es importante destacar que se estara trabajando como super usuario hasta la creación del usuario sin privilegios
Empezamos por actualizar el sistema y instalar Python:
-
apt update && sudo apt upgrade -y
-
apt install python3 python3-pip python3-venv -y
-
apt install mysql-server
2. Configuración de MySQL para Django.
Por defecto, Django utiliza SQLite3 como base de datos, pero si se desea usar una base de datos más robusta, como PostgreSQL o MySQL, se necesita instalar y configurar el servidor correspondiente, se es libre de saltar esta parte si no aplica.
Para configurar MySQL vamos a ejecutar el comando mysql_secure_installation
y seguiremos los pasos configurando el servicio según nos convenga.
Accedemos a MySQL y vamos a crear una base de datos para el proyecto.
CREATE DATABASE Django;
Y un usuario al que le vamos a asignar privilegios sobre la base de datos que acabamos de crear y aplicamos los cambios
CREATE USER 'adaminerweb'@'localhost' IDENTIFIED BY 'Unacontraseñasegura';
GRANT ALL PRIVILEGES ON Django.* TO 'adaminerweb'@'localhost';
FLUSH PRIVILEGES;
en esta configuración MySQL solo puede accederse de manera local.
3. Creación de un Usuario para la Web
Empezamos por crear un usuario sin privilegios para la web.
adduser adaminerweb
creamos un acceso por ssh al usuario
ssh-keygen
** Recomendado poner un passphrase**
5. Envío del Proyecto al Servidor
ya con acceso a ssh al servidor se procede a transferir el proyecto a la carpeta raíz del usuario. Se puede hacer desde github u otros medios de transferencia en este ejemplo utilizo scp
que permite transmitir archivos de forma segura mediante ssh.
scp -r /home/davy/Documentos/DSWEB/Portafolio/django_portfolio adaminerweb@145.222.166.223:/home/adaminerweb
6. Creación y Activación del Entorno Virtual
se crea un entorno virtual para el proyecto
python -m venv venv
y se activa el entorno virtual con el comando
source venv/bin/activate
![[2024-12-03_12-10.png]]
7. Instalación de Requisitos del Proyecto
se instalan las dependencias necesarias.
pip install -r requirements.txt
Configuración de producción
8. Configuración de Django para Producción
Desactivamos el modo de desarrollo para esto cambiamos la constante DEBUG
a False
en el settings.py
Se agrega la configuración para archivos estáticos.
STATIC_URL = "/static/"
STATIC_ROOT = os.path.join(BASE_DIR, 'static')
ejecutamos el comando python manage.py collectstatic
9. Configuración de ASGI
activamos la configuración ASGI en Django.
en el settings.py agregamos la constante ASGI_APPLICATION
ASGI_APPLICATION = "{nombre_proyecto}.asgi.application"
12. Configuración de base de datos MySQL
Primero instalamos pip install mysqlclient
En settings.py se cambia la configuración de la base de datos.
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'Django',
'USER': 'adaminerweb',
'PASSWORD': 'Unacontraseñasegura',
'HOST': 'localhost',
'PORT': '3306',
}
}
y ejecutamos las migraciones python manage.py migrate
11. Instalación de uvicorn
se instala uvicorn. para manejar grandes cantidades de tráfico y conexiones concurrentes.
python -m pip install uvicorn
12. Instalación y Configuración de Supervisor
se instala supervisor para asegurarse de que la aplicación se mantenga ejecutándose en producción.
sudo apt install supervisor
habilitamos el servicio
sudo systemctl enable supervisor
sudo systemctl start supervisor
Se verifica el estado con
supervisorctl status
lo que sigue es crear un archivo de configuración en la ruta /etc/supervisor/conf.d/
de nombre uvicorn.conf
[program:uvicorn]
command=/home/davy/Documentos/DSWEB/Portafolio/ven/bin/uvicorn django_portfolio.asgi:application --host 127.0.0.1 --port 8000 --log-level info
directory=/home/davy/Documentos/DSWEB/Portafolio/django_portfolio
user=adaminerweb
autostart=true
autorestart=true
stdout_logfile=/home/davy/Documentos/DSWEB/Portafolio/uvicorn.log
stderr_logfile=/home/davy/Documentos/DSWEB/Portafolio/uvicorn_error.log
process_name=%(program_name)s_%(process_num)02d
reiniciamos nuevamente el servicio.
sudo systemctl restart supervisor
Si revisamos el archivo uvicorn_error.log
comprobaremos si el servidor empezó a andar
debería aparecer algo así
INFO: Started server process [136997]
INFO: Waiting for application startup.
INFO: ASGI 'lifespan' protocol appears unsupported.
INFO: Application startup complete.
INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
13. Configuración de Nginx
Configuramos Nginx para servir archivos estáticos, de medios y hacer proxy al servidor Uvicorn:
en la ruta /etc/nginx/sites-avilable
vamos a crear un archivo con el nombre de la aplicación
se configura el puerto que escucha y server_name donde debe ir el nombre de dominio
server {
listen 80;
server_name dominio.com www.dominio.com;
se desactiva el log de cualquier solicitud favicon.ico
location = /favicon.ico {access_log off; log_not_found off; }
se agregan las rutas en donde se deben buscar los estáticos y los medios
location /static/ {
root /home/webadmin/django_portfolio;
}
location /media/ {
root /home/webadmin/django_portfolio;
}
Por ultimo se agrega a el archivo la configuración del proxy.
location / {
proxy_pass http://127.0.0.1:8000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
reiniciamos nginx y probamos acceder a la web.
14. Certificado SSL con Let's Encrypt
Por ultimo agregamos el certificado ssl con Let's Encrypt por su facilidad y accesibilidad https://certbot.eff.org/
Para instalarlo se usara el comando
sudo apt install certbot python3-certbot-nginx
la ventaja mas grande de esta herramienta es que automatiza el proceso de configuración de el certificado ssl.
como en este caso se esta usando nginx se va a ejecutar el comando
certbot --nginx
Una vez ejecutado la primera vez nos va a pedir una cuenta de correo para avisar si el certificado se esta acabando.
Which names would you like to activate HTTPS for?
We recommend selecting either all domains, or all domains in a VirtualHost/server block.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1: dominio.com
2: www.dominio.com
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Select the appropriate numbers separated by commas and/or spaces, or leave input
blank to select all options shown (Enter 'c' to cancel):
este detectara los dominios que configuramos con nginx, se puede elegir uno en especifico o ambos.
Requesting a certificate for dominio.com and www.dominio.com
Successfully received certificate.
Certificate is saved at: /etc/letsencrypt/live/dominio.com/fullchain.pem
Key is saved at: /etc/letsencrypt/live/dominio.com/privkey.pem
This certificate expires on 2025-03-06.
These files will be updated when the certificate renews.
Certbot has set up a scheduled task to automatically renew this certificate in the background.
Deploying certificate
Successfully deployed certificate for dominio.com to /etc/nginx/sites-enabled/django_app
Successfully deployed certificate for www.dominio.com to /etc/nginx/sites-enabled/django_app
Congratulations! You have successfully enabled HTTPS on https://NOMBREDOMINIO.com and https://www.NOMBREDOMINIO.com
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
If you like Certbot, please consider supporting our work by:
* Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate
* Donating to EFF: https://eff.org/donate-le
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Protegiendo el VPS de Ciberataques
15. Configuración del firewall
se instala ufw
apt install ufw -y
se agrega a la configuración nginx
ufw allow 'Nginx Full'
se agrega ssh
ufw allow OpenSSH
se activa el firewall
ufw enable
16. Instalación y configuración de Fail2Ban
Fail2Ban permite proteger el servidor contra ataques de fuerza bruta
para instalarlo apt install fail2ban
vamos al directorio /etc/fail2ban/
. Allí encontraremos un archivo llamado jail.conf
lo vamos a copiar y cambiar el nombre a .local
cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
en el archivo debemos bajar hasta la sección sshd y agregar lo siguiente
[sshd]
enabled = true
port = ssh
logpath = /var/log/auth.log
backend = systemd
Fail2Ban almacena sus registros en el archivo /var/log/fail2ban.log
. Se revisa este archivo para ver detalles de las acciones de Fail2Ban.
y con el comando sudo fail2ban-client status
veremos que este funcionando.
Status
|- Number of jail: 1
`- Jail list: sshd, mysqld-auth
esta es toda la configuración del servidor en un script de automatización. [PROXIMAMENTE EL github del script]