Docker Compose WordPress con pure-ftpd: el usuario de FTP no tiene permisos de escritura

6 minutos de lectura

Avatar de usuario de Jpv
jpv

Algo nuevo en Docker, así que tengan paciencia conmigo.

ANTECEDENTES:
He configurado los siguientes contenedores en un sistema operativo Win 10 con WSL2:

WordPress + MariaDB + PhpMyAdmin + Pure-ftpd

No estoy vinculando mis archivos de proyecto con mi sistema operativo, ya que ralentiza todo el sitio web. En cambio, estoy usando pure-ftpd para actualizar mis volúmenes.

¡Esta configuración funciona muy bien! ATM mi base de datos es de aproximadamente 1 GB o más, los archivos son de aproximadamente 500 MB y las cargas son de aproximadamente 22 GB. *beso del chef

PROBLEMA:
Cuando creo un archivo usando FTP, este no tiene permisos de “Escritura”. Entonces, crear nuevos scripts se vuelve imposible. Una solución ha sido ir al volumen y actualizar el permiso del archivo a “777”

pure-ftpd crea los archivos usando el usuario “1000”, pero cuando intento buscar al usuario en el contenedor, esto no devuelve nada.

MI falta algo en mi .YML para permitir que pure-ftpd escriba en el volumen “wordpress” como “raíz”

Este es mi .YML

