Skip to content

Commit bf487a2

Browse files
committed
feat: update README for database VM options; add PostgreSQL setup script; enhance API installation script for database configuration
1 parent 744c660 commit bf487a2

File tree

6 files changed

+327
-376
lines changed

6 files changed

+327
-376
lines changed

04-cloud/azure/iaas/01-db-vm/README-ubuntu-postgresql.md

Lines changed: 37 additions & 211 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ VM_SIZE="Standard_DS1_v2"
1515
# 🔐 Credenciales de PostgreSQL (las usaremos dentro de la VM)
1616
POSTGRES_USER="heroesadmin"
1717
POSTGRES_PASSWORD="Heroes@2024#"
18-
POSTGRES_DB="heroes_db"
18+
POSTGRES_DB="heroes"
1919
```
2020

2121
o si estás en Windows:
@@ -31,7 +31,7 @@ $VM_SIZE="Standard_B2as_v2"
3131
# 🔐 Credenciales de PostgreSQL (las usaremos dentro de la VM)
3232
$POSTGRES_USER="heroesadmin"
3333
$POSTGRES_PASSWORD="Heroes@2024#"
34-
$POSTGRES_DB="heroes_db"
34+
$POSTGRES_DB="heroes"
3535
```
3636

3737
## 🖥️ Crear la máquina virtual
@@ -48,7 +48,8 @@ az vm create \
4848
--vnet-name $VNET_NAME \
4949
--subnet $DB_SUBNET_NAME \
5050
--size $VM_SIZE \
51-
--nsg $DB_VM_NSG_NAME
51+
--nsg $DB_VM_NSG_NAME \
52+
--public-ip-address ""
5253

5354
echo -e "✅ Máquina virtual creada"
5455
```
@@ -73,13 +74,9 @@ az vm create `
7374
echo "✅ Máquina virtual creada"
7475
```
7576

76-
> 💡 **Nota**: Usamos `--generate-ssh-keys` para crear automáticamente las claves SSH. Si ya tienes una clave SSH, puedes usar `--ssh-key-values ~/.ssh/id_rsa.pub` en su lugar.
77-
78-
Para poder simplificar las cosas un poco, hemos permitido que el comando le asigne una IP pública, pero en un entorno de producción no es recomendable. Más adelante veremos cómo eliminarla.
77+
> 💡 **Nota**: Usamos `--generate-ssh-keys` para crear automáticamente las claves SSH y `--public-ip-address ""` para no asignar IP pública (más seguro).
7978
80-
## 🔒 Crear reglas de seguridad de red
81-
82-
### Regla para PostgreSQL (puerto 5432)
79+
## 🔒 Crear regla de seguridad de red para PostgreSQL
8380

8481
Para poder acceder a PostgreSQL desde la API:
8582

@@ -93,7 +90,7 @@ az network nsg rule create \
9390
--priority 1001 \
9491
--destination-port-ranges 5432 \
9592
--protocol Tcp \
96-
--source-address-prefixes "*" \
93+
--source-address-prefixes $API_SUBNET_ADDRESS_PREFIX \
9794
--direction Inbound
9895

9996
echo -e "✅ Regla de seguridad creada"
@@ -117,169 +114,56 @@ az network nsg rule create `
117114
echo "✅ Regla de seguridad creada"
118115
```
119116

120-
### Regla para SSH (solo para configuración inicial)
117+
## 🐘 Instalar y configurar PostgreSQL
121118

122-
Para conectarnos por SSH y configurar PostgreSQL, necesitamos habilitar temporalmente el acceso SSH:
119+
Utilizamos `az vm run-command` para ejecutar el script de instalación de PostgreSQL en la VM sin necesidad de conectarnos por SSH. El script acepta como parámetro la subred desde la que se permitirán conexiones (la subred de la API):
123120

124121
```bash
125-
echo -e "🔒 Creando regla de seguridad para SSH"
126-
127-
MY_HOME=$(curl -s ifconfig.me)/32 # 🌍 Obtiene tu IP pública
122+
echo -e "🐘 Instalando y configurando PostgreSQL..."
128123

129-
az network nsg rule create \
124+
az vm run-command invoke \
130125
--resource-group $RESOURCE_GROUP \
131-
--nsg-name $DB_VM_NSG_NAME \
132-
--name AllowSSHFromHome \
133-
--priority 1002 \
134-
--destination-port-ranges 22 \
135-
--protocol Tcp \
136-
--source-address-prefixes $MY_HOME \
137-
--direction Inbound
126+
--name $DB_VM_NAME \
127+
--command-id RunShellScript \
128+
--scripts @04-cloud/azure/iaas/scripts/setup-postgresql.sh \
129+
--parameters $API_SUBNET_ADDRESS_PREFIX
138130

