Despliegue de AppFlowy en un VPS: Tu propio análogo de Notion con Docker y PostgreSQL
TL;DR
En esta guía detallada, configuraremos paso a paso AppFlowy —una potente alternativa open-source a Notion— en tu propio VPS. Aprenderás a instalar y configurar Docker, PostgreSQL, AppFlowy Server, así como a asegurar el acceso a través de HTTPS con Caddy. Al finalizar el tutorial, tendrás una herramienta de gestión de conocimientos y proyectos completamente funcional y segura, bajo tu control total.
Instalación de AppFlowy Server utilizando Docker Compose para un despliegue sencillo.
Configuración de una base de datos PostgreSQL dedicada para almacenar los datos de AppFlowy.
Garantizar el acceso seguro a AppFlowy a través de HTTPS con la gestión automática de certificados SSL por parte de Caddy.
Preparación básica del VPS: configuración de seguridad, firewall y acceso SSH.
Recomendaciones para la copia de seguridad de datos y el mantenimiento del sistema para una estabilidad a largo plazo.
¿Qué configuramos y por qué?
Esquema: ¿Qué configuramos y por qué?
En el mundo moderno, la gestión eficaz de la información y los proyectos es clave para el éxito, tanto para profesionales individuales como para equipos. Notion se ha convertido en el estándar de facto para muchos debido a su flexibilidad y versatilidad. Sin embargo, no siempre se desea confiar todos los datos a servicios en la nube de terceros. Aquí es donde AppFlowy entra en juego: una potente alternativa a Notion, completamente de código abierto (open-source), que se puede desplegar en tu propio servidor.
AppFlowy ofrece una experiencia de usuario similar con bloques, bases de datos, tableros Kanban y páginas wiki, pero otorga control total sobre los datos. Es la solución ideal para quienes valoran la privacidad, desean personalizar el sistema según sus necesidades únicas o simplemente prefieren poseer la infraestructura en lugar de alquilarla.
En esta guía, desplegaremos AppFlowy Server en un servidor privado virtual (VPS), utilizando la contenerización con Docker y Docker Compose. Como base de datos se utilizará PostgreSQL, lo que garantizará un almacenamiento de datos fiable y escalable. También configuraremos la obtención y renovación automática de certificados SSL con Caddy, para que tu AppFlowy sea accesible a través de una conexión HTTPS segura.
Al final, obtendrás un análogo de Notion completamente funcional, seguro y bajo tu control, accesible para tu equipo o uso personal a través de un navegador web. Esto te permitirá almacenar datos confidenciales en tu propia infraestructura, minimizando los riesgos asociados con la dependencia de proveedores externos.
Alternativas: Cloud-managed vs. Self-hosted
Antes de profundizar en la configuración, es importante entender por qué una solución autoalojada (self-hosted), como AppFlowy en un VPS, puede ser preferible a las alternativas en la nube:
Servicios gestionados en la nube (Cloud-managed) (por ejemplo, Notion, Monday.com, ClickUp):
Ventajas: Facilidad de inicio, no se requiere experiencia técnica, escalado y copias de seguridad automáticos, soporte del proveedor.
Desventajas: Alto costo a medida que el equipo crece, falta de control total sobre los datos, dependencia de la política de privacidad del proveedor, opciones de personalización limitadas.
Autoalojado (Self-hosted) en un VPS (por ejemplo, AppFlowy, GitLab Community Edition, Mattermost):
Ventajas: Control total sobre los datos y la seguridad, costo potencialmente menor a largo plazo (especialmente para equipos grandes), alto grado de personalización, posibilidad de integración con tu propia infraestructura.
Desventajas: Requiere conocimientos técnicos para la instalación y el mantenimiento, la responsabilidad de las copias de seguridad y las actualizaciones recae en ti, la configuración inicial puede ser laboriosa.
La elección de AppFlowy autoalojado en un VPS es ideal para quienes están dispuestos a invertir tiempo en la configuración en aras de la independencia y el control total, o para equipos con datos sensibles que no pueden alojarse en servidores de terceros.
¿Qué configuración de VPS se necesita para esta tarea?
Esquema: ¿Qué configuración de VPS se necesita para esta tarea?
La elección de una configuración de VPS adecuada es crucial para el funcionamiento estable y rápido de AppFlowy. Aunque AppFlowy en sí mismo no es una aplicación extremadamente intensiva en recursos, trabajar con Docker, PostgreSQL y un servidor web requiere una cierta reserva de recursos. Los requisitos que se presentan a continuación son válidos para el año 2026 y están calculados para un funcionamiento estable para un equipo pequeño (hasta 10-15 usuarios activos).
Requisitos mínimos
CPU: 2 núcleos. Los procesadores VPS modernos proporcionan suficiente rendimiento por núcleo.
RAM: 4 GB. De ellos, 2 GB serán utilizados por los contenedores Docker (AppFlowy Server, PostgreSQL, Caddy) y otros 2 GB para el sistema operativo, el almacenamiento en caché y el crecimiento potencial.
Disco: 80 GB NVMe SSD. Un SSD rápido mejora significativamente el rendimiento de la base de datos. 80 GB son suficientes para el sistema operativo, las imágenes de Docker, los datos de AppFlowy y las copias de seguridad durante varias semanas. Para el almacenamiento a largo plazo de copias de seguridad, se recomienda utilizar almacenamiento externo.
Red: Puerto de 100 Mbps o 1 Gbps. Para una aplicación web como AppFlowy, la estabilidad es más importante que el ancho de banda pico, a menos que planees transferir archivos muy grandes.
Plan de VPS recomendado
Para un funcionamiento cómodo y la posibilidad de una pequeña escalabilidad futura, así como para garantizar la estabilidad durante las cargas pico, se recomiendan las siguientes características:
CPU: 4 núcleos.
RAM: 8 GB.
Disco: 160 GB NVMe SSD.
Red: Puerto de 1 Gbps.
Esta configuración garantizará un funcionamiento fluido de AppFlowy incluso con varios usuarios trabajando simultáneamente, uso activo de bases de datos e indexación de contenido. Puedes considerar un VPS con las características indicadas para alquilar. Asegúrate de que el proveedor ofrezca una infraestructura fiable y acceso a versiones actualizadas de sistemas operativos, por ejemplo, Ubuntu Server 24.04 LTS.
Cuándo se necesita un servidor dedicado y no un VPS
Un servidor dedicado se vuelve necesario cuando:
Gran número de usuarios: Si planeas un despliegue para más de 50 usuarios activos o para uso corporativo con datos críticos.
Altos requisitos de rendimiento: Para cargas de trabajo muy intensivas, como el procesamiento de grandes volúmenes de datos, aprendizaje automático o bases de datos de alta carga, donde incluso el VPS más potente puede ser insuficiente.
Requisitos estrictos de seguridad y cumplimiento: Algunas normativas pueden exigir el uso de hardware físicamente aislado.
Personalización del hardware: Necesidad de configuraciones específicas de RAID, GPU o tarjetas de red inusuales.
Para la mayoría de los casos de despliegue de AppFlowy para uso personal o un equipo pequeño/mediano, un VPS bien configurado será más que suficiente.
Ubicación: en qué influye
La elección de la ubicación geográfica del servidor VPS influye en varios aspectos clave:
Latencia: Cuanto más cerca esté el servidor de tus usuarios, menor será la latencia y más rápida la respuesta de la aplicación. Para un equipo distribuido en diferentes regiones, conviene elegir una ubicación central.
Legislación: Las leyes de protección de datos (por ejemplo, GDPR en la UE) pueden imponer restricciones sobre dónde se pueden almacenar los datos. Elige una ubicación que cumpla con tus requisitos legales.
Costo: Los precios de los VPS pueden variar significativamente según la región debido al costo de la electricidad, los bienes raíces y la infraestructura de red.
Disponibilidad: Algunas regiones pueden tener una mejor conectividad con las troncales de internet globales, lo que garantiza una conexión más estable.
Para AppFlowy, generalmente es suficiente elegir un servidor en el país donde se encuentre la mayoría de tus usuarios para minimizar la latencia.
Preparación del servidor
Diagrama: Preparación del servidor
Antes de proceder con la instalación de AppFlowy, es necesario realizar una configuración básica y reforzar la seguridad de su nuevo VPS. Utilizaremos Ubuntu Server 24.04 LTS como sistema operativo principal, ya que es una de las plataformas más populares y estables para implementaciones de servidores.
1. Conexión por SSH
Primero, conéctese a su VPS como usuario root, utilizando la dirección IP proporcionada por su proveedor:
ssh root@ВАШ_IP_АДРЕС_VPS
Si es la primera conexión, es posible que deba aceptar la huella digital de la clave del servidor. Ingrese la contraseña de root si se le solicita.
2. Creación de un nuevo usuario con permisos sudo
Trabajar como usuario root no es seguro. Crearemos un nuevo usuario que se utilizará para tareas diarias y le otorgaremos permisos sudo.
# Reemplace 'appflowyuser' con el nombre de usuario deseado
adduser appflowyuser
Siga las instrucciones: ingrese y confirme la contraseña, y luego puede omitir el llenado de información adicional simplemente presionando Enter.
Ahora, agregue el nuevo usuario al grupo sudo para que pueda ejecutar comandos con privilegios de administrador:
usermod -aG sudo appflowyuser
3. Configuración de la autenticación con claves SSH (recomendado)
El uso de claves SSH aumenta significativamente la seguridad en comparación con la autenticación por contraseña. Si aún no tiene un par de claves SSH, genérelas en su computadora local:
# En su computadora LOCAL
ssh-keygen -t rsa -b 4096
Luego, copie la clave pública a su VPS para el nuevo usuario:
# En su computadora LOCAL, reemplace 'appflowyuser' y 'ВАШ_IP_АДРЕС_VPS'
ssh-copy-id appflowyuser@ВАШ_IP_АДРЕС_VPS
Después de esto, salga de la sesión de root e inicie sesión como el nuevo usuario, utilizando la clave SSH:
# En su computadora LOCAL
exit
ssh appflowyuser@ВАШ_IP_АДРЕС_VPS
Si puede iniciar sesión sin contraseña, significa que las claves están configuradas correctamente. Ahora deshabilitaremos la autenticación por contraseña para SSH y prohibiremos el inicio de sesión para root.
# En el VPS, como 'appflowyuser'
sudo nano /etc/ssh/sshd_config
Busque y modifique las siguientes líneas (si no existen, agréguelas):
# ...
PermitRootLogin no
PasswordAuthentication no
ChallengeResponseAuthentication no
UsePAM yes
# ...
Guarde los cambios (Ctrl+O, Enter) y salga (Ctrl+X). Luego, reinicie el servicio SSH:
sudo systemctl restart sshd
IMPORTANTE: Asegúrese de poder iniciar sesión como el nuevo usuario con la clave SSH ANTES de deshabilitar la autenticación por contraseña y el inicio de sesión para root. De lo contrario, corre el riesgo de perder el acceso al servidor.
4. Actualización del sistema
Siempre comience actualizando la base de paquetes y los paquetes instalados a las versiones más recientes.
# Actualizar la lista de paquetes
sudo apt update
# Actualizar todos los paquetes instalados
sudo apt upgrade -y
# Eliminar paquetes antiguos e innecesarios
sudo apt autoremove -y
5. Configuración del firewall (UFW)
UFW (Uncomplicated Firewall) es una interfaz fácil de usar para configurar reglas de iptables. Lo habilitaremos y permitiremos solo los puertos necesarios.
# Permitir SSH (puerto 22)
sudo ufw allow OpenSSH
# Permitir HTTP (puerto 80)
sudo ufw allow http
# Permitir HTTPS (puerto 443)
sudo ufw allow https
# Habilitar el firewall
sudo ufw enable
# Verificar el estado del firewall
sudo ufw status
Asegúrese de que el estado sea active y que los puertos 80, 443, 22 estén permitidos. Permitir OpenSSH antes de habilitar UFW es crítico para no perder el acceso al servidor.
6. Instalación de Fail2Ban
Fail2Ban ayuda a proteger el servidor contra ataques de fuerza bruta, bloqueando las direcciones IP desde las cuales se producen múltiples intentos fallidos de inicio de sesión.
# Instalación de Fail2Ban
sudo apt install fail2ban -y
# Iniciar y habilitar el inicio automático
sudo systemctl enable fail2ban
sudo systemctl start fail2ban
# Verificar el estado (opcional)
sudo systemctl status fail2ban
Fail2Ban protege SSH por defecto. Para servicios adicionales, se pueden configurar reglas en el archivo /etc/fail2ban/jail.local.
Ahora su servidor está listo para la instalación del software principal.
Instalación de software — paso a paso
Diagrama: Instalación de software — paso a paso
En este paso, instalaremos todo el software necesario: Docker y Docker Compose para la contenerización de AppFlowy Server y PostgreSQL, así como Caddy para el servidor web y la obtención automática de certificados SSL.
1. Instalación de Docker Engine
Docker es una plataforma para desarrollar, entregar y ejecutar aplicaciones en contenedores. Utilizaremos el repositorio oficial de Docker para obtener la versión más reciente, actualizada para 2026 (suponemos Docker Engine v25.x o v26.x).
# Actualizar la lista de paquetes
sudo apt update
# Instalar los paquetes necesarios para trabajar con repositorios HTTPS
sudo apt install ca-certificates curl gnupg -y
# Crear el directorio para las claves GPG
sudo install -m 0755 -d /etc/apt/keyrings
# Descargar la clave GPG oficial de Docker
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
# Cambiar los permisos de acceso al archivo de clave
sudo chmod a+r /etc/apt/keyrings/docker.gpg
# Añadir el repositorio de Docker a la lista de fuentes de APT
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
# Actualizar la lista de paquetes teniendo en cuenta el nuevo repositorio de Docker
sudo apt update
# Instalar Docker Engine, Docker CLI y containerd
sudo apt install docker-ce docker-ce-cli containerd.io -y
Agregue su usuario al grupo docker para ejecutar comandos de Docker sin sudo:
# Reemplace 'appflowyuser' con su nombre de usuario
sudo usermod -aG docker appflowyuser
# Salga y vuelva a iniciar sesión en la sesión SSH para que los cambios surtan efecto
exit
ssh appflowyuser@ВАШ_IP_АДРЕС_VPS
Verifique que Docker esté instalado correctamente:
# Verificar la versión de Docker
docker --version
# Verificar el funcionamiento de Docker ejecutando un contenedor de prueba
docker run hello-world
La salida de hello-world confirmará la instalación exitosa.
2. Instalación de Docker Compose
Docker Compose permite definir y ejecutar aplicaciones Docker de múltiples contenedores. Lo instalaremos desde el repositorio oficial, asegurando su relevancia para 2026 (suponemos Docker Compose v2.25.x o posterior).
# Instalación de Docker Compose
sudo apt install docker-compose-plugin -y
Verifique la versión de Docker Compose:
# Verificar la versión de Docker Compose
docker compose version
3. Instalación de Caddy
Caddy es un servidor web potente y extensible con HTTPS automático. Es fácil de configurar e ideal para proporcionar acceso seguro a AppFlowy.
# Instalación de los paquetes necesarios
sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https
# Descargar la clave GPG de Caddy
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | sudo gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg
# Añadir el repositorio de Caddy
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | sudo tee /etc/apt/sources.list.d/caddy-stable.list
# Actualizar la lista de paquetes
sudo apt update
# Instalar Caddy
sudo apt install caddy -y
Verifique el estado de Caddy:
# Verificar el estado del servicio Caddy
sudo systemctl status caddy
Debe estar activo y en ejecución. Si no lo está, inícielo: sudo systemctl start caddy.
4. Configuración del nombre de dominio y DNS
Para que HTTPS funcione con Caddy, necesitará un nombre de dominio (por ejemplo, appflowy.yourdomain.com) que apunte a la dirección IP de su VPS. Vaya al panel de control de su registrador de dominios o proveedor de DNS y cree un registro A:
Tipo: A
Nombre/Host:appflowy (o cualquier otro subdominio que desee utilizar)
Valor: Su_Dirección_IP_VPS
TTL: 300 (o menos para una actualización rápida)
Espere unos minutos (hasta varias horas, dependiendo del TTL) para que se propaguen los registros DNS. Puede verificar esto con el comando dig (en su computadora local):
# En su computadora LOCAL
dig appflowy.yourdomain.com
La respuesta debe contener una sección ANSWER SECTION con la dirección IP de su VPS.
Ahora todos los componentes necesarios están instalados y listos para una configuración posterior.
Configuración
Diagrama: Configuración
En este paso, configuraremos AppFlowy Server, PostgreSQL y Caddy para que trabajen juntos. Utilizaremos Docker Compose para orquestar todos los servicios.
1. Creación de directorios para el proyecto
Crearemos el directorio raíz para nuestro proyecto AppFlowy y subdirectorios para almacenar los datos de PostgreSQL y la configuración de Caddy.
# Creación del directorio principal del proyecto
mkdir -p ~/appflowy-server
cd ~/appflowy-server
# Creación del directorio para los datos de PostgreSQL
mkdir -p ./data/postgresql
# Creación del directorio para la configuración de Caddy
mkdir -p ./caddy/Caddyfile
mkdir -p ./caddy/data # Caddy almacenará aquí los certificados
mkdir -p ./caddy/config # Caddy almacenará aquí su configuración
2. Creación del archivo .env para variables de entorno
Para gestionar secretos y parámetros de configuración, como contraseñas de bases de datos, utilizaremos un archivo .env. Esto es más seguro que codificarlos directamente en el archivo docker-compose.yml.
nano .env
Agregue el siguiente contenido, cambiando los valores de YOUR_DB_PASSWORD, YOUR_APPFLOWY_SECRET_KEY y YOUR_APPFLOWY_JWT_SECRET por cadenas seguras y generadas aleatoriamente. Utilice un generador de contraseñas para ello.
# Configuración de la base de datos PostgreSQL
POSTGRES_DB=appflowy_db
POSTGRES_USER=appflowy_user
POSTGRES_PASSWORD=YOUR_DB_PASSWORD # Generar una contraseña segura
# Configuración del servidor AppFlowy
APPFLOWY_SERVER_PORT=3060 # Puerto predeterminado para el servidor AppFlowy
APPFLOWY_SERVER_HOST=0.0.0.0 # Escuchar en todas las interfaces
APPFLOWY_SERVER_SECRET_KEY=YOUR_APPFLOWY_SECRET_KEY # Generar una clave fuerte y aleatoria
APPFLOWY_SERVER_JWT_SECRET=YOUR_APPFLOWY_JWT_SECRET # Generar una clave fuerte y aleatoria para JWT
APPFLOWY_SERVER_DATABASE_URL=postgresql://appflowy_user:YOUR_DB_PASSWORD@db:5432/appflowy_db
# Opcional: Establecer el nivel de registro para el servidor AppFlowy (ej. info, debug, error)
# APPFLOWY_SERVER_LOG_LEVEL=info
# Configuración de Caddy (para acceso externo)
CADDY_DOMAIN=appflowy.yourdomain.com # Reemplazar con su dominio real
Guarde el archivo (Ctrl+O, Enter) y salga (Ctrl+X).
3. Creación del archivo docker-compose.yml
Este archivo definirá tres servicios: PostgreSQL, AppFlowy Server y Caddy.
nano docker-compose.yml
Pegue el siguiente contenido. Asegúrese de que las versiones de las imágenes sean actuales para 2026 (AppFlowy Server v0.4.0, PostgreSQL v16.x, Caddy v2.x).
version: '3.8'
services:
db:
image: postgres:16-alpine # Usamos la versión actual de PostgreSQL para 2026
restart: unless-stopped
env_file:
- .env
environment:
POSTGRES_DB: ${POSTGRES_DB}
POSTGRES_USER: ${POSTGRES_USER}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
volumes:
- ./data/postgresql:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DB}"]
interval: 10s
timeout: 5s
retries: 5
appflowy:
image: appflowy/appflowy-server:0.4.0 # Versión actual supuesta de AppFlowy Server para 2026
restart: unless-stopped
env_file:
- .env
environment:
AF_SERVER_HOST: ${APPFLOWY_SERVER_HOST}
AF_SERVER_PORT: ${APPFLOWY_SERVER_PORT}
AF_SERVER_SECRET_KEY: ${APPFLOWY_SERVER_SECRET_KEY}
AF_SERVER_JWT_SECRET: ${APPFLOWY_SERVER_JWT_SECRET}
AF_SERVER_DATABASE_URL: ${APPFLOWY_SERVER_DATABASE_URL}
# AF_SERVER_LOG_LEVEL: ${APPFLOWY_SERVER_LOG_LEVEL} # Descomentar para cambiar el nivel de registro
ports:
- "127.0.0.1:${APPFLOWY_SERVER_PORT}:${APPFLOWY_SERVER_PORT}" # Abrimos el puerto solo para localhost, Caddy hará de proxy
depends_on:
db:
condition: service_healthy # AppFlowy se inicia solo después de que la BD esté lista
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:${APPFLOWY_SERVER_PORT}/health"]
interval: 30s
timeout: 10s
retries: 5
caddy:
image: caddy:2.7.6-alpine # Versión actual de Caddy para 2026
restart: unless-stopped
ports:
- "80:80"
- "443:443"
volumes:
- ./caddy/Caddyfile:/etc/caddy/Caddyfile # Su Caddyfile
- ./caddy/data:/data # Para almacenar certificados TLS
- ./caddy/config:/config # Para almacenar la configuración de Caddy
environment:
CADDY_DOMAIN: ${CADDY_DOMAIN} # Pasamos el dominio desde .env
depends_on:
appflowy:
condition: service_healthy # Caddy se inicia solo después de que AppFlowy esté listo
Guarde el archivo.
4. Configuración de Caddyfile
Ahora crearemos un archivo de configuración para Caddy que actuará como proxy para las solicitudes al servidor AppFlowy y gestionará automáticamente los certificados SSL.
nano ./caddy/Caddyfile
Pegue el siguiente contenido. Asegúrese de que {$CADDY_DOMAIN} sea reemplazado por su nombre de dominio del archivo .env.
{$CADDY_DOMAIN} {
# Habilitar HTTPS automático
tls {
dns cloudflare {env.CLOUDFLARE_API_TOKEN} # Si usa Cloudflare DNS, de lo contrario, elimine o use HTTP-01
}
# Proxy para todas las solicitudes al servidor AppFlowy
reverse_proxy appflowy:3060 {
# Configuraciones adicionales para el proxy, si son necesarias
header_up Host {host}
header_up X-Real-IP {remote_ip}
header_up X-Forwarded-For {remote_ip}
header_up X-Forwarded-Proto {scheme}
}
# Habilitar compresión de datos para acelerar la carga
encode gzip zstd
# Registro
log {
output file /var/log/caddy/access.log
}
}
Nota importante sobre TLS: En el ejemplo anterior se utiliza el proveedor de DNS Cloudflare para emitir certificados Let's Encrypt (dns cloudflare). Esto es conveniente si su DNS se gestiona a través de Cloudflare y no necesita abrir los puertos 80/443 en Caddy para la verificación ACME HTTP-01 (aunque ya los hemos abierto). Si no utiliza Cloudflare o prefiere la verificación HTTP-01 (que funciona por defecto si los puertos 80/443 están abiertos), simplemente elimine la línea dns cloudflare {env.CLOUDFLARE_API_TOKEN}. Caddy intentará automáticamente usar HTTP-01. Si utiliza un proveedor de DNS diferente a Cloudflare, Caddy admite muchos complementos para varios proveedores de DNS. Es posible que deba compilar Caddy con el complemento necesario o usar HTTP-01.
Si decide utilizar la verificación DNS con Cloudflare, también deberá agregar la variable de entorno CLOUDFLARE_API_TOKEN al archivo .env. Cree un token de API en Cloudflare con permisos para editar las zonas DNS de su dominio.
# ... (al final de su archivo .env)
CLOUDFLARE_API_TOKEN=YOUR_CLOUDFLARE_API_TOKEN # Solo si usa la verificación DNS con Cloudflare
Guarde el Caddyfile.
5. Inicio de AppFlowy con Docker Compose
Ahora que todos los archivos de configuración están listos, puede iniciar todos los servicios.
# Asegúrese de estar en el directorio ~/appflowy-server
cd ~/appflowy-server
# Iniciar todos los servicios en segundo plano
docker compose up -d
Esto descargará las imágenes de Docker necesarias (si no están presentes), creará los contenedores, configurará las redes e iniciará AppFlowy Server, PostgreSQL y Caddy.
6. Verificación del funcionamiento
Deje que los servicios se inicien e inicialicen durante unos minutos. Puede monitorear los registros:
# Ver los registros de todos los servicios
docker compose logs -f
Busque mensajes que indiquen un inicio exitoso de AppFlowy Server y Caddy. Si Caddy muestra errores, verifique la exactitud de su Caddyfile y la configuración de DNS.
Una vez que los registros muestren que todos los servicios se han iniciado sin errores, verifique el estado de los contenedores:
docker compose ps
Todos los contenedores deben tener el estado running (healthy).
Finalmente, abra su navegador web y vaya a la dirección de su dominio (por ejemplo, https://appflowy.yourdomain.com). Debería ver la página de registro/inicio de sesión de AppFlowy. Registre al primer usuario y obtendrá acceso a su propio AppFlowy Workspace.
Copias de seguridad y mantenimiento
Diagrama: Copias de seguridad y mantenimiento
Las copias de seguridad regulares y el mantenimiento del sistema son la clave para la estabilidad y seguridad a largo plazo de su AppFlowy Server. No subestime esta etapa.
1. ¿Qué respaldar?
Para una recuperación completa de AppFlowy, necesitará guardar los siguientes datos:
Base de datos PostgreSQL: Contiene todos sus proyectos, páginas, bloques, usuarios y sus datos. Este es el componente más crítico.
Archivos de configuración de AppFlowy: Aunque la mayor parte de la configuración se almacena en .env y docker-compose.yml, puede haber otros archivos importantes (aunque para AppFlowy Server esto es menos crítico que para otras aplicaciones).
Datos de Caddy: Principalmente, son los certificados SSL que Caddy obtiene y almacena automáticamente. Se encuentran en el directorio ./caddy/data.
Archivos Docker Compose: Los archivos docker-compose.yml y .env, que definen su infraestructura.
2. Script simple de copia de seguridad automática
Crearemos un script simple que realizará una copia de seguridad de la base de datos PostgreSQL y de los archivos clave, para luego archivarlos.
# Cree un directorio para los scripts
mkdir -p ~/scripts
nano ~/scripts/backup_appflowy.sh
Pegue el siguiente contenido:
#!/bin/bash
# --- Configuración ---
BACKUP_DIR="/var/backups/appflowy" # Directorio para almacenar las copias de seguridad
TIMESTAMP=$(date +"%Y%m%d%H%M%S")
APPFLOWY_PROJECT_DIR="/home/appflowyuser/appflowy-server" # Ruta a su directorio AppFlowy
DB_CONTAINER_NAME="appflowy-server_db_1" # Nombre del contenedor de la base de datos (puede variar)
DB_NAME=$(grep POSTGRES_DB ${APPFLOWY_PROJECT_DIR}/.env | cut -d '=' -f2)
DB_USER=$(grep POSTGRES_USER ${APPFLOWY_PROJECT_DIR}/.env | cut -d '=' -f2)
# --- Creación del directorio de copias de seguridad, si no existe ---
mkdir -p ${BACKUP_DIR}
echo "--- Iniciando copia de seguridad de AppFlowy ---"
# --- 1. Copia de seguridad de la base de datos PostgreSQL ---
echo "Creando volcado de PostgreSQL..."
docker exec ${DB_CONTAINER_NAME} pg_dump -U ${DB_USER} -d ${DB_NAME} > ${BACKUP_DIR}/appflowy_db_backup_${TIMESTAMP}.sql
if [ $? -eq 0 ]; then
echo "Volcado de PostgreSQL creado con éxito: ${BACKUP_DIR}/appflowy_db_backup_${TIMESTAMP}.sql"
else
echo "Error al crear el volcado de PostgreSQL. Revise los logs."
exit 1
fi
# --- 2. Copia de archivos de configuración y certificados ---
echo "Copiando archivos de configuración y certificados..."
cp ${APPFLOWY_PROJECT_DIR}/docker-compose.yml ${BACKUP_DIR}/
cp ${APPFLOWY_PROJECT_DIR}/.env ${BACKUP_DIR}/
cp ${APPFLOWY_PROJECT_DIR}/caddy/Caddyfile ${BACKUP_DIR}/
# Copia de datos de Caddy (certificados)
cp -r ${APPFLOWY_PROJECT_DIR}/caddy/data ${BACKUP_DIR}/caddy_data_${TIMESTAMP}
cp -r ${APPFLOWY_PROJECT_DIR}/caddy/config ${BACKUP_DIR}/caddy_config_${TIMESTAMP}
# --- 3. Archivando todos los archivos de la copia de seguridad ---
echo "Archivando copia de seguridad..."
tar -czf ${BACKUP_DIR}/appflowy_backup_full_${TIMESTAMP}.tar.gz \
-C ${BACKUP_DIR} \
appflowy_db_backup_${TIMESTAMP}.sql \
docker-compose.yml \
.env \
Caddyfile \
caddy_data_${TIMESTAMP} \
caddy_config_${TIMESTAMP}
if [ $? -eq 0 ]; then
echo "Archivo completo de la copia de seguridad creado: ${BACKUP_DIR}/appflowy_backup_full_${TIMESTAMP}.tar.gz"
# Eliminando archivos temporales
rm ${BACKUP_DIR}/appflowy_db_backup_${TIMESTAMP}.sql
rm ${BACKUP_DIR}/docker-compose.yml
rm ${BACKUP_DIR}/.env
rm ${BACKUP_DIR}/Caddyfile
rm -rf ${BACKUP_DIR}/caddy_data_${TIMESTAMP}
rm -rf ${BACKUP_DIR}/caddy_config_${TIMESTAMP}
else
echo "Error al archivar la copia de seguridad."
exit 1
fi
# --- 4. Eliminando copias de seguridad antiguas (mantener los últimos 7 días) ---
echo "Eliminando copias de seguridad antiguas..."
find ${BACKUP_DIR} -type f -name "appflowy_backup_full_*.tar.gz" -mtime +7 -delete
echo "--- Copia de seguridad completada ---"
Haga el script ejecutable:
chmod +x ~/scripts/backup_appflowy.sh
Verifique el nombre del contenedor de PostgreSQL usando docker compose ps en el directorio ~/appflowy-server. Normalmente se ve como appflowy-server_db_1, pero puede variar. Actualice la variable DB_CONTAINER_NAME en el script si es necesario.
3. Configuración de Cron para el inicio automático de la copia de seguridad
Para que el script se ejecute automáticamente, lo añadiremos a la programación de Cron.
crontab -e
Seleccione un editor de texto si se le solicita. Añada la siguiente línea al final del archivo para que el script se ejecute diariamente a las 03:00 de la madrugada:
Guarde y salga. Ahora las copias de seguridad se crearán automáticamente.
4. ¿Dónde almacenar las copias de seguridad?
Almacenar las copias de seguridad en el mismo servidor que el servicio principal es extremadamente arriesgado. Si el servidor falla, perderá tanto el servicio como las copias de seguridad. Opciones recomendadas:
Almacenamiento externo compatible con S3: Servicios como AWS S3, Backblaze B2, DigitalOcean Spaces o cualquier otro proveedor de almacenamiento de objetos. Puede modificar el script de copia de seguridad para cargar automáticamente los archivos en S3 utilizando aws cli o rclone.
VPS o NAS separado: Si tiene otro servidor o almacenamiento en red, puede configurar rsync o scp para transferir las copias de seguridad archivadas allí.
Ejemplo de uso de rclone para S3 (requiere la instalación y configuración de rclone):
# Dentro de backup_appflowy.sh, después de crear el archivo:
# rclone copy ${BACKUP_DIR}/appflowy_backup_full_${TIMESTAMP}.tar.gz remote_s3_bucket:appflowy-backups/
5. Actualizaciones: Rolling vs. Ventana de mantenimiento
Las actualizaciones regulares son cruciales para la seguridad y para obtener nuevas funciones.
Actualización del SO: Se recomienda realizar una vez al mes. Esto se puede hacer manualmente o configurar actualizaciones de seguridad automáticas.
sudo apt update && sudo apt upgrade -y && sudo apt autoremove -y
sudo reboot # Si se requiere una actualización del kernel u otros componentes críticos
Actualización de imágenes Docker (AppFlowy, PostgreSQL, Caddy):
Ventana de mantenimiento: Enfoque preferido. Programe un momento en el que AppFlowy no se esté utilizando activamente.
cd ~/appflowy-server
docker compose pull # Descargar nuevas versiones de las imágenes
docker compose up -d # Volver a crear los contenedores con las nuevas imágenes
Esto asegurará un tiempo de inactividad mínimo y permitirá verificar la funcionalidad después de la actualización.
Rolling Updates (para sistemas más complejos): No aplicable directamente a nuestro archivo Docker Compose actual sin herramientas de orquestación adicionales (por ejemplo, Kubernetes). Para un solo servidor, siempre es mejor usar una ventana de mantenimiento.
¡Antes de cada actualización importante, siempre haga una copia de seguridad completa!
Troubleshooting + FAQ
Esta sección contiene respuestas a preguntas frecuentes y soluciones a problemas típicos que pueden surgir al desplegar y operar AppFlowy en un VPS.
No se puede conectar por SSH después de configurar el firewall o las claves SSH. ¿Qué hacer?
Error: Conexión SSH rechazada o tiempo de espera agotado.
Qué verificar:
Asegúrese de haber permitido el puerto SSH (por defecto 22) en UFW con sudo ufw allow OpenSSH antes de habilitar el firewall.
Si ha deshabilitado la autenticación por contraseña y el inicio de sesión para root, asegúrese de que su clave pública SSH esté copiada correctamente en el servidor para su usuario (~/.ssh/authorized_keys) y tenga los permisos correctos (chmod 600 ~/.ssh/authorized_keys).
Verifique que el servicio SSH (sshd) esté en ejecución: sudo systemctl status sshd.
Cómo solucionarlo: Si ha perdido el acceso, es posible que deba usar la consola de recuperación de su proveedor de VPS para iniciar sesión y corregir la configuración de SSH o UFW. Sea extremadamente cuidadoso al cambiar la configuración de SSH y UFW.
AppFlowy no está disponible por nombre de dominio, pero los contenedores están en ejecución.
Error: El navegador web muestra un error "Sitio no disponible" o "Conexión rechazada".
Qué verificar:
Registros DNS: Asegúrese de que su registro A para el dominio (por ejemplo, appflowy.yourdomain.com) apunte correctamente a la dirección IP de su VPS. Use dig appflowy.yourdomain.com (en su PC local).
Firewall del VPS: Verifique que los puertos 80 y 443 estén permitidos en UFW: sudo ufw status.
Servicio Caddy: Asegúrese de que Caddy esté en ejecución y no tenga errores: sudo systemctl status caddy y docker compose logs caddy. Verifique el Caddyfile en busca de errores de sintaxis.
Certificados TLS: Caddy debería obtener automáticamente los certificados. Si hay errores, revise los logs de Caddy. Asegúrese de que los puertos 80 y 443 estén accesibles desde internet para la verificación HTTP-01, o que el plugin DNS de Caddy esté configurado correctamente si lo está utilizando.
Disponibilidad de AppFlowy dentro de Docker: Asegúrese de que el contenedor de AppFlowy esté saludable: docker compose ps. Revise sus logs: docker compose logs appflowy.
Cómo solucionarlo: Corrija el DNS, abra los puertos en UFW, corrija el Caddyfile, o reinicie Caddy/Docker Compose.
¿Qué configuración mínima de VPS es adecuada?
Para AppFlowy Server en Docker con PostgreSQL, se recomiendan mínimamente 2 núcleos de CPU, 4 GB de RAM y 80 GB de SSD NVMe. Esto será suficiente para uso personal o un equipo pequeño de hasta 5 personas. Sin embargo, para un trabajo más cómodo y la posibilidad de crecimiento, es mejor apuntar a 4 núcleos de CPU, 8 GB de RAM y 160 GB de SSD NVMe. Esto proporcionará un mejor rendimiento de la base de datos y una mayor capacidad de respuesta general del sistema.
¿Qué elegir — VPS o dedicado para esta tarea?
Para el despliegue de AppFlowy para necesidades personales o un equipo pequeño/mediano (hasta 50 usuarios), un VPS es la opción óptima. Ofrece un excelente equilibrio entre costo, flexibilidad y rendimiento. Un servidor dedicado se recomienda solo para equipos muy grandes, entornos corporativos con altos requisitos de rendimiento y seguridad, o en casos donde se necesita una configuración de hardware específica. Para la mayoría de los usuarios de AppFlowy, un VPS será más que suficiente.
El contenedor de PostgreSQL no se inicia o está unhealthy.
Error:docker compose ps muestra unhealthy o exited para el contenedor db.
Qué verificar:
Logs del contenedor:docker compose logs db. Busque errores relacionados con el inicio de PostgreSQL, permisos de acceso a datos o conflictos de puertos.
Permisos de acceso al directorio de datos: Asegúrese de que el directorio ./data/postgresql tenga los permisos de acceso correctos para el usuario de Docker. Por defecto, Docker gestiona esto, pero si ha cambiado los permisos manualmente, pueden surgir problemas.
Contraseña: Verifique que POSTGRES_PASSWORD en .env cumpla con los requisitos de PostgreSQL y no contenga caracteres especiales que puedan ser interpretados incorrectamente.
Cómo solucionarlo: Corrija los errores en los logs. A veces ayuda eliminar los volúmenes de Docker (si no hay datos importantes) y volver a iniciar: docker compose down -v (¡tenga cuidado, esto eliminará los datos de la BD!) y luego docker compose up -d.
¿Cómo actualizar AppFlowy Server a una nueva versión?
Pasos:
Haga una copia de seguridad: Siempre realice una copia de seguridad completa antes de actualizar.
Detenga los servicios:cd ~/appflowy-server && docker compose down.
Cambie la versión de la imagen: Edite docker-compose.yml y actualice la etiqueta de la imagen de AppFlowy (por ejemplo, de 0.4.0 a 0.4.1).
Inicie los servicios:docker compose up -d. Docker descargará la nueva imagen y recreará el contenedor de AppFlowy.
Verifique los logs: Asegúrese de que todo se haya iniciado correctamente.
Un proceso similar se aplica a la actualización de la imagen de PostgreSQL, pero con aún más precaución y una copia de seguridad obligatoria, ya que la actualización de la BD puede ser más compleja.
Conclusiones y próximos pasos
Diagrama: Conclusiones y próximos pasos
¡Felicidades! Ha desplegado con éxito AppFlowy Server en su VPS, creando una plataforma potente y segura para la gestión de conocimientos y proyectos, que está bajo su control total. Ha dominado aspectos clave del trabajo con Docker Compose, PostgreSQL y HTTPS automático a través de Caddy, adquiriendo una valiosa experiencia en la administración autónoma de servidores.
Ahora que su sistema está en funcionamiento, aquí hay algunos próximos pasos para un mayor desarrollo y optimización:
Monitoreo y registro: Configure un sistema de monitoreo (por ejemplo, Prometheus + Grafana) para rastrear el rendimiento del VPS y los contenedores. El registro centralizado (por ejemplo, ELK Stack o Loki) ayudará a identificar y resolver problemas más rápidamente.
Escalado de almacenamiento: Si planea almacenar grandes volúmenes de archivos, considere montar almacenamiento en red (NFS, Ceph) o usar almacenamiento de objetos para archivos, para no sobrecargar el disco principal del VPS.
Integraciones y personalización: Explore las capacidades de AppFlowy para la integración con otros servicios o para extender la funcionalidad a través de plugins, si estos llegan a estar disponibles.
¿Te fue útil esta guía?
Tus comentarios nos ayudan a mejorar nuestras guías.
Compartir esta publicación:
Envía esta guía a alguien a quien pueda resultarle útil.