services:
#DATABASE
  db:
    container_name: cc_db
    # We use a mariadb image which supports both amd64 & arm64 architecture
    image: mariadb:10.6.9-focal
    command: '--default-authentication-plugin=mysql_native_password'
    volumes:
      - cc_db:/var/lib/mysql/****_woo
      - ./my_customized.cnf:/etc/mysql/my.cnf
    ports:
      - "3306:3306"  # To Allow Remote Connections
    restart: always
    environment:
      - MYSQL_ROOT_PASSWORD=******++
      - MYSQL_DATABASE=******
      - MYSQL_USER=wordpress
      - MYSQL_PASSWORD=wordpress
    expose:
      - 3306
      - 33060

    networks:
      - cc_network

#PHPMYADMIN
  phpmyadmin:
    image: phpmyadmin/phpmyadmin
    depends_on:
      - db
    environment:
      - UPLOAD_LIMIT=768M
      - PMA_HOST:db
      - PMA_PORT:3306
      - PMA_ARBITRARY:1
      - MYSQL_ROOT_PASSWORD=******++
    restart: always
    ports:
      - 8080:80
    networks:
    - cc_network

#WORDPRESS
  wordpress:
    container_name: cc_wordpress
    #image: wordpress:latest
    # Current Website:  WordPress @ 6.0.2  -- PHP 8.1.10  -- Maria DB 10.6.9  :: Post Max Size: 128 MB , PHP Limit 120  :: Max Inpt Var 4500
    image: wordpress:6.0.2-php8.1
    ports:
      - 80:80
    restart: always
    networks:
      - cc_network
    environment:
      # our local dev environment
      - WORDPRESS_DEBUG:1
      - WORDPRESS_DB_HOST=db:3306
      - WORDPRESS_DB_USER=wordpress
      - WORDPRESS_DB_PASSWORD=wordpress
      - WORDPRESS_DB_NAME=*****
    volumes:
      - ./uploads.ini:/usr/local/etc/php/conf.d/uploads.ini
      - ./httpd/wp-config.php:/var/www/html/wp-config.php
      - ./httpd/.htaccess:/var/www/html/.htaccess
      - cc_wordpress:/var/www/html/wp-content:rw

  ftp:
    container_name: ftpd-server
    image: stilliard/pure-ftpd:hardened
    depends_on:
      - wordpress
    ports:
      - 21:21
      - 20:20
      - 30000-30009:30000-30009
    volumes:
     - cc_wordpress:/home/user/:rw
     - './ftp/pass:/etc/pure-ftpd/passwd'
    environment:
      PUBLICHOST: "10.47.61.236"
      FTP_USER_NAME: "user"
      FTP_USER_PASS: "*****++"
      FTP_USER_HOME: "/home/user"
      ADDED_FLAGS: "--tls=2"
      TLS_CN: "**** FTP"
      TLS_ORG: "*****"
      TLS_C: "US"
      MAX_CONNECTIONS: "20"
    restart: always
    
    networks:
      - cc_network


networks:
  cc_network:

volumes:
  cc_wordpress:
  cc_db:

avatar de usuario de jccampanero
jccampero

De acuerdo con la pure-ftpd documentación podrias indicar el UID y GID del usuario FTP usando las variables de entorno apropiadas:

Si desea configurar el UID & GID del usuario FTP, utilice el FTP_USER_UID & FTP_USER_GID Variables de entorno.

La documentación proporciona también una ejemplo de uso pure-ftpd explícitamente con WordPress. Menciona:

En el contenedor de WordPress, el propietario de los archivos tiene la UID 33 & GID 33por lo tanto, configuramos el UID y GID del usuario de FTP en consecuencia, proporcionando el siguiente fragmento de código:

version: "3.2"
services:
  web:
    image: wordpress:4.8-apache
    # other configs for wordpress
    volumes:
      - ./data/wordpress:/var/www/html
  ftp:
    # optionally replace username/repo:tag with your name and image details
    image: stilliard/pure-ftpd:latest
    deploy:
      replicas: 1
      restart_policy:
        condition: on-failure
    environment:
      PUBLICHOST: xxx.xxx.xxx.xxx
      FTP_USER_NAME: "bob"
      FTP_USER_PASS: "foobarqux"
      FTP_USER_HOME: "/var/www/html"
      FTP_USER_UID: 33
      FTP_USER_GID: 33
    volumes:
      - ./data/wordpress:/var/www/html
      - ./data/ftp:/etc/ssl/private
    ports:
      - target: 21
        published: 21
        protocol: tcp
        mode: host

# Bind each passive ports to the host
      - target: 30000
        published: 30000
        protocol: tcp
        mode: host
# ...

Por favor, intente modificar su docker-compose archivo en consecuencia, supongo que algo similar a esto:

services:
#DATABASE
  db:
    container_name: cc_db
    # We use a mariadb image which supports both amd64 & arm64 architecture
    image: mariadb:10.6.9-focal
    command: '--default-authentication-plugin=mysql_native_password'
    volumes:
      - cc_db:/var/lib/mysql/****_woo
      - ./my_customized.cnf:/etc/mysql/my.cnf
    ports:
      - "3306:3306"  # To Allow Remote Connections
    restart: always
    environment:
      - MYSQL_ROOT_PASSWORD=******++
      - MYSQL_DATABASE=******
      - MYSQL_USER=wordpress
      - MYSQL_PASSWORD=wordpress
    expose:
      - 3306
      - 33060

    networks:
      - cc_network

#PHPMYADMIN
  phpmyadmin:
    image: phpmyadmin/phpmyadmin
    depends_on:
      - db
    environment:
      - UPLOAD_LIMIT=768M
      - PMA_HOST:db
      - PMA_PORT:3306
      - PMA_ARBITRARY:1
      - MYSQL_ROOT_PASSWORD=******++
    restart: always
    ports:
      - 8080:80
    networks:
    - cc_network

#WORDPRESS
  wordpress:
    container_name: cc_wordpress
    #image: wordpress:latest
    # Current Website:  WordPress @ 6.0.2  -- PHP 8.1.10  -- Maria DB 10.6.9  :: Post Max Size: 128 MB , PHP Limit 120  :: Max Inpt Var 4500
    image: wordpress:6.0.2-php8.1
    ports:
      - 80:80
    restart: always
    networks:
      - cc_network
    environment:
      # our local dev environment
      - WORDPRESS_DEBUG:1
      - WORDPRESS_DB_HOST=db:3306
      - WORDPRESS_DB_USER=wordpress
      - WORDPRESS_DB_PASSWORD=wordpress
      - WORDPRESS_DB_NAME=*****
    volumes:
      - ./uploads.ini:/usr/local/etc/php/conf.d/uploads.ini
      - ./httpd/wp-config.php:/var/www/html/wp-config.php
      - ./httpd/.htaccess:/var/www/html/.htaccess
      - cc_wordpress:/var/www/html/wp-content:rw

  ftp:
    container_name: ftpd-server
    image: stilliard/pure-ftpd:hardened
    depends_on:
      - wordpress
    ports:
      - 21:21
      - 20:20
      - 30000-30009:30000-30009
    volumes:
     - cc_wordpress:/home/user/:rw
     - './ftp/pass:/etc/pure-ftpd/passwd'
    environment:
      PUBLICHOST: "10.47.61.236"
      FTP_USER_NAME: "user"
      FTP_USER_PASS: "*****++"
      FTP_USER_HOME: "/home/user"
      FTP_USER_UID: 33
      FTP_USER_GID: 33
      ADDED_FLAGS: "--tls=2"
      TLS_CN: "**** FTP"
      TLS_ORG: "*****"
      TLS_C: "US"
      MAX_CONNECTIONS: "20"
    restart: always
    
    networks:
      - cc_network


networks:
  cc_network:

volumes:
  cc_wordpress:
  cc_db:

estas usando el wordpress:6.0.2-php8.1 imagen que a su vez se basa en php:8.1-apache. Por lo que entiendo de la php:8.1-apache Dockerfile tendrias que ajustar el FTP_USER_UID y FTP_USER_GID variables para que coincidan con las utilizadas para ejecutar Apache, supongo, el usuario www-data, creado por defecto en sistemas Debian con UID y GID 33.

Excelente respuesta de @jccampanero. Me gustaría agregar que puedes hacer docker exec algo como pure-pw useradd yourusername -f /etc/pure-ftpd/passwd/pureftpd.passwd -m -u ftpuser -d /home/ftpusers/youruser. También según la documentación,

Si tiene algún problema con los permisos de volumen debido al uid o gid del usuario creado, puede cambiar el indicador -u por el uid que le gustaría usar y/o especificar -g con la identificación del grupo también. Para más información ver tema

¿Ha sido útil esta solución?