diff --git a/.env.example b/.env.example
index b081f78..3f152f2 100644
--- a/.env.example
+++ b/.env.example
@@ -1,10 +1,11 @@
-# Apache
-PUBLIC_PORT=80 # 配信ポート
+# Apache
+PUBLIC_PORT=80 # 配信ポート
+
+# MariaDB
+MARIADB_ROOT_PASSWORD=rootpass # ルートパスワード
+MARIADB_DATABASE=uwuzu # データベース
+MARIADB_USER=uwuzu # ユーザー名
+MARIADB_PASSWORD=password # パスワード
+MARIADB_TIME_ZONE=Azia/Tokyo # タイムゾーン
+PUBLIC_MARIADB_PORT=3306 # 配信ポート # 外部にMariaDBを後悔しない場合は不要
-# MariaDB
-MARIADB_ROOT_PASSWORD=rootpass # ルートパスワード
-MARIADB_DATABASE=uwuzu # データベース
-MARIADB_USER=uwuzu # ユーザー名
-MARIADB_PASSWORD=password # パスワード
-MARIADB_TIME_ZONE=Azia/Tokyo # タイムゾーン
-PUBLIC_MARIADB_PORT=3306 # 配信ポート # 外部にMariaDBを後悔しない場合は不要
diff --git a/.gitignore b/.gitignore
index f0043c4..8882573 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,2 +1,3 @@
-.env
-src/
+.env
+src/
+
diff --git a/README.md b/README.md
index 3419e78..2d4b3ab 100644
--- a/README.md
+++ b/README.md
@@ -1,19 +1,16 @@
-# uwuzuをDocker Composeで動かすやつ
-## What is this
-uwuzu v1.6.5がDocker Composeで動きます。
-
-## 使い方
-### .env
-.env.exampleの空気を読んでください
-
-### srcフォルダ
-srcフォルダにuwuzuのZIPを展開してください。
-v1.6.5は検証済みです。
-
-### phpフォルダ・dbフォルダ
-MariaDB・PHP・Apacheの設定が色々あります。
-一旦v1.6.5用の設定があります。
-これを読んでいる以上技術者ではあるはずなのでv1.6.5以上でこのリポジトリが更新されていないのに構造に破壊的変更があったら空気を読んでいじってください。
-
-# 結論
-空気読めば動く
+# uwuzu for Docker Compose
+uwuzuがDocker Composeで動きます。
+※一部バージョンでは動かない可能性があります。動作保証は致しません。また、セキュリティ上の問題が発生する可能性があるため本番環境では推奨しません。
+
+# 使い方
+## /.env
+.env.exampleのコメントに従って入力してください。
+
+## /src
+srcフォルダにuwuzuのリポジトリで配布されているZIPファイルを展開してください。
+
+## /db・/php
+設定ファイルやDockerfileなどがあります。
+動作しない場合は適宜修正してください。
+> [!NOTE]
+> 余裕があればIssue・プルリクエストのご協力をお願いします。
diff --git a/db/init.sql b/db/init.sql
index 2dbecf8..e790b0b 100644
--- a/db/init.sql
+++ b/db/init.sql
@@ -1 +1,2 @@
-CREATE DATABASE uwuzu;
+CREATE DATABASE uwuzu;
+
diff --git a/db/my.cnf b/db/my.cnf
index 2f81d61..4c28810 100644
--- a/db/my.cnf
+++ b/db/my.cnf
@@ -1,2 +1,4 @@
-[mysqld]
-sql_mode = NO_ENGINE_SUBSTITUTION
+[mysqld]
+sql_mode=NO_ENGINE_SUBSTITUTION
+character-set-server = utf8mb4
+collation-server = utf8mb4_general_ci
diff --git a/docker-compose.yml b/docker-compose.yml
index 85ecf89..c2b8ee3 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -1,42 +1,44 @@
-services:
- web:
- build:
- context: ./php
- container_name: php-apache-dev
- ports:
- - "${PUBLIC_PORT}:80"
- volumes:
- - ./src:/var/www/html
- - ./php/php.ini:/usr/local/etc/php/conf.d/99-custom.ini
- environment:
- - APACHE_DOCUMENT_ROOT=/var/www/html
- depends_on:
- - db
- networks:
- - devnet
-
- db:
- image: mariadb:11.3
- container_name: mariadb-dev
- restart: unless-stopped
- environment:
- MYSQL_ROOT_PASSWORD: ${MARIADB_ROOT_PASSWORD}
- MYSQL_DATABASE: ${MARIADB_DATABASE}
- MYSQL_USER: ${MARIADB_USER}
- MYSQL_PASSWORD: ${MARIADB_PASSWORD}
- TZ: ${MARIADB_TIME_ZONE}
- volumes:
- - db_data:/var/lib/mysql
- - ./db/init.sql:/docker-entrypoint-initdb.d/init.sql
- - ./db/my.cnf:/etc/mysql/conf.d/my.cnf
- ports:
- - "${PUBLIC_MARIADB_PORT}:3306"
- networks:
- - devnet
-
-networks:
- devnet:
- driver: bridge
-
-volumes:
- db_data:
+services:
+ web:
+ build:
+ context: .
+ dockerfile: ./php/Dockerfile
+ container_name: web
+ ports:
+ - "${PUBLIC_PORT}:80"
+ volumes:
+ - app_data:/var/www/html
+ - ./php/php.ini:/usr/local/etc/php/conf.d/99-custom.ini
+ environment:
+ - APACHE_DOCUMENT_ROOT=/var/www/html
+ depends_on:
+ - db
+ networks:
+ - devnet
+
+ db:
+ image: mariadb:11.3
+ container_name: mariadb
+ restart: unless-stopped
+ environment:
+ MYSQL_ROOT_PASSWORD: ${MARIADB_ROOT_PASSWORD}
+ MYSQL_DATABASE: ${MARIADB_DATABASE}
+ MYSQL_USER: ${MARIADB_USER}
+ MYSQL_PASSWORD: ${MARIADB_PASSWORD}
+ TZ: ${MARIADB_TIME_ZONE}
+ volumes:
+ - db_data:/var/lib/mysql
+ - ./db/init.sql:/docker-entrypoint-initdb.d/init.sql
+ - ./db/my.cnf:/etc/mysql/mariadb.conf.d/99-custom.cnf
+ ports:
+ - "${PUBLIC_MARIADB_PORT}:3306"
+ networks:
+ - devnet
+
+networks:
+ devnet:
+ driver: bridge
+
+volumes:
+ db_data:
+ app_data:
diff --git a/php/Dockerfile b/php/Dockerfile
index eaeed3e..a5ef4a1 100644
--- a/php/Dockerfile
+++ b/php/Dockerfile
@@ -1,16 +1,58 @@
-FROM php:8.2-apache
+# Load php-apache
+FROM php:8.2-apache
+
+# Set working directory
+WORKDIR /var/www/html
+
+# Install packages(apt)
+RUN apt-get update
+RUN apt-get install -y libpng-dev
+RUN apt-get install -y libjpeg62-turbo-dev
+RUN apt-get install -y libfreetype6-dev
+RUN apt-get install -y libonig-dev
+RUN apt-get install -y libzip-dev
+RUN apt-get install -y libcurl4-openssl-dev
+RUN apt-get install -y zip
+RUN apt-get install -y unzip
+RUN apt-get install -y curl
+RUN apt-get clean
+RUN rm -rf /var/lib/apt/lists/*
+
+# Copy uwuzu
+COPY src /usr/src/app
+
+# Install packages(php)
+RUN docker-php-ext-configure gd --with-freetype --with-jpeg
+RUN docker-php-ext-install gd
+RUN docker-php-ext-install pdo_mysql
+RUN docker-php-ext-install mysqli
+RUN docker-php-ext-install mbstring
+RUN docker-php-ext-install zip
+RUN docker-php-ext-install fileinfo
+RUN docker-php-ext-install curl
+
+# Enable Apache modules
+RUN a2enmod rewrite
+RUN a2enmod headers
+
+# Copy custom configuration
+COPY php/php.ini /usr/local/etc/php/conf.d/99-custom.ini
+COPY php/apache2.conf /etc/apache2/conf-enabled/99-custom.conf
+
+# Set permissions
+USER root
+RUN chown -R www-data:www-data /usr/src/app
+RUN find /usr/src/app -type d -exec chmod 775 {} \;
+RUN find /usr/src/app -type f -exec chmod 664 {} \;
+RUN chmod 777 /usr/src/app
+
+# Copy entrypoint
+COPY php/entrypoint.sh /usr/src/entrypoint.sh
+RUN chmod +x /usr/src/entrypoint.sh
+
+# Run as www-data
+USER www-data
+
+# Exec entrypoint
+ENTRYPOINT ["/usr/src/entrypoint.sh"]
-RUN apt-get update
-RUN apt-get install -y \
- libpng-dev \
- libjpeg62-turbo-dev \
- libfreetype6-dev \
- libonig-dev \
- libzip-dev \
- zip \
- unzip
-RUN docker-php-ext-configure gd --with-freetype --with-jpeg
-RUN docker-php-ext-install gd pdo_mysql mysqli mbstring zip fileinfo
-
-RUN a2enmod rewrite headers
-COPY apache2.conf /etc/apache2/conf-enabled/99-custom.conf
diff --git a/php/apache2.conf b/php/apache2.conf
index 3eba03f..416f513 100644
--- a/php/apache2.conf
+++ b/php/apache2.conf
@@ -1,9 +1,10 @@
-
- Options Indexes FollowSymLinks
- AllowOverride All
- Require all granted
-
+
+ Options Indexes FollowSymLinks
+ AllowOverride All
+ Require all granted
+
+
+ServerName localhost
+ServerAdmin webmaster@localhost
+DocumentRoot /var/www/html
-ServerName localhost
-ServerAdmin webmaster@localhost
-DocumentRoot /var/www/html
diff --git a/php/entrypoint.sh b/php/entrypoint.sh
new file mode 100644
index 0000000..8c1280a
--- /dev/null
+++ b/php/entrypoint.sh
@@ -0,0 +1,18 @@
+#!/bin/bash
+set -e
+
+APP_DIR="/var/www/html"
+SRC_DIR="/usr/src/app"
+INIT_FLAG="$APP_DIR/.initialized"
+
+if [ ! -f "$INIT_FLAG" ]; then
+ echo "[Init] Copying initial files to $APP_DIR..."
+ cp -rT "$SRC_DIR" "$APP_DIR"
+ chown -R www-data:www-data "$APP_DIR"
+ touch "$INIT_FLAG"
+else
+ echo "[Init] Already initialized."
+fi
+
+exec apache2-foreground
+
diff --git a/php/php.ini b/php/php.ini
index c82f2fe..c381fe7 100644
--- a/php/php.ini
+++ b/php/php.ini
@@ -1,7 +1,8 @@
-display_errors = Off
-extension=fileinfo
-extension=gd
-extension=pdo_mysql
-extension=mysqli
-extension=mbstring
-extension=zip
+display_errors = Off
+display_startup_errors = Off
+log_errors = On
+error_log = /proc/self/fd/2
+error_reporting = E_ALL & ~E_WARNING & ~E_NOTICE
+error_prepend_string =
+error_append_string =
+default_charset = "UTF-8"