diff --git a/.gitignore b/.gitignore index 845cda6..0a720fa 100644 --- a/.gitignore +++ b/.gitignore @@ -1,55 +1 @@ -# Prerequisites -*.d - -# Object files -*.o -*.ko -*.obj -*.elf - -# Linker output -*.ilk -*.map -*.exp - -# Precompiled Headers -*.gch -*.pch - -# Libraries -*.lib -*.a -*.la -*.lo - -# Shared objects (inc. Windows DLLs) -*.dll -*.so -*.so.* -*.dylib - -# Executables -*.exe -*.out -*.app -*.i*86 -*.x86_64 -*.hex - -# Debug files -*.dSYM/ -*.su -*.idb -*.pdb - -# Kernel Module Compile Results -*.mod* -*.cmd -.tmp_versions/ -modules.order -Module.symvers -Mkfile.old -dkms.conf - -# debug information files -*.dwo +secrets/*.txt diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..bbd8524 --- /dev/null +++ b/Makefile @@ -0,0 +1,37 @@ +NAME = inception +COMPOSE = docker compose --env-file srcs/.env -f srcs/docker-compose.yml +DATA_PATH = /home/oriabenkyi/data + +all: up + +up: data + $(COMPOSE) up -d --build + +data: + mkdir -p $(DATA_PATH)/wordpress + mkdir -p $(DATA_PATH)/mariadb + +down: + $(COMPOSE) down + +stop: + $(COMPOSE) stop + +start: + $(COMPOSE) start + +restart: down up + +logs: + $(COMPOSE) logs -f + +clean: down + docker system prune -f + +fclean: clean + sudo rm -rf $(DATA_PATH)/wordpress + sudo rm -rf $(DATA_PATH)/mariadb + +re: fclean up + +.PHONY: all up down stop start restart logs clean fclean re data diff --git a/srcs/.env b/srcs/.env new file mode 100644 index 0000000..4df59b2 --- /dev/null +++ b/srcs/.env @@ -0,0 +1,14 @@ +DOMAIN_NAME=oriabenk.42.fr +LOGIN=oriabenk + +DATA_PATH=/home/oriabenkyi/data + +MYSQL_DATABASE=wordpress +MYSQL_USER=wp_user +MYSQL_HOST=mariadb + +WP_TITLE=Inception +WP_ADMIN_USER=supervisor +WP_ADMIN_EMAIL=supervisor@oriabenk.42.fr +WP_USER=oriabenk +WP_USER_EMAIL=oriabenk@oriabenk.42.fr diff --git a/srcs/docker-compose.yml b/srcs/docker-compose.yml new file mode 100644 index 0000000..89b6420 --- /dev/null +++ b/srcs/docker-compose.yml @@ -0,0 +1,74 @@ +services: + mariadb: + build: ./requirements/mariadb + image: mariadb:inception + container_name: mariadb + env_file: .env + secrets: + - db_root_password + - db_password + volumes: + - mariadb_data:/var/lib/mysql + networks: + - inception + restart: always + + wordpress: + build: ./requirements/wordpress + image: wordpress:inception + container_name: wordpress + env_file: .env + secrets: + - db_password + - wp_admin_password + - wp_user_password + volumes: + - wordpress_data:/var/www/html + networks: + - inception + depends_on: + - mariadb + restart: always + + nginx: + build: ./requirements/nginx + image: nginx:inception + container_name: nginx + env_file: .env + volumes: + - wordpress_data:/var/www/html + networks: + - inception + ports: + - "443:443" + depends_on: + - wordpress + restart: always + +networks: + inception: + driver: bridge + +volumes: + mariadb_data: + driver: local + driver_opts: + type: none + o: bind + device: ${DATA_PATH}/mariadb + wordpress_data: + driver: local + driver_opts: + type: none + o: bind + device: ${DATA_PATH}/wordpress + +secrets: + db_root_password: + file: ../secrets/db_root_password.txt + db_password: + file: ../secrets/db_password.txt + wp_admin_password: + file: ../secrets/wp_admin_password.txt + wp_user_password: + file: ../secrets/wp_user_password.txt diff --git a/srcs/requirements/mariadb/Dockerfile b/srcs/requirements/mariadb/Dockerfile new file mode 100644 index 0000000..d408483 --- /dev/null +++ b/srcs/requirements/mariadb/Dockerfile @@ -0,0 +1,18 @@ +FROM debian:bookworm-slim + +RUN apt-get update && apt-get install -y --no-install-recommends \ + mariadb-server \ + mariadb-client \ + && rm -rf /var/lib/apt/lists/* + +COPY conf/my.cnf /etc/mysql/mariadb.conf.d/50-server.cnf +COPY tools/entrypoint.sh /usr/local/bin/entrypoint.sh + +RUN chmod +x /usr/local/bin/entrypoint.sh \ + && rm -rf /var/lib/mysql/* \ + && mkdir -p /var/lib/mysql /run/mysqld \ + && chown -R mysql:mysql /var/lib/mysql /run/mysqld + +EXPOSE 3306 + +ENTRYPOINT ["entrypoint.sh"] diff --git a/srcs/requirements/mariadb/conf/my.cnf b/srcs/requirements/mariadb/conf/my.cnf new file mode 100644 index 0000000..5003e99 --- /dev/null +++ b/srcs/requirements/mariadb/conf/my.cnf @@ -0,0 +1,11 @@ +[mysqld] +user = mysql +bind-address = 0.0.0.0 +port = 3306 +datadir = /var/lib/mysql +socket = /run/mysqld/mysqld.sock +pid-file = /run/mysqld/mysqld.pid +skip-name-resolve + +[client] +socket = /run/mysqld/mysqld.sock diff --git a/srcs/requirements/mariadb/tools/entrypoint.sh b/srcs/requirements/mariadb/tools/entrypoint.sh new file mode 100755 index 0000000..58dbebc --- /dev/null +++ b/srcs/requirements/mariadb/tools/entrypoint.sh @@ -0,0 +1,36 @@ +#!/bin/bash +set -e + +unset MYSQL_HOST + +mkdir -p /run/mysqld +chown -R mysql:mysql /run/mysqld /var/lib/mysql + +DB_ROOT_PASSWORD=$(cat /run/secrets/db_root_password) +DB_PASSWORD=$(cat /run/secrets/db_password) + +if [ ! -f "/var/lib/mysql/.inception_initialized" ]; then + mariadb-install-db --user=mysql --datadir=/var/lib/mysql > /dev/null + + mariadbd --user=mysql --skip-networking --socket=/run/mysqld/mysqld.sock & + pid="$!" + + until mariadb-admin --socket=/run/mysqld/mysqld.sock --silent ping 2>/dev/null; do + sleep 1 + done + + mariadb --socket=/run/mysqld/mysqld.sock -u root <<-EOSQL + CREATE DATABASE IF NOT EXISTS \`${MYSQL_DATABASE}\`; + CREATE USER IF NOT EXISTS '${MYSQL_USER}'@'%' IDENTIFIED BY '${DB_PASSWORD}'; + GRANT ALL PRIVILEGES ON \`${MYSQL_DATABASE}\`.* TO '${MYSQL_USER}'@'%'; + ALTER USER 'root'@'localhost' IDENTIFIED BY '${DB_ROOT_PASSWORD}'; + FLUSH PRIVILEGES; +EOSQL + + mariadb-admin --socket=/run/mysqld/mysqld.sock -u root -p"${DB_ROOT_PASSWORD}" shutdown + wait "$pid" + + touch /var/lib/mysql/.inception_initialized +fi + +exec mariadbd --user=mysql diff --git a/srcs/requirements/nginx/Dockerfile b/srcs/requirements/nginx/Dockerfile new file mode 100644 index 0000000..3f7e5e4 --- /dev/null +++ b/srcs/requirements/nginx/Dockerfile @@ -0,0 +1,18 @@ +FROM debian:bookworm-slim + +RUN apt-get update && apt-get install -y --no-install-recommends \ + nginx \ + openssl \ + && rm -rf /var/lib/apt/lists/* + +COPY conf/nginx.conf /etc/nginx/sites-available/wordpress.conf +COPY tools/entrypoint.sh /usr/local/bin/entrypoint.sh + +RUN rm -f /etc/nginx/sites-enabled/default \ + && ln -s /etc/nginx/sites-available/wordpress.conf /etc/nginx/sites-enabled/wordpress.conf \ + && mkdir -p /etc/nginx/ssl \ + && chmod +x /usr/local/bin/entrypoint.sh + +EXPOSE 443 + +ENTRYPOINT ["entrypoint.sh"] diff --git a/srcs/requirements/nginx/conf/nginx.conf b/srcs/requirements/nginx/conf/nginx.conf new file mode 100644 index 0000000..94494fc --- /dev/null +++ b/srcs/requirements/nginx/conf/nginx.conf @@ -0,0 +1,24 @@ +server { + listen 443 ssl; + listen [::]:443 ssl; + + server_name oriabenk.42.fr; + + ssl_certificate /etc/nginx/ssl/inception.crt; + ssl_certificate_key /etc/nginx/ssl/inception.key; + ssl_protocols TLSv1.2 TLSv1.3; + + root /var/www/html; + index index.php index.html; + + location / { + try_files $uri $uri/ /index.php?$args; + } + + location ~ \.php$ { + fastcgi_pass wordpress:9000; + fastcgi_index index.php; + fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; + include fastcgi_params; + } +} diff --git a/srcs/requirements/nginx/tools/entrypoint.sh b/srcs/requirements/nginx/tools/entrypoint.sh new file mode 100755 index 0000000..5e64938 --- /dev/null +++ b/srcs/requirements/nginx/tools/entrypoint.sh @@ -0,0 +1,12 @@ +#!/bin/bash +set -e + +if [ ! -f /etc/nginx/ssl/inception.crt ]; then + openssl req -x509 -nodes -days 365 \ + -newkey rsa:2048 \ + -keyout /etc/nginx/ssl/inception.key \ + -out /etc/nginx/ssl/inception.crt \ + -subj "/C=UA/ST=Kyiv/L=Kyiv/O=42/OU=42/CN=${DOMAIN_NAME}" +fi + +exec nginx -g "daemon off;" diff --git a/srcs/requirements/wordpress/Dockerfile b/srcs/requirements/wordpress/Dockerfile new file mode 100644 index 0000000..0de0a26 --- /dev/null +++ b/srcs/requirements/wordpress/Dockerfile @@ -0,0 +1,32 @@ +FROM debian:bookworm-slim + +RUN apt-get update && apt-get install -y --no-install-recommends \ + ca-certificates \ + php-fpm \ + php-mysql \ + php-curl \ + php-gd \ + php-xml \ + php-mbstring \ + php-zip \ + php-intl \ + curl \ + default-mysql-client \ + && rm -rf /var/lib/apt/lists/* + +RUN curl -sS -o /usr/local/bin/wp \ + https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar \ + && chmod +x /usr/local/bin/wp + +COPY conf/www.conf /etc/php/8.2/fpm/pool.d/www.conf +COPY tools/entrypoint.sh /usr/local/bin/entrypoint.sh + +RUN mkdir -p /var/www/html \ + && chown -R www-data:www-data /var/www/html \ + && chmod +x /usr/local/bin/entrypoint.sh + +WORKDIR /var/www/html + +EXPOSE 9000 + +ENTRYPOINT ["entrypoint.sh"] diff --git a/srcs/requirements/wordpress/conf/www.conf b/srcs/requirements/wordpress/conf/www.conf new file mode 100644 index 0000000..e158923 --- /dev/null +++ b/srcs/requirements/wordpress/conf/www.conf @@ -0,0 +1,15 @@ +[www] +user = www-data +group = www-data + +listen = 9000 +listen.owner = www-data +listen.group = www-data + +pm = dynamic +pm.max_children = 5 +pm.start_servers = 2 +pm.min_spare_servers = 1 +pm.max_spare_servers = 3 + +clear_env = no diff --git a/srcs/requirements/wordpress/tools/entrypoint.sh b/srcs/requirements/wordpress/tools/entrypoint.sh new file mode 100755 index 0000000..22af54e --- /dev/null +++ b/srcs/requirements/wordpress/tools/entrypoint.sh @@ -0,0 +1,45 @@ +#!/bin/bash +set -e + +DB_PASSWORD=$(cat /run/secrets/db_password) +WP_ADMIN_PASSWORD=$(cat /run/secrets/wp_admin_password) +WP_USER_PASSWORD=$(cat /run/secrets/wp_user_password) + +cd /var/www/html + +until (echo > "/dev/tcp/${MYSQL_HOST}/3306") 2>/dev/null; do + sleep 1 +done + +if [ ! -f wp-config.php ]; then + wp core download --allow-root + + wp config create \ + --dbname="${MYSQL_DATABASE}" \ + --dbuser="${MYSQL_USER}" \ + --dbpass="${DB_PASSWORD}" \ + --dbhost="${MYSQL_HOST}" \ + --allow-root + + until mysqladmin ping -h"${MYSQL_HOST}" -u"${MYSQL_USER}" -p"${DB_PASSWORD}" --silent 2>/dev/null; do + sleep 1 + done + + wp core install \ + --url="https://${DOMAIN_NAME}" \ + --title="${WP_TITLE}" \ + --admin_user="${WP_ADMIN_USER}" \ + --admin_password="${WP_ADMIN_PASSWORD}" \ + --admin_email="${WP_ADMIN_EMAIL}" \ + --skip-email \ + --allow-root + + wp user create "${WP_USER}" "${WP_USER_EMAIL}" \ + --role=author \ + --user_pass="${WP_USER_PASSWORD}" \ + --allow-root +fi + +chown -R www-data:www-data /var/www/html + +exec php-fpm8.2 -F