[{"data":1,"prerenderedAt":198},["ShallowReactive",2],{"seo-verification":3,"blog-alojar-appwrite-en-un-vps-ma-es":6,"promo-bar-likely":197},{"google":4,"bing":5},"EycwPY2XMyTkVzas3n1ygeNJFGAH513qrMjfDljzsMQ","",{"key":7,"data":8},"blog-alojar-appwrite-en-un-vps-ma-es",{"id":9,"slug":10,"slugs":11,"title":15,"excerpt":16,"readTime":17,"views":18,"isPinned":19,"noindex":19,"publishedAt":20,"updatedAt":21,"category":22,"categories":28,"featuredImage":30,"bgImage":31,"posterImage":32,"relatedSolution":33,"intro":36,"sections":37,"ctaTitle":139,"ctaBody":140,"ctaButton":141,"ctaUrl":142,"relatedPosts":143},61,"alojar-appwrite-en-un-vps",{"fr":12,"en":13,"ar":14,"es":10},"heberger-appwrite-vps","hosting-appwrite-on-a-vps","استضافة-appwrite-على-خادم-vps","Alojar Appwrite en un VPS: guía completa self-hosted","Despliega Appwrite en tu VPS con Docker: stack completa, Traefik SSL, copias de seguridad, hardening y comparativa con Supabase.",10,1,false,"2026-04-20T00:00:00+00:00","2026-09-19T02:00:43+00:00",{"id":23,"name":24,"slug":25,"color":26,"icon":27},6,"Bases de datos","bases-de-donnees","bg-teal-500\u002F10 text-teal-400","database",[29],{"id":23,"name":24,"slug":25,"color":26,"icon":27},null,"\u002Fblog\u002Fcovers\u002Fbg.svg","\u002Fblog\u002Fcovers\u002Fheberger-appwrite-vps-poster.svg",{"categorySlug":34,"appSlug":35},"bases-de-datos","appwrite","Appwrite es un backend-as-a-service open source pensado para los desarrolladores web y móviles: base de datos documental, autenticación, almacenamiento de archivos, funciones serverless y messaging. Autoalojarlo en un VPS le ofrece un backend completo self-hosted, con SDK multiplataforma y sin facturación por uso. Esta guía cubre la instalación, la configuración de Traefik, el hardening de producción y las copias de seguridad — de principio a fin.",[38,42,54,57,60,82,85,88,132,136],{"type":39,"title":40,"body":41},"h2","Por qué autoalojar Appwrite en un VPS","Appwrite reúne en una sola plataforma todo lo que una aplicación necesita del lado del servidor: autenticación con más de 30 métodos OAuth, base de datos documental con permisos granulares, almacenamiento de archivos con transformación de imágenes, funciones serverless en varios lenguajes y messaging. Su versión cloud factura por uso y por recursos; al autoalojarla en un VPS, despliega el conjunto mediante Docker y lo pilota desde una consola web elegante, sin tope.\n\nResulta especialmente adecuado para los desarrolladores de Flutter, React Native o web que quieren un backend listo para usar con SDK oficiales, manteniendo los datos y la lógica en su propia infraestructura. Usted controla las funciones, las claves API y los permisos, y evoluciona a su ritmo — sin estar sujeto a las cuotas o subidas de precios de una nube pública.",{"type":43,"title":44,"items":45},"ul","Los beneficios concretos de un Appwrite autoalojado",[46,47,48,49,50,51,52,53],"Backend todo en uno: Auth, Databases, Storage, Functions y Messaging en una consola única.","SDK oficiales para Flutter, React Native, Web, Android, iOS, Node, Python y más.","Más de 30 proveedores OAuth integrados (Google, GitHub, Apple...) sin escribir código.","Funciones serverless self-hosted: ejecute su lógica de negocio sin ningún servicio externo.","Permisos granulares a nivel de documento y de colección, gestionados desde la consola.","Sin facturación por ejecución ni cuota de usuarios: tarifa de VPS fija.","Datos alojados en su propia infraestructura: cumplimiento GDPR simplificado, sin dependencia de nube de terceros.","Realtime integrado: suscríbase a cambios en documentos, archivos y estado de sesión vía WebSocket.",{"type":39,"title":55,"body":56},"Arquitectura interna: lo que Docker lanza realmente","Antes de instalar, conviene saber qué orquesta Appwrite. El instalador oficial genera un `docker-compose.yml` con al menos veinte servicios:\n\n- **appwrite** — el servidor API principal (PHP, expuesto en el puerto 80\u002F443 mediante Traefik).\n- **appwrite-console** — la consola de administración web (React, servida en el mismo dominio en `\u002F`).\n- **appwrite-realtime** — el servicio WebSocket para suscripciones en tiempo real.\n- **appwrite-worker-*** — una serie de workers para tareas asíncronas: envío de e-mails, webhooks salientes, limpieza de archivos temporales, etc.\n- **appwrite-executor** — el runtime de ejecución de las Functions serverless (Docker-in-Docker).\n- **mariadb** — la base de datos relacional interna (usuarios, proyectos, reglas de permisos).\n- **redis** — la caché y la cola de tareas (jobs de workers, sesiones, rate-limiting).\n- **traefik** — el reverse proxy integrado que gestiona el enrutamiento HTTPS y los certificados Let's Encrypt.\n\nPara un VPS de desarrollo, solo el nodo `core` es estrictamente necesario: API, Consola, MariaDB, Redis y Traefik. Los workers y el executor son imprescindibles en producción si usa Functions, webhooks o envío de e-mails. **Calcule al menos 4 GB de RAM para esta stack completa**.",{"type":39,"title":58,"body":59},"Requisitos de hardware y software","Para una instancia de desarrollo o pruebas, bastan 2 vCPU y 4 GB de RAM con 40 GB de SSD. Para producción con funciones serverless activas y varias apps cliente, apunte a 4 vCPU, 8 GB de RAM y 80 GB de SSD — cada invocación de Function arranca su propio contenedor efímero, lo que presiona el disco y la CPU.\n\nEn cuanto al software: Ubuntu 22.04 o 24.04 LTS, Docker CE y Docker Compose v2 (Appwrite gestiona su propio Traefik para el enrutamiento y el SSL), y un nombre de dominio que apunte a la IP del VPS — por ejemplo `api.miapp.com`. Los puertos 80 y 443 deben estar libres y abiertos en `ufw` para que Traefik obtenga los certificados Let's Encrypt mediante el challenge ACME.\n\n**Una nota sobre el almacenamiento.** Las Functions generan imágenes Docker intermedias que se acumulan en el SSD. Sin purgas periódicas, una instancia que lleva meses en marcha puede saturar su disco. Programe una tarea cron semanal de `docker system prune --volumes -f`, y monitoree el espacio libre con `df -h`.",{"type":61,"title":62,"steps":63},"steps","Desplegar Appwrite self-hosted con Docker",[64,67,70,73,76,79],{"title":65,"body":66},"Preparar el VPS y abrir los puertos","Instale Docker CE y Docker Compose v2, luego abra los puertos necesarios:\n\n```bash\nufw allow 80\u002Ftcp\nufw allow 443\u002Ftcp\nufw enable\n```\n\nHaga que su dominio (p. ej., `api.miapp.com`) apunte a la IP del VPS mediante un registro A. Espere la propagación DNS antes de ejecutar el instalador — Traefik necesita que el dominio resuelva realmente para pasar el challenge ACME.",{"title":68,"body":69},"Lanzar el instalador interactivo oficial","Ejecute el instalador con un solo comando:\n\n```bash\ndocker run -it --rm \\\n  --volume \u002Fvar\u002Frun\u002Fdocker.sock:\u002Fvar\u002Frun\u002Fdocker.sock \\\n  --volume \"$(pwd)\"\u002Fappwrite:\u002Fusr\u002Fsrc\u002Fcode\u002Fappwrite:rw \\\n  --entrypoint=\"install\" \\\n  appwrite\u002Fappwrite\n```\n\nEl asistente le pide el dominio principal, el puerto HTTP (80), el puerto HTTPS (443), un e-mail para Let's Encrypt y algunas opciones. Genera un `docker-compose.yml` y un archivo `.env` con secretos generados aleatoriamente. **No toque estos secretos a mano** — modifíquelos únicamente mediante las variables de entorno en `.env`.",{"title":71,"body":72},"Verificar la configuración del dominio y el SSL","Tras el arranque (`docker compose up -d`), espere 30 a 60 segundos para que Traefik emita el certificado. Compruebe:\n\n```bash\ncurl -I https:\u002F\u002Fapi.miapp.com\u002Fv1\u002Fhealth\n```\n\nLa respuesta debe ser `HTTP\u002F2 200` con `content-type: application\u002Fjson`. Si Traefik aún no tiene certificado, obtendrá un error TLS — es normal durante los primeros segundos. Si persiste, compruebe que los puertos 80\u002F443 no están filtrados por un firewall superior y que el dominio resuelve a la IP correcta (`dig api.miapp.com`).",{"title":74,"body":75},"Crear la cuenta de administrador y el primer proyecto","Abra `https:\u002F\u002Fapi.miapp.com` en su navegador. Appwrite le invita a crear la cuenta de administrador raíz en el primer acceso — esta cuenta es la única con acceso a los ajustes de la plataforma. Desde la consola, cree un proyecto, añada una plataforma (Web, Flutter, Apple…) declarando el hostname autorizado y recupere el ID del proyecto. Esos datos alimentan la inicialización del SDK en el lado del cliente:\n\n```bash\nnpm install appwrite\n```\n\n```bash\nimport { Client } from 'appwrite';\nconst client = new Client()\n  .setEndpoint('https:\u002F\u002Fapi.miapp.com\u002Fv1')\n  .setProject('\u003Cyour-project-id>');\n```",{"title":77,"body":78},"Endurecer la configuración de producción","Abra el archivo `.env` generado por el instalador y ajuste las siguientes variables:\n\n- `_APP_OPTIONS_ABUSE=enabled` — activa el rate-limiting integrado por IP.\n- `_APP_OPTIONS_FORCE_HTTPS=enabled` — redirige todas las peticiones HTTP a HTTPS.\n- `_APP_SMTP_HOST` \u002F `_APP_SMTP_PORT` \u002F `_APP_SMTP_SECURE` \u002F `_APP_SMTP_USERNAME` \u002F `_APP_SMTP_PASSWORD` — configure su relay SMTP para los e-mails de verificación y restablecimiento de contraseña.\n- `_APP_CONSOLE_WHITELIST_ROOT=disabled` si quiere permitir el registro abierto en la consola (no recomendado en prod); déjelo en `enabled` y rellene `_APP_CONSOLE_WHITELIST_EMAILS` con las direcciones autorizadas.\n\nReinicie los servicios tras la modificación: `docker compose up -d`.",{"title":80,"body":81},"Configurar las copias de seguridad automatizadas","Dos volúmenes Docker contienen todos los datos persistentes de Appwrite:\n\n- `appwrite-mariadb` — la base de datos (usuarios, proyectos, documentos, reglas).\n- `appwrite-uploads` — los archivos subidos por las apps cliente.\n\nPrograme un dump diario:\n\n```bash\ndocker exec appwrite-mariadb mysqldump \\\n  -u appwrite -p\"$MARIADB_ROOT_PASSWORD\" appwrite \\\n  > \u002Fbackups\u002Fappwrite-$(date +%Y%m%d).sql\n```\n\nArchive también el volumen `appwrite-uploads` (un `tar` de los datos o un snapshot de volumen según su infraestructura). **Guarde también `_APP_OPENSSL_KEY_V1`** — Appwrite lo usa para cifrar archivos y ciertos datos sensibles. Sin esta clave, una restauración de base de datos deja los contenidos cifrados permanentemente ilegibles.",{"type":39,"title":83,"body":84},"Red y Traefik: lo que ocurre entre bastidores","Traefik es el único punto de entrada de red de Appwrite: escucha en los puertos 80 y 443, gestiona los certificados Let's Encrypt y enruta las peticiones al servicio interno correcto. Esta integración es transparente — usted no escribe ninguna configuración de Traefik, la genera el instalador.\n\nAlgunos puntos importantes si añade un reverse proxy superior (nginx, Cloudflare Tunnel…):\n\n- **No duplique el TLS.** Si su proxy superior ya termina el SSL y reenvía en HTTP a Appwrite, desactive el challenge ACME estableciendo `_APP_OPTIONS_FORCE_HTTPS=disabled` y dejando `_APP_SYSTEM_SECURITY_EMAIL_ADDRESS=` vacío para evitar que Traefik intente obtener un certificado que no puede validar.\n- **Transmita la IP real.** Añada `X-Forwarded-For` y `X-Real-IP` en su proxy superior, y active la confianza en headers en Traefik (ya configurada por defecto en el instalador de Appwrite).\n- **Puertos de la consola.** La consola web y la API se sirven bajo el mismo dominio: no enrute el puerto 9501 (Realtime interno) públicamente — Traefik lo gestiona de forma interna.\n\nSi coloca Appwrite detrás de Cloudflare en modo proxied, establezca el modo SSL de la zona en **Full (strict)** — en modo Flexible, nginx redirige HTTP→HTTPS, lo que crea un bucle de redirección infinito entre Cloudflare y Traefik.",{"type":39,"title":86,"body":87},"Resolución de problemas comunes","**La consola muestra «Could not connect to the Appwrite API».**\nCompruebe que las variables `_APP_DOMAIN` y `_APP_DOMAIN_TARGET` en `.env` coincidan exactamente con el dominio que está usando. Un subdominio mal configurado (con o sin `www`) impide que Traefik enrute correctamente. Ejecute `docker compose up -d` después de cualquier modificación del `.env`.\n\n**Los e-mails de verificación no llegan.**\nAppwrite no tiene relay SMTP integrado — debe configurar `_APP_SMTP_*` con un servicio externo (Mailgun, Resend, su propio servidor). Sin SMTP configurado, los e-mails se encolan y se ignoran. Compruebe los logs del worker `appwrite-worker-mails`: `docker compose logs appwrite-worker-mails --tail 50`.\n\n**Las Functions serverless expiran por timeout.**\nCada Function arranca su propio contenedor Docker. En un VPS con 2 GB de RAM, el arranque en frío suele superar los 10 segundos, lo que dispara el timeout por defecto. Aumente `_APP_FUNCTIONS_TIMEOUT` en `.env` y prevea al menos 4 GB de RAM para uso en producción. Monitoree también el espacio en disco — las imágenes de runtime permanecen en el SSD tras la ejecución.\n\n**El certificado SSL no se genera.**\nTraefik necesita que los puertos 80 y 443 respondan desde el exterior para pasar el challenge ACME. Si un firewall superior (reglas de seguridad de su proveedor de VPS) bloquea estos puertos, el challenge falla silenciosamente. Pruebe desde una máquina externa: `curl -I http:\u002F\u002Fapi.miapp.com` debe responder (aunque sea con un 302), no expirar.\n\n**MariaDB arranca pero la consola muestra errores de base de datos.**\nSi ha modificado `.env` a mano entre reinicios, compruebe que `_APP_DB_HOST`, `_APP_DB_USER` y `_APP_DB_PASS` coinciden con los valores del contenedor MariaDB. Un reinicio parcial (un solo servicio) sin `docker compose down` puede dejar contenedores huérfanos con variables antiguas en memoria.",{"type":89,"title":90,"headers":91,"rows":95},"comparison","Appwrite vs Supabase: ¿cuál autoalojar?",[92,93,94],"Criterio","Appwrite","Supabase",[96,100,104,108,112,116,120,124,128],[97,98,99],"Base de datos","MariaDB, modelo documental","PostgreSQL nativo, SQL completo",[101,102,103],"Enfoque","Orientado a SDK y apps móviles","Orientado a SQL y apps relacionales",[105,106,107],"Funciones serverless","Nativas, multilenguaje, integradas","Edge Functions (Deno)",[109,110,111],"Instalación","Instalador interactivo oficial","Compose que hay que configurar a mano",[113,114,115],"SSL \u002F enrutamiento","Traefik integrado, automático","Reverse proxy externo por añadir",[117,118,119],"Búsqueda vectorial \u002F IA","No nativa","Nativa mediante pgvector",[121,122,123],"Realtime","WebSocket integrado, multi-recurso","Postgres CDC mediante Realtime",[125,126,127],"Ideal para","Flutter, React Native, mobile-first","SQL avanzado, RAG, relacional",[129,130,131],"Consola de administración","Consola rica y guiada","Studio centrado en las tablas SQL",{"type":133,"title":134,"body":135},"tip","Actualizaciones y mantenimiento continuo","Para actualizar Appwrite, vuelva a ejecutar el instalador con la nueva versión o modifique el tag de imagen en `docker-compose.yml` y ejecute `docker compose pull && docker compose up -d`. Appwrite aplica las migraciones de esquema automáticamente al arrancar el contenedor API — no se necesita ningún comando manual.\n\nPrograme también una purga semanal de imágenes Docker huérfanas para evitar la saturación del SSD:\n\n```bash\ndocker system prune --volumes -f\n```\n\nGuarde `_APP_OPENSSL_KEY_V1` en una caja fuerte separada (gestor de secretos, archivo cifrado fuera del VPS). Sin esta clave, una restauración de base de datos deja los archivos cifrados y ciertos datos sensibles permanentemente ilegibles — es el único punto de no retorno de una instalación de Appwrite.",{"type":133,"title":137,"body":138},"Esta plantilla aporta el núcleo: las Functions vienen después","El instalador oficial de Appwrite genera más de 25 contenedores, entre ellos workers de segundo plano y un runtime de ejecución para las Functions serverless y los Sites. Para mantener una huella reducida en el VPS, esta plantilla solo aporta el núcleo autosuficiente, el servidor de API, MariaDB, Redis y Traefik, que hace funcionar plenamente Auth, Databases, Storage, Realtime y la Console. Las Functions serverless, los webhooks salientes y el envío de correos en segundo plano requieren los contenedores worker y executor adicionales, y no están activados aquí. Cuando su proyecto lo necesite, pase a la stack docker-compose oficial completa de Appwrite y prevea al menos 4 GB de RAM. Para las copias de seguridad, programe snapshots de los volúmenes Docker `appwrite-mariadb` (datos) y `appwrite-uploads` (archivos).","Autoaloje su backend Appwrite","El VPS Cloud ServOrbit, con plantilla Docker lista para usar y SSD, aloja toda la stack de Appwrite, funciones serverless incluidas, en HTTPS.","Desplegar mi VPS Cloud","\u002Fvps-cloud",[144,162,180],{"id":145,"slug":146,"slugs":147,"title":151,"excerpt":152,"readTime":153,"views":18,"isPinned":19,"noindex":19,"publishedAt":154,"updatedAt":155,"category":156,"categories":157,"featuredImage":30,"bgImage":31,"posterImage":159,"relatedSolution":160},56,"alojar-postgresql-en-un-vps",{"fr":148,"en":149,"ar":150,"es":146},"heberger-postgresql-vps","postgresql-on-a-vps-a-reliable-and-controlled-database","postgresql-على-خادم-vps-قاعدة-بيانات-موثوقة-ومتحكم-بها","PostgreSQL en VPS: base de datos fiable y controlada","Aloje PostgreSQL en VPS: configuración prod, copias pgBackRest, HA streaming, comparativa RDS\u002FSupabase\u002FNeon y resolución de fallos OOM.",9,"2026-04-25T00:00:00+00:00","2026-10-21T15:21:37+00:00",{"id":23,"name":24,"slug":25,"color":26,"icon":27},[158],{"id":23,"name":24,"slug":25,"color":26,"icon":27},"\u002Fblog\u002Fcovers\u002Fheberger-postgresql-vps-poster.svg",{"categorySlug":34,"appSlug":161},"postgresql-stack",{"id":163,"slug":164,"slugs":165,"title":169,"excerpt":170,"readTime":153,"views":171,"isPinned":19,"noindex":19,"publishedAt":172,"updatedAt":173,"category":174,"categories":175,"featuredImage":30,"bgImage":31,"posterImage":177,"relatedSolution":178},57,"alojar-mysql-en-un-vps",{"fr":166,"en":167,"ar":168,"es":164},"heberger-mysql-vps","hosting-mysql-on-a-vps","استضافة-mysql-على-خادم-vps","Alojar MySQL en un VPS: guía completa","Instale MySQL 8.4 LTS en un VPS: requisitos, seguridad, rendimiento InnoDB, acceso remoto seguro, copias de seguridad automatizadas y resolución de errores.",0,"2026-04-24T00:00:00+00:00","2026-11-09T20:55:18+00:00",{"id":23,"name":24,"slug":25,"color":26,"icon":27},[176],{"id":23,"name":24,"slug":25,"color":26,"icon":27},"\u002Fblog\u002Fcovers\u002Fheberger-mysql-vps-poster.svg",{"categorySlug":34,"appSlug":179},"mysql-stack",{"id":181,"slug":182,"slugs":183,"title":187,"excerpt":188,"readTime":17,"views":171,"isPinned":19,"noindex":19,"publishedAt":189,"updatedAt":190,"category":191,"categories":192,"featuredImage":30,"bgImage":31,"posterImage":194,"relatedSolution":195},58,"alojar-redis-en-un-vps",{"fr":184,"en":185,"ar":186,"es":182},"heberger-redis-vps","hosting-redis-on-a-vps","استضافة-redis-على-خادم-vps","Alojar Redis en un VPS: la guía completa","Despliegue Redis en su VPS Cloud: requisitos de RAM\u002FCPU, seguridad (ACL, TLS), persistencia RDB\u002FAOF, resolución de errores y alta disponibilidad.","2026-04-23T00:00:00+00:00","2026-09-08T21:59:59+00:00",{"id":23,"name":24,"slug":25,"color":26,"icon":27},[193],{"id":23,"name":24,"slug":25,"color":26,"icon":27},"\u002Fblog\u002Fcovers\u002Fheberger-redis-vps-poster.svg",{"categorySlug":34,"appSlug":196},"redis-stack",true,1794270520340]