version: "3.9"
# Define la versión del formato docker-compose.
# La versión 3.9 es compatible con las últimas versiones 
# de Docker y permite utilizar funcionalidades avanzadas.

services:
# Define los contenedores que se ejecutarán como parte de la aplicación.
# En este caso, se definen cuatro servicios: php, mysql, phpmyadmin y sftp.

  php:
  # Define un contenedor para ejecutar PHP.
    build:
    # Indica que se debe construir una imagen Docker para el servicio
    # php usando un Dockerfile ubicado en el mismo directorio (./).
      context: ./
      # Define el contexto de construcción, que es el directorio actual (./).
      dockerfile: Dockerfile
      # Especifica el nombre del archivo Dockerfile que se utilizará
      # para construir la imagen.
    container_name: web-server_php_completo
    # Asigna un nombre al contenedor, en este caso web-server_php_completo.
    restart: always
    # Define la política de reinicio del contenedor. always asegura 
    # que el contenedor se reiniciará automáticamente si se detiene.
    ports:
    # Publica el puerto 80 del contenedor en el puerto 80
    # de la máquina host, permitiendo el acceso al servidor web.
      - 80:80
    volumes:
    # Monta volúmenes para compartir archivos entre el host y el contenedor.
    # El primer volumen monta el directorio public_html del host en
    # /home/test/public_html en el contenedor. 
    # El segundo volumen monta la configuración de PHP desde el directorio
    # config del host en /usr/local/etc/php en el contenedor.
      - ./public_html:/home/test/public_html
      - ./config:/usr/local/etc/php
    networks:
    # Conecta el contenedor a la red web-server_network,
    # lo que permite la comunicación entre los servicios.
      - web-server_network
    depends_on:
    # Define que este servicio (php) depende del servicio mysql.
    # Docker Compose asegurará que el contenedor mysql se inicie
    # antes que el contenedor php.
      - mysql
  
  mysql:
  # Define un contenedor para la base de datos MySQL.
    image: mysql:8.2.0
    container_name: web-server_mysql_completo
    restart: always
    environment:
    # Define variables de entorno para configurar MySQL.
    # Estas variables configuran el usuario root, la contraseña de root,
    # el nombre de la base de datos predeterminada y las credenciales
    # del usuario adicional.
      MYSQL_ROOT_PASSWORD: debian
      MYSQL_DATABASE: debian
      MYSQL_USER: debian
      MYSQL_PASSWORD: debian
    ports:
      - "3306:3306"
    volumes:
      - ./mysql-data:/var/lib/mysql
    networks:
      - web-server_network
  
  phpmyadmin:
  # Define un contenedor para ejecutar PHPMyAdmin,
  # una herramienta web para gestionar bases de datos MySQL.
    image: phpmyadmin:5.2.1
    container_name: web-server_phpmyadmin_completo
    restart: always
    ports:
      - 8080:80
    environment:
    # Define variables de entorno para configurar PHPMyAdmin. 
    # PMA_HOST y PMA_PORT indican que PHPMyAdmin debe conectarse 
    # al servicio mysql en el puerto 3306. 
    # PMA_ARBITRARY permite la conexión a múltiples servidores,
    # y MYSQL_ROOT_PASSWORD especifica la contraseña del usuario
    # root de MySQL.
      - PMA_HOST=mysql
      - PMA_PORT=3306
      - PMA_ARBITRARY=1
      - MYSQL_ROOT_PASSWORD=root
    depends_on:
      - mysql
    networks:
      - web-server_network
  
  sftp:
  # Define un contenedor para ejecutar un servidor SFTP
  # (Secure File Transfer Protocol).
    image: atmoz/sftp
    container_name: web-server_sftp_completo
    restart: always
    volumes:
      - ./public_html:/home/test/public_html
    ports:
      - "2222:22"
    command: test:test:1001

networks:
# Define la red web-server_network como una red de tipo bridge.
# Esta red conecta todos los servicios definidos en el archivo 
# docker-compose.yml, permitiendo que se comuniquen entre sí.
  web-server_network:
    driver: bridge

volumes:
# Define volúmenes para public_html, config, mysql_data y sftp. 
# Estos volúmenes permiten almacenar datos persistentes en el host, 
# asegurando que los datos no se pierdan cuando los contenedores 
# se reinician o eliminan.
  public_html: {}
  config: {}
  mysql_data: {}
  sftp: {}
