Despliegue de una aplicación Swift en VPS: guía paso a paso
El desarrollo de aplicaciones de servidor en Swift utilizando el framework Vapor está ganando popularidad. Sin embargo, después de escribir el código surge la pregunta: ¿cómo alojar una aplicación Swift en un servidor remoto? En este artículo, analizaremos el proceso completo de despliegue de una aplicación Swift en un VPS (Ubuntu 22.04), desde la instalación de los componentes necesarios hasta la configuración del reverse proxy y la ejecución en modo producción.
1. Preparación del servidor e instalación de Swift
Primero, nos conectamos al VPS por SSH y actualizamos la base de paquetes:
sudo apt update && sudo apt upgrade -ySwift requiere dependencias para la compilación. Las instalamos:
sudo apt install clang libicu-dev libcurl4-openssl-dev libssl-dev python3 pkg-config -yLuego, descargamos e instalamos Swift para Ubuntu. En el momento de escribir este artículo, la versión actual es la 5.9. Descargamos el archivo:
wget https://download.swift.org/swift-5.9-release/ubuntu2204/swift-5.9-RELEASE/swift-5.9-RELEASE-ubuntu22.04.tar.gzLo descomprimimos y lo movemos a /usr/share:
tar xzf swift-5.9-RELEASE-ubuntu22.04.tar.gzsudo mv swift-5.9-RELEASE-ubuntu22.04 /usr/share/swiftAñadimos Swift al PATH. Abrimos ~/.bashrc:
nano ~/.bashrcAñadimos la línea al final del archivo:
export PATH="/usr/share/swift/usr/bin:$PATH"Aplicamos los cambios:
source ~/.bashrcVerificamos la instalación:
swift --versionDebería mostrarse la versión de Swift 5.9.
2. Compilación de la aplicación Swift (Vapor) en el servidor
Clonamos el repositorio con la aplicación o copiamos los archivos mediante SCP. Como ejemplo, crearemos un proyecto de prueba con Vapor:
mkdir ~/myapp && cd ~/myappswift package init --type executableAñadimos Vapor en Package.swift (ejemplo de un servidor mínimo):
// swift-tools-version:5.9import PackageDescription
let package = Package( name: "myapp", platforms: [.macOS(.v13)], dependencies: [ .package(url: "https://github.com/vapor/vapor.git", from: "4.89.0") ], targets: [ .executableTarget(name: "myapp", dependencies: [ .product(name: "Vapor", package: "vapor") ]) ])Creamos el archivo Sources/myapp/main.swift:
import Vapor
let app = try Application(.detect())app.get { req in return "Hello, Swift on VPS!"}try app.run()Compilamos el proyecto en modo release:
swift build -c releaseDespués de la compilación, el binario se encontrará en .build/release/myapp. Lo copiamos a una ubicación conveniente:
cp .build/release/myapp /usr/local/bin/myapp3. Configuración de Nginx como reverse proxy
La aplicación Swift escuchará en el puerto 8080, y Nginx redirigirá el tráfico desde el puerto 80 (o 443 para HTTPS). Instalamos Nginx:
sudo apt install nginx -yCreamos un archivo de configuración para nuestra aplicación:
sudo nano /etc/nginx/sites-available/myappContenido del archivo:
server { listen 80; server_name your-domain.com;
location / { proxy_pass http://127.0.0.1:8080; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection 'upgrade'; proxy_set_header Host $host; proxy_cache_bypass $http_upgrade; }}Activamos la configuración y reiniciamos Nginx:
sudo ln -s /etc/nginx/sites-available/myapp /etc/nginx/sites-enabled/sudo nginx -tsudo systemctl restart nginxNo olvides configurar un registro DNS A para tu dominio, que apunte a la dirección IP del VPS.