Despliegue de Mini Programas de WeChat con Backend Flask y Proxies Docker

Configuración del Entorno Base

El despliegue de una aplicación tipo mini programa requiere coordinar un entorno frontend con herramientas oficiales de desarrollo y un servicio backend accesible exclusivamente mediante protocolos seguros. La infraestructura recomendada utiliza instancias virtuales ligeras con sistema operativo Ubuntu, junto con un dominio personalizado y certificados TLS válidos.

  • Cliente: WeChat Developer Tools (procesamiento JavaScript/TypeScript).
  • Servidor de Aplicaciones: Python 3 + Framework Flask.
  • Infraestructura: Máquina virtual Ubuntu LTS y registro de dominio gestionado por proveedores compatibles.

Orquestación de Contenedores y Servidor Web

La instalación de Docker proporciona el aislamiento necesario para ejecutar servicios de forma reproducible. Se recomienda utilizar los repositorios oficiales y gestionar las claves GPG mediante rutas estándar del sistema.

# Actualización del gestor de paquetes
sudo apt update && sudo apt upgrade -y

# Instalación de dependencias del runtime
sudo apt install -y ca-certificates curl gnupg lsb-release

# Importación de clave GPG oficial
install -m 0755 -d /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

# Adición del repositorio seguro
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

# Despliegue final
sudo apt update && sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

# Activación del servicio
sudo systemctl enable docker.service
sudo systemctl start docker.service

Una vez operativos los motores de contenedores, se procede a extraer la imagen de Nginx y definir volúmenes persistentes para mantener configuraciones y registros tras reinicios del host.

# Extracción de imagen base
docker pull nginx:alpine

# Creación de estructura de directorios locales
mkdir -p /srv/webproxy/{html,logs,conf.d,certs}

# Primera ejecución para extraer configuración predeterminada
docker run --name temp-nginx -p 8080:80 -d nginx

# Transferencia de archivos de ruta interna a mapeo local
docker cp temp-nginx:/etc/nginx/nginx.conf /srv/webproxy/conf/nginx.conf
docker cp temp-nginx:/etc/nginx/conf.d/default.conf /srv/webproxy/conf.d/app-route.conf

# Remoción del contenedor temporal
docker rm -f temp-nginx

Ajuste de Certificados y Redireccionamiento HTTP

Se debe cargar el archivo .crt y .key generado durante el proceso de homologación del dominio dentro del directorio asignado a certs. Posteriormente, se configura el bloque de escucha para capturar tráfico no cifrado y redirigirlo automáticamente.

server {
    listen 80;
    listen [::]:80;
    server_name tu-dominio.top;
    
    location /.well-known/acme-challenge/ {
        root /var/www/certbot;
    }

    return 301 https://$host$request_uri;
}

Configuración de Proxy Inverso e Interfaz Segura

El siguiente fragmento define cómo Nginx actuará como puerta de enlace hacia la lógica de negocio alojada en el contenedor Python. Se establecen cabeceras de tránsito y se especifican los puntos de terminación TLS.

server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    server_name tu-dominio.top;

    ssl_certificate     /etc/nginx/certs/tu-dominio.pem;
    ssl_certificate_key /etc/nginx/certs/tu-dominio.key;

    ssl_session_timeout 1d;
    ssl_session_cache shared:SSL:10m;
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256';
    ssl_prefer_server_ciphers off;

    client_max_body_size 20m;

    location /api/ {
        proxy_pass http://127.0.0.1:5000;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        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;
        proxy_cache_bypass $http_upgrade;
    }

    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }
}

Tras validar la sintaxis con docker exec temp-nginx nginx -t, se lanza el contenedor definitivo asociando todos los volúmenes anteriores y aplicando políticas de reinicio automático.

docker run -d \
  --name prod-nginx \
  -p 80:80 -p 443:443 \
  -v /srv/webproxy/html:/usr/share/nginx/html:ro \
  -v /srv/webproxy/logs:/var/log/nginx \
  -v /srv/webproxy/conf/nginx.conf:/etc/nginx/nginx.conf:ro \
  -v /srv/webproxy/conf.d:/etc/nginx/conf.d:ro \
  -v /srv/webproxy/certs:/etc/nginx/certs:ro \
  --restart unless-stopped \
  nginx:alpine

Empaquetado y Ejecución del Servicio Backend

La capa de lógica de negocio se expone mediante endpoints RESTful desarrollados en Flask. Es crucial estructurar el código fuente, declarar dependencias explícitas y generar un archivo de configuración optimizado para entornos aislados.

from flask import Flask, jsonify, request
import os

app = Flask(__name__)
app.secret_key = os.urandom(24).hex()

@app.route('/health', methods=['GET'])
def check_status():
    return jsonify({"status": "operativo", "version": "1.0"}), 200

@app.route('/proceso', methods=['POST'])
def procesar_solicitud():
    datos_recibidos = request.get_json(silent=True)
    if not datos_recibidos:
        return jsonify({"error": "Cuerpo JSON vacío"}), 400
    
    # Lógica de transformación o persistencia aquí
    return jsonify({"mensaje": "Procesado correctamente"}), 201

if __name__ == '__main__':
    puerto = int(os.getenv('PORT', 5000))
    app.run(host='0.0.0.0', port=puerto, debug=False)

La definición del entorno de construcción debe instalar solo lo necesario para reducir la huella de la imagen final. Se prioriza la limpieza de cachés de compilación y la verificación de integridad de paquetes.

FROM python:3.11-slim AS builder
WORKDIR /build
COPY requirements.txt .
RUN pip install --no-cache-dir --user -r requirements.txt

FROM python:3.11-slim
LABEL maintainer="admin@dominio.top"
RUN apt-get update && apt-get install -y --no-install-recommends curl \
    && rm -rf /var/lib/apt/lists/*
WORKDIR /app
COPY --from=builder /root/.local /root/.local
ENV PATH=/root/.local/bin:$PATH
COPY . .
RUN chmod +x entrypoint.sh
ENTRYPOINT ["/bin/bash", "./entrypoint.sh"]

El script de inicio asigna permisos y lanza el motor de la aplicación enlazándoce a todas las interfaces disponibles dentro del namespace de red del contenedor.

#!/usr/bin/env bash
set -e
chown -R root:root /app
exec python3 main.py

La generación y puesta en marcha de la imagen se realiza mediante secuencias automáticas que verifican la disponibilidad del servicio antes de exponerlo al proxy inverso.

# Construcción de la capa estática
docker build -t api-service:latest .

# Validación previa (opcional)
docker run --rm api-service:latest python main.py health

# Lanzamiento productivo
docker run -d \
  --name flask-backend \
  -p 5000:5000 \
  --restart always \
  --memory=512m \
  --cpus=1.0 \
  api-service:latest

Integración del Cliente Oficial

Dentro del panel de administración de WeChat Developer Tools, se debe navegar a la sección de configuración de seguridad del proyecto. Allí se registra el nombre completo del dominio público bajo la lista blanca de servidores legítimos. Solo los identificadores con certificados emitidos por autoridades reconocidas son aceptados por la plataforma.

Al completar la fase de pruebas locales y ajustes de interfaz, se genera una versión estandarizada mediante el compilador integrado. Esta versión se sincroniza directamente hacia el centro de desarrollo web correspondiente. Desde esa consola, se solicita una revisión manual donde el equipo técnico valida el cumplimiento de lineamientos de seguridad, privacidad y funcionalidad antes de habilitarla públicamente.

Etiquetas: Flask Docker Nginx weixin-miniprogram Ubuntu

Publicado el 9-27 10:50