diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..739e3e8 --- /dev/null +++ b/.env.example @@ -0,0 +1,6 @@ +# Настройки для MySQL +DB_HOST=db +DB_PORT=3306 +DB_DATABASE=mydatabase +DB_USERNAME=myuser +DB_PASSWORD=mypassword \ No newline at end of file diff --git a/code/img/2832713.jpg b/code/img/2832713.jpg new file mode 100644 index 0000000..f4eaf22 Binary files /dev/null and b/code/img/2832713.jpg differ diff --git a/code/index.php b/code/index.php new file mode 100644 index 0000000..5b44d9a --- /dev/null +++ b/code/index.php @@ -0,0 +1,62 @@ + + + + + Домашнее задание 1 + + + +

Домашнее задание 1

+

Проверка загрузки css и картинок

+ +
+
+ + + + +"; + +$redis = new Redis(); +try { + $redis->connect('redis', 6379); + $redis->set('message', 'Привет из Redis!'); + $message = $redis->get('message'); + echo "Соединение с Redis установлено: $message"; +} catch (Exception $e) { + echo "Ошибка подключения к Redis: " . $e->getMessage(); +} + +echo "
"; + +$memcached = new Memcached(); +$memcached->addServer('memcached', 11211); +if ($memcached->getVersion()) { + $memcached->set('memcached_message', 'Привет из Memcached!'); + echo "Соединение с Memcached установлено: " . $memcached->get('memcached_message'); +} else { + echo "Ошибка подключения к Memcached"; +} + +echo "
"; + +$host = getenv('DB_HOST'); +$db = getenv('DB_DATABASE'); +$user = getenv('DB_USERNAME'); +$pass = getenv('DB_PASSWORD'); +$charset = 'utf8mb4'; +$dsn = "mysql:host=$host;dbname=$db;charset=$charset"; +$options = [ + PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, + PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, + PDO::ATTR_EMULATE_PREPARES => false, +]; + +try { + $pdo = new PDO($dsn, $user, $pass, $options); + echo "Соединение с MySQL установлено!"; +} catch (\PDOException $e) { + echo "Ошибка подключения к MySQL: " . $e->getMessage(); +} diff --git a/code/style.css b/code/style.css new file mode 100644 index 0000000..b08e4f9 --- /dev/null +++ b/code/style.css @@ -0,0 +1,3 @@ +img { + width:200px +} \ No newline at end of file diff --git a/composer.json b/composer.json new file mode 100644 index 0000000..dbbef43 --- /dev/null +++ b/composer.json @@ -0,0 +1,4 @@ +{ + "name": "napastyuk/hw", + "require": {} +} diff --git a/docker-compose.yaml b/docker-compose.yaml new file mode 100644 index 0000000..78d96aa --- /dev/null +++ b/docker-compose.yaml @@ -0,0 +1,76 @@ + +# в этом блоке мы описываем контейнеры, которые будут запускаться +services: + #контейнер с Nginx + nginx: + # Если нет секции build, то система будет искать образ в репозиториях + build: + context: ./nginx + dockerfile: Dockerfile + image: myapp/nginx # имя будущего образа + container_name: nginx # имя контейнера после запуска + ports: + - "80:80" + volumes: + - ./code:/data/mysite.local + networks: + - app-network + depends_on: + - app + - redis + - memcached + + #Контейнер с PHP-FPM + app: + build: + context: ./fpm + dockerfile: Dockerfile + image: myapp/php + container_name: app + volumes: + - ./code:/data/mysite.local + networks: + - app-network + depends_on: + - redis + - memcached + env_file: + - .env + + #Контейнер с MySQL + db: + image: mysql + container_name: mysql + environment: + MYSQL_ROOT_PASSWORD: ${DB_PASSWORD} + MYSQL_DATABASE: ${DB_DATABASE} + MYSQL_USER: ${DB_USERNAME} + MYSQL_PASSWORD: ${DB_PASSWORD} + ports: + - "${DB_PORT}:3306" + networks: + - app-network + volumes: + - db_data:/var/lib/mysql + + #Контейнер с Redis + redis: + image: redis + container_name: redis + networks: + - app-network + + #Контейнер с Memcached + memcached: + image: memcached + container_name: memcached + networks: + - app-network + +volumes: + db_data: + +#виртуальная сеть +networks: + app-network: + driver: bridge \ No newline at end of file diff --git a/fpm/Dockerfile b/fpm/Dockerfile new file mode 100644 index 0000000..da775f2 --- /dev/null +++ b/fpm/Dockerfile @@ -0,0 +1,57 @@ +FROM php:8.2-fpm + +RUN apt-get update && apt-get install -y \ + libfreetype6-dev \ + libjpeg62-turbo-dev \ + libpng-dev \ + libonig-dev \ + libzip-dev \ + pkg-config \ + build-essential \ + default-mysql-client \ + && docker-php-ext-install -j$(nproc) iconv mbstring mysqli pdo_mysql zip + +RUN apt install -y libmemcached-dev zlib1g-dev libssl-dev && \ + pecl install memcached && docker-php-ext-enable memcached + +RUN pecl install redis && docker-php-ext-enable redis + +COPY ./php.ini /usr/local/etc/php/conf.d/php-custom.ini + +# Копирование Composer из официального образа +COPY --from=composer:latest /usr/bin/composer /usr/bin/composer + +WORKDIR /data + +VOLUME /data + +CMD ["php-fpm"] + + +# # Установка зависимостей и расширений +# RUN apt-get update && apt-get install -y \ +# libfreetype6-dev \ +# libjpeg62-turbo-dev \ +# libpng-dev \ +# libonig-dev \ +# libzip-dev \ +# pkg-config \ +# build-essential \ +# && docker-php-ext-install -j$(nproc) iconv mbstring mysqli pdo_mysql zip + +# RUN apt install -y libmemcached-dev zlib1g-dev libssl-dev + +# # Установка расширения Memcached +# RUN pecl install -f memcached-3.3.0 \ +# && docker-php-ext-enable memcached + +# # Установка расширения Redis +# RUN pecl install redis && docker-php-ext-enable redis + +# COPY ./php.ini /usr/local/etc/php/conf.d/php-custom.ini + +# WORKDIR /data + +# VOLUME /data + +# CMD ["php-fpm"] diff --git a/fpm/php.ini b/fpm/php.ini new file mode 100644 index 0000000..ff806bb --- /dev/null +++ b/fpm/php.ini @@ -0,0 +1,2 @@ +session.save_handler = memcache +session.save_path = "tcp://memcache:11211" \ No newline at end of file diff --git a/nginx/Dockerfile b/nginx/Dockerfile new file mode 100644 index 0000000..c26b4e8 --- /dev/null +++ b/nginx/Dockerfile @@ -0,0 +1,11 @@ +FROM nginx:latest + +COPY ./hosts/mysite.local.conf /etc/nginx/conf.d/mysite.local.conf + +WORKDIR /data + +VOLUME /data + +EXPOSE 80 + +CMD ["nginx", "-g", "daemon off;"] \ No newline at end of file diff --git a/nginx/hosts/mysite.local.conf b/nginx/hosts/mysite.local.conf new file mode 100644 index 0000000..f983927 --- /dev/null +++ b/nginx/hosts/mysite.local.conf @@ -0,0 +1,36 @@ +server { + # указываем 80 порт для соединения + listen 80; + # нужно указать, какому доменному имени принадлежит наш конфиг + server_name mysite.local; + + # задаём корневую директорию + root /data/mysite.local; + + # стартовый файл + index index.php index.html; + + # при обращении к статическим файлам логи не нужны, равно как и обращение к fpm + # http://mysite.local/static/some.png + location ~* .(jpg|jpeg|gif|css|png|js|ico|html)$ { + access_log off; + expires max; + } + + # помним про единую точку доступа + # все запросы заворачиваются в корневую директорию root на index.php + location / { + try_files $uri $uri/ /index.php?$query_string; + } + + # и наконец правило обращения к php-fpm + location ~* .php$ { + try_files $uri = 404; + fastcgi_split_path_info ^(.+.php)(/.+)$; + # fastcgi_pass app:9000; + fastcgi_pass unix:/var/run/php-fpm.sock; + fastcgi_index index.php; + fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; + include fastcgi_params; + } +}