diff --git a/.env.example b/.env.example
new file mode 100644
index 000000000..dfd8ac483
--- /dev/null
+++ b/.env.example
@@ -0,0 +1,4 @@
+MYSQL_USER=
+MYSQL_PASSWORD=
+MYSQL_ROOT_PASSWORD=
+REDIS_PASSWORD=
diff --git a/Makefile b/Makefile
new file mode 100644
index 000000000..2e5aaeb04
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,10 @@
+init: docker-down docker-build docker-up
+
+docker-down:
+ docker compose down --remove-orphans
+
+docker-build:
+ docker compose build
+
+docker-up:
+ docker compose up -d
diff --git a/code/index.php b/code/index.php
new file mode 100644
index 000000000..8fac08803
--- /dev/null
+++ b/code/index.php
@@ -0,0 +1,48 @@
+";
+
+$redis = new Redis();
+$redis->connect('redis', 6379);
+$redis->auth(getenv("REDIS_PASSWORD"));
+
+if ($redis->ping()) {
+ print_r('Redis is alive!!!!!!');
+ echo "
";
+}
+
+$mc = new Memcached();
+$mc->addServer("memcached", 11211);
+$mc->set("foo", "Hello!");
+$mc->set("bar", "Memcached...");
+$data = [
+ $mc->get("foo"),
+ $mc->get("bar")
+];
+
+print_r($data);
+echo "
";
+
+try {
+ $user = getenv("DB_USER");
+ $pass = getenv("DB_PASSWORD");
+ $opt = [
+ PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
+ PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
+ PDO::ATTR_EMULATE_PREPARES => false,
+ ];
+ $pdo = new PDO("mysql:host=mysql;dbname=mysite", $user, $pass, $opt);
+ $stmt = $pdo->query('SHOW DATABASES;');
+
+ while ($row = $stmt->fetch()) {
+ print_r($row);
+ }
+} catch (\Throwable $e) {
+ print_r($e->getMessage());
+}
+
+echo "
";
+
+echo "";
+
+phpinfo();
diff --git a/docker-compose.yaml b/docker-compose.yaml
new file mode 100644
index 000000000..4a0cb809a
--- /dev/null
+++ b/docker-compose.yaml
@@ -0,0 +1,70 @@
+version: '3'
+
+services:
+ nginx:
+ image: nginx:latest
+ container_name: mysite-nginx
+ depends_on:
+ - php-fpm
+ ports:
+ - "80:80"
+ volumes:
+ - ./code:/data/mysite.local
+ - ./nginx/hosts/mysite.local.conf:/etc/nginx/conf.d/mysite.local.conf
+ networks:
+ - app-network
+
+ php-fpm:
+ build:
+ context: ./fpm
+ dockerfile: Dockerfile
+ image: mysite/php-fpm
+ container_name: mysite-php-fpm
+ environment:
+ - REDIS_PASSWORD=${REDIS_PASSWORD}
+ - DB_USER=${MYSQL_USER}
+ - DB_PASSWORD=${MYSQL_PASSWORD}
+ depends_on:
+ - memcached
+ - redis
+ volumes:
+ - ./code:/data/mysite.local
+ networks:
+ - app-network
+
+ memcached:
+ image: memcached:latest
+ container_name: mysite-memcached
+ networks:
+ - app-network
+
+ redis:
+ image: redis:latest
+ container_name: mysite-redis
+ environment:
+ - REDIS_PASSWORD=${REDIS_PASSWORD}
+ command: sh -c 'exec redis-server --requirepass "$REDIS_PASSWORD"'
+ networks:
+ - app-network
+
+ mysql:
+ image: mysql:8.0
+ container_name: mysite-mysql
+ ports:
+ - "3306:3306"
+ environment:
+ MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
+ MYSQL_DATABASE: mysite
+ MYSQL_USER: ${MYSQL_USER}
+ MYSQL_PASSWORD: ${MYSQL_PASSWORD}
+ volumes:
+ - mysite-dbdata:/var/lib/mysql
+ networks:
+ - app-network
+
+networks:
+ app-network:
+ driver: bridge
+
+volumes:
+ mysite-dbdata:
diff --git a/fpm/Dockerfile b/fpm/Dockerfile
new file mode 100644
index 000000000..d1b249e40
--- /dev/null
+++ b/fpm/Dockerfile
@@ -0,0 +1,36 @@
+FROM php:8.2-fpm
+
+# ставим необходимые для нормальной работы модули
+RUN apt-get update \
+ && apt-get install -y \
+ libfreetype6-dev \
+ libjpeg62-turbo-dev \
+ libpng-dev \
+ libonig-dev \
+ libzip-dev \
+ libmemcached-dev \
+ zlib1g-dev \
+ libssl-dev \
+ libz-dev \
+ libmcrypt-dev \
+ && pecl install mcrypt-1.0.6 \
+ && docker-php-ext-enable mcrypt \
+ && docker-php-ext-install -j$(nproc) iconv mbstring mysqli pdo_mysql zip \
+ && docker-php-ext-configure gd --with-freetype --with-jpeg \
+ && docker-php-ext-install -j$(nproc) gd \
+ && pecl install redis \
+ && docker-php-ext-enable redis
+
+RUN yes '' | pecl install -f memcached-3.2.0 \
+ && docker-php-ext-enable memcached
+
+# Устанавливаем Composer
+RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
+
+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 000000000..ed0de8695
--- /dev/null
+++ b/fpm/php.ini
@@ -0,0 +1,2 @@
+session.save_handler = memcache
+session.save_path = "tcp://memcache:11211"
diff --git a/nginx/hosts/mysite.local.conf b/nginx/hosts/mysite.local.conf
new file mode 100644
index 000000000..b725d7b11
--- /dev/null
+++ b/nginx/hosts/mysite.local.conf
@@ -0,0 +1,25 @@
+server {
+ listen 80;
+ server_name mysite.local;
+ root /data/mysite.local;
+ index index.php index.html;
+
+ location ~* .(jpg|jpeg|gif|css|png|js|ico|html)$ {
+ access_log off;
+ expires max;
+ }
+
+ location / {
+ try_files $uri $uri/ /index.php?$query_string;
+ }
+
+ location ~* .php$ {
+ try_files $uri = 404;
+ fastcgi_split_path_info ^(.+.php)(/.+)$;
+ fastcgi_pass php-fpm: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;
+ }
+}