mirror of
https://github.com/DanielnetoDotCom/YouPHPTube
synced 2025-10-02 17:29:20 +02:00
223 lines
6.9 KiB
YAML
223 lines
6.9 KiB
YAML
version: '3.9'
|
|
|
|
services:
|
|
avideo:
|
|
build:
|
|
context: .
|
|
args:
|
|
SOCKET_PORT: ${SOCKET_PORT}
|
|
HTTP_PORT: ${HTTP_PORT}
|
|
HTTPS_PORT: ${HTTPS_PORT}
|
|
DB_MYSQL_HOST: ${DB_MYSQL_HOST}
|
|
DB_MYSQL_PORT: ${DB_MYSQL_PORT}
|
|
DB_MYSQL_NAME: ${DB_MYSQL_NAME}
|
|
DB_MYSQL_USER: ${DB_MYSQL_USER}
|
|
DB_MYSQL_PASSWORD: ${DB_MYSQL_PASSWORD}
|
|
SERVER_NAME: ${SERVER_NAME}
|
|
ENABLE_PHPMYADMIN: ${ENABLE_PHPMYADMIN}
|
|
PHPMYADMIN_PORT: ${PHPMYADMIN_PORT}
|
|
PHPMYADMIN_ENCODER_PORT: ${PHPMYADMIN_ENCODER_PORT}
|
|
CREATE_TLS_CERTIFICATE: "${CREATE_TLS_CERTIFICATE:-yes}"
|
|
TLS_CERTIFICATE_FILE: ${TLS_CERTIFICATE_FILE}
|
|
TLS_CERTIFICATE_KEY: ${TLS_CERTIFICATE_KEY}
|
|
CONTACT_EMAIL: ${CONTACT_EMAIL}
|
|
SYSTEM_ADMIN_PASSWORD: ${SYSTEM_ADMIN_PASSWORD}
|
|
WEBSITE_TITLE: ${WEBSITE_TITLE}
|
|
MAIN_LANGUAGE: ${MAIN_LANGUAGE}
|
|
restart: "unless-stopped"
|
|
environment:
|
|
SOCKET_PORT: ${SOCKET_PORT:-2053}
|
|
HTTP_PORT: ${HTTP_PORT:-80}
|
|
HTTPS_PORT: ${HTTPS_PORT:-443}
|
|
DB_MYSQL_HOST: "${DB_MYSQL_HOST:-database}"
|
|
DB_MYSQL_PORT: ${DB_MYSQL_PORT:-3306}
|
|
DB_MYSQL_NAME: "${DB_MYSQL_NAME:-avideo}"
|
|
DB_MYSQL_USER: "${DB_MYSQL_USER:-avideo}"
|
|
DB_MYSQL_PASSWORD: "${DB_MYSQL_PASSWORD:-avideo}"
|
|
SERVER_NAME: "${SERVER_NAME:-localhost}"
|
|
ENABLE_PHPMYADMIN: "${ENABLE_PHPMYADMIN:-yes}"
|
|
PHPMYADMIN_PORT: ${PHPMYADMIN_PORT:-8081}
|
|
PHPMYADMIN_ENCODER_PORT: ${PHPMYADMIN_ENCODER_PORT:-8082}
|
|
CREATE_TLS_CERTIFICATE: "${CREATE_TLS_CERTIFICATE:-yes}"
|
|
TLS_CERTIFICATE_FILE: "${TLS_CERTIFICATE_FILE:-/etc/apache2/ssl/localhost.crt}"
|
|
TLS_CERTIFICATE_KEY: "${TLS_CERTIFICATE_KEY:-/etc/apache2/ssl/localhost.key}"
|
|
CONTACT_EMAIL: "${CONTACT_EMAIL:-admin@localhost}"
|
|
SYSTEM_ADMIN_PASSWORD: "${SYSTEM_ADMIN_PASSWORD:-password}"
|
|
WEBSITE_TITLE: "${WEBSITE_TITLE:-AVideo}"
|
|
MAIN_LANGUAGE: "${MAIN_LANGUAGE:-en_US}"
|
|
NGINX_RTMP_PORT: "${NGINX_RTMP_PORT:-1935}"
|
|
NGINX_HTTP_PORT: "${NGINX_HTTP_PORT:-8080}"
|
|
NGINX_HTTPS_PORT: "${NGINX_HTTPS_PORT:-8443}"
|
|
MEMCACHED_HOST: memcached
|
|
env_file:
|
|
- .env
|
|
ports:
|
|
- "${SOCKET_PORT:-2053}:${SOCKET_PORT:-2053}"
|
|
- "${HTTP_PORT:-80}:80"
|
|
- "${HTTPS_PORT:-443}:443"
|
|
- "${WEBRTC_PORT:-3000}:${WEBRTC_PORT:-3000}"
|
|
volumes:
|
|
- "./.compose/HLS:/HLS"
|
|
- "./:/var/www/html/AVideo"
|
|
- "./.compose/videos:/var/www/html/AVideo/videos"
|
|
- "./.compose/encoder:/var/www/html/AVideo/Encoder"
|
|
- "./.compose/letsencrypt:/etc/letsencrypt/"
|
|
depends_on:
|
|
database:
|
|
condition: service_healthy
|
|
database_encoder:
|
|
condition: service_healthy
|
|
memcached:
|
|
condition: service_started
|
|
healthcheck:
|
|
test: ["CMD-SHELL", "curl --silent --fail http://localhost || exit 1"]
|
|
interval: 30s
|
|
timeout: 10s
|
|
retries: 3
|
|
deploy:
|
|
resources:
|
|
limits:
|
|
cpus: "${CPUS_LIMIT:-3}"
|
|
memory: "${MEMORY_LIMIT:-8G}"
|
|
reservations:
|
|
cpus: "${CPUS_LIMIT:-1}"
|
|
memory: "${MEMORY_LIMIT:-2G}"
|
|
networks:
|
|
app_net:
|
|
aliases:
|
|
- avideo
|
|
|
|
live:
|
|
build:
|
|
context: .
|
|
dockerfile: Dockerfile.live
|
|
restart: "unless-stopped"
|
|
volumes:
|
|
- "./.compose/HLS:/HLS"
|
|
- "./.compose/letsencrypt:/etc/letsencrypt/"
|
|
environment:
|
|
SERVER_NAME: "${SERVER_NAME:-localhost}"
|
|
CREATE_TLS_CERTIFICATE: "${CREATE_TLS_CERTIFICATE:-yes}"
|
|
TLS_CERTIFICATE_FILE: "${TLS_CERTIFICATE_FILE:-/etc/apache2/ssl/localhost.crt}"
|
|
TLS_CERTIFICATE_KEY: "${TLS_CERTIFICATE_KEY:-/etc/apache2/ssl/localhost.key}"
|
|
NGINX_RTMP_PORT: "${NGINX_RTMP_PORT:-1935}"
|
|
NGINX_HTTP_PORT: "${NGINX_HTTP_PORT:-8080}"
|
|
NGINX_HTTPS_PORT: "${NGINX_HTTPS_PORT:-8443}"
|
|
MEMCACHED_HOST: memcached
|
|
env_file:
|
|
- .env
|
|
ports:
|
|
- "${NGINX_RTMP_PORT:-1935}:1935"
|
|
- "${NGINX_HTTP_PORT:-8080}:8080"
|
|
- "${NGINX_HTTPS_PORT:-8443}:8443"
|
|
depends_on:
|
|
avideo:
|
|
condition: service_healthy
|
|
database:
|
|
condition: service_healthy
|
|
memcached:
|
|
condition: service_started
|
|
healthcheck:
|
|
test: ["CMD-SHELL", "curl --silent --fail http://localhost:8080 || exit 1"]
|
|
interval: 30s
|
|
timeout: 10s
|
|
retries: 3
|
|
deploy:
|
|
resources:
|
|
limits:
|
|
cpus: "2"
|
|
memory: "4G"
|
|
reservations:
|
|
cpus: "1"
|
|
memory: "2G"
|
|
networks:
|
|
- app_net
|
|
|
|
database:
|
|
build:
|
|
context: .
|
|
dockerfile: Dockerfile.mariadb
|
|
restart: "unless-stopped"
|
|
environment:
|
|
MYSQL_RANDOM_ROOT_PASSWORD: "yes"
|
|
MYSQL_INITDB_SKIP_TZINFO: 1
|
|
MYSQL_DATABASE: "${DB_MYSQL_NAME}"
|
|
MYSQL_USER: "${DB_MYSQL_USER}"
|
|
MYSQL_PASSWORD: "${DB_MYSQL_PASSWORD}"
|
|
volumes:
|
|
- ./.compose/db:/var/lib/mysql
|
|
healthcheck:
|
|
test: "mariadb-admin ping -h localhost -u $DB_MYSQL_USER -p$DB_MYSQL_PASSWORD"
|
|
interval: 30s
|
|
timeout: 10s
|
|
retries: 3
|
|
deploy:
|
|
resources:
|
|
limits:
|
|
cpus: "2"
|
|
memory: "10G"
|
|
reservations:
|
|
cpus: '1'
|
|
memory: '4G'
|
|
networks:
|
|
- app_net
|
|
|
|
database_encoder:
|
|
build:
|
|
context: .
|
|
dockerfile: Dockerfile.mariadb
|
|
restart: "unless-stopped"
|
|
environment:
|
|
MYSQL_RANDOM_ROOT_PASSWORD: "yes"
|
|
MYSQL_INITDB_SKIP_TZINFO: 1
|
|
MYSQL_DATABASE: "${DB_MYSQL_NAME}_encoder"
|
|
MYSQL_USER: "${DB_MYSQL_USER}"
|
|
MYSQL_PASSWORD: "${DB_MYSQL_PASSWORD}"
|
|
volumes:
|
|
- ./.compose/db_encoder:/var/lib/mysql
|
|
healthcheck:
|
|
test: "mariadb-admin ping -h localhost -u $DB_MYSQL_USER -p$DB_MYSQL_PASSWORD"
|
|
interval: 30s
|
|
timeout: 10s
|
|
retries: 3
|
|
deploy:
|
|
resources:
|
|
limits:
|
|
cpus: "0.5"
|
|
memory: "1G"
|
|
networks:
|
|
- app_net
|
|
|
|
# Optimised Memcached service (docker-compose.yml)
|
|
memcached:
|
|
image: memcached:alpine
|
|
restart: unless-stopped
|
|
# ── Runtime flags ────────────────────────────────────────────────
|
|
# -m 512 → 512 MiB cache (enough for large PHP sessions)
|
|
# -c 2048 → 2 048 concurrent connections
|
|
# -t ${NPROC:-4} → one worker thread per vCPU (default 4)
|
|
# -R 200 → 200 requests per event loop → lower latency
|
|
command: >
|
|
memcached -m 512 -c 2048 -t ${NPROC:-4} -R 200
|
|
ports:
|
|
- "${MEMCACHE_PORT:-11211}:11211"
|
|
deploy:
|
|
resources:
|
|
limits:
|
|
cpus: '1'
|
|
memory: "4G" # hard limit (container OOM-kills above this)
|
|
reservations:
|
|
cpus: '0.5'
|
|
memory: '1G' # guaranteed reservation (was 512 M)
|
|
networks:
|
|
- app_net
|
|
environment:
|
|
NPROC: ${NPROC:-4}
|
|
|
|
|
|
networks:
|
|
app_net:
|
|
driver: bridge
|
|
ipam:
|
|
config:
|
|
- subnet: "${NETWORK_SUBNET:-172.21.0.0/16}"
|