139-
echo -e "Regla SSH creada"
131+
echo -e "PostgreSQL instalado y configurado"
140132
```
141133

142134
o si estás en Windows:
143135

144136
```pwsh
145-
echo "🔒 Creando regla de seguridad para SSH"
146-
147-
$MY_HOME = (Invoke-RestMethod -Uri "https://ifconfig.me") + "/32"
137+
echo "🐘 Instalando y configurando PostgreSQL..."
148138
149-
az network nsg rule create `
139+
az vm run-command invoke `
150140
--resource-group $RESOURCE_GROUP `
151-
--nsg-name $DB_VM_NSG_NAME `
152-
--name AllowSSHFromHome `
153-
--priority 1002 `
154-
--destination-port-ranges 22 `
155-
--protocol Tcp `
156-
--source-address-prefixes $MY_HOME `
157-
--direction Inbound
158-
159-
echo "✅ Regla SSH creada"
160-
```
161-
162-
## 🌐 Obtener la IP pública
163-
164-
Para conectarnos a la VM por SSH, necesitamos su IP pública:
165-
166-
```bash
167-
DB_PUBLIC_IP=$(az network public-ip show --resource-group $RESOURCE_GROUP --name ${DB_VM_NAME}PublicIP --query "ipAddress" -o tsv)
168-
169-
echo "✅ IP pública temporal: $DB_PUBLIC_IP"
170-
```
171-
172-
## 🔌 Conectarse por SSH e instalar PostgreSQL
173-
174-
Conéctate a la VM por SSH:
175-
176-
```bash
177-
ssh $DB_VM_ADMIN_USERNAME@$DB_PUBLIC_IP
178-
```
179-
180-
Una vez dentro de la VM, ejecuta los siguientes comandos para instalar y configurar PostgreSQL:
181-
182-
### 1️⃣ Instalar PostgreSQL
183-
184-
```bash
185-
# Actualizar el sistema
186-
sudo apt update && sudo apt upgrade -y
187-
188-
# Instalar PostgreSQL
189-
sudo apt install -y postgresql postgresql-contrib
190-
191-
# Verificar que PostgreSQL está corriendo
192-
sudo systemctl status postgresql
193-
```
194-
195-
### 2️⃣ Configurar PostgreSQL para aceptar conexiones remotas
196-
197-
```bash
198-
# Cambiar al usuario postgres
199-
sudo -i -u postgres
200-
201-
# Crear usuario y base de datos
202-
psql -c "CREATE USER heroesadmin WITH PASSWORD 'Heroes@2024#';"
203-
psql -c "CREATE DATABASE heroes OWNER heroesadmin;"
204-
psql -c "GRANT ALL PRIVILEGES ON DATABASE heroes TO heroesadmin;"
205-
206-
# Salir del usuario postgres
207-
exit
208-
```
209-
210-
### 3️⃣ Configurar PostgreSQL para escuchar en todas las interfaces
211-
212-
```bash
213-
# Editar postgresql.conf
214-
sudo nano /etc/postgresql/14/main/postgresql.conf
215-
```
216-
217-
Busca la línea `#listen_addresses = 'localhost'` y cámbiala por:
218-
219-
```
220-
listen_addresses = '*'
221-
```
222-
223-
> 💡 **Tip**: En nano, usa `Ctrl+W` para buscar y `Ctrl+O` para guardar, `Ctrl+X` para salir.
224-
225-
### 4️⃣ Configurar autenticación para conexiones remotas
226-
227-
```bash
228-
# Editar pg_hba.conf
229-
sudo nano /etc/postgresql/14/main/pg_hba.conf
230-
```
231-
232-
Añade la siguiente línea al final del archivo para permitir conexiones desde la subred de la API (o desde cualquier IP con `0.0.0.0/0` para pruebas):
233-
234-
```
235-
# Permitir conexiones desde la subred de la API
236-
host all all 10.0.2.0/24 scram-sha-256
237-
238-
# O para permitir desde cualquier IP (menos seguro, solo para pruebas)
239-
# host all all 0.0.0.0/0 scram-sha-256
240-
```
241-
242-
### 5️⃣ Reiniciar PostgreSQL y verificar
243-
244-
```bash
245-
# Reiniciar PostgreSQL para aplicar los cambios
246-
sudo systemctl restart postgresql
247-
248-
# Verificar que PostgreSQL está escuchando en el puerto 5432
249-
sudo ss -tlnp | grep 5432
250-
```
141+
--name $DB_VM_NAME `
142+
--command-id RunShellScript `
143+
--scripts @04-cloud/azure/iaas/scripts/setup-postgresql.sh `
144+
--parameters $API_SUBNET_ADDRESS_PREFIX
251145
252-
Deberías ver algo como:
253-
```
254-
LISTEN 0 244 0.0.0.0:5432 0.0.0.0:* users:(("postgres",pid=xxxx,fd=x))
146+
echo "✅ PostgreSQL instalado y configurado"
255147
```
256148

257-
### 6️⃣ Configurar el firewall de Ubuntu (UFW)
258-
259-
```bash
260-
# Habilitar el firewall si no está activo
261-
sudo ufw enable
262-
263-
# Permitir SSH
264-
sudo ufw allow 22/tcp
149+
El script [setup-postgresql.sh](../scripts/setup-postgresql.sh) realiza automáticamente:
150+
- ✅ Instalación de PostgreSQL
151+
- ✅ Creación del usuario `heroesadmin` y base de datos `heroes`
152+
- ✅ Configuración para aceptar conexiones remotas desde la subred de la API (pasada como parámetro)
153+
- ✅ Configuración del firewall UFW
265154

