¡Bienvenido a PHPost!

Para participar en el foro, descargar complementos y acceder al chat, es necesario tener una cuenta activa. Regístrate con un correo válido para completar la activación.

⚖️ Aviso Legal y Normas de Contenido

PHPost.es es una comunidad dedicada al soporte, desarrollo y difusión de software libre para la creación y administración de comunidades en línea.

Compromiso con la legalidad: No se permite la publicación, promoción o distribución de software pirateado, contenido warez ni material que infrinja derechos de autor o cualquier otra normativa aplicable.

Responsabilidad: Cada usuario es responsable del contenido alojado en su propio sitio web y del uso que haga del software. Los administradores y desarrolladores de Risus Nova no controlan ni supervisan los servidores o contenidos gestionados por terceros.

⚠️ Aviso de seguridad

Risus Nova se distribuye únicamente a través de phpost.es, que es la fuente oficial del proyecto donde publicamos las versiones verificadas.

Recomendamos no utilizar copias obtenidas desde sitios de terceros, ya que podrían haber sido modificadas y no contar con la integridad del código original, lo que puede suponer riesgos de seguridad en la instalación.

Para garantizar una instalación segura y actualizada, descarga siempre la versión oficial desde el botón disponible en esta página.

Importante: No pediremos donaciones en ningún momento ni en ninguna plataforma (Ko-fi, PayPal, redes sociales u otras). Si encuentras campañas de donación que utilicen el nombre de Risus Nova o PHPost, no tienen ninguna relación con el proyecto.

🔄 Desarrollo activo

Risus Nova forma parte de una nueva etapa del proyecto PHPost, en evolución constante con mejoras, correcciones y nuevas funciones. Puedes seguir el progreso y los cambios oficiales a través del changelog y la comunidad.

Risus Nova 2.1 Estable Desarrollo activo Última actualización: 12/07/2026 Ver Demo Changelog 260 Desarrollo del tema: 75% (fase actual de desarrollo) Descargar
Calificación:
  • 0 voto(s) - 0 Media
  • 1
  • 2
  • 3
  • 4
  • 5

TUTORIAL Guía completa: PHPost (Risus Nova) con Docker desde cero
#1

2
Mejor respuesta del mensaje Guía completa: PHPost (Risus Nova) con Docker desde ceroHola!, he vuelto a la comunidad haha, hace un tiempo llevo desarollando otro script y me dió por instalar PHPost para ver como ha evolucionado y si puedo ayudar a mejorar en mis tiempos libres, como hoy que me ha entrado las ganas de instalar el script en mi server con docker y si alguno necesita un paso a paso de como hacerlo, esta es la guía definitiva, me gustaría que si hay mejoras o correcciones de typo por ejemplo, o mejoras en cuanto a docker me escriban, por ahora, nada más que decir, solamente agradecer a los desarrolladores que siguieron aquí haciendo posible esta comunidad.

Guía completa: PHPost (Risus Nova) con Docker desde cero

Te digo exactamente qué archivos crear, con qué nombre, dónde guardarlos y qué escribir dentro de cada uno. Copia, pega y listo.
Funciona igual en Windows, Linux y Mac. No necesitas instalar PHP, ni MySQL, ni Apache: Docker lo trae todo dentro.

La estructura final (esto es lo que vamos a construir)
Cuando termines, tendrás esto:
 
phpost/

├── Script/                      ← el script Risus Nova
│   ├── index.php
│   ├── config.inc.php
│   ├── install/
│   ├── files/
│   └── ... (todo el contenido del script)

├── docker/                      ← carpeta que TÚ creas
│   ├── Dockerfile
│   ├── php.ini
│   ├── vhost.conf
│   └── entrypoint.sh

├── docker-compose.yml           ← archivo que TÚ creas
├── .env.example                 ← archivo que TÚ creas (plantilla)
├── .env                         ← copia de .env.example con tus contraseñas
└── .dockerignore                ← archivo que TÚ creas

En total tienes que crear 7 archivos (más la carpeta 
docker/
). Vamos uno por uno.

Paso 0: prepara la carpeta base
  1. Crea una carpeta para el proyecto. La llamaré 
    phpost/
     pero puedes ponerle el nombre que quieras.
  2. Descarga Risus Nova de Debes agradecer para ver el contenido... e inserta todo el contenido del script dentro de una subcarpeta llamada 
    Script/
    .
  3. Crea una carpeta vacía llamada 
    docker/
     al lado de 
    Script/
    .
Quedaría así:
 
phpost/
├── Script/     ← con el script dentro
└── docker/     ← vacía de momento

Archivo 1 de 7 - docker/Dockerfile Es el archivo que contiene todos los pasos que construye el contenedor de PHP + Apache con todas las extensiones que el script necesita.
 
FROM php:8.2-apache

# --- Extensiones de sistema necesarias para GD y utilidades ---
RUN apt-get update && apt-get install -y --no-install-recommends \
        libpng-dev \
        libjpeg62-turbo-dev \
        libfreetype6-dev \
        libwebp-dev \
        libonig-dev \
        libzip-dev \
        libssl-dev \
        curl \
        unzip \
    && rm -rf /var/lib/apt/lists/*

# --- Extensiones PHP obligatorias/recomendadas (REQUISITOS.txt) ---
#  mysqli, mbstring, gd, json(core), session(core), fileinfo(core),
#  openssl(core), curl, zip
RUN docker-php-ext-configure gd \
        --with-freetype \
        --with-jpeg \
        --with-webp \
    && docker-php-ext-install -j"$(nproc)" \
        mysqli \
        mbstring \
        gd \
        zip

# --- Apache: mod_rewrite + mod_headers (URLs limpias y cabeceras) ---
RUN a2enmod rewrite headers

# --- Config PHP a valores recomendados ---
COPY docker/php.ini /usr/local/etc/php/conf.d/zz-phpost.ini

# --- VirtualHost con AllowOverride All para que funcione el .htaccess ---
COPY docker/vhost.conf /etc/apache2/sites-available/000-default.conf

# --- Entrypoint: fija permisos de carpetas escribibles al arrancar ---
COPY docker/entrypoint.sh /usr/local/bin/entrypoint.sh
RUN chmod +x /usr/local/bin/entrypoint.sh

ENTRYPOINT ["entrypoint.sh"]
CMD ["apache2-foreground"]

Qué hace: parte de PHP 8.2 con Apache, instala las extensiones obligatorias (
mysqli


mbstring

), activa 
mod_rewrite
 para las URLs limpias, y prepara los tres archivos de configuración que creamos a continuación.
Cita:💡 GD se configura con 
--with-freetype --with-jpeg --with-webp
 antes de instalarse, o no podrá generar miniaturas ni avatares.

Archivo 2 de 7 - docker/php.ini Los ajustes de PHP que recomienda el 
REQUISITOS.txt
 del script.
 
; Valores recomendados por PHPost / Risus Nova (REQUISITOS.txt)
upload_max_filesize = 8M
post_max_size = 8M
max_execution_time = 60
memory_limit = 128M

; allow_url_fopen: comprobador de versiones, login Google, Discord, StopForumSpam
allow_url_fopen = On

; Zona horaria (ajusta a tu region)
date.timezone = "Europe/Madrid"

expose_php = Off
Cita:El 
allow_url_fopen = On
 es importante: sin él pierdes el comprobador de versiones, el login con Google, las notificaciones de Discord y Stop Forum Spam.

Archivo 3 de 7 - docker/vhost.conf Configuración de Apache. La línea clave es 
AllowOverride All
, sin ella el 
.htaccess
 del script se ignora y las URLs dan 404.
 
<VirtualHost *:80>
    ServerAdmin webmaster@localhost
    DocumentRoot /var/www/html

    <Directory /var/www/html>
        Options +FollowSymLinks
        AllowOverride All
        Require all granted
    </Directory>

    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

Archivo 4 de 7 - docker/entrypoint.sh Este script se ejecuta cada vez que arranca el contenedor y arregla los permisos de las carpetas escribibles automáticamente (las mismas que el instalador te pide poner en 777).
 
#!/bin/bash
set -e

# Carpetas que deben tener permisos de escritura (REQUISITOS.txt)
WRITABLE_DIRS=(
    "cache"
    "templates_c"
    "files/uploads"
    "files/images"
    "files/avatar"
    "files/posts"
    "themes"
    "inc/smarty/templates_c"
)

cd /var/www/html

for dir in "${WRITABLE_DIRS[@]}"; do
    mkdir -p "$dir" 2>/dev/null || true
    chown -R www-data:www-data "$dir" 2>/dev/null || true
    chmod -R 777 "$dir" 2>/dev/null || true
done

exec "$@"
Cita:⚠️ MUY IMPORTANTE en Windows: guarda este archivo con saltos de línea LF (Unix), NO CRLF (Windows). Si lo guardas en formato Windows, el contenedor no arrancará y dará un error raro tipo 
exec format error
. En VS Code lo cambias en la esquina inferior derecha: haz clic donde pone 
 y elige 
.

Archivo 5 de 7 — docker-compose.yml El director de orquesta. Junta la app, la base de datos y los extras opcionales.
 
services:
  # ---------------------------------------------------------------
  #  Aplicacion: PHP 8.2 + Apache (Risus Nova / PHPost)
  # ---------------------------------------------------------------
  app:
    build:
      context: .
      dockerfile: docker/Dockerfile
    container_name: phpost_app
    restart: unless-stopped
    depends_on:
      db:
        condition: service_healthy
    ports:
      - "${APP_PORT:-8080}:80"
    volumes:
      # Codigo del script (uploads persisten en el host)
      - ./Script:/var/www/html
    environment:
      TZ: ${TZ:-Europe/Madrid}
    networks:
      - phpost

  # ---------------------------------------------------------------
  #  Base de datos: MariaDB 10.11
  # ---------------------------------------------------------------
  db:
    image: mariadb:10.11
    container_name: phpost_db
    restart: unless-stopped
    environment:
      MARIADB_ROOT_PASSWORD: ${DB_ROOT_PASSWORD}
      MARIADB_DATABASE: ${DB_NAME}
      MARIADB_USER: ${DB_USER}
      MARIADB_PASSWORD: ${DB_PASSWORD}
      TZ: ${TZ:-Europe/Madrid}
    volumes:
      - db_data:/var/lib/mysql
    healthcheck:
      test: ["CMD", "healthcheck.sh", "--connect", "--innodb_initialized"]
      interval: 10s
      timeout: 5s
      retries: 10
    networks:
      - phpost

  # ---------------------------------------------------------------
  #  Cron: llama a cron.php de forma periodica (opcional)
  #  Activar con:  docker compose --profile cron up -d
  # ---------------------------------------------------------------
  cron:
    image: curlimages/curl:latest
    container_name: phpost_cron
    restart: unless-stopped
    depends_on:
      - app
    profiles: ["cron"]
    entrypoint: >
      sh -c "while true; do
        curl -s -o /dev/null Registrate o inicia tu sesión para ver este contenido || true;
        sleep ${CRON_INTERVAL:-300};
      done"
    networks:
      - phpost

  # ---------------------------------------------------------------
  #  phpMyAdmin (opcional, gestion de BD)
  #  Activar con:  docker compose --profile tools up -d
  # ---------------------------------------------------------------
  phpmyadmin:
    image: phpmyadmin:latest
    container_name: phpost_pma
    restart: unless-stopped
    depends_on:
      - db
    profiles: ["tools"]
    ports:
      - "${PMA_PORT:-8081}:80"
    environment:
      PMA_HOST: db
      UPLOAD_LIMIT: 64M
    networks:
      - phpost

volumes:
  db_data:
    driver: local

networks:
  phpost:
    driver: bridge

Detalles que importan:
Archivo 6 de 7 - .env.example La plantilla de configuración. Aquí van puertos y contraseñas. La subes al repositorio sin miedo porque no tiene contraseñas reales.
 
# -------- Puertos host --------
APP_PORT=8080          # Registrate o inicia tu sesión para ver este contenido
PMA_PORT=8081          # phpMyAdmin (perfil tools)

# -------- Base de datos --------
# Estos valores son los que introduces en el instalador web.
# Hostname de BD en el instalador  =  db   (nombre del servicio)
DB_NAME=phpost
DB_USER=phpost
DB_PASSWORD=cambia_esta_password
DB_ROOT_PASSWORD=cambia_esta_root_password

# -------- Cron (perfil cron) --------
CRON_INTERVAL=300      # segundos entre llamadas a cron.php

# -------- Zona horaria --------
TZ=America/Bogota

Archivo 7 de 7 - .dockerignore Le dice a Docker qué NO meter dentro de la imagen (archivos que no hacen falta).
 
.git
*.md
CHANGELOG.txt
LEEME.txt
REQUISITOS.txt
*.url
.env

Comprobación: ¿tienes todo?
Antes de arrancar, revisa que tu carpeta tiene estos archivos y esta estrucutra:
 
phpost/
├── Script/                  ← el script (ya lo tenías)
├── docker/
│   ├── Dockerfile           ✔ archivo 1
│   ├── php.ini              ✔ archivo 2
│   ├── vhost.conf           ✔ archivo 3
│   └── entrypoint.sh        ✔ archivo 4  (¡en formato LF!)
├── docker-compose.yml       ✔ archivo 5
├── .env.example             ✔ archivo 6
└── .dockerignore            ✔ archivo 7


Ahora solamente falta arrancar el proyecto
Abre una terminal dentro de la carpeta 
phpost/
 y ejecuta:
 
# 1. Crea tu .env real a partir de la plantilla
cp .env.example .env

Ahora edita el 
 y cambia 
DB_PASSWORD
 y 
DB_ROOT_PASSWORD
 por contraseñas de verdad.
Cita:🔑 Para generar una contraseña segura: 
openssl rand -base64 18
 (en Linux, Mac o Git Bash de Windows).
 
# 2. Construye y arranca todo
docker compose up -d --build
 Espera un par de minutos la primera vez (se descarga y construye la imagen). Cuando termine:
  • La web está en Debes agradecer para ver el contenido...
  • La base de datos corriendo por dentro
Para comprobar que todo está arriba:
Cita:docker compose ps

Debes ver 
phpost_app
 y 
phpost_db
 con estado 
 (y la BD como 
healthy
).

El instalador web

Abre Debes agradecer para ver el contenido... y sigue el asistente.

Permisos de archivos

El instalador comprobará los permisos de las carpetas. Gracias al 
entrypoint.sh
deberían salir todos en OK (777) automáticamente. Si alguno sale en NO, reinicia el contenedor con 
docker compose restart app
 y recarga.

Datos de la base de datos
Aquí es donde falla casi todo el mundo. Pon exactamente esto:

[img]Registrate o inicia tu sesión para ver este contenido[/img]

El error nº1: poner "localhost"
 En Docker cada contenedor es como un ordenador independiente. Si pones 
localhost
, la app busca la base de datos dentro de sí misma y no la encuentra. Hay que usar el nombre del servicio
. Docker se encarga de que ese nombre apunte al contenedor de MySQL en su red interna.

Grábate esto: el servidor de la base de datos es 
, no 
localhost
.


¿Dónde se guardan mis datos? (volúmenes)
 Un contenedor es efímero: si lo borras, se lleva todo lo de dentro. Por eso los datos importantes viven fuera, en volúmenes. En este montaje hay dos:
  1. Base de datos → volumen 
    db_data
    .
     Todos los usuarios, posts y comentarios viven en un volumen que gestiona Docker. Aunque borres y recrees el contenedor, la BD sigue ahí. Solo se pierde con 
    docker compose down -v
    .
  2. Código y subidas → carpeta 
    Script/
     de tu PC
     (bind-mount 
    ./Script:/var/www/html
    ). Esto tiene dos ventajas:
    • Editas un archivo en tu ordenador y el cambio se ve al instante en la web.
    • Los avatares, imágenes y posts que suben los usuarios se guardan en tu carpeta 
      Script/files/
      , no dentro del contenedor. Así que sobreviven a cualquier cosa.

Comandos del día a día
 
docker compose ps                 # ver qué está corriendo
docker compose logs -f app        # ver logs de PHP/Apache
docker compose exec app bash      # entrar al contenedor
docker compose restart app        # reiniciar solo la app
docker compose down               # parar todo (conserva los datos)
docker compose down -v            # parar y BORRAR la base de datos ⚠️
docker compose up -d --build      # reconstruir tras cambiar el Dockerfile


Espero que les sirva bastante. Dudas y mejoras en los comentarios, saludos!
Responder Compartir
#2

0
¡Bienvenido de vuelta, y gracias por la guía! 🙌

Está muy bien montada — se nota el trabajo de dejar cada archivo explicado paso a paso, con la ruta exacta y todo.
Seguro que le sirve a más de uno para probar el script sin instalar nada en local.

Le he echado un vistazo y he encontrado una cosilla para corregir:

entrypoint.sh — rutas de caché

El script lista estas carpetas como escribibles:
 
"cache"
"templates_c"
...
"inc/smarty/templates_c"

Pero la carpeta real de compilación de Smarty en esta versión del script es solo cache/ en la raíz del proyecto — así está configurado en c.smarty.php:
 
$this->setCompileDir(TS_ROOT.DIRECTORY_SEPARATOR.'cache');

Ni templates_c/ ni inc/smarty/templates_c/ existen ni se usan aquí.
No rompe nada dejarlas en el script (simplemente no hacen nada), pero mejor que la guía refleje la estructura real para no confundir a quien la siga.

Un par de notas menores, no errores:
  • memory_limit = 128M puede quedarse justo en instalaciones con mucho contenido (el sanitizado de HTML en posts/comentarios puede pedir más). No hace falta cambiarlo para probar, pero si ves timeouts raros, súbelo a 256M.
  • Usas PHP 8.2 — funciona perfecto, aunque el proyecto en general ya apunta a 8.3+.

Fuera de eso, todo lo demás está sólido: el AllowOverride All, el healthcheck de la base de datos, los profiles para cron/phpMyAdmin opcionales... buen trabajo.

¡Gracias por seguir aportando a la comunidad!
Responder Compartir


Compartir en:

Salto de foro:


Usuarios navegando en este tema: 1 invitado(s)