Una idea que estoy probando desde hace un tiempo es tener mi servidor Ubuntu local en remoto, como si fuera el servidor de desarrollo de la empresa que está en un servidor o cloud, y me esta gustando la idea de no tener que ir reinstalado cosas cada vez que pruebo un sistema.
Que vamos ver en este artículo
- 1) La idea de lo que queremos montar
- 2) Herramientas que utilizaremos para trabajar
- 3) Instalación del servidor remoto
- 4) Configurar los diferentes servicios apache2, MySql, etc … con docker
- 5) Cómo conectar con Visual Studio Code con el código del servidor
- 6) Configurar nginx y los servicios dockers para que se entiendan entre ellos
- 7) Crear nuestra primera aplicación y darle un dominio
- 8) Conclusiones
Por ejemplo este artículo que publico ahora en cambiatealinux lo estoy escribiendo desde Windows.
Tener el servidor remoto me permite cambiar de sistema sin tener que montar todo el entorno de desarrollo en cada sistema y tenerlo todo centralizado.
Es cierto que se necesita una conexión a internet aceptable pero ahora ya cualquier suele ser buena para esto, personalmente hasta con la del móvil me sirve.
1) La idea de lo que queremos montar
La idea es sencilla subir todo mi entorno de desarrollo de local a un servidor remoto en ovh, concretamente siguiente:- Un servidor Linux Ubuntu, yo los tengo en https://www.kimsufi.com
Otros proveedores que podéis mirar y bien de precio son https://www.hetzner.com/cloud o https://contabo.com/es/vps he utilizado los tres. Disclaimer: no es publicidad pagada
He de avisar que se necesita algo con unas 8/16 GB de ram y discos NVMe para poder trabajar bien, personalmente tengo uno de 32GB de ram
- un nginx instalado en el servidor para redirigir las peticiones http/s al apache2 que vive docker
- Git para conectar los repositorios
- Y después ya Docker para virtualizar diferentes servicios:
- Apache2 + PHP
- MySql, diferentes versiones
- PostgreSQl, también con diferentes versiones
- SQL Server
- Oracle
- phpMyAdmin uno por entorno de MySql
- Adminer para administrar PostgreSQL
2) Herramientas que utilizaremos para trabajar
Básicamente las mismas que utilizo en local pero trabajando de forma remota:Para conectarnos al servidor y poder trabajar remotamente utilizó varias cosas:
- Visual Studio Code con la extensión Remote Development para conectar remotamente por ssh al servidor
- Desde el terminal o explorador de archivo tendremos que conectar con sshfs instalado para mapear rutas locales a rutas del servidor
3) Instalación del servidor remoto
Partimos de la base que el servidor Ubuntu Server ya lo tenemos instalado, esto lo hacemos desde el proveedor cuando lo contratamos y tenemos acceso por el terminal.Vamos a instalar el entorno de desarrollo instalando.
Primero instalamos Docker para tener todos los servicios antes comentados. Dejo este script con el que instalo siempre docker
#!/bin/bash
# Exit on error
set -e
echo "==> Updating system..."
sudo apt update
sudo apt upgrade -y
echo "==> Installing dependencies..."
sudo apt install -y ca-certificates curl gnupg lsb-release
echo "==> Adding Docker GPG key..."
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | \
sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg
echo "==> Adding Docker repository..."
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] \
https://download.docker.com/linux/ubuntu \
$(. /etc/os-release && echo $VERSION_CODENAME) stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
echo "==> Installing Docker..."
sudo apt update
sudo apt install -y \
docker-ce \
docker-ce-cli \
containerd.io \
docker-buildx-plugin \
docker-compose-plugin
echo "==> Enabling Docker service..."
sudo systemctl enable docker
sudo systemctl start docker
echo "==> Adding current user to docker group..."
sudo usermod -aG docker $USER
sudo chown $USER /var/run/docker.sock
echo "==> Applying group changes..."
newgrp docker < Verifying installation..."
docker --version
docker compose version
echo "==> Running test container..."
docker run hello-world
echo "==> Installation completed successfully!"
echo "IMPORTANT: If you still need sudo, log out and log in again."
Le damos permisos de ejecución
sudo chmod 700 install-docker.sh
y lo ejecutamos./install-docker.sh
Ahora instalamos el resto de aplicaciones que vamos a necesitar para trabajar, en mi caso Nodejs y npm, nginx y gitPara instalar node lo hacer de la siguiente forma, de hecho me he conectado al web de node y donde dice descargas y seleccione las siguientes opciones
Esto te da unos pasos a seguir para instalar node:
# Descarga e instala nvm:
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.3/install.sh | bash
# en lugar de reiniciar la shell
\. "$HOME/.nvm/nvm.sh"
# Descarga e instala Node.js:
nvm install 24
# Verifica la versión de Node.js:
node -v # Debería mostrar "v24.18.0".
# Verifica versión de npm:
npm -v # Debería mostrar "11.16.0".
Que se ponen en un fichero con permisos de ejecución como antes y lo ejecutamos.
sudo chmod 700 install-node.sh
./install-node.sh
sudo apt install nginx git
Voy a instalar también zsh y oh-my-zsh que me gusta más para el termina
sudo apt install zsh
sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"
4) Configurar los diferentes servicios apache2, MySql, etc … con docker
Para configurar los diferentes servicios voy a utilizar docker compose para con unos simples comandos crear todo el entorno, destruirlo o modificarlo.El proyecto de todos los entornos construido con docker compose y lo podéis descargar desde github:
https://github.com/depruebas/docker-services
En esta url está el README si queréis leer antes todo lo que tiene:
https://github.com/depruebas/docker-services/blob/master/README.md
Y aquí información sobre cómo utilizar el comando make
https://github.com/depruebas/docker-services/blob/master/COMANDOS.md
El funcionamiento es muy sencillo, desde el servidor o desde local, porque también sirve para trabajar en local, descargamos el repositorio:
git clone https://github.com/depruebas/docker-services.git elamp-docker
elamp-docker porque yo al proyecto lo he llamado asi y dentro de él los entornos todos empiezan por elamp, pero claro, esto podéis cambiarlo si queréis.El proyecto funciona con un fichero .env de configuración así que copiais el de ejemplo:
cp .env.example .env
Y los editáis para poner vuestras rutas y passwords un poco más seguros si lo instaláis en un servidor remoto.Aquí lo importante son las rutas donde tendréis los proyectos, por ejemplo:
- PROJECT_PATH=/home/ubuntu/elamp-docker es donde vive el proyecto de docker compose
- WWW_PATH=/home/ubuntu/workspaces/webs donde viven las proyectos web enlazados con Apache2
- TEMP_PATH=/home/ubuntu/temp y un directorio temporal
docker compose --env-file .env -f mariadb/docker-compose.yml down -v
5) Cómo conectar con Visual Studio Code con el código del servidor
Aquí viene lo interesante, nos conectaremos al servidor remotamente con Visual Studio Code y con el componente Remote DevelopmentAqui podeis ver un artículo completo para instalarlo y conectarse
https://www.netveloper.com/desarrollo-remoto-con-ssh-y-visual-studio-code
También nos podremos conectar por ssh y desde linux mapear un directorio del disco en local con un directorio en el servidor, en este artículo os lo explico todo https://cambiatealinux.com/montar-carpetas-remotas-con-sshfs-y-ftp
Pero rápidamente sería una cosa así:
sshfs root@servidor.remoto.com:/var/www/html/mi_proyecto_guay /home/depruebas/www/web_remota
6) Configurar nginx y los servicios dockers para que se entiendan entre ellos
Lo primero que haremos es entrar en el servidor por ssh (ssh usuario@Ip) y arrancar los dockers a ver que no den problemas de configuración.Para arrancar los dockers ejecutamos el comando
make up
Recordar que los comandos están en el fichero COMANDOS.mdEn principio todo tiene que arrancar bien y aparecer un listado como este:
Ahora que está todo funcionando correctamente vamos a comprobar que las url que se crean al arrancar docker funcionan.
Si os fijáis al acabar de arrancar los dockers con make up sale las urls donde os podéis conectar de entrar con localhost
Apache/PHP http://localhost
phpMyAdmin (MySQL) . http://localhost:8081
phpMyAdmin (MariaDB) http://localhost:8082
Adminer (Postgres) . http://localhost:8083
Tenéis que cambiar localhost por la IP de vuestro servidor.
7) Crear nuestra primera aplicación y darle un dominio
Ahora vamos a crear un proyecto, en realidad ya hay uno de pruebas y vamos a reutilizar pero crear un proyecto web nuevo sería lo mismoLo que vamos hacer es:
- Crear un fichero .conf para apache2
- Crear un fichero .conf para nginx
- Instalar la aplicación web en la ruta que queramos
example.local.conf
Este es el código arreglado para mi prueba donde ya he modificado la ruta del proyecto.Y el ejemplo example.local está en el proyecto de elamp-docker en el directorio www/example.local, yo lo he copiado en /home/ubuntu/workspaces/webs/
Pero mi ruta real es la del docker, por eso la ruta final que se ve en DocumentRoot y Directory es /var/www/webs/example.local/public
<VirtualHost *:80>
ServerName example.local
ServerAlias www.example.local
DocumentRoot /var/www/webs/example.local/public
<Directory /var/www/webs/example.local/public>
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
# Logs propios del dominio -> aparecen en el host en apache2/logs/
ErrorLog ${APACHE_LOG_DIR}/sites/example.local-error.log
CustomLog ${APACHE_LOG_DIR}/sites/example.local-access.log combined
</VirtualHost>
Y ejecutamos
docker exec elamp-apache2 apache2ctl graceful
para reiniciar apache2 y aplique estos cambios.Lo mismo se ha de hacer cuando se crea un fichero nuevo.
Ahora creamos el fichero del nginx tiene que ser como el de ejemplo y hay que ponerlo en el servidor, en el directorio de nginx /etc/nginx/sites-available y lo llamamos example.local.conf
server {
listen 80;
listen [::]:80;
server_name example.local;
location / {
proxy_pass http://172.50.0.3;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
Una vez creada hacemos un simblink en al directorio sites-enabled
sudo ln -s /etc/nginx/sites-available/example.local.conf /etc/nginx/sites-enabled
Y por último crear una entrada en /etc/hosts al nuevo dominio190.90.0.11 example.local
Y ya probarlo, http://example.local
8) Conclusión
Igual que tenemos nuestro entorno de desarrollo en local pero como hemos podido comprobar es muy sencillo instalarlo en un servidor remoto para poder tener siempre disponible nuestros proyectos.Como todo lo bueno tiene cosas malas aquí podríamos decir y dependiendo de los proyectos de cada uno pero un mínimo de 8GB de ram y 2/4 Cores para ejecutar dockers y el sistema remoto de Visual Studio que consumen sobre todo si trabajáis con varios proyectos a la vez.
Por cierto yo también le he instalado Claude code en el Visual Studio Code para que se conecte remotamente al servidor.
Y esto es todo !!!
Gracias por seguirme y leerme, espero que les haya ayudado
Saludos
Alex
:-)
/