266-
# Permitir PostgreSQL
267-
sudo ufw allow 5432/tcp
155+
### 🔍 Verificar la instalación (opcional)
268156

269-
# Verificar las reglas
270-
sudo ufw status
271-
```
272-
273-
### 7️⃣ Salir de la VM
157+
Si quieres comprobar que PostgreSQL se instaló correctamente:
274158

275159
```bash
276-
exit
160+
az vm run-command invoke \
161+
--resource-group $RESOURCE_GROUP \
162+
--name $DB_VM_NAME \
163+
--command-id RunShellScript \
164+
--scripts "sudo systemctl status postgresql && sudo -u postgres psql -c '\l'"
277165
```
278166

279-
## 🧹 Cómo probar desde fuera con la extensión de VS Code para postgres
280-
281-
Abre VS Code y usa la extensión [PostgreSQL](https://marketplace.visualstudio.com/items?itemName=ckolkman.vscode-postgres) para conectarte a tu base de datos PostgreSQL usando la IP pública temporal, el usuario y la contraseña que configuraste.
282-
283167
## 🔗 Obtener la IP privada de la base de datos
284168

285169
```bash
@@ -309,69 +193,13 @@ echo "🔗 IP privada de la base de datos: $DB_PRIVATE_IP"
309193
La cadena de conexión para PostgreSQL desde tu API sería:
310194

311195
```
312-
Host=$DB_PRIVATE_IP;Port=5432;Database=heroes_db;Username=heroesadmin;Password=Heroes@2024#
196+
Host=$DB_PRIVATE_IP;Port=5432;Database=heroes;Username=heroesadmin;Password=Heroes@2024#
313197
```
314198

315199
O en formato URI:
316200

317201
```
318-
postgresql://heroesadmin:Heroes@2024#@$DB_PRIVATE_IP:5432/heroes_db
319-
```
320-
321-
## 🆚 Alternativa: Usar cloud-init para automatizar la instalación
322-
323-
Si quieres automatizar toda la instalación de PostgreSQL, puedes usar **cloud-init**. Crea un archivo `cloud-init-postgres.yaml`:
324-
325-
```yaml
326-
#cloud-config
327-
package_update: true
328-
package_upgrade: true
329-
330-
packages:
331-
- postgresql
332-
- postgresql-contrib
333-
334-
write_files:
335-
- path: /tmp/setup-postgres.sh
336-
permissions: '0755'
337-
content: |
338-
#!/bin/bash
339-
# Esperar a que PostgreSQL esté listo
340-
sleep 10
341-
342-
# Crear usuario y base de datos
343-
sudo -u postgres psql -c "CREATE USER heroesadmin WITH PASSWORD 'Heroes@2024#';"
344-
sudo -u postgres psql -c "CREATE DATABASE heroes_db OWNER heroesadmin;"
345-
sudo -u postgres psql -c "GRANT ALL PRIVILEGES ON DATABASE heroes_db TO heroesadmin;"
346-
347-
# Configurar para escuchar en todas las interfaces
348-
sudo sed -i "s/#listen_addresses = 'localhost'/listen_addresses = '*'/" /etc/postgresql/14/main/postgresql.conf
349-
350-
# Permitir conexiones remotas
351-
echo "host all all 10.0.2.0/24 scram-sha-256" | sudo tee -a /etc/postgresql/14/main/pg_hba.conf
352-
353-
# Reiniciar PostgreSQL
354-
sudo systemctl restart postgresql
355-
356-
runcmd:
357-
- /tmp/setup-postgres.sh
358-
```
359-
360-
Y luego crear la VM con:
361-
362-
```bash
363-
az vm create \
364-
--resource-group $RESOURCE_GROUP \
365-
--name $DB_VM_NAME \
366-
--image $DB_VM_IMAGE \
367-
--admin-username $DB_VM_ADMIN_USERNAME \
368-
--generate-ssh-keys \
369-
--vnet-name $VNET_NAME \
370-
--subnet $DB_SUBNET_NAME \
371-
--size $VM_SIZE \
372-
--nsg $DB_VM_NSG_NAME \
373-
--public-ip-address "" \
374-
--custom-data cloud-init-postgres.yaml
202+
postgresql://heroesadmin:Heroes@2024#@$DB_PRIVATE_IP:5432/heroes
375203
```
376204

377205
---
@@ -400,5 +228,3 @@ az vm create \
400228
---
401229

402230
Ahora que ya tienes la base de datos creada con PostgreSQL, necesitamos una API que interactúe con ella. Puedes continuar en el siguiente [paso](../02-api-vm/README.md) 🚀.
403-
404-
> ⚠️ **Nota**: Si tu API estaba configurada para SQL Server, necesitarás adaptarla para usar PostgreSQL. El driver y la cadena de conexión serán diferentes.

0 commit comments

Comments
 (0)