services: nextcloud: image: nextcloud:33-apache container_name: nextcloud restart: unless-stopped depends_on: postgres: condition: service_healthy redis: condition: service_started env_file: .env environment: - POSTGRES_HOST=postgres - REDIS_HOST=redis - REDIS_HOST_PASSWORD=${REDIS_PASSWORD} volumes: - ${DATA_ROOT}/nextcloud/html:/var/www/html - ${DATA_ROOT}/nextcloud/data:/var/www/html/data networks: - proxy - nextcloud-internal logging: driver: json-file options: max-size: "10m" max-file: "3" healthcheck: test: ["CMD", "curl", "-f", "http://localhost/status.php"] interval: 30s timeout: 10s retries: 3 postgres: image: postgres:17-alpine container_name: nextcloud-postgres restart: unless-stopped env_file: .env volumes: - ${DATA_ROOT}/nextcloud/db:/var/lib/postgresql/data networks: - nextcloud-internal healthcheck: test: ["CMD-SHELL", "pg_isready -U $$POSTGRES_USER -d $$POSTGRES_DB"] interval: 10s timeout: 5s retries: 5 logging: driver: json-file options: max-size: "10m" max-file: "3" redis: image: redis:8-alpine container_name: nextcloud-redis restart: unless-stopped command: redis-server --requirepass ${REDIS_PASSWORD} env_file: .env networks: - nextcloud-internal logging: driver: json-file options: max-size: "10m" max-file: "3" cron: image: nextcloud:33-apache container_name: nextcloud-cron restart: unless-stopped depends_on: - nextcloud entrypoint: /cron.sh volumes: - ${DATA_ROOT}/nextcloud/html:/var/www/html - ${DATA_ROOT}/nextcloud/data:/var/www/html/data networks: - nextcloud-internal logging: driver: json-file options: max-size: "10m" max-file: "3" networks: proxy: external: true nextcloud-internal: driver: bridge