diff --git a/.dockerignore b/.dockerignore index 2a06cd3e..40ea88df 100644 --- a/.dockerignore +++ b/.dockerignore @@ -1,5 +1,5 @@ README.md .env -Dockerfile -docker-compose.yml +docker-compose.dev.yml +docker-compose.core.yml .gitignore \ No newline at end of file diff --git a/Makefile b/Makefile index 66a47df3..7a1affdb 100644 --- a/Makefile +++ b/Makefile @@ -1,9 +1,12 @@ -DC := docker compose +DC := docker compose -f ./docker-compose.core.yml -all: set_app_host up +all: set_app_host dev -up: - $(DC) up --build +dev: + $(DC) -f ./docker-compose.dev.yml up --build + +prod: set_app_host + $(DC) -f ./docker-compose.prod.yml up --build down: $(DC) down @@ -14,9 +17,10 @@ fclean: down docker system prune -af --volumes rm -rf websocket/node_modules rm -rf frontend/node_modules + rm -rf frontend/dist rm -rf api/storage/photos/* -re: fclean up +re: fclean dev set_app_host: @if [ "$(wildcard .env)" = "" ]; then \ diff --git a/api/Dockerfile.prod b/api/Dockerfile.prod new file mode 100644 index 00000000..dd0a880b --- /dev/null +++ b/api/Dockerfile.prod @@ -0,0 +1,16 @@ +FROM composer:2.0 + +WORKDIR /app + +RUN apk add --no-cache \ + php8-pdo \ + php8-pdo_mysql \ + php8-mysqli \ + mysql-client \ + libpng-dev \ + php8-fpm + +RUN docker-php-ext-install pdo pdo_mysql gd + +COPY --chmod=777 ./entrypoint_docker.prod.sh . +ENTRYPOINT ["sh", "entrypoint_docker.prod.sh"] \ No newline at end of file diff --git a/api/composer.lock b/api/composer.lock index 32b53e7a..a112b83c 100644 --- a/api/composer.lock +++ b/api/composer.lock @@ -1043,16 +1043,16 @@ }, { "name": "friendsofphp/php-cs-fixer", - "version": "v3.69.0", + "version": "v3.68.5", "source": { "type": "git", "url": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer.git", - "reference": "630a59448c00729bc235d5e95cfedefeaca37523" + "reference": "7bedb718b633355272428c60736dc97fb96daf27" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/630a59448c00729bc235d5e95cfedefeaca37523", - "reference": "630a59448c00729bc235d5e95cfedefeaca37523", + "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/7bedb718b633355272428c60736dc97fb96daf27", + "reference": "7bedb718b633355272428c60736dc97fb96daf27", "shasum": "" }, "require": { @@ -1069,7 +1069,7 @@ "react/promise": "^2.0 || ^3.0", "react/socket": "^1.0", "react/stream": "^1.0", - "sebastian/diff": "^4.0 || ^5.1 || ^6.0 || ^7.0", + "sebastian/diff": "^4.0 || ^5.1 || ^6.0", "symfony/console": "^5.4 || ^6.4 || ^7.0", "symfony/event-dispatcher": "^5.4 || ^6.4 || ^7.0", "symfony/filesystem": "^5.4 || ^6.4 || ^7.0", @@ -1082,18 +1082,18 @@ "symfony/stopwatch": "^5.4 || ^6.4 || ^7.0" }, "require-dev": { - "facile-it/paraunit": "^1.3.1 || ^2.5", - "infection/infection": "^0.29.10", + "facile-it/paraunit": "^1.3.1 || ^2.4", + "infection/infection": "^0.29.8", "justinrainbow/json-schema": "^5.3 || ^6.0", "keradus/cli-executor": "^2.1", "mikey179/vfsstream": "^1.6.12", "php-coveralls/php-coveralls": "^2.7", "php-cs-fixer/accessible-object": "^1.1", - "php-cs-fixer/phpunit-constraint-isidenticalstring": "^1.6", - "php-cs-fixer/phpunit-constraint-xmlmatchesxsd": "^1.6", - "phpunit/phpunit": "^9.6.22 || ^10.5.45 || ^11.5.7", - "symfony/var-dumper": "^5.4.48 || ^6.4.18 || ^7.2.0", - "symfony/yaml": "^5.4.45 || ^6.4.18 || ^7.2.0" + "php-cs-fixer/phpunit-constraint-isidenticalstring": "^1.5", + "php-cs-fixer/phpunit-constraint-xmlmatchesxsd": "^1.5", + "phpunit/phpunit": "^9.6.22 || ^10.5.40 || ^11.5.2", + "symfony/var-dumper": "^5.4.48 || ^6.4.15 || ^7.2.0", + "symfony/yaml": "^5.4.45 || ^6.4.13 || ^7.2.0" }, "suggest": { "ext-dom": "For handling output formats in XML", @@ -1134,7 +1134,7 @@ ], "support": { "issues": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/issues", - "source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.69.0" + "source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.68.5" }, "funding": [ { @@ -1142,7 +1142,7 @@ "type": "github" } ], - "time": "2025-02-14T16:19:23+00:00" + "time": "2025-01-30T17:00:50+00:00" }, { "name": "myclabs/deep-copy", diff --git a/api/entrypoint_docker.prod.sh b/api/entrypoint_docker.prod.sh new file mode 100644 index 00000000..488085a8 --- /dev/null +++ b/api/entrypoint_docker.prod.sh @@ -0,0 +1,19 @@ +composer require + +upload_max_filesize=240M +post_max_size=50M +max_execution_time=100 +max_input_time=223 + +for key in upload_max_filesize post_max_size max_execution_time max_input_time +do + sed -i "s/^\($key\).*/\1 $(eval echo = \${$key})/" /usr/local/etc/php/php.ini-development +done + +cp /usr/local/etc/php/php.ini-development /usr/local/etc/php/php.ini + +sed -i 's|^listen =.*|listen = 0.0.0.0:9000|' /etc/php8/php-fpm.d/www.conf + +composer migrate + +php-fpm8 -F diff --git a/docker-compose.yml b/docker-compose.core.yml similarity index 69% rename from docker-compose.yml rename to docker-compose.core.yml index 2f2c52a1..a77fe227 100644 --- a/docker-compose.yml +++ b/docker-compose.core.yml @@ -30,27 +30,10 @@ services: networks: - matchaNetwork - api: - build: - context: ./api/ - dockerfile: Dockerfile - container_name: api - restart: always - volumes: - - api:/app - ports: - - 3000:3000 - networks: - - matchaNetwork - depends_on: - mysql: - condition: service_healthy - env_file: - - ./.env - websocket: build: context: ./websocket/ +# image: node:22.11 container_name: websocket restart: always volumes: @@ -64,22 +47,6 @@ services: depends_on: - mysql - frontend: - build: - context: ./frontend/ - container_name: frontend - restart: always - volumes: - - frontend:/app - expose: - - '1212' - ports: - - 1212:1212 - networks: - - matchaNetwork - depends_on: - - mysql - volumes: frontend: driver: local diff --git a/docker-compose.dev.yml b/docker-compose.dev.yml new file mode 100644 index 00000000..48dfdfa1 --- /dev/null +++ b/docker-compose.dev.yml @@ -0,0 +1,33 @@ +services: + frontend: + image: node:22.11 + container_name: frontend + restart: always + volumes: + - frontend:/app + expose: + - '1212' + ports: + - 1212:1212 + networks: + - matchaNetwork + working_dir: /app + command: sh -c "npm install && npm run dev" + + api: + build: + context: ./api/ + dockerfile: Dockerfile + container_name: api + restart: always + volumes: + - api:/app + ports: + - 3000:3000 + networks: + - matchaNetwork + depends_on: + mysql: + condition: service_healthy + env_file: + - ./.env \ No newline at end of file diff --git a/docker-compose.prod.yml b/docker-compose.prod.yml new file mode 100644 index 00000000..52482f89 --- /dev/null +++ b/docker-compose.prod.yml @@ -0,0 +1,52 @@ +services: + nginx: + build: + context: . + dockerfile: ./nginx/Dockerfile + container_name: nginx + restart: always + ports: + - "1212:1212" + networks: + - matchaNetwork + + + + nginx_api: + image: nginx:alpine + container_name: nginx_api + restart: always + volumes: + - api:/app + - ./nginx/api.conf:/etc/nginx/conf.d/api.conf + ports: + - "3000:3000" + networks: + - matchaNetwork + depends_on: + - api + command: /bin/sh -c " + cp -R /app/* /usr/share/nginx/html/ && + chown -R nginx:nginx /usr/share/nginx/html/ && + chmod -R 755 /usr/share/nginx/html/ && + nginx -g 'daemon off;'" + + api: + build: + context: ./api/ + dockerfile: Dockerfile.prod + container_name: api + restart: always + volumes: + - api:/app +# ports: +# - 3000:3000 + expose: + - 9000 + networks: + - matchaNetwork + depends_on: + mysql: + condition: service_healthy + env_file: + - ./.env \ No newline at end of file diff --git a/frontend/Dockerfile b/frontend/Dockerfile deleted file mode 100644 index 8bfce110..00000000 --- a/frontend/Dockerfile +++ /dev/null @@ -1,5 +0,0 @@ -FROM node:22.11 - -WORKDIR /app -COPY --chmod=777 ./entrypoint_docker.sh . -ENTRYPOINT ["sh", "entrypoint_docker.sh"] \ No newline at end of file diff --git a/frontend/entrypoint_docker.sh b/frontend/entrypoint_docker.sh deleted file mode 100644 index 686d242b..00000000 --- a/frontend/entrypoint_docker.sh +++ /dev/null @@ -1,3 +0,0 @@ -npm install -chmod -R 777 node_modules -npm run dev \ No newline at end of file diff --git a/nginx/Dockerfile b/nginx/Dockerfile new file mode 100644 index 00000000..6d69860f --- /dev/null +++ b/nginx/Dockerfile @@ -0,0 +1,15 @@ +FROM node:22.11 AS builder + +WORKDIR /app + +COPY ./frontend/ ./ + +RUN npm install && npm run build + +FROM nginx:alpine + +COPY --from=builder /app/dist /usr/share/nginx/html + +COPY ./nginx/conf.d /etc/nginx/conf.d + +CMD ["nginx", "-g", "daemon off;"] \ No newline at end of file diff --git a/nginx/api.conf b/nginx/api.conf new file mode 100644 index 00000000..36d51fbe --- /dev/null +++ b/nginx/api.conf @@ -0,0 +1,18 @@ +server { + listen 3000; + server_name api; + root /app/public; + index index.php; + + location / { + try_files $uri $uri/ /index.php?$query_string; + } + location ~ \.php$ { + fastcgi_split_path_info ^(.+\.php)(/.+)$; + fastcgi_pass api:9000; + fastcgi_index index.php; + include fastcgi_params; + fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; + fastcgi_param PATH_INFO $fastcgi_path_info; + } +} \ No newline at end of file diff --git a/nginx/conf.d/frontend.conf b/nginx/conf.d/frontend.conf new file mode 100644 index 00000000..16957b3f --- /dev/null +++ b/nginx/conf.d/frontend.conf @@ -0,0 +1,10 @@ +server { + listen 1212; + server_name matcha; + root /usr/share/nginx/html; + index index.html; + + location / { + try_files $uri $uri/ /index.html; + } +}