From 80501b7f0acc2b26c4884d742eed3009a3ee295b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C5=91cze=20Bence?= Date: Sat, 16 Sep 2023 15:05:34 +0200 Subject: [PATCH 01/15] add nodejs installer script --- docker/scripts/install-nodejs.sh | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100755 docker/scripts/install-nodejs.sh diff --git a/docker/scripts/install-nodejs.sh b/docker/scripts/install-nodejs.sh new file mode 100755 index 0000000..f206a4f --- /dev/null +++ b/docker/scripts/install-nodejs.sh @@ -0,0 +1,14 @@ +#!/bin/sh + +set -e + +apt update +apt install -y ca-certificates curl gnupg +mkdir -p /etc/apt/keyrings +curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg + +NODE_MAJOR=18 +echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_$NODE_MAJOR.x nodistro main" | tee /etc/apt/sources.list.d/nodesource.list + +apt update +apt install -y nodejs From cede0e7985782cb9e1117ec57516e4d75e74a44e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C5=91cze=20Bence?= Date: Sat, 16 Sep 2023 15:05:48 +0200 Subject: [PATCH 02/15] add release generator script --- docker/scripts/release.sh | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100755 docker/scripts/release.sh diff --git a/docker/scripts/release.sh b/docker/scripts/release.sh new file mode 100755 index 0000000..27aad4b --- /dev/null +++ b/docker/scripts/release.sh @@ -0,0 +1,30 @@ +#!/bin/bash + +set -e + +chmod 777 cache + +echo "Installing Composer packages..." +composer create-project --no-dev + +echo "Installing NPM packages..." +(cd multi && npm install) + +echo "Installing Yarn packages..." +(cd public/static && yarn install) + +echo "Updating version info..." +VERSION=$(git describe --tags --always --match "Release_*" HEAD) +REVISION=$(git rev-parse --short HEAD) +REVISION_DATE=$(git show -s --format=%aI HEAD) +sed -i -E "s/const VERSION = '(.*)';/const VERSION = '${VERSION}';/" main.php +sed -i -E "s/const REVISION = '(.*)';/const REVISION = '${REVISION}';/" main.php +sed -i -E "s/const REVISION_DATE = '(.*)';/const REVISION_DATE = '${REVISION_DATE}';/" main.php + +echo "Minifying JS, CSS and SVG files..." +find public/static/js -type f -iname '*.js' -exec uglifyjs {} -c -m -o {} \; +find public/static/css -type f -iname '*.css' -exec cleancss {} -o {} \; +find public/static/img -type f -iname '*.svg' -exec svgo {} -o {} \; + +echo "Linking view files..." +./mapg view:link From 0048fb9b1d3c914fd4b7863bb537cf6a73bf153a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C5=91cze=20Bence?= Date: Sat, 16 Sep 2023 21:26:01 +0200 Subject: [PATCH 03/15] add cron for db:maintain --- docker/scripts/cron | 1 + 1 file changed, 1 insertion(+) create mode 100644 docker/scripts/cron diff --git a/docker/scripts/cron b/docker/scripts/cron new file mode 100644 index 0000000..fbae242 --- /dev/null +++ b/docker/scripts/cron @@ -0,0 +1 @@ +0 * * * * /var/www/mapguesser/mapg db:maintain From a11a879a4f59ec5bf81f880c9ff5968379983bf5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C5=91cze=20Bence?= Date: Sat, 16 Sep 2023 21:26:20 +0200 Subject: [PATCH 04/15] remove deprecated scripts --- scripts/deploy-to-multiple-worktrees.py | 162 ------------------------ scripts/install.sh | 35 ----- scripts/minify.sh | 11 -- scripts/update-version.sh | 17 --- scripts/update.sh | 29 ----- 5 files changed, 254 deletions(-) delete mode 100755 scripts/deploy-to-multiple-worktrees.py delete mode 100755 scripts/install.sh delete mode 100755 scripts/minify.sh delete mode 100755 scripts/update-version.sh delete mode 100755 scripts/update.sh diff --git a/scripts/deploy-to-multiple-worktrees.py b/scripts/deploy-to-multiple-worktrees.py deleted file mode 100755 index 2ef97f6..0000000 --- a/scripts/deploy-to-multiple-worktrees.py +++ /dev/null @@ -1,162 +0,0 @@ -#!/usr/bin/python3 - -# Usage: ./deploy-to-multiple-worktrees.py REPO_PATH WORKTREE_DEVELOPMENT_PATH WORKTREE_PRODUCTION_PATH - -import sys -import os -import subprocess -import re - -WORKTREE_REGEX = r"^worktree (.*)\nHEAD ([a-f0-9]*)\n(?:branch refs\/heads\/(.*)|detached)$" - -if len(sys.argv) < 4: - print("Usage: ./deploy-to-multiple-worktrees.py REPO_PATH WORKTREE_DEVELOPMENT_PATH WORKTREE_PRODUCTION_PATH") - exit(1) - -REPO = os.path.abspath(sys.argv[1]) -WORKTREE_DEVELOPMENT = os.path.abspath(sys.argv[2]) -WORKTREE_PRODUCTION = os.path.abspath(sys.argv[3]) - -class Worktree: - def __init__(self, path, branch, revision, version): - self.path = path - self.branch = branch - self.revision = revision - self.version = version - self.newRevision = None - self.newVersion = None - -def getDataForWorktrees(): - ret = subprocess.check_output(["git", "worktree", "list", "--porcelain"], cwd=REPO).decode().strip() - blocks = ret.split("\n\n") - - worktrees = [] - - for block in blocks: - matches = re.search(WORKTREE_REGEX, block) - - if matches: - path = matches.group(1) - revision = matches.group(2) - branch = matches.group(3) - version = getVersion(revision) - - worktrees.append(Worktree(path, branch, revision, version)) - - return worktrees - -def findWorktree(path): - for worktree in worktrees: - if worktree.path == path: - return worktree - - return None - -def getVersion(branch): - return subprocess.check_output(["git", "describe", "--tags", "--always", "--match", "Release_*", branch], cwd=REPO).decode().strip() - -def getRevisionForRef(ref): - return subprocess.check_output(["git", "rev-list", "-1", ref], cwd=REPO).decode().strip() - -def getLatestReleaseTag(): - process = subprocess.Popen(["git", "for-each-ref", "refs/tags/Release*", "--sort=-creatordate", "--format=%(refname:short)"], stdout=subprocess.PIPE, cwd=REPO) - - for line in process.stdout: - tag = line.decode().rstrip() - - if isTagVerified(tag): - return tag - - print(f"[WARNING] Tag '{tag}' is not verified, skipping.") - - raise Exception("No verified 'Release*' tag found!") - -def isTagVerified(tag): - process = subprocess.run(["git", "tag", "--verify", tag], stdout=subprocess.PIPE, stderr=subprocess.STDOUT, cwd=REPO) - - return process.returncode == 0 - -def updateRepoFromRemote(): - subprocess.call(["git", "fetch", "origin", "--prune", "--prune-tags"], cwd=REPO) - -def checkoutWorktree(worktreePath, ref): - subprocess.call(["git", "checkout", "-f", ref], cwd=worktreePath) - -def cleanWorktree(worktreePath): - subprocess.call(["git", "clean", "-f", "-d"], cwd=worktreePath) - -def updateAppInWorktree(worktreePath): - subprocess.call([worktreePath + "/scripts/update.sh"], cwd=worktreePath) - -def updateAppVersionInWorktree(worktreePath): - subprocess.call([worktreePath + "/scripts/update-version.sh"], cwd=worktreePath) - -worktrees = getDataForWorktrees() - -updateRepoFromRemote() - -print("Repo is updated from origin") - -print("----------------------------------------------") -print("----------------------------------------------") - -developmentWorktree = findWorktree(WORKTREE_DEVELOPMENT) - -developmentWorktree.newRevision = getRevisionForRef(developmentWorktree.branch) -developmentWorktree.newVersion = getVersion(developmentWorktree.revision) - -print("DEVELOPMENT (" + developmentWorktree.path + ") is on branch " + developmentWorktree.branch) -print(developmentWorktree.revision + " = " + developmentWorktree.branch + " (" + developmentWorktree.version + ")") -print(developmentWorktree.newRevision + " = origin/" + developmentWorktree.branch + " (" + developmentWorktree.newVersion + ")") - -if developmentWorktree.revision != developmentWorktree.newRevision: - print("-> DEVELOPMENT (" + developmentWorktree.path + ") will be UPDATED") - print("----------------------------------------------") - - checkoutWorktree(developmentWorktree.path, developmentWorktree.branch) - cleanWorktree(developmentWorktree.path) - - print(developmentWorktree.path + " is checked out to " + developmentWorktree.branch + " and cleaned") - - updateAppInWorktree(developmentWorktree.path) - updateAppVersionInWorktree(developmentWorktree.path) - - print("MapGuesser is updated in " + developmentWorktree.path) -elif developmentWorktree.version != developmentWorktree.newVersion: - print("-> DEVELOPMENT " + developmentWorktree.path + "'s version info will be UPDATED") - - updateAppVersionInWorktree(developmentWorktree.path) - - print("MapGuesser version is updated in " + developmentWorktree.path) -else: - print("-> DEVELOPMENT (" + developmentWorktree.path + ") WON'T be updated") - -print("----------------------------------------------") -print("----------------------------------------------") - -productionWorktree = findWorktree(WORKTREE_PRODUCTION) - -productionWorktree.newVersion = getLatestReleaseTag() -productionWorktree.newRevision = getRevisionForRef(productionWorktree.newVersion) - -print("PRODUCTION (" + productionWorktree.path + ")") -print(productionWorktree.revision + " = " + productionWorktree.version) -print(productionWorktree.newRevision + " = " + productionWorktree.newVersion) - -if productionWorktree.revision != productionWorktree.newRevision: - print("-> PRODUCTION (" + productionWorktree.path + ") will be UPDATED") - - checkoutWorktree(productionWorktree.path, productionWorktree.newRevision) - cleanWorktree(productionWorktree.path) - - print(productionWorktree.path + " is checked out to " + productionWorktree.newRevision + " and cleaned") - - updateAppInWorktree(productionWorktree.path) - updateAppVersionInWorktree(productionWorktree.path) - - print("MapGuesser is updated in " + productionWorktree.path) -else: - print("-> PRODUCTION (" + productionWorktree.path + ") WON'T be updated") - -print("----------------------------------------------") -print("----------------------------------------------") diff --git a/scripts/install.sh b/scripts/install.sh deleted file mode 100755 index 6abf5a6..0000000 --- a/scripts/install.sh +++ /dev/null @@ -1,35 +0,0 @@ -#!/bin/bash - -ROOT_DIR=$(dirname $(readlink -f "$0"))/.. - -. ${ROOT_DIR}/.env - -if [ -f ${ROOT_DIR}/installed ]; then - echo "MapGuesser is already installed! To force reinstall, delete file 'installed' from the root directory!" - exit 1 -fi - -echo "Installing NPM packages..." -(cd ${ROOT_DIR}/multi && npm install) - -echo "Installing Yarn packages..." -(cd ${ROOT_DIR}/public/static && yarn install) - -echo "Installing MapGuesser DB..." -mysql --host=${DB_HOST} --user=${DB_USER} --password=${DB_PASSWORD} ${DB_NAME} < ${ROOT_DIR}/database/mapguesser.sql - -echo "Migrating DB..." -(cd ${ROOT_DIR} && ./mapg db:migrate) - -if [ -z "${DEV}" ] || [ "${DEV}" -eq "0" ]; then - echo "Minifying JS, CSS and SVG files..." - ${ROOT_DIR}/scripts/minify.sh - - echo "Linking view files..." - (cd ${ROOT_DIR} && ./mapg view:link) -else - echo "Creating the first user..." - (cd ${ROOT_DIR} && ./mapg user:add mapg@mapg.dev 123456 admin) -fi - -touch ${ROOT_DIR}/installed diff --git a/scripts/minify.sh b/scripts/minify.sh deleted file mode 100755 index bcf6a6a..0000000 --- a/scripts/minify.sh +++ /dev/null @@ -1,11 +0,0 @@ -#!/bin/bash - -ROOT_DIR=$(dirname $(readlink -f "$0"))/.. - -. ${ROOT_DIR}/.env - -find ${ROOT_DIR}/public/static/js -type f -iname '*.js' -exec uglifyjs {} -c -m -o {} \; - -find ${ROOT_DIR}/public/static/css -type f -iname '*.css' -exec cleancss {} -o {} \; - -find ${ROOT_DIR}/public/static/img -type f -iname '*.svg' -exec svgo {} -o {} \; diff --git a/scripts/update-version.sh b/scripts/update-version.sh deleted file mode 100755 index de564b7..0000000 --- a/scripts/update-version.sh +++ /dev/null @@ -1,17 +0,0 @@ -#!/bin/bash - -ROOT_DIR=$(dirname $(readlink -f "$0"))/.. - -. ${ROOT_DIR}/.env - -cd ${ROOT_DIR} - -echo "Updating version info..." - -VERSION=$(git describe --tags --always --match "Release_*" HEAD) -REVISION=$(git rev-parse --short HEAD) -REVISION_DATE=$(git show -s --format=%aI HEAD) - -sed -i -E "s/const VERSION = '(.*)';/const VERSION = '${VERSION}';/" main.php -sed -i -E "s/const REVISION = '(.*)';/const REVISION = '${REVISION}';/" main.php -sed -i -E "s/const REVISION_DATE = '(.*)';/const REVISION_DATE = '${REVISION_DATE}';/" main.php diff --git a/scripts/update.sh b/scripts/update.sh deleted file mode 100755 index f82d649..0000000 --- a/scripts/update.sh +++ /dev/null @@ -1,29 +0,0 @@ -#!/bin/bash - -ROOT_DIR=$(dirname $(readlink -f "$0"))/.. - -. ${ROOT_DIR}/.env - -echo "Installing Composer packages..." -if [ -z "${DEV}" ] || [ "${DEV}" -eq "0" ]; then - (cd ${ROOT_DIR} && composer install --no-dev) -else - (cd ${ROOT_DIR} && composer install --dev) -fi - -echo "Installing NPM packages..." -(cd ${ROOT_DIR}/multi && npm install) - -echo "Installing Yarn packages..." -(cd ${ROOT_DIR}/public/static && yarn install) - -echo "Migrating DB..." -(cd ${ROOT_DIR} && ./mapg db:migrate) - -if [ -z "${DEV}" ] || [ "${DEV}" -eq "0" ]; then - echo "Minifying JS, CSS and SVG files..." - ${ROOT_DIR}/scripts/minify.sh - - echo "Linking view files..." - (cd ${ROOT_DIR} && ./mapg view:link) -fi From cd17f44de0f88822d0a3026e91de364f349916ae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C5=91cze=20Bence?= Date: Sat, 16 Sep 2023 20:28:32 +0200 Subject: [PATCH 05/15] merge migration of migrations to base db --- database/mapguesser.sql | 8 ++++++++ .../migrations/structure/20200602_2306_migrations.sql | 6 ------ 2 files changed, 8 insertions(+), 6 deletions(-) delete mode 100644 database/migrations/structure/20200602_2306_migrations.sql diff --git a/database/mapguesser.sql b/database/mapguesser.sql index 538e3da..97b65ec 100644 --- a/database/mapguesser.sql +++ b/database/mapguesser.sql @@ -15,6 +15,14 @@ CREATE TABLE `maps` ( ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; +CREATE TABLE `migrations` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `migration` varchar(255) NOT NULL, + `type` enum('structure', 'data') NOT NULL, + PRIMARY KEY (`id`) +) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4; + + DROP TABLE IF EXISTS `places`; CREATE TABLE `places` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, diff --git a/database/migrations/structure/20200602_2306_migrations.sql b/database/migrations/structure/20200602_2306_migrations.sql deleted file mode 100644 index 29400e5..0000000 --- a/database/migrations/structure/20200602_2306_migrations.sql +++ /dev/null @@ -1,6 +0,0 @@ -CREATE TABLE `migrations` ( - `id` int(10) unsigned NOT NULL AUTO_INCREMENT, - `migration` varchar(255) NOT NULL, - `type` enum('structure', 'data') NOT NULL, - PRIMARY KEY (`id`) -) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4; From f5950658df04f6b344b3568119ba57b279e6c2a6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C5=91cze=20Bence?= Date: Sat, 16 Sep 2023 20:29:55 +0200 Subject: [PATCH 06/15] install base database in MigrateDatabaseCommand --- src/Cli/MigrateDatabaseCommand.php | 31 +++++++++++++++++++----------- 1 file changed, 20 insertions(+), 11 deletions(-) diff --git a/src/Cli/MigrateDatabaseCommand.php b/src/Cli/MigrateDatabaseCommand.php index a2f371c..5d789ec 100644 --- a/src/Cli/MigrateDatabaseCommand.php +++ b/src/Cli/MigrateDatabaseCommand.php @@ -19,6 +19,8 @@ class MigrateDatabaseCommand extends Command { $db = \Container::$dbConnection; + $this->createBaseDb(); + $db->startTransaction(); $success = []; @@ -62,10 +64,8 @@ class MigrateDatabaseCommand extends Command return 0; } - private function readDir(string $type): array + private function createBaseDb() { - $done = []; - $migrationTableExists = \Container::$dbConnection->query('SELECT count(*) FROM information_schema.tables WHERE table_schema = \'' . $_ENV['DB_NAME'] . '\' @@ -73,16 +73,25 @@ class MigrateDatabaseCommand extends Command ->fetch(IResultSet::FETCH_NUM)[0]; if ($migrationTableExists != 0) { - $select = new Select(\Container::$dbConnection, 'migrations'); - $select->columns(['migration']); - $select->where('type', '=', $type); - $select->orderBy('migration'); + return; + } - $result = $select->execute(); + \Container::$dbConnection->multiQuery(file_get_contents(ROOT . '/database/mapguesser.sql')); + } - while ($migration = $result->fetch(IResultSet::FETCH_ASSOC)) { - $done[] = $migration['migration']; - } + private function readDir(string $type): array + { + $done = []; + + $select = new Select(\Container::$dbConnection, 'migrations'); + $select->columns(['migration']); + $select->where('type', '=', $type); + $select->orderBy('migration'); + + $result = $select->execute(); + + while ($migration = $result->fetch(IResultSet::FETCH_ASSOC)) { + $done[] = $migration['migration']; } $path = ROOT . '/database/migrations/' . $type; From 57a24f8c90286c854d5444250adba88eacf0c8c6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C5=91cze=20Bence?= Date: Sat, 16 Sep 2023 15:06:11 +0200 Subject: [PATCH 07/15] add entry point for release docker --- docker/scripts/entry-point.sh | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100755 docker/scripts/entry-point.sh diff --git a/docker/scripts/entry-point.sh b/docker/scripts/entry-point.sh new file mode 100755 index 0000000..59de3bb --- /dev/null +++ b/docker/scripts/entry-point.sh @@ -0,0 +1,20 @@ +#!/bin/bash + +set -e + +echo "Migrating DB..." +./mapg db:migrate + +echo "Installing crontab..." +/usr/bin/crontab docker/scripts/cron + +set +e + +/usr/sbin/cron -f & +/usr/sbin/php-fpm7.4 -F & +/usr/sbin/nginx -g 'daemon off;' & +/usr/bin/node multi & + +wait -n + +exit $? From 4f6e18f83a63b493f0c4d824e674919b8c1dc6d9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C5=91cze=20Bence?= Date: Sat, 16 Sep 2023 19:36:42 +0200 Subject: [PATCH 08/15] add entry point for dev docker --- docker/scripts/entry-point-dev.sh | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100755 docker/scripts/entry-point-dev.sh diff --git a/docker/scripts/entry-point-dev.sh b/docker/scripts/entry-point-dev.sh new file mode 100755 index 0000000..26c43ca --- /dev/null +++ b/docker/scripts/entry-point-dev.sh @@ -0,0 +1,31 @@ +#!/bin/bash + +set -e + +chmod 777 cache + +echo "Installing Composer packages..." +if [ -f .env ]; then + composer install +else + composer create-project +fi + +echo "Installing NPM packages..." +(cd multi && npm install) + +echo "Installing Yarn packages..." +(cd public/static && yarn install) + +echo "Migrating DB..." +./mapg db:migrate + +set +e + +/usr/sbin/php-fpm7.4 -F & +/usr/sbin/nginx -g 'daemon off;' & +/usr/bin/node --inspect=0.0.0.0:9229 multi & + +wait -n + +exit $? From fea42119301de56b3d9981627793186a04599b56 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C5=91cze=20Bence?= Date: Sat, 16 Sep 2023 15:07:24 +0200 Subject: [PATCH 09/15] add new dockerfile with dev and release stages --- docker/Dockerfile | 44 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 docker/Dockerfile diff --git a/docker/Dockerfile b/docker/Dockerfile new file mode 100644 index 0000000..cfa360e --- /dev/null +++ b/docker/Dockerfile @@ -0,0 +1,44 @@ +FROM ubuntu:focal AS mapg_base + +ENV DEBIAN_FRONTEND noninteractive + +RUN apt update --fix-missing && apt install -y curl git unzip mariadb-client nginx \ + php-apcu php7.4-cli php7.4-curl php7.4-fpm php7.4-mbstring php7.4-mysql php7.4-zip php7.4-xml + +RUN mkdir -p /run/php +COPY docker/configs/nginx.conf /etc/nginx/sites-available/default + +COPY docker/scripts/install-composer.sh install-composer.sh +RUN ./install-composer.sh + +COPY docker/scripts/install-nodejs.sh install-nodejs.sh +RUN ./install-nodejs.sh +RUN npm install -g uglify-js clean-css-cli svgo yarn + + +FROM mapg_base AS mapg_dev + +RUN apt update --fix-missing && apt install -y php-xdebug + +RUN echo "xdebug.remote_enable = 1" >> /etc/php/7.4/mods-available/xdebug.ini &&\ + echo "xdebug.remote_autostart = 1" >> /etc/php/7.4/mods-available/xdebug.ini &&\ + echo "xdebug.remote_connect_back = 1" >> /etc/php/7.4/mods-available/xdebug.ini + +EXPOSE 80 +EXPOSE 5000 +EXPOSE 8090 +EXPOSE 9229 +ENTRYPOINT docker/scripts/entry-point-dev.sh + +FROM mapg_base AS mapg_release + +RUN apt update --fix-missing && apt install -y cron + +WORKDIR /var/www/mapguesser +COPY ./ /var/www/mapguesser +RUN docker/scripts/release.sh &&\ + rm -rf /var/www/mapguesser/.git /var/www/mapguesser/.env + +EXPOSE 80 +EXPOSE 8090 +ENTRYPOINT docker/scripts/entry-point.sh From c180d7a0123bd8b611058d16f007f0e68d9a5ff9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C5=91cze=20Bence?= Date: Sat, 16 Sep 2023 23:35:59 +0200 Subject: [PATCH 10/15] delete deprecated dockerfiles --- docker/Dockerfile-app | 30 ------------------------------ docker/Dockerfile-multi | 16 ---------------- docker/Dockerfile-test | 6 ------ 3 files changed, 52 deletions(-) delete mode 100644 docker/Dockerfile-app delete mode 100644 docker/Dockerfile-multi delete mode 100644 docker/Dockerfile-test diff --git a/docker/Dockerfile-app b/docker/Dockerfile-app deleted file mode 100644 index 5ffde9e..0000000 --- a/docker/Dockerfile-app +++ /dev/null @@ -1,30 +0,0 @@ -FROM ubuntu:focal - -ENV DEBIAN_FRONTEND noninteractive - -# Install Nginx, PHP and further necessary packages -RUN apt update --fix-missing -RUN apt install -y curl git unzip mariadb-client nginx \ - php-apcu php-xdebug php7.4-cli php7.4-curl php7.4-fpm php7.4-mbstring php7.4-mysql php7.4-zip php7.4-xml - -# Configure Nginx with PHP -RUN mkdir -p /run/php -COPY configs/nginx.conf /etc/nginx/sites-available/default -RUN echo "xdebug.remote_enable = 1" >> /etc/php/7.4/mods-available/xdebug.ini -RUN echo "xdebug.remote_autostart = 1" >> /etc/php/7.4/mods-available/xdebug.ini -RUN echo "xdebug.remote_connect_back = 1" >> /etc/php/7.4/mods-available/xdebug.ini - -# Install Composer -COPY scripts/install-composer.sh install-composer.sh -RUN ./install-composer.sh - -# Install Node.js and required packages -RUN curl -sL https://deb.nodesource.com/setup_14.x | bash - -RUN apt install -y nodejs -RUN npm install -g uglify-js clean-css-cli svgo yarn - -EXPOSE 80 -VOLUME /var/www/mapguesser -WORKDIR /var/www/mapguesser - -ENTRYPOINT /usr/sbin/php-fpm7.4 -F & /usr/sbin/nginx -g 'daemon off;' diff --git a/docker/Dockerfile-multi b/docker/Dockerfile-multi deleted file mode 100644 index 5092616..0000000 --- a/docker/Dockerfile-multi +++ /dev/null @@ -1,16 +0,0 @@ -FROM ubuntu:focal - -ENV DEBIAN_FRONTEND noninteractive - -# Install necessary packages -RUN apt update --fix-missing -RUN apt install -y curl build-essential - -# Install Node.js and required packages -RUN curl -sL https://deb.nodesource.com/setup_14.x | bash - -RUN apt install -y nodejs - -VOLUME /var/www/mapguesser -WORKDIR /var/www/mapguesser - -ENTRYPOINT /usr/bin/node --inspect=0.0.0.0:9229 multi diff --git a/docker/Dockerfile-test b/docker/Dockerfile-test deleted file mode 100644 index 915d332..0000000 --- a/docker/Dockerfile-test +++ /dev/null @@ -1,6 +0,0 @@ -FROM ubuntu:focal - -ENV DEBIAN_FRONTEND noninteractive - -RUN apt update && apt install -y curl git unzip php7.4-cli php7.4-mbstring php7.4-xml -RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer From 32e9fc2cb09bb9b0c20020b7349246cb8dd495a8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C5=91cze=20Bence?= Date: Sat, 16 Sep 2023 23:36:43 +0200 Subject: [PATCH 11/15] use the new dockerfile in pipeline --- Jenkinsfile | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index f3d6ba3..12e6b26 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -13,8 +13,9 @@ pipeline { } agent { dockerfile { - filename 'docker/Dockerfile-test' + filename 'docker/Dockerfile' dir '.' + additionalBuildArgs '--target mapg_base' reuseNode true } } @@ -26,8 +27,9 @@ pipeline { stage('Unit Testing') { agent { dockerfile { - filename 'docker/Dockerfile-test' + filename 'docker/Dockerfile' dir '.' + additionalBuildArgs '--target mapg_base' reuseNode true } } @@ -44,8 +46,9 @@ pipeline { stage('Static Code Analysis') { agent { dockerfile { - filename 'docker/Dockerfile-test' + filename 'docker/Dockerfile' dir '.' + additionalBuildArgs '--target mapg_base' reuseNode true } } From cb5e90c0f7d279ca75077285fc0f6e562b17afd7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C5=91cze=20Bence?= Date: Sat, 16 Sep 2023 23:42:08 +0200 Subject: [PATCH 12/15] add docker release stage to pipeline --- Jenkinsfile | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/Jenkinsfile b/Jenkinsfile index 12e6b26..2ae2461 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -61,5 +61,27 @@ pipeline { } } } + + stage('Release Docker image') { + steps { + script { + sh script: 'git clean -ffdx', label: 'Clean repository' + + def version = sh(script: 'git describe --tags --always --match "Release_*" HEAD', returnStdout: true).trim() + def imageUrl = "git.esoko.eu/esoko/mapguesser:${version}" + + sh script: """docker buildx build \ + -t ${imageUrl} \ + -f docker/Dockerfile \ + --target mapg_release \ + .""", + label: 'Build Docker image' + + withDockerRegistry([credentialsId: 'gitea-system-user', url: 'https://git.esoko.eu/']) { + sh script: "docker push ${imageUrl}", label: 'Push Docker image to registry' + } + } + } + } } } From 7a1da55cebb6d6523f234ce71ea97c6c34d7f186 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C5=91cze=20Bence?= Date: Sat, 16 Sep 2023 19:37:29 +0200 Subject: [PATCH 13/15] update docker-compose --- docker-compose.yml | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index b13127e..ede07d4 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -2,22 +2,20 @@ version: '3' services: app: build: - context: ./docker - dockerfile: Dockerfile-app + context: . + dockerfile: docker/Dockerfile + target: mapg_dev + depends_on: + mariadb: + condition: service_healthy ports: - 80:80 - volumes: - - .:/var/www/mapguesser - multi: - build: - context: ./docker - dockerfile: Dockerfile-multi - ports: - 5000:5000 - 8090:8090 - 9229:9229 volumes: - .:/var/www/mapguesser + working_dir: /var/www/mapguesser mariadb: image: mariadb:10.3 ports: @@ -29,6 +27,13 @@ services: MYSQL_DATABASE: 'mapguesser' MYSQL_USER: 'mapguesser' MYSQL_PASSWORD: 'mapguesser' + healthcheck: + test: ["CMD-SHELL", "mysqladmin -u $$MYSQL_USER -p$$MYSQL_PASSWORD ping -h localhost || exit 1"] + start_period: 5s + start_interval: 1s + interval: 5s + timeout: 5s + retries: 5 adminer: image: adminer:4.8.1-standalone ports: From 7c614916530b1dc7b6d1a117797a518149ac461b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C5=91cze=20Bence?= Date: Sat, 16 Sep 2023 21:51:14 +0200 Subject: [PATCH 14/15] update soko-web --- composer.json | 2 +- composer.lock | 282 ++++++++++++++++++++++++++++++++------------------ 2 files changed, 180 insertions(+), 104 deletions(-) diff --git a/composer.json b/composer.json index 4b6cf19..e7f244c 100644 --- a/composer.json +++ b/composer.json @@ -10,7 +10,7 @@ } ], "require": { - "esoko/soko-web": "0.10.1", + "esoko/soko-web": "0.14", "fzaninotto/faker": "^1.9" }, "require-dev": { diff --git a/composer.lock b/composer.lock index 4c40b6c..d839a6b 100644 --- a/composer.lock +++ b/composer.lock @@ -4,17 +4,92 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "27b6af78f89ef8dde87e918118511571", + "content-hash": "00d7fdf2ffefd95b3379f5eb8305c288", "packages": [ + { + "name": "cocur/slugify", + "version": "v4.5.0", + "source": { + "type": "git", + "url": "https://github.com/cocur/slugify.git", + "reference": "af8e6ee771458bf885f7457807b5ff9bad8743cb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/cocur/slugify/zipball/af8e6ee771458bf885f7457807b5ff9bad8743cb", + "reference": "af8e6ee771458bf885f7457807b5ff9bad8743cb", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "php": "^7.1 || ~8.0.0 || ~8.1.0 || ~8.2.0" + }, + "conflict": { + "symfony/config": "<3.4 || >=4,<4.3", + "symfony/dependency-injection": "<3.4 || >=4,<4.3", + "symfony/http-kernel": "<3.4 || >=4,<4.3", + "twig/twig": "<2.12.1" + }, + "require-dev": { + "laravel/framework": "^5.0|^6.0|^7.0|^8.0", + "latte/latte": "~2.2", + "league/container": "^2.2.0", + "mikey179/vfsstream": "~1.6.8", + "mockery/mockery": "^1.3", + "nette/di": "~2.4", + "pimple/pimple": "~1.1", + "plumphp/plum": "~0.1", + "symfony/config": "^3.4 || ^4.3 || ^5.0 || ^6.0", + "symfony/dependency-injection": "^3.4 || ^4.3 || ^5.0 || ^6.0", + "symfony/http-kernel": "^3.4 || ^4.3 || ^5.0 || ^6.0", + "symfony/phpunit-bridge": "^5.4 || ^6.0", + "twig/twig": "^2.12.1 || ~3.0", + "zendframework/zend-modulemanager": "~2.2", + "zendframework/zend-servicemanager": "~2.2", + "zendframework/zend-view": "~2.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "Cocur\\Slugify\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Florian Eckerstorfer", + "email": "florian@eckerstorfer.co", + "homepage": "https://florian.ec" + }, + { + "name": "Ivo Bathke", + "email": "ivo.bathke@gmail.com" + } + ], + "description": "Converts a string into a slug.", + "keywords": [ + "slug", + "slugify" + ], + "support": { + "issues": "https://github.com/cocur/slugify/issues", + "source": "https://github.com/cocur/slugify/tree/v4.5.0" + }, + "time": "2023-09-16T10:10:53+00:00" + }, { "name": "esoko/soko-web", - "version": "v0.10.1", + "version": "v0.14", "source": { "type": "git", "url": "https://git.esoko.eu/esoko/soko-web.git", - "reference": "585d469b695365e6f8c0f9b596dbb18b6d3ce584" + "reference": "ebe1fa2aa625c9035611bd995539e9d0f87d1e08" }, "require": { + "cocur/slugify": "^4.3", "phpmailer/phpmailer": "^6.8", "symfony/console": "^5.4", "vlucas/phpdotenv": "^5.5" @@ -33,7 +108,7 @@ "GNU GPL 3.0" ], "description": "Lightweight web framework", - "time": "2023-05-02T16:06:33+00:00" + "time": "2023-09-16T21:56:41+00:00" }, { "name": "fzaninotto/faker", @@ -154,16 +229,16 @@ }, { "name": "phpmailer/phpmailer", - "version": "v6.8.0", + "version": "v6.8.1", "source": { "type": "git", "url": "https://github.com/PHPMailer/PHPMailer.git", - "reference": "df16b615e371d81fb79e506277faea67a1be18f1" + "reference": "e88da8d679acc3824ff231fdc553565b802ac016" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PHPMailer/PHPMailer/zipball/df16b615e371d81fb79e506277faea67a1be18f1", - "reference": "df16b615e371d81fb79e506277faea67a1be18f1", + "url": "https://api.github.com/repos/PHPMailer/PHPMailer/zipball/e88da8d679acc3824ff231fdc553565b802ac016", + "reference": "e88da8d679acc3824ff231fdc553565b802ac016", "shasum": "" }, "require": { @@ -173,13 +248,13 @@ "php": ">=5.5.0" }, "require-dev": { - "dealerdirect/phpcodesniffer-composer-installer": "^0.7.2", + "dealerdirect/phpcodesniffer-composer-installer": "^1.0", "doctrine/annotations": "^1.2.6 || ^1.13.3", "php-parallel-lint/php-console-highlighter": "^1.0.0", "php-parallel-lint/php-parallel-lint": "^1.3.2", "phpcompatibility/php-compatibility": "^9.3.5", "roave/security-advisories": "dev-latest", - "squizlabs/php_codesniffer": "^3.7.1", + "squizlabs/php_codesniffer": "^3.7.2", "yoast/phpunit-polyfills": "^1.0.4" }, "suggest": { @@ -222,7 +297,7 @@ "description": "PHPMailer is a full-featured email creation and transfer class for PHP", "support": { "issues": "https://github.com/PHPMailer/PHPMailer/issues", - "source": "https://github.com/PHPMailer/PHPMailer/tree/v6.8.0" + "source": "https://github.com/PHPMailer/PHPMailer/tree/v6.8.1" }, "funding": [ { @@ -230,7 +305,7 @@ "type": "github" } ], - "time": "2023-03-06T14:43:22+00:00" + "time": "2023-08-29T08:26:30+00:00" }, { "name": "phpoption/phpoption", @@ -357,16 +432,16 @@ }, { "name": "symfony/console", - "version": "v5.4.22", + "version": "v5.4.28", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "3cd51fd2e6c461ca678f84d419461281bd87a0a8" + "reference": "f4f71842f24c2023b91237c72a365306f3c58827" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/3cd51fd2e6c461ca678f84d419461281bd87a0a8", - "reference": "3cd51fd2e6c461ca678f84d419461281bd87a0a8", + "url": "https://api.github.com/repos/symfony/console/zipball/f4f71842f24c2023b91237c72a365306f3c58827", + "reference": "f4f71842f24c2023b91237c72a365306f3c58827", "shasum": "" }, "require": { @@ -436,7 +511,7 @@ "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v5.4.22" + "source": "https://github.com/symfony/console/tree/v5.4.28" }, "funding": [ { @@ -452,7 +527,7 @@ "type": "tidelift" } ], - "time": "2023-03-25T09:27:28+00:00" + "time": "2023-08-07T06:12:30+00:00" }, { "name": "symfony/deprecation-contracts", @@ -523,16 +598,16 @@ }, { "name": "symfony/polyfill-ctype", - "version": "v1.27.0", + "version": "v1.28.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-ctype.git", - "reference": "5bbc823adecdae860bb64756d639ecfec17b050a" + "reference": "ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/5bbc823adecdae860bb64756d639ecfec17b050a", - "reference": "5bbc823adecdae860bb64756d639ecfec17b050a", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb", + "reference": "ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb", "shasum": "" }, "require": { @@ -547,7 +622,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.27-dev" + "dev-main": "1.28-dev" }, "thanks": { "name": "symfony/polyfill", @@ -585,7 +660,7 @@ "portable" ], "support": { - "source": "https://github.com/symfony/polyfill-ctype/tree/v1.27.0" + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.28.0" }, "funding": [ { @@ -601,20 +676,20 @@ "type": "tidelift" } ], - "time": "2022-11-03T14:55:06+00:00" + "time": "2023-01-26T09:26:14+00:00" }, { "name": "symfony/polyfill-intl-grapheme", - "version": "v1.27.0", + "version": "v1.28.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-grapheme.git", - "reference": "511a08c03c1960e08a883f4cffcacd219b758354" + "reference": "875e90aeea2777b6f135677f618529449334a612" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/511a08c03c1960e08a883f4cffcacd219b758354", - "reference": "511a08c03c1960e08a883f4cffcacd219b758354", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/875e90aeea2777b6f135677f618529449334a612", + "reference": "875e90aeea2777b6f135677f618529449334a612", "shasum": "" }, "require": { @@ -626,7 +701,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.27-dev" + "dev-main": "1.28-dev" }, "thanks": { "name": "symfony/polyfill", @@ -666,7 +741,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.27.0" + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.28.0" }, "funding": [ { @@ -682,20 +757,20 @@ "type": "tidelift" } ], - "time": "2022-11-03T14:55:06+00:00" + "time": "2023-01-26T09:26:14+00:00" }, { "name": "symfony/polyfill-intl-normalizer", - "version": "v1.27.0", + "version": "v1.28.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-normalizer.git", - "reference": "19bd1e4fcd5b91116f14d8533c57831ed00571b6" + "reference": "8c4ad05dd0120b6a53c1ca374dca2ad0a1c4ed92" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/19bd1e4fcd5b91116f14d8533c57831ed00571b6", - "reference": "19bd1e4fcd5b91116f14d8533c57831ed00571b6", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/8c4ad05dd0120b6a53c1ca374dca2ad0a1c4ed92", + "reference": "8c4ad05dd0120b6a53c1ca374dca2ad0a1c4ed92", "shasum": "" }, "require": { @@ -707,7 +782,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.27-dev" + "dev-main": "1.28-dev" }, "thanks": { "name": "symfony/polyfill", @@ -750,7 +825,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.27.0" + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.28.0" }, "funding": [ { @@ -766,20 +841,20 @@ "type": "tidelift" } ], - "time": "2022-11-03T14:55:06+00:00" + "time": "2023-01-26T09:26:14+00:00" }, { "name": "symfony/polyfill-mbstring", - "version": "v1.27.0", + "version": "v1.28.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "8ad114f6b39e2c98a8b0e3bd907732c207c2b534" + "reference": "42292d99c55abe617799667f454222c54c60e229" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/8ad114f6b39e2c98a8b0e3bd907732c207c2b534", - "reference": "8ad114f6b39e2c98a8b0e3bd907732c207c2b534", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/42292d99c55abe617799667f454222c54c60e229", + "reference": "42292d99c55abe617799667f454222c54c60e229", "shasum": "" }, "require": { @@ -794,7 +869,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.27-dev" + "dev-main": "1.28-dev" }, "thanks": { "name": "symfony/polyfill", @@ -833,7 +908,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.27.0" + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.28.0" }, "funding": [ { @@ -849,20 +924,20 @@ "type": "tidelift" } ], - "time": "2022-11-03T14:55:06+00:00" + "time": "2023-07-28T09:04:16+00:00" }, { "name": "symfony/polyfill-php73", - "version": "v1.27.0", + "version": "v1.28.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php73.git", - "reference": "9e8ecb5f92152187c4799efd3c96b78ccab18ff9" + "reference": "fe2f306d1d9d346a7fee353d0d5012e401e984b5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/9e8ecb5f92152187c4799efd3c96b78ccab18ff9", - "reference": "9e8ecb5f92152187c4799efd3c96b78ccab18ff9", + "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/fe2f306d1d9d346a7fee353d0d5012e401e984b5", + "reference": "fe2f306d1d9d346a7fee353d0d5012e401e984b5", "shasum": "" }, "require": { @@ -871,7 +946,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.27-dev" + "dev-main": "1.28-dev" }, "thanks": { "name": "symfony/polyfill", @@ -912,7 +987,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php73/tree/v1.27.0" + "source": "https://github.com/symfony/polyfill-php73/tree/v1.28.0" }, "funding": [ { @@ -928,20 +1003,20 @@ "type": "tidelift" } ], - "time": "2022-11-03T14:55:06+00:00" + "time": "2023-01-26T09:26:14+00:00" }, { "name": "symfony/polyfill-php80", - "version": "v1.27.0", + "version": "v1.28.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php80.git", - "reference": "7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936" + "reference": "6caa57379c4aec19c0a12a38b59b26487dcfe4b5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936", - "reference": "7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/6caa57379c4aec19c0a12a38b59b26487dcfe4b5", + "reference": "6caa57379c4aec19c0a12a38b59b26487dcfe4b5", "shasum": "" }, "require": { @@ -950,7 +1025,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.27-dev" + "dev-main": "1.28-dev" }, "thanks": { "name": "symfony/polyfill", @@ -995,7 +1070,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php80/tree/v1.27.0" + "source": "https://github.com/symfony/polyfill-php80/tree/v1.28.0" }, "funding": [ { @@ -1011,7 +1086,7 @@ "type": "tidelift" } ], - "time": "2022-11-03T14:55:06+00:00" + "time": "2023-01-26T09:26:14+00:00" }, { "name": "symfony/service-contracts", @@ -1098,16 +1173,16 @@ }, { "name": "symfony/string", - "version": "v5.4.22", + "version": "v5.4.26", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "8036a4c76c0dd29e60b6a7cafcacc50cf088ea62" + "reference": "1181fe9270e373537475e826873b5867b863883c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/8036a4c76c0dd29e60b6a7cafcacc50cf088ea62", - "reference": "8036a4c76c0dd29e60b6a7cafcacc50cf088ea62", + "url": "https://api.github.com/repos/symfony/string/zipball/1181fe9270e373537475e826873b5867b863883c", + "reference": "1181fe9270e373537475e826873b5867b863883c", "shasum": "" }, "require": { @@ -1164,7 +1239,7 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v5.4.22" + "source": "https://github.com/symfony/string/tree/v5.4.26" }, "funding": [ { @@ -1180,7 +1255,7 @@ "type": "tidelift" } ], - "time": "2023-03-14T06:11:53+00:00" + "time": "2023-06-28T12:46:07+00:00" }, { "name": "vlucas/phpdotenv", @@ -1399,16 +1474,16 @@ }, { "name": "nikic/php-parser", - "version": "v4.15.4", + "version": "v4.17.1", "source": { "type": "git", "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "6bb5176bc4af8bcb7d926f88718db9b96a2d4290" + "reference": "a6303e50c90c355c7eeee2c4a8b27fe8dc8fef1d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/6bb5176bc4af8bcb7d926f88718db9b96a2d4290", - "reference": "6bb5176bc4af8bcb7d926f88718db9b96a2d4290", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/a6303e50c90c355c7eeee2c4a8b27fe8dc8fef1d", + "reference": "a6303e50c90c355c7eeee2c4a8b27fe8dc8fef1d", "shasum": "" }, "require": { @@ -1449,9 +1524,9 @@ ], "support": { "issues": "https://github.com/nikic/PHP-Parser/issues", - "source": "https://github.com/nikic/PHP-Parser/tree/v4.15.4" + "source": "https://github.com/nikic/PHP-Parser/tree/v4.17.1" }, - "time": "2023-03-05T19:49:14+00:00" + "time": "2023-08-13T19:53:39+00:00" }, { "name": "phar-io/manifest", @@ -1566,16 +1641,16 @@ }, { "name": "phpstan/phpstan", - "version": "1.10.11", + "version": "1.10.34", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan.git", - "reference": "8aa62e6ea8b58ffb650e02940e55a788cbc3fe21" + "reference": "7f806b6f1403e6914c778140e2ba07c293cb4901" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/8aa62e6ea8b58ffb650e02940e55a788cbc3fe21", - "reference": "8aa62e6ea8b58ffb650e02940e55a788cbc3fe21", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/7f806b6f1403e6914c778140e2ba07c293cb4901", + "reference": "7f806b6f1403e6914c778140e2ba07c293cb4901", "shasum": "" }, "require": { @@ -1624,20 +1699,20 @@ "type": "tidelift" } ], - "time": "2023-04-04T19:17:42+00:00" + "time": "2023-09-13T09:49:47+00:00" }, { "name": "phpunit/php-code-coverage", - "version": "9.2.26", + "version": "9.2.28", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "443bc6912c9bd5b409254a40f4b0f4ced7c80ea1" + "reference": "7134a5ccaaf0f1c92a4f5501a6c9f98ac4dcc0ef" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/443bc6912c9bd5b409254a40f4b0f4ced7c80ea1", - "reference": "443bc6912c9bd5b409254a40f4b0f4ced7c80ea1", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/7134a5ccaaf0f1c92a4f5501a6c9f98ac4dcc0ef", + "reference": "7134a5ccaaf0f1c92a4f5501a6c9f98ac4dcc0ef", "shasum": "" }, "require": { @@ -1693,7 +1768,8 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.26" + "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.28" }, "funding": [ { @@ -1701,7 +1777,7 @@ "type": "github" } ], - "time": "2023-03-06T12:58:08+00:00" + "time": "2023-09-12T14:36:20+00:00" }, { "name": "phpunit/php-file-iterator", @@ -1946,16 +2022,16 @@ }, { "name": "phpunit/phpunit", - "version": "9.6.6", + "version": "9.6.12", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "b65d59a059d3004a040c16a82e07bbdf6cfdd115" + "reference": "a122c2ebd469b751d774aa0f613dc0d67697653f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/b65d59a059d3004a040c16a82e07bbdf6cfdd115", - "reference": "b65d59a059d3004a040c16a82e07bbdf6cfdd115", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/a122c2ebd469b751d774aa0f613dc0d67697653f", + "reference": "a122c2ebd469b751d774aa0f613dc0d67697653f", "shasum": "" }, "require": { @@ -1970,7 +2046,7 @@ "phar-io/manifest": "^2.0.3", "phar-io/version": "^3.0.2", "php": ">=7.3", - "phpunit/php-code-coverage": "^9.2.13", + "phpunit/php-code-coverage": "^9.2.28", "phpunit/php-file-iterator": "^3.0.5", "phpunit/php-invoker": "^3.1.1", "phpunit/php-text-template": "^2.0.3", @@ -2029,7 +2105,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", "security": "https://github.com/sebastianbergmann/phpunit/security/policy", - "source": "https://github.com/sebastianbergmann/phpunit/tree/9.6.6" + "source": "https://github.com/sebastianbergmann/phpunit/tree/9.6.12" }, "funding": [ { @@ -2045,7 +2121,7 @@ "type": "tidelift" } ], - "time": "2023-03-27T11:43:46+00:00" + "time": "2023-09-12T14:39:31+00:00" }, { "name": "sebastian/cli-parser", @@ -2347,16 +2423,16 @@ }, { "name": "sebastian/diff", - "version": "4.0.4", + "version": "4.0.5", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/diff.git", - "reference": "3461e3fccc7cfdfc2720be910d3bd73c69be590d" + "reference": "74be17022044ebaaecfdf0c5cd504fc9cd5a7131" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/3461e3fccc7cfdfc2720be910d3bd73c69be590d", - "reference": "3461e3fccc7cfdfc2720be910d3bd73c69be590d", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/74be17022044ebaaecfdf0c5cd504fc9cd5a7131", + "reference": "74be17022044ebaaecfdf0c5cd504fc9cd5a7131", "shasum": "" }, "require": { @@ -2401,7 +2477,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/diff/issues", - "source": "https://github.com/sebastianbergmann/diff/tree/4.0.4" + "source": "https://github.com/sebastianbergmann/diff/tree/4.0.5" }, "funding": [ { @@ -2409,7 +2485,7 @@ "type": "github" } ], - "time": "2020-10-26T13:10:38+00:00" + "time": "2023-05-07T05:35:17+00:00" }, { "name": "sebastian/environment", @@ -2553,16 +2629,16 @@ }, { "name": "sebastian/global-state", - "version": "5.0.5", + "version": "5.0.6", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/global-state.git", - "reference": "0ca8db5a5fc9c8646244e629625ac486fa286bf2" + "reference": "bde739e7565280bda77be70044ac1047bc007e34" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/0ca8db5a5fc9c8646244e629625ac486fa286bf2", - "reference": "0ca8db5a5fc9c8646244e629625ac486fa286bf2", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/bde739e7565280bda77be70044ac1047bc007e34", + "reference": "bde739e7565280bda77be70044ac1047bc007e34", "shasum": "" }, "require": { @@ -2605,7 +2681,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/global-state/issues", - "source": "https://github.com/sebastianbergmann/global-state/tree/5.0.5" + "source": "https://github.com/sebastianbergmann/global-state/tree/5.0.6" }, "funding": [ { @@ -2613,7 +2689,7 @@ "type": "github" } ], - "time": "2022-02-14T08:28:10+00:00" + "time": "2023-08-02T09:26:13+00:00" }, { "name": "sebastian/lines-of-code", @@ -3069,5 +3145,5 @@ "prefer-lowest": false, "platform": [], "platform-dev": [], - "plugin-api-version": "2.3.0" + "plugin-api-version": "2.6.0" } From 716494f614753d65106546d2a491562f12589a9c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C5=91cze=20Bence?= Date: Sat, 16 Sep 2023 23:06:39 +0200 Subject: [PATCH 15/15] update readme --- README.md | 115 +++++++++++++++++++++++++++--------------------------- 1 file changed, 57 insertions(+), 58 deletions(-) diff --git a/README.md b/README.md index 1b072f3..a7d679a 100644 --- a/README.md +++ b/README.md @@ -6,53 +6,11 @@ This is the MapGuesser Application project. This is a game about guessing where ## Installation -### Clone the Git repository - -The first step is obviously cloning the repository to your machine: - -``` -git clone https://gitea.e5tv.hu/esoko/mapguesser.git -``` - -All the commands listed here should be executed from the repository root. - -### Setup Docker stack (recommended) - -The easiest way to build up a fully working application with web server and database is to use Docker Compose with the included `docker-compose.yml`. - -All you have to do is executing the following command: - -``` -docker-compose up -d -``` - -Attach shell to the container of `mapguesser_app`: - -``` -docker exec -it mapguesser_app_1 bash -``` - -All of the following commands should be executed there. - -### Manual setup (alternative) - -If you don't use the Docker stack you need to install your environment manually. Check `docker-compose.yml` and `docker/Dockerfile` to see the system requirements. - -### Initialize project - -This command installes all of the Composer requirements and creates a copy of the example `.env` file. - -``` -composer create-project -``` - ### Set environment variables -The `.env` file contains several environment variables that are needed by the application to work properly. These should be configured for your environment. +The `.env` file contains several environment variables that are needed by the application to work properly. These should be configured for your environment. Check `.env.example` for reference. -One very important variable is `DEV`. This indicates that the application operates in development (staging) and not in production mode. - -**Hint:** If you install the application in the Docker stack for development (staging) environment, only the variables for external dependencies (API keys, map attribution, etc.) should be adapted. All other variables (for DB connection, static root, mailing, multiplayer, etc.) are fine with the default value. +**Important: `DEV` should NOT be set for production! See section Development if you want to use the application in development mode.** #### API keys @@ -75,31 +33,72 @@ LEAFLET_TILESERVER_SUBDOMAINS=abc LEAFLET_TILESERVER_ATTRIBUTION="© OpenStreetMap contributors" ``` -### (Production only) Create cron job +### Docker Compose -To maintain database (delete inactive users, old sessions etc.), the command `db:maintain` should be regularly executed. It is recommended to create a cron job that runs every hour: +Create a `docker-compose.yml` file. The example code below assumes that `.env` is placed in the same folder. + +```yml +version: '3' +services: + app: + image: git.esoko.eu/esoko/mapguesser:latest + depends_on: + mariadb: + condition: service_healthy + ports: + - 80:80 + - 8090:8090 + volumes: + - .env:/var/www/mapguesser/.env + mariadb: + image: mariadb:10.3 + volumes: + - mysql:/var/lib/mysql + environment: + MYSQL_ROOT_PASSWORD: 'root' + MYSQL_DATABASE: 'mapguesser' + MYSQL_USER: 'mapguesser' + MYSQL_PASSWORD: 'mapguesser' + healthcheck: + test: ["CMD-SHELL", "mysqladmin -u $$MYSQL_USER -p$$MYSQL_PASSWORD ping -h localhost || exit 1"] + start_period: 5s + start_interval: 1s + interval: 5s + timeout: 5s + retries: 5 +volumes: + mysql: ``` -0 * * * * /path/to/your/installation/mapg db:maintain >>/var/log/cron-mapguesser.log 2>&1 + +Execute the following command: +```bash +docker compose up -d ``` -### Finalize installation -After you followed the above steps, execute the following command: - -``` -scripts/install.sh -``` - -**Warning: Because of a known issue the image `mapguesser_multi` fails to run without the installation steps. You have to relauch `docker-compose up -d` after you finished the installation process.** - -**And you are done!** The application is ready to use and develop. In development mode an administrative user is also created by the installation script, email is **mapg@mapg.dev**, password is **123456**. In production mode you should create the first administrative user with the following command: +**And you are done!** The application is ready to use. You can create the first administrative user with the following command after attaching to the `app` container: ``` ./mapg user:add EMAIL PASSWORD admin ``` -If you installed it in the Docker stack, you can reach it on http://localhost. The mails that are sent by the application can be found on http://localhost:8080/. If needed, the database server can be directly reached on localhost:3306. +## Development + +### Set environment variables + +`.env.example` should be copied to `.env` into the repo root. Only the variables for external dependencies (API keys, map attribution, etc.) should be adapted in. All other variables (for DB connection, static root, mailing, multiplayer, etc.) are fine with the default value. **`DEV=1` should be set for development!** + +### Docker Compose + +Execute the following command from the repo root: +```bash +docker compose up -d +``` + +**And you are done!** You can reach the application on http://localhost. The mails that are sent by the application can be found on http://localhost:8080. If needed, the database server can be directly reached on localhost:3306, or you can use Adminer web interface on http://localhost:9090 + +You might have to attach to the `app` container, e.g. for creating users, `composer update`, etc. ---