[{"content":"","date":"26/02/2026","externalUrl":null,"permalink":"/es/categories/","section":"Categories","summary":"","title":"Categories","type":"categories"},{"content":"","date":"26/02/2026","externalUrl":null,"permalink":"/es/tags/containers/","section":"Tags","summary":"","title":"Containers","type":"tags"},{"content":"","date":"26/02/2026","externalUrl":null,"permalink":"/es/tags/devops/","section":"Tags","summary":"","title":"Devops","type":"tags"},{"content":"","date":"26/02/2026","externalUrl":null,"permalink":"/es/categories/devops/","section":"Categories","summary":"","title":"DevOps","type":"categories"},{"content":"","date":"26/02/2026","externalUrl":null,"permalink":"/es/tags/docker/","section":"Tags","summary":"","title":"Docker","type":"tags"},{"content":"","date":"26/02/2026","externalUrl":null,"permalink":"/es/tags/github-actions/","section":"Tags","summary":"","title":"Github-Actions","type":"tags"},{"content":"Tengo un servidor donde tengo desplegados muchos servicios y aplicaciones que uso en mi día a día: servidores web como el de Tutaim, bots de Telegram y servidores de juegos, entre otras cosas.\nPero, ¿qué pasa si un día se quema el datacenter donde está mi VPS, se borra todo o pasa cualquier cosa terrible que haga que no lo pueda usar más? Perdería absolutamente todos los servicios y tendría que configurar todo desde cero en un nuevo servidor, lo que perfectamente podría llevarme horas de trabajo.\nPor eso he pensado en dockerizar todos los servicios y aplicaciones que pueda. Así, si ocurre alguna catástrofe, podré desplegarlos en minutos en cualquier otro servidor partiendo de cero. Para ello, en esta guía te voy a explicar todo el proceso con un ejemplo real: dockerizar un bot de Telegram, subir la imagen a GitHub y desplegarlo.\n1. Instalar Docker: ¿Engine o Desktop? # Para instalar Docker hay varias formas. A nosotros nos interesa el Docker Engine, el motor nativo con el que crearemos y usaremos los contenedores. Sin embargo, también existe Docker Desktop, que es una aplicación con interfaz gráfica empaquetada que incluye el motor, pero le mete una tonelada de cosas extra (y máquinas virtuales) para que sea \u0026ldquo;fácil de usar\u0026rdquo;.\nEn la siguiente tabla puedes ver de forma rápida las diferencias clave entre ambas opciones:\nCaracterística Docker Engine Docker Desktop Arquitectura Proceso en segundo plano (dockerd) + CLI. App GUI + VM gestionada + Engine embebido. Rendimiento Nativo (metal). Súper ligero y rápido. Pesado. Arrastra una Máquina Virtual y una interfaz gráfica. Sistemas Linux nativo (En Windows/Mac requiere VM manual). Windows, Mac y Linux (corre todo mediante VM). Interfaz Terminal pura (CLI). Interfaz gráfica amigable. Coste 100% Open Source y gratis. Gratis para uso personal. De pago para empresas grandes. Uso ideal Estándar absoluto en servidores de producción. Solo recomendado para desarrollo local cómodo. Teniendo en cuenta estas características, elige una de las dos. Si buscas máximo rendimiento y estás en Linux, usa solo Docker Engine. Si buscas comodidad visual en Windows o Mac, usa Docker Desktop. No instales ambas opciones a la vez en Linux o tendrás conflictos severos a la hora de ejecutar comandos.\nYo voy a usar Docker Engine en Linux, que se instala de forma muy sencilla siguiendo estos pasos:\nDescargar e instalar el script oficial: curl -fsSL https://get.docker.com -o get-docker.sh sudo sh get-docker.sh Arreglar los permisos (para poder usar Docker sin escribir sudo todo el rato): sudo usermod -aG docker $USER Important Tras lanzar este comando, cierra sesión o reinicia el PC para que los permisos se apliquen\n2. Preparar la aplicación # La aplicación que voy a usar para crear la imagen es un simple bot de Telegram que da la hora. Voy a crear una carpeta con los 5 archivos que necesito:\n1. requirements.txt El fichero con las librerías de Python necesarias.\npython-telegram-bot==20.8 python-dotenv==1.0.1 pytz==2024.1 2. .env El fichero de las variables de entorno. Este archivo es un secreto y debe ser siempre local.\nTELEGRAM_TOKEN=123456:ABC-TuTokenFalsoAqui TIMEZONE=Europe/Madrid 3. .dockerignore Aquí añadimos todos los ficheros temporales de caché, basura de los IDEs y, lo más importante, el archivo .env. Todo lo listado aquí NO se añadirá a la imagen pública.\n__pycache__/ *.pyc .env .git/ venv/ 4. main.py El código de mi bot.\nimport os import logging from datetime import datetime import pytz from dotenv import load_dotenv from telegram import Update from telegram.ext import ApplicationBuilder, ContextTypes, CommandHandler # 1. Cargar variables de entorno (Oculta las claves) load_dotenv() # 2. Configurar Logging (Para ver errores en la consola) logging.basicConfig( format=\u0026#39;%(asctime)s - %(name)s - %(levelname)s - %(message)s\u0026#39;, level=logging.INFO ) # 3. Lógica del Bot async def start(update: Update, context: ContextTypes.DEFAULT_TYPE): await update.message.reply_text(\u0026#34;¡Hola! Soy TimeBot. Usa /hora para saber qué hora es.\u0026#34;) async def get_time(update: Update, context: ContextTypes.DEFAULT_TYPE): # Pillamos la zona horaria del .env o usamos Madrid por defecto tz_name = os.getenv(\u0026#34;TIMEZONE\u0026#34;, \u0026#34;Europe/Madrid\u0026#34;) try: zona = pytz.timezone(tz_name) hora_actual = datetime.now(zona).strftime(\u0026#34;%H:%M:%S\u0026#34;) await update.message.reply_text(f\u0026#34;En {tz_name} son las: {hora_actual}\u0026#34;) except Exception as e: logging.error(f\u0026#34;Error con la zona horaria: {e}\u0026#34;) await update.message.reply_text(\u0026#34;He tenido un problema calculando la hora.\u0026#34;) # 4. Ejecución Principal if __name__ == \u0026#39;__main__\u0026#39;: token = os.getenv(\u0026#34;TELEGRAM_TOKEN\u0026#34;) if not token: raise ValueError(\u0026#34;¡NO HAY TOKEN! Revisa tu archivo .env\u0026#34;) application = ApplicationBuilder().token(token).build() application.add_handler(CommandHandler(\u0026#39;start\u0026#39;, start)) application.add_handler(CommandHandler(\u0026#39;hora\u0026#39;, get_time)) application.run_polling() 5. Dockerfile\nDockerfile es el fichero de instrucciones para crear la imagen. Si nunca has hecho un Dockerfile, puede parecer que estás escribiendo conjuros en un idioma antiguo, pero en realidad es el manual de instrucciones más tonto del mundo. Es como darle a un becario una hoja de papel diciéndole exactamente cómo tiene que configurar un ordenador desde cero.\nFROM python:3.12-slim # Argumento para detectar arquitectura (amd64/arm64) ARG TARGETARCH WORKDIR /app # Instalamos dependencias del sistema si hicieran falta (ej. ffmpeg, curl...) # RUN apt-get update \u0026amp;\u0026amp; apt-get install -y curl \u0026amp;\u0026amp; rm -rf /var/lib/apt/lists/* COPY requirements.txt . # Instalamos librerías de Python RUN pip install --no-cache-dir -r requirements.txt COPY . . # Comando de arranque CMD [\u0026#34;python\u0026#34;, \u0026#34;main.py\u0026#34;] ¿Qué hace exactamente este Dockerfile? # Docker lee este archivo de arriba hacia abajo, ejecutando cada instrucción y guardando el resultado como una \u0026ldquo;capa\u0026rdquo; de la imagen. Vamos a destripar las instrucciones más importantes que hemos usado:\nFROM python:3.12-slim (La base) Siempre es la primera instrucción. Le dice a Docker: \u0026ldquo;Bájate un Linux lite que ya traiga Python 3.12 instalado de fábrica\u0026rdquo;. Así nos ahorramos tener que instalar el lenguaje nosotros a mano.\nARG TARGETARCH (La arquitectura) Esta instrucción es preparatoria. Le dice a Docker que se prepare para recibir una variable externa mágica mientras está construyendo la imagen. No hace que tu imagen sea multiarquitectura por sí sola (de eso se encargará el comando buildx que veremos después), pero es vital ponerla si tu aplicación crece. ¿Por qué? Porque si mañana necesitas instalar un programa de Linux que en procesadores normales (Intel/AMD) se llama programa-x64, y en Raspberry (ARM) se llama programa-arm, puedes usar esta variable dentro del Dockerfile para decirle: \u0026ldquo;Si TARGETARCH es amd64 bájate el primero, si es arm64 bájate el segundo\u0026rdquo;. De momento no lo usamos activamente en los RUN, pero es una buena práctica dejar el Dockerfile preparado.\nWORKDIR /app (La carpeta de trabajo) Le dice al contenedor: \u0026ldquo;A partir de ahora, todos los comandos que ejecute y los archivos que copie, mételos dentro de la carpeta /app\u0026rdquo;. Obviamente en tu Docker puedes guardar los archivos donde quieras.\nRUN apt-get update... (Ejecuta comandos de Linux) Usar RUN seguido de algo, es el equivalente a abrir la terminal de ese Linux virtual y teclear ese algo. Aquí puedes instalar programas del sistema operativo que tu aplicación necesite por debajo (como ffmpeg si vas a procesar audio o vídeo, o curl).\nNote Si vas a ejecutar varios comandos de sistema, únelos siempre con \u0026amp;\u0026amp; en un solo RUN. Si pones 10 comandos RUN separados, Docker creará 10 \u0026ldquo;capas\u0026rdquo; inútiles y tu imagen pesará muchísimo más. Para entender mejor las capas de Docker de forma opcional puedes revisar su explicación oficial.\nCOPY requirements.txt . (Mete tus archivos en la olla) Copia archivos desde tu ordenador hacia dentro de la imagen. Fíjate que primero copiamos solo el archivo de requisitos y luego ejecutamos el pip install en el siguiente RUN. Esto se hace así para aprovechar el sistema de caché de Docker: si modificas tu código en main.py pero no tocas las librerías, Docker se saltará la instalación de pip y construirá la imagen más rápidamente. COPY . . (El volcado final) Copia TODO lo que hay en la carpeta de tu proyecto (tu código fuente, carpetas, etc.) dentro de la imagen. Todo aquello que no quieras que entre (como el .env con tus claves reales o los temporales de __pycache__), debe estar listado en el archivo .dockerignore. CMD [\u0026quot;python\u0026quot;, \u0026quot;main.py\u0026quot;] (El botón de encendido) Es la orden final. Le dice al contenedor qué tiene que hacer cuando alguien lo encienda en el servidor. Ojo con esto: si el script main.py crashea o termina de ejecutarse, el contenedor entero se apagará al instante. Docker solo mantiene vivo el contenedor mientras el proceso del CMD siga corriendo en primer plano. Además, este archivo está preparado con la variable TARGETARCH por si en el futuro queremos instalar dependencias distintas dependiendo de si el servidor usa procesadores Intel/AMD (amd64) o procesadores ARM como las Raspberry Pi (arm64).\n3. Subir la imagen a GitHub (GHCR) # Para poder descargar nuestra aplicación desde cualquier servidor del mundo, vamos a alojar la imagen Docker en el GitHub Container Registry.\nPara ello necesitas un Token. Genera uno nuevo y asegúrate de marcar la casilla write:packages. Copia ese token.\nAhora, abre tu terminal y inicia sesión en Github:\ndocker login ghcr.io -u TuUsuarioGitHub Pega el token generado cuando te lo pida.\n4. Compilación nativa y multiarquitectura # Multiarquitectura # Normalmente, si construyes la imagen en tu PC (amd64), no funcionará en máquinas ARM (arm64) como las Raspberry. Para solucionar esto y construir ambas versiones de golpe, usaremos Docker Buildx.\nEjecuta estos tres comandos en tu terminal local, dentro de la carpeta del proyecto:\n# 1. Instala los emuladores para que tu PC pueda compilar ARM (solo la primera vez) docker run --privileged --rm tonistiigi/binfmt --install all # 2. Crea un constructor avanzado (solo la primera vez) docker buildx create --use # 3. Compila las dos versiones a la vez y súbelas automáticamente a GitHub docker buildx build --platform linux/amd64,linux/arm64 -t ghcr.io/TuUsuarioGitHub/timebot:latest --push . Una vez que termine, la imagen estará disponible en la pestaña \u0026ldquo;Packages\u0026rdquo; de tu perfil de GitHub.\nNativa # Si solo te interesa compilar la imagen para la arquitectura de tu sistema actual, simplemente ejecuta estos comandos y ya:\n# 1. Compilas la imagen docker build -t ghcr.io/TuUsuarioGitHub/timebot:latest . # 2. La subes al registro de GitHub docker push ghcr.io/TuUsuarioGitHub/timebot:latest Important ghcr.io/TuUsuarioGitHub/timebot:latest no solo es el nombre de la imagen, es toda la dirección de envío completa, como si fuera la etiqueta de un paquete de correos. Le indicamos que suba la imagen a GitHub Container Registry en la ruta /TuUsuarioGitHub/timebot.\n:latest Es la versión específica de la imagen. En un entorno profesional se suele usar una etiqeuta numérica, pero a nosotros nos sirve así.\n5. El despliegue en el servidor (el orquestador) # Por fin llegamos al servidor de producción. Accede a una terminal de tu servidor o VPS.\nEn este punto, podrías encender tu contenedor usando un comando larguísimo de docker run en la terminal, pero eso es una mala práctica. Si el servidor se reinicia, el contenedor no se levantará solo y perderás la configuración.\nPara solucionarlo usamos Docker Compose, que es un \u0026ldquo;orquestador local\u0026rdquo;. Nos permite escribir un archivo de configuración (docker-compose.yml) donde definimos cómo queremos que se comporte nuestro contenedor, si necesita reiniciarse automáticamente, qué puertos usa y dónde lee las contraseñas.\nComo el código de nuestro bot ya está dentro de la imagen alojada en GitHub, no necesitas subir ni copiar tus archivos de Python al VPS. Solo necesitas decirle a Docker Compose que descargue la imagen y la encienda.\nCrea una carpeta nueva en tu servidor, entra en ella y crea tu archivo de credenciales, que en nuestro caso sí que lo necesita, ya que es un archivo que no viene con la imagen, se debe crear localmente por seguridad.\nmkdir timebot \u0026amp;\u0026amp; cd timebot nano .env A continuación, crea el orquestador, el nombre debe ser docker-compose.yml o compose.yml, en las últimas versiones la documentación de Docker recomienda usar compose.yml, aunque docker-compose.yml sigue siendo completamente válido.\nnano docker-compose.yml Y pega la siguiente configuración:\nservices: timebot: image: ghcr.io/TuUsuarioGitHub/timebot:latest container_name: timebot_prod restart: always env_file: - .env ¿Qué significa cada línea del docker-compose.yml? # services:: Aquí empieza la lista de aplicaciones que vamos a levantar. En nuestro caso, solo una (nuestro bot). timebot:: Es el nombre interno que le damos al servicio. Si en el futuro añadiéramos una base de datos de PostgreSQL, la pondríamos debajo con el nombre db:. image:: Le dice a Docker de dónde tiene que descargar el paquete exacto. Al poner :latest, nos aseguramos de que siempre apunte a la última versión que hayamos subido a GitHub. container_name:: Es el nombre \u0026ldquo;bonito\u0026rdquo; que verás cuando listes los procesos de tu servidor con docker ps. restart: always: La línea salvavidas. Le dice a Docker que, si el script de Python crashea por un error, o si el servidor VPS entero se reinicia por un corte de luz, Docker debe volver a encender el bot automáticamente. env_file:: Le inyecta de forma segura las contraseñas y configuraciones que guardamos en nuestro archivo .env del servidor, para que el código en Python pueda leer el TELEGRAM_TOKEN sin que esté público en GitHub. Para ver todas las opciones aparte de las explicadas aquí, que ofrece el fichero Docker Compose, te recomiendo mirar la documentación oficial de docker.\nUna vez guardado el archivo, enciende el bot en segundo plano ejecutando:\ndocker compose up -d (El parámetro -d o \u0026ldquo;detached\u0026rdquo; sirve para que el bot se quede corriendo de fondo y te devuelva el control de la terminal).\nEjecutamos y esperamos a que baje la imagen y la encienda:\nubuntu@myvps:~/dockers/timebot$ docker compose up -d [+] up 11/11 ✔ Image ghcr.io/mr-umar/timebot:latest Pulled 2.4s ✔ Network timebot_default Created 0.5s ✔ Container timebot_prod Started 0.3s ubuntu@myvps:~/dockers/timebot$ Para comprobar que nuestro contenedor está funcionando, podemos comprobarlo con docker ps:\nubuntu@myvps:~/dockers/timebot$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 4ba9a9dd53df ghcr.io/mr-umar/timebot:latest \u0026#34;python main.py\u0026#34; About a minute ago Up About a minute timebot_prod Como vemos, el bot ya está funcionando en la nube de forma segura, aislada y preparado para sobrevivir a reinicios.\n6. Actualizar en el futuro (El ciclo DevOps) # ¿Has modificado el código en tu ordenador y quieres actualizar la aplicación en el VPS? Este es el proceso que deberías seguir:\nEn tu PC: Vuelves a lanzar el comando de subida. docker buildx build --platform linux/amd64,linux/arm64 -t ghcr.io/TuUsuarioGitHub/timebot:latest --push . o\n# 1. Compilas la imagen docker build -t ghcr.io/TuUsuarioGitHub/timebot:latest . # 2. La subes al registro de GitHub docker push ghcr.io/TuUsuarioGitHub/timebot:latest En tu VPS: Te descargas la actualización y reinicias el contenedor. docker compose pull docker compose up -d Con estos dos simples pasos, Docker detecta la nueva versión, apaga el contenedor viejo y levanta el nuevo en cuestión de pocos segundos. Ya tienes un sistema DevOps completo que te salvará la vida la próxima vez que tu servidor decida salir ardiendo.\nConclusión # Este bot de Telegram es solo la excusa: el flujo es el mismo para casi cualquier app o servicio que quieras dejar “a prueba de incendios” (Dockerfile → build → subir a un registry → desplegar con Compose en el servidor → actualizar con pull + up). La gracia no es el ejemplo, es que separas código (dentro de la imagen) de config/secrets (fuera, en .env/variables), y así puedes recrear todo en minutos en cualquier máquina limpia sin copiar proyectos a mano.\nA partir de aquí, tu trabajo es repetir el patrón: si la app usa puertos, los declaras en Compose; si necesita persistencia, le metes volúmenes; si depende de otros servicios (DB, Redis), los añades como más services y listo. Para no liarla, cuando quieras hacer algo “raro” (healthchecks, redes, volúmenes, límites de recursos, depends_on, etc.), tira primero de la documentación oficial de Docker Compose, porque ahí están todas las opciones con el comportamiento real y actualizado. Y sí: puedes usar un LLM para que te genere el esqueleto del Dockerfile/compose.yml o para adaptar el despliegue a tu caso, pero luego no seas un NPC: compruébalo en local, y versiona/taggea tus imágenes si no quieres sorpresas.\n","date":"26/02/2026","externalUrl":null,"permalink":"/es/posts/dockerizar-aplicaciones-vps-github-container-registry/","section":"","summary":"","title":"Guía completa para Dockerizar aplicaciones y servicios","type":"posts"},{"content":"Hola 👋. Aquí encontrarás documentación que voy escribiendo para tener referencias en el futuro (por si se me olvida algo), además de cosas interesantes que voy aprendiendo.\n¡Espero que te sea útil! Puedes buscar cualquier tema con el icono de la lupa de arriba 🔍 o simplemente echar un vistazo a mis posts recientes más abajo\n","date":"26/02/2026","externalUrl":null,"permalink":"/es/","section":"Inicio","summary":"","title":"Inicio","type":"page"},{"content":"","date":"26/02/2026","externalUrl":null,"permalink":"/es/categories/proyectos/","section":"Categories","summary":"","title":"Proyectos","type":"categories"},{"content":"","date":"26/02/2026","externalUrl":null,"permalink":"/es/tags/python/","section":"Tags","summary":"","title":"Python","type":"tags"},{"content":"","date":"26/02/2026","externalUrl":null,"permalink":"/es/tags/self-hosting/","section":"Tags","summary":"","title":"Self-Hosting","type":"tags"},{"content":"","date":"26/02/2026","externalUrl":null,"permalink":"/es/categories/sistemas/","section":"Categories","summary":"","title":"Sistemas","type":"categories"},{"content":"","date":"26/02/2026","externalUrl":null,"permalink":"/es/tags/","section":"Tags","summary":"","title":"Tags","type":"tags"},{"content":"","date":"26/02/2026","externalUrl":null,"permalink":"/es/tags/telegram-bot/","section":"Tags","summary":"","title":"Telegram-Bot","type":"tags"},{"content":"","date":"26/02/2026","externalUrl":null,"permalink":"/es/categories/tutoriales/","section":"Categories","summary":"","title":"Tutoriales","type":"categories"},{"content":"","date":"26/02/2026","externalUrl":null,"permalink":"/es/tags/vps/","section":"Tags","summary":"","title":"Vps","type":"tags"},{"content":"","date":"26 febrero 2026","externalUrl":null,"permalink":"/tags/ghcr/","section":"Tags","summary":"","title":"Ghcr","type":"tags"},{"content":"","date":"26 febrero 2026","externalUrl":null,"permalink":"/categories/linux/","section":"Categories","summary":"","title":"Linux","type":"categories"},{"content":"","date":"26 febrero 2026","externalUrl":null,"permalink":"/posts/","section":"Posts","summary":"","title":"Posts","type":"posts"},{"content":"","date":"26 febrero 2026","externalUrl":null,"permalink":"/categories/projects/","section":"Categories","summary":"","title":"Projects","type":"categories"},{"content":"","date":"26 febrero 2026","externalUrl":null,"permalink":"/categories/tutorials/","section":"Categories","summary":"","title":"Tutorials","type":"categories"},{"content":"","date":"19/02/2026","externalUrl":null,"permalink":"/es/tags/android/","section":"Tags","summary":"","title":"Android","type":"tags"},{"content":"","date":"19/02/2026","externalUrl":null,"permalink":"/es/tags/apuntes/","section":"Tags","summary":"","title":"Apuntes","type":"tags"},{"content":"","date":"19 febrero 2026","externalUrl":null,"permalink":"/tags/engineering/","section":"Tags","summary":"","title":"Engineering","type":"tags"},{"content":"","date":"19/02/2026","externalUrl":null,"permalink":"/es/tags/estudio/","section":"Tags","summary":"","title":"Estudio","type":"tags"},{"content":"","date":"19/02/2026","externalUrl":null,"permalink":"/es/tags/ingenieria/","section":"Tags","summary":"","title":"Ingenieria","type":"tags"},{"content":"","date":"19/02/2026","externalUrl":null,"permalink":"/es/tags/lapiz/","section":"Tags","summary":"","title":"Lapiz","type":"tags"},{"content":"Desde hace unos meses adquirí la Xiaomi Pad 7 junto a su lápiz original, el Focus Pen, a un muy buen precio. Mi idea era usarla para tomar apuntes para la universidad, por lo que durante estos últimos meses he probado decenas de apps para tomar apuntes a mano con el lápiz y creo que finalmente he encontrado las mejores. En este post te voy a hablar de algunas opciones que he probado y cuáles son las mejores en mi opinión.\nMi Canvas (Lienzos Mi): La decepción nativa # Mi Canvas es la aplicación por defecto preinstalada en la Xiaomi Pad 7 y otras tablets de la marca. Es correcta para garabatos rápidos, pero no está pensada para tomar apuntes serios de universidad.\nEl primer problema mortal es que los trazos NO son vectoriales. ¿Qué significa esto? Que cuando compartas o exportes tus apuntes, se pixelarán al hacer zoom. Mira la imagen de abajo: el texto de la izquierda (Mi Canvas) está claramente pixelado; el de la derecha (otra app con trazos vectoriales) se ve infinitamente más nítido. Para mí, esto ya la descarta de entrada.\nOtros fallos graves:\nSin navegación Con notas largas no puedes saltar entre hojas fácilmente. Tienes que hacer scroll eterno para encontrar información anterior. Sin organización Todas las notas en una sola carpeta. Imposible organizar por asignaturas, temas o semestres. Cloud limitado Solo sincroniza con Xiaomi Cloud. Ni Google Drive, ni Dropbox, ni nada útil. Sirve para un boceto rápido, pero para apuntes es una tomadura de pelo.\nNota 4/10\n✅ Lo Bueno (Mi Canvas) ❌ Lo Malo (Mi Canvas) Integración nativa: Funciona perfecto con los botones del lápiz (intercambiar estilos y colores) sin configurar nada. Falta de funciones No tiene capas (layers), ni carpetas, ni muchas opciones de personalización Latencia mínima: Al ser del sistema, el trazo es casi instantáneo. Interfaz pobre: Pocos pinceles, sin opciones de personalización de página avanzadas. Gratis: Viene instalada, cero coste. Sin exportación decente: Olvídate de sacar un PDF vectorial de calidad o ver las notas en PC fácilmente. Simplicidad: \u0026ldquo;Llegar y besar el santo\u0026rdquo;, ideal para notas rápidas o garabatos sucios. Samsung Notes: La joya exclusiva # Si tienes una tablet Samsung, no busques más: esta es tu mejor opción, punto. Es la aplicación nativa por excelencia y, desgraciadamente, es exclusiva del ecosistema Samsung. Aunque existen APKs modificados para otras marcas, suelen dar problemas de sincronización o funcionalidades capadas, así que si tienes una tablet de otra marca, olvídate de usarla al 100%.\nA nivel técnico, es todo lo que Mi Canvas debería ser y no es. Samsung Notes juega en otra liga: motor de escritura vectorial impecable, sincronización perfecta con la nube (Microsoft OneNote/PC), capas de dibujo, grabación de audio sincronizada con lo que escribes (brutal para conferencias) y una gestión de PDFs que es una delicia.\nSi tienes una tablet Samsung, probablemente sea la mejor opción.\nNota 8.5/10\n✅ Lo bueno (Samsung Notes) ❌ Lo malo (Samsung Notes) Motor vectorial: Trazo perfecto y escalado infinito sin pixelar. Exclusividad: Solo funciona bien en dispositivos Samsung Galaxy. Audio sync: Graba la clase mientras tomas notas; al reproducir, te resalta lo que escribías en ese momento. Lock-in: Si te cambias de marca (a Xiaomi/iPad), exportar tus notas editables es un dolor. Ecosistema PC: Tiene app nativa para Windows (aunque solo se deja instalar fácilmente en portátiles Samsung Galaxy Book; en otros requiere trucos). Sincronización en Linux: No tiene cliente nativo; dependes de OneNote web o backups. Gratis y completa: Viene preinstalada con funciones Pro que otras cobran. Squid Notes: La veterana eficiente # Squid es una de las aplicaciones pioneras en Android para tomar apuntes manuscritos y, sorprendentemente, sigue dando guerra. Aunque su versión gratuita es muy limitada para un uso serio (te faltarán herramientas básicas), su modelo de suscripción es ridículamente barato: 1€ al mes o 10€ al año. Un precio simbólico por una herramienta profesional.\nSu mayor virtud es técnica: utiliza un motor de renderizado vectorial basado en OpenGL que consigue una latencia bajísima incluso en dispositivos antiguos. Esto significa que la \u0026ldquo;tinta\u0026rdquo; sale de la punta del lápiz sin retraso perceptible, algo crítico para escribir rápido. Además, genera archivos PDF vectoriales muy ligeros, perfectos para compartir o imprimir sin perder calidad.\nSin embargo, se le notan los años. A pesar de llevar más de una década en el mercado, sigue sin tener cliente nativo de PC ni versión web, lo que es un fallo imperdonable en 2026. La única solución es activar la \u0026ldquo;Exportación PDF automática\u0026rdquo; a la nube (Google Drive/Dropbox/Box) para tener una copia legible en tu ordenador.\nRecientemente han lavado la cara a la interfaz con un diseño más moderno, que falta le hacía, aunque la experiencia de edición pura (seleccionar, mover, cambiar color) sigue sintiéndose un paso por detrás de apps modernas.\nEs la opción ideal si buscas velocidad pura, estabilidad y archivos que no ocupen gigas. No esperes florituras artísticas; es una herramienta de trabajo bruta.\nNota 7/10\n✅ Lo Bueno (Squid) ❌ Lo Malo (Squid) Rendimiento: Latencia mínima y fluidez extrema en cualquier tablet. Sin cliente PC/Web: Obligado a usar \u0026ldquo;hacks\u0026rdquo; (exportación PDF auto) para ver notas en Linux/Windows. Archivos ligeros: Genera PDFs vectoriales que ocupan muy poco espacio. Interfaz: Aunque mejorada, la UX de edición se siente \u0026ldquo;antigua\u0026rdquo;. Precio: 10 €/año es imbatible para una herramienta pro. Fiabilidad: Es una roca, no crashea y sincroniza correctamente. Saber Notes: La Alternativa Open Source # Saber es la aplicación que he usado durante más tiempo y, para mí, la única competencia real de código abierto frente a gigantes como Samsung Notes. De hecho, su creador la diseñó explícitamente para llenar ese vacío en el ecosistema Android libre.\nAl ser open source, tienes el control total: puedes auditar el código, ver cómo funciona por dentro e incluso hacer tu propio fork para añadir funciones específicas, algo que yo mismo hice para adaptarla a mis necesidades.\nSu punto fuerte es la compatibilidad multiplataforma real: tiene clientes nativos para Android, Linux (Flatpak), Windows y hasta iOS. Si usas Linux en el escritorio, es una gozada tener tus notas sincronizadas sin hacer malabares.\nSin embargo, no es perfecta. La sincronización en la nube depende exclusivamente de Nextcloud/WebDAV, lo cual es genial para la privacidad (puedes autoalojar tu servidor), pero requiere configuración técnica si no tienes un hosting a mano.\nEl gran problema de Saber es el rendimiento y peso de los archivos. Al guardar trazos vectoriales muy detallados sin mucha compresión, una nota de pocas páginas puede ocupar cientos de megas. En tablets de gama media o baja, con notas largas la app se siente pesada y el scroll puede dar tirones.\nTiene compatibilidad con gran variedad de pencils, aunque lamentablemente no para mi Focus Pen. ;(\nEs la opción obligatoria para probar antes de pagar nada. Si tienes una tablet potente y te gusta el open source, puede ser tu app definitiva. Da igual la tablet o PC que tengas, funciona en cualquier sistema operativo\nNota 9/10\n✅ Lo bueno (Saber) ❌ Lo malo (Saber) Open Source: Código libre, sin trackers y modificable. Archivos pesados: Notas simples pueden ocupar \u0026gt;100 MB por falta de optimización. Multiplataforma: Cliente nativo Linux, Windows, Android e iOS que funciona igual en todos lados. Rendimiento: Exige hardware potente para ir fluida con muchas páginas. Privacidad: Sincronización vía Nextcloud/WebDAV (tus datos son tuyos). Sync Limitada: No soporta GDrive/Dropbox nativo fácil sin montar líos. Gratis: Sin suscripciones, sin anuncios, sin compras in-app. Bugs ocasionales: A veces tiene fallos tontos. Notein: La revelación definitiva # Para mí, Notein es la aplicación definitiva en Android hoy en día. Es la respuesta directa a GoodNotes de iOS, desarrollada por ingenieros ex-Huawei y Baidu que saben muy bien lo que hacen.\nA nivel técnico es una bestia: tiene absolutamente todas las funciones que un estudiante puede soñar. Trazos vectoriales perfectos, reconocimiento de formas geométricas instantáneo, OCR con IA (en la versión de pago), capas múltiples y una personalización de hojas/plantillas brutal.\nEs la única aplicación de todas las que he probado que implementa un sistema de pestañas superior (tipo navegador web) y pantalla dividida, permitiéndote tener múltiples notas y PDFs abiertos simultáneamente para consultar o copiar contenido sin perder tiempo cambiando de ventana.\nLo que me terminó de enamorar fue su integración con el hardware: es la única app de terceros (aparte de la nativa Mi Canvas) que detecta y usa correctamente los botones del Xiaomi Focus Pen para cambiar herramientas o borrar sin tocar la pantalla.\nSu precio es ridículo para lo que ofrece: unos 7€ al año o 14€ de pago único de por vida. Yo pagué la vitalicia sin dudarlo.\nEl único \u0026ldquo;pero\u0026rdquo; importante es su disponibilidad: es exclusiva de Android. No tiene cliente nativo de PC (Windows/Linux) ni versión web. Sin embargo, como está en constante desarrollo, espero que en un futuro tenga cliente para PC.\nSi no tienes una tablet Samsung, esta es tu app. Combina la velocidad de Squid con las funciones de Samsung Notes. Es el sustituto perfecto de Saber si buscas estabilidad y no te importa pagar 14 €.\nNota 9/10\n✅ Lo Bueno (Notein) ❌ Lo Malo (Notein) Motor gráfico: Latencia cero y trazo vectorial ultrafluido. Solo Android: Sin cliente nativo de PC/Web (dependes del backup PDF). Hardware Xiaomi: Soporte nativo para botones del Focus Pen (raro en apps de terceros). Curva de aprendizaje: Tantas opciones pueden abrumar al principio. Funciones pro: (De pago) Capas, OCR, audio sync, zoom infinito real. Pago: Aunque barato, no tiene versión \u0026ldquo;full\u0026rdquo; gratis como Saber. Precio: Pago único asequible (14€) vs. suscripciones eternas. Privacidad: Servidores en China/Singapur (aunque usas GDrive para backup). Conclusión: ¿Cuál es la mejor app para ti? # Después de probarlas todas intensivamente en mi día a día como estudiante de ingeniería, la respuesta depende de tu hardware y tu flujo de trabajo.\nSi tienes una tablet Samsung, no te compliques: Samsung Notes es insuperable en su ecosistema y gratuita.\nSi quieres velocidad en cualquier tablet vieja, Squid sigue siendo el rey del rendimiento.\nPero si tienes una tablet no Samsung y quieres la experiencia más productiva, Saber Notes y Notein son las ganadoras absolutas. Como recomendación personal, prueba ambas. Aunque seas usuario de Samsung también.\nApp Ideal para Precio Linux/Windows Nota Final Notein Usuarios android (Ingeniería/Estudio serio) ~14€ (Vitalicio) Solo Android 😃 Nota 9/10 (Muy recomendada) Saber Cualquier estudiante Gratis (Open Source) Cliente nativo 😃 Nota 9/10 (Muy recomendada) Samsung Notes Dueños de Galaxy Tab (Exclusiva) Gratis (Incluida) Solo Windows/Web 😊 Nota 8.5/10 (Recomendada para usuarios de Samsung) Squid Tablets antiguas/lentas (rapidez pura) ~10 €/año Solo PDF con backups 🙂 Nota 7/10 Recomendada) Mi Canvas Notas rápidas/bocetos (uso casual) Gratis (incluida) No 😢 Nota 4/10 No recomendada ","date":"19/02/2026","externalUrl":null,"permalink":"/es/posts/mejores-apps-tablet-apuntes-ingenieria-universidad/","section":"","summary":"","title":"Las mejores apps para tomar apuntes para la universidad","type":"posts"},{"content":"","date":"19/02/2026","externalUrl":null,"permalink":"/es/tags/matematicas/","section":"Tags","summary":"","title":"Matematicas","type":"tags"},{"content":"","date":"19 febrero 2026","externalUrl":null,"permalink":"/tags/math/","section":"Tags","summary":"","title":"Math","type":"tags"},{"content":"","date":"19/02/2026","externalUrl":null,"permalink":"/es/tags/notas/","section":"Tags","summary":"","title":"Notas","type":"tags"},{"content":"","date":"19 febrero 2026","externalUrl":null,"permalink":"/tags/note-taking/","section":"Tags","summary":"","title":"Note-Taking","type":"tags"},{"content":"","date":"19 febrero 2026","externalUrl":null,"permalink":"/tags/notes/","section":"Tags","summary":"","title":"Notes","type":"tags"},{"content":"","date":"19/02/2026","externalUrl":null,"permalink":"/es/categories/productividad/","section":"Categories","summary":"","title":"Productividad","type":"categories"},{"content":"","date":"19 febrero 2026","externalUrl":null,"permalink":"/categories/productivity/","section":"Categories","summary":"","title":"Productivity","type":"categories"},{"content":"","date":"19/02/2026","externalUrl":null,"permalink":"/es/categories/rese%C3%B1as/","section":"Categories","summary":"","title":"Reseñas","type":"categories"},{"content":"","date":"19 febrero 2026","externalUrl":null,"permalink":"/categories/reviews/","section":"Categories","summary":"","title":"Reviews","type":"categories"},{"content":"","date":"19 febrero 2026","externalUrl":null,"permalink":"/tags/study/","section":"Tags","summary":"","title":"Study","type":"tags"},{"content":"","date":"19 febrero 2026","externalUrl":null,"permalink":"/tags/stylus/","section":"Tags","summary":"","title":"Stylus","type":"tags"},{"content":"","date":"19/02/2026","externalUrl":null,"permalink":"/es/tags/tablet/","section":"Tags","summary":"","title":"Tablet","type":"tags"},{"content":"","date":"19 febrero 2026","externalUrl":null,"permalink":"/categories/technology/","section":"Categories","summary":"","title":"Technology","type":"categories"},{"content":"","date":"19/02/2026","externalUrl":null,"permalink":"/es/categories/tecnologia/","section":"Categories","summary":"","title":"Tecnologia","type":"categories"},{"content":"","date":"19/02/2026","externalUrl":null,"permalink":"/es/tags/universidad/","section":"Tags","summary":"","title":"Universidad","type":"tags"},{"content":"","date":"19 febrero 2026","externalUrl":null,"permalink":"/tags/university/","section":"Tags","summary":"","title":"University","type":"tags"},{"content":"Si has llegado hasta aquí, ya te habrás dado cuenta de que Nvidia y Linux en general no se llevan muy bien\u0026hellip; Por lo que en esta guía rápida te voy a explicar cómo activar tu GPU Nvidia en distribuciones de Linux basadas en Ubuntu como Linux Mint, KDE Neon, Pop!_OS y muchas otras.\nAntes de nada, verificamos por si las moscas que nuestra distro realmente está basada en Ubuntu; obviamente, si usas Ubuntu, no hace falta que lo hagas.\ncat /etc/os-release | grep ubuntu Si este comando te muestra una salida, ya sea como la siguiente, entonces puedes continuar sin miedo:\numar@crappycomputer:~$ cat /etc/os-release | grep ubuntu ID_LIKE=\"ubuntu debian\" Este procedimiento asume que los drivers de NVIDIA aún no están instalados o que se parte de una configuración limpia.\nPaso 1: Instalar el controlador (driver) de NVIDIA # Abre una terminal (Ctrl+Alt+T). Busca los controladores (drivers) recomendados para tu hardware con el siguiente comando: ubuntu-drivers devices Esto tiene la siguiente salida:\numar@crappycomputer:~$ ubuntu-drivers devices == /sys/devices/pci0000:00/0000:00:06.0/0000:01:00.0 == modalias : pci:v000010DEd000025A2sv00001043sd00001113bc03sc02i00 vendor : NVIDIA Corporation model : GA107M [GeForce RTX 3050 Mobile] (...) driver : nvidia-driver-580-open - distro non-free driver : nvidia-driver-590-server - distro non-free driver : nvidia-driver-590-open - distro non-free recommended driver : nvidia-driver-535 - distro non-free driver : nvidia-driver-470-server - distro non-free driver : xserver-xorg-video-nouveau - distro free builtin Instala el controlador que aparece como recommended. En mi caso es el nvidia-driver-590-open. Ejecuta el siguiente comando para instalarlo: sudo apt install nvidia-driver-590-open Una vez finalice la instalación, reinicia el ordenador. Paso 2: Cambiar a la sesión gráfica X11 # Esta es la parte más importante para garantizar la compatibilidad.\nEn la pantalla de inicio de sesión (donde introduces tu contraseña), busca un icono o menú desplegable en una de las esquinas. Selecciona la opción Plasma (X11) en lugar de \u0026ldquo;Plasma (Wayland)\u0026rdquo;. Inicia sesión como lo harías normalmente. Paso 3: Configurar el sistema para usar solo la GPU NVIDIA # Abre una terminal. Ejecuta el siguiente comando para establecer el perfil de rendimiento de NVIDIA: sudo prime-select nvidia Reinicia el ordenador para que los cambios se apliquen correctamente. Paso 4: Verificar que todo ha funcionado # Después de reiniciar, abre una terminal y ejecuta el comando de monitorización de NVIDIA:\nnvidia-smi Si aparece una tabla con la información de tu tarjeta gráfica y muestra el proceso /usr/lib/xorg/Xorg, significa que la GPU NVIDIA está activa y renderizando todo el escritorio.\nImportant Puede que después de alguna actualizacion la GPU NVIDIA no quede como la principal, en ese caso con que repitas los pasos a partir del Paso 3 es suficiente.\nMission Center # Una buena aplicación gráfica para monitorizar tu Linux es Mission Center, donde puedes ver por cada GPU el uso, memoria y codificación/decodificación de video. Si ves que tu tarjeta Nvidia no tiene uso, es que algún paso no ha salido bien o, después de alguna actualización, no está la GPU NVIDIA como principal; en ese caso, con que repitas los pasos a partir del Paso 3, es suficiente.\nEspero que esta guía rápida te sea útil. ","date":"15/02/2026","externalUrl":null,"permalink":"/es/posts/activar-gpu-nvidia-linux-ubuntu-drivers/","section":"","summary":"","title":"Activar tarjetas gráficas NVIDIA en distribuciones Ubuntu","type":"posts"},{"content":"","date":"15/02/2026","externalUrl":null,"permalink":"/es/categories/gu%C3%ADa/","section":"Categories","summary":"","title":"Guía","type":"categories"},{"content":"","date":"15 febrero 2026","externalUrl":null,"permalink":"/categories/guide/","section":"Categories","summary":"","title":"Guide","type":"categories"},{"content":"","date":"15/02/2026","externalUrl":null,"permalink":"/es/tags/hardware/","section":"Tags","summary":"","title":"Hardware","type":"tags"},{"content":"","date":"15/02/2026","externalUrl":null,"permalink":"/es/tags/linux/","section":"Tags","summary":"","title":"Linux","type":"tags"},{"content":"","date":"15/02/2026","externalUrl":null,"permalink":"/es/tags/nvidia/","section":"Tags","summary":"","title":"Nvidia","type":"tags"},{"content":"","date":"15 febrero 2026","externalUrl":null,"permalink":"/tags/os/","section":"Tags","summary":"","title":"OS","type":"tags"},{"content":"","date":"15/02/2026","externalUrl":null,"permalink":"/es/tags/so/","section":"Tags","summary":"","title":"SO","type":"tags"},{"content":"","date":"15/02/2026","externalUrl":null,"permalink":"/es/tags/ubuntu/","section":"Tags","summary":"","title":"Ubuntu","type":"tags"},{"content":"","date":"14/02/2026","externalUrl":null,"permalink":"/es/tags/blowfish/","section":"Tags","summary":"","title":"Blowfish","type":"tags"},{"content":" ¿Qué es Hugo? # Si estás buscando algo para gestionar un blog, documentación o simplemente una web donde puedas publicar tus cosas y te has dado cuenta de que WordPress es lento, inseguro y estás harto de actualizar plugins cada dos días para evitar que te entren los rusos o los chinos.\nLa solución es Hugo. Es un generador de sitios estáticos hecho en Go. Compila tu web entera en milisegundos. Pero antes debes saber que las páginas que generas se harán en Markdown o, si tienes miedo a usar un mínimo la terminal de Linux, entonces deja esto y usa Wix.\nAparte de Hugo, te voy a mostrar cómo instalar el tema Blowfish, el tema que yo uso actualmente.\nRequisitos # Te voy a enseñar a instalar Hugo en Linux y hostearlo en GitHub Pages, por lo que necesitas:\nUna cuenta de GitHub. Cómo vamos a usar GitHub, pues en tu máquina evidentemente debes tener Git. Un editor de código. Puedes usar Gedit, Visual Studio, Sublime Text, o incluso nano o vim si te sirve. Usa lo que sepas. Yo te recomiendo Visual Studio. Instalación # Con Snap Store # Para instalar Hugo hay varias formas; la primera y la más fácil si tienes Snap es pegar el siguiente comando en tu terminal:\nsudo snap install hugo --channel=extended Necesitamos la versión Extended para soporte Sass/SCSS.\nLa forma general para Linux # Si no tienes Snap, o no te apetece usarlo, puedes descargar el paquete .deb desde el repositorio oficial de Hugo.\nVe a GitHub Releases. Busca el archivo .deb que pone hugo_extended_X.XX.X_linux-amd64.deb. Importante que tenga la palabra extended.\nNote Si estás en un máquina con arquitectura ARM (Si pones arch en tu terminal te dice que arquitectura tiene tu máquina) tienes que buscar hugo_extended_X.XX.X_linux-arm64.deb\nUna vez que tengas el .debdescárgalo manualmente o con wget \u0026lt;link de descarga\u0026gt;.\nPara hacer la instalación, sitúate en el directorio donde tengas el .deb y ejecuta:\nsudo dpkg -i hugo_extended_*.deb Ahora, para comprobar que todo ha salido bien, cierra tu terminal actual y abre una nueva y ejecuta:\nhugo version Deberías ver algo como:\numar@crappycomputer:~$ hugo version hugo v0.155.3-8a85c04d295+extended linux/amd64 (...) Con esto ya tienes Hugo en tu máquina.\nTu primera web # Ahora que tienes Hugo, vamos a crear nuestra web, blog, portfolio, da igual para lo que sea. Aquí el comando clave es el siguiente, donde mi-blog será el nombre de la carpeta que creará Hugo para crear tu sitio.\nhugo new site mi-blog Note Puedes crearlo en la ubicación que te de la gana, pero te recomeindo tenerlo ordenado para que luego cuando lo quieras editar sepas donde está. Este será tu repositorio local donde harás tus cambios antes de subirlos.\nAhora que lo tienes, entra e inicializa tu repo:\ncd mi-blog git init Crear y conectar el repositorio de GitHub # Antes de continuar, necesitas crear un repositorio en GitHub y conectarlo con tu repo local.\nVe a GitHub y crea un repositorio nuevo.\nImportant Si quieres que tu sitio esté en tu-usuario.github.io, el nombre del repo tiene que ser exactamente tu-usuario.github.io. Si le pones otro nombre como mi-blog, la URL será tu-usuario.github.io/mi-blog.\nCuando crees el repo, NO marques las opciones de \u0026ldquo;Add a README file\u0026rdquo;, \u0026ldquo;.gitignore\u0026rdquo; o \u0026ldquo;license\u0026rdquo;. Déjalo vacío porque ya tienes el contenido local. Además, si no tienes GitHub Pro, el repo debe ser público.\nUna vez creado el repo, copia la URL que te da GitHub (algo como https://github.com/tu-usuario/nombre-repo.git) y ejecuta:\ngit remote add origin https://github.com/tu-usuario/nombre-repo.git Instalar el tema Blowfish # Ahora vamos a instalar el tema Blowfish; es un tema con muchas posibilidades, y creo que para un primer sitio está muy bien, pero si tienes otra cosa en cabeza y quieres usar otro tema, puedes buscar el que más te guste en el repositorio de temas de Hugo.\nPodríamos bajar el zip y añadirlo manualmente, pero usa el siguiente comando para tener la última versión de Blowfish:\ngit submodule add -b main https://github.com/nunocoracao/blowfish.git themes/blowfish Blowfish tiene una configuración compleja por las diferentes posibilidades que ofrece. No te recomiendo que empieces de cero escribiendo ficheros .toml o romperás algo seguro. Copia los archivos de ejemplo de themes/blowfish/config/_default/ a tu carpeta config/_default/. Puede que tengas que crear las carpetas tú.\nLuego edita hugo.toml, cambia la baseURL:\nbaseURL = \u0026#34;https://docs.umarmohammad.xyz/\u0026#34; languageCode = \u0026#34;en\u0026#34; theme = \u0026#34;blowfish\u0026#34; title = \u0026#34;Umar Mohammad Docs\u0026#34; En mi configuración he puesto la URL https://docs.umarmohammad.xyz/ pero puede que tú no tengas tu propio dominio; entonces, como vas a usar GitHub Pages, debes poner usuario-github.github.io, así para acceder a tu sitio alguien en el navegador pondrá usuario-github.github.io.\nNote usuario-github es tu usuario de GitHub, como el mio es mr-umar.\nSi tienes tu propio dominio, también te enseñaré en los próximos pasos cómo configurar el DNS. De momento, como recomendación, no modifiques los ajustes del tema ni de Hugo; se te puede liar 😵.\nPruebas locales # Ahora, antes de continuar, vamos a probar si nuestro repositorio local funciona. En el directorio de la web, ejecuta:\nhugo server Abre http://localhost:1313 en tu navegador; si funciona, felicidades. Si no, lee el log de errores en el terminal. Probablemente en este punto sea un error de configuración tonto al tocar el archivo hugo.toml.\nDesplegando con GitHub Pages # Actualización: Tras investigar Cloudflare Pages, he visto que también permite desplegar sitios hechos con Hugo. Más info: guía oficial. Si no te interesa puedes continuar con esta guía. :) Vale, ahora viene la parte bonita para que cualquiera pueda acceder a tu sitio. Primero, desde la terminal, ponte en el directorio de tu sitio si no lo estabas ya y ejecuta:\n# Añade todo al staging git add . # Commit git commit -m \u0026#34;Primer commit de mi sitio con Hugo\u0026#34; # Push al repo git branch -M main git push -u origin main git push origin main Note Si es la primera vez que haces push, puede que te pida autenticarte. Si te pide usuario y contraseña, usa un Personal Access Token, con la contraseña de tu cuenta de GitHub NO va a funcionar.\nAhora vete al repositorio en la web de GitHub → Settings → Pages. A continuación verás la opción Build and deployment y justo abajo Source con un desplegable; a nosotros nos interesa seleccionar la opción GitHub Actions.\nAhora, debajo del desplegable donde has seleccionado GitHub Actions, deberá aparecer browse all workflows; si le das clic, debes buscar hugo y darle a Enter y seleccionar Hugo dándole a Configure.\nA continuación verás una página muy similar a la siguiente; aquí lo único que debes modificar es bajar hasta la línea 34, donde indica HUGO_VERSION y poner la versión que te has instalado más arriba en tu máquina local.\nSi no haces este paso, muy probablemente después tengas problemas con los temas y ajustes que uses. Una vez hecho esto, debes pulsar en Commit changes.\nNote Si vas a usar tu propio dominio en el repo, en Settings → Pages, debes ir hasta donde indique Custom domain y poner tu dominio. Además debes ir a los ajustes DNS de tu dominio y crear un registro CNAME que apunte a tu-usuario.github.io. Después de hacer estos ajustes, el siguiente paso que debes hacer es traer los cambios de GitHub Actions a tu repo local con el siguiente comando:\ngit pull Ahora, este paso es importante: si vas a usar un dominio propio, debes ejecutar lo siguiente con tu dominio.\necho \u0026#34;dominio.com\u0026#34; \u0026gt; static/CNAME git add . git commit -m \u0026#34;Registro CNAME\u0026#34; git push origin main Con este paso solo debes esperar 2-3 minutos para que GitHub Actions levante tu web en tu dominio personalizado o en tu-usuario.github.io. Ahora ya puedes acceder a tu web.\nAhora, para crear el contenido, te recomiendo abrir la carpeta del repo local con VSCode e instalar la extensión Front Matter CMS, que simplificará tu vida.\nY también visita la documentación de Hugo y Blowfish para saber más.\n","date":"14/02/2026","externalUrl":null,"permalink":"/es/posts/como-instalar-hugo-y-blowfish/","section":"","summary":"","title":"Cómo instalar Hugo y Blowfish (sin volverse loco)","type":"posts"},{"content":"","date":"14/02/2026","externalUrl":null,"permalink":"/es/tags/hugo/","section":"Tags","summary":"","title":"Hugo","type":"tags"},{"content":"","date":"14/02/2026","externalUrl":null,"permalink":"/es/tags/wordpress/","section":"Tags","summary":"","title":"WordPress","type":"tags"},{"content":"","externalUrl":null,"permalink":"/es/authors/","section":"Authors","summary":"","title":"Authors","type":"authors"},{"content":"Aquí encontrarás conceptos de Machine Learning según los voy aprendiendo: palabras clave, fundamentos, resúmenes y explicaciones que escribo para consultarlas en el futuro. Estos posts pueden contener errores o quedar incompletos, así que es posible que los corrija y los actualice con el tiempo\n","externalUrl":null,"permalink":"/es/machine-learning/","section":"Machine Learning","summary":"","title":"Machine Learning","type":"machine-learning"},{"content":"","externalUrl":null,"permalink":"/es/series/","section":"Series","summary":"","title":"Series","type":"series"}]