diff --git a/.env b/.env deleted file mode 100644 index fb22769..0000000 --- a/.env +++ /dev/null @@ -1,5 +0,0 @@ -RUNNER_SCRIPT_DIR=scripts -GENERATE_SOURCEMAP=false -DEFAULT_ENV=prod -PORT=8081 -WEBSITE_URL=amachiromaker.example.com diff --git a/.github/workflows/docker-publish.yml b/.github/workflows/docker-publish.yml index a80585e..9324c9a 100644 --- a/.github/workflows/docker-publish.yml +++ b/.github/workflows/docker-publish.yml @@ -39,6 +39,5 @@ jobs: cache-from: type=local,src=/tmp/.buildx-cache cache-to: type=local,dest=/tmp/.buildx-cache - - name: Image digest run: echo ${{ steps.build_and_push_image.outputs.digest }} diff --git a/.gitignore b/.gitignore index 924eda1..108f42a 100644 --- a/.gitignore +++ b/.gitignore @@ -30,4 +30,4 @@ public/orderedLayers.json scripts/defaultCombination.json public/defaultCombination.json -Makefile \ No newline at end of file +Makefile diff --git a/Dockerfile b/Dockerfile index 9b9e54c..11fa7a5 100644 --- a/Dockerfile +++ b/Dockerfile @@ -7,12 +7,12 @@ ENV NODE_ENV=production RUN yarn install --frozen-lockfile --production=false COPY public/ ./public/ COPY scripts/ ./scripts/ -RUN yarn build-static -j2 +RUN yarn build-static -j4 COPY . . RUN yarn build RUN chmod -R 755 ./build -FROM nginx:stable-alpine +FROM nginx:1.25-alpine3.18 COPY nginx.conf /etc/nginx/conf.d/default.conf COPY --from=build /usr/src/app/build /usr/share/nginx/html EXPOSE 80 diff --git a/README.md b/README.md index 48e6fea..49efbac 100644 --- a/README.md +++ b/README.md @@ -1,59 +1,34 @@ # amachiromaker -> **Update:** As of May 2022, Wayback Machine also excluded all the artworks. So, the download script provided in the repo will fail. Unfortunately, I cannot provide the artworks due to copyright reasons. You have to somehow find all the artworks yourself, otherwise it won't work (you will see blank images everywhere). You can check what files are needed and where they are located in `Makefile` after running `node scripts/generateMakefile.js`. There are over 1,000 items (it is not a easy task)... - I created this website since the [original one](https://picrew.me/image_maker/168503) was not accessible (as of November 2021; was taken down by its author 甘城なつき). Original website: [amachiromaker|Picrew](https://picrew.me/image_maker/168503). This website is not a one-to-one clone of the original one, rather it is rewritten from scratch using basic React (very lightweight, no UI library used). -**Note:** The original artwork (layers in the image) is ***not*** (and ***will not be***) provided due to copyright reasons. You have to download them yourself (by running `yarn build-static`). I am not responsible if you violate the license. +**Note:** The original artwork (layers in the image) is ***not*** (and ***will not be***) provided due to copyright reasons. You have to download them yourself, if the servers happen to be alive. I am not responsible if you violate the license. ## How to Build ### Build or Develop Locally -Before you begin, make sure `node` (>= 14), `yarn`, `GNU Make`, and `curl` are installed. Also, it is recommended to use a `bash`-compatible shell (try WSL/MinGW/Cygwin if you run into problems in Windows). +Before you begin, make sure `node` (>= 14), `yarn`, `GNU Make`, and `curl` are installed. Also, it is recommended to use a `bash`-compatible shell (Windows users will have problems, try WSL/MinGW/Cygwin). -> If you do not want to install all the dependencies, use Docker to build the image (next section). You can extract build artifacts from `build/`. +> If you do not want to install all the dependencies, use Docker to build the image (next section). It should be easier. - Run `yarn install` to install dependencies. -- Run `yarn build-static` to download original artworks from [Wayback Machine](http://web.archive.org/web/20210130063020/https://picrew.me/image_maker/168503) - - By doing this, you agree that you will follow the license on the [original webpage (Wayback Machine copy)](http://web.archive.org/web/20210130063020/https://picrew.me/image_maker/168503) and are responsible for any consequences if you violate the license. - - Optionally, you may use `yarn build-static -jx` to enable parallel downloads, where `x` = number of threads. - - If you are throttled by Wayback Machine, just retry later. +- Run `yarn build-static` to download original artworks. This may take a while. + - By doing this, you agree that you will follow the license on the [original webpage](https://picrew.me/image_maker/168503) and are responsible for any consequences if you violate the license. + - Optionally, you may use `yarn build-static -jx` to enable parallel downloads, where `x` = number of threads (preferably `4`, setting it too high will cause the server to throttle you). - Run `yarn start` to start development server. Your browser should open shortly. -- Or, run `yarn build` to build the website. Static files will be located under `build/`. - -### Build Docker Image - -Just run `docker build . -t charlie0129/amachiromaker` to build the image. - -## How to Deploy - -You have two options to deploy this application. Choose the one you like. -### Containerized +If you want to build the website, run `yarn build` to build the website. Static files will be located under `build/`. Use any static file server to serve the directory. For development purposes, you can use `python3 -m http.server` to serve the directory on port 8000. For production, you can use `nginx` (example configuration is in `nginx.conf`) or `caddy` to serve the directory. -1. Make sure `docker` and `docker-compose` are installed and updated. -2. Copy `.env` as `.env.local`. This is your configuration file. -3. Depending on whether you want to have `traefik` as a reverse proxy, you have two options: - 1. No `traefik`: `./runner.sh start prod -v -d ` (listens on `PORT` in `.env.local`, defaults to `8081`) - 2. With `traefik`: `./runner.sh start prod-traefik -v -d` (you need to configure `traefik` yourself. remember to check the `traefik` configurations in `docker-compose.traefik.yml` and `WEBSITE_URL` in `.env.local`) - -> If you wonder what the heck is `./runner.sh`, you can find it [here (charlie0129/server-app-runner)](https://github.com/charlie0129/server-app-runner) . - -### Other - -If you do not have Docker, try using a static file server to serve the `build/` directory (after you successfully built the project). - -Quick examples: +### Build Docker Image -- `python3 -m http.server -d build 3000` (`python3` should be installed) -- `serve build` (`serve` should be installed by `yarn global add serve`) +Make sure `docker` is installed. You can follow the instructions [here](https://docs.docker.com/get-docker/). -Preferably: +Just run `docker build . -t charlie0129/amachiromaker` to build the production-ready image. It will take a while to download all the artworks for you if you haven't done it in the previous section. -- `nginx` (example configuration is in [`nginx.conf`](https://github.com/charlie0129/amachiromaker/blob/master/nginx.conf)) +You can then run `docker run --rm -it -p 8000:80 charlie0129/amachiromaker` to start the server (Port 8000 can be changed to whatever you want). The website will be available at `http://localhost:8000/`. ## Features @@ -87,8 +62,7 @@ Preferably: - `scripts/data/` JSONs from the original website, containing layer info. Scripts below will use them. - `scripts/findDefaultCombination.js` find out the layer combination to compose the default picture. - `scripts/findDepth.js` order the layers by depth. -- `scripts/generateMakefile.js` generate Makefile to download all the layers from Wayback Machine. +- `scripts/generateMakefile.js` generate Makefile to download all the layers from picrew CDN. - `scripts/organizeData.js` reconstruct the original data to make it easier to use (mainly by combining image `src`s of different colors into layer objects). - #### If you find this project interesting, stars⭐️ are appreciated. diff --git a/docker-compose.traefik.yml b/docker-compose.traefik.yml deleted file mode 100644 index 4882463..0000000 --- a/docker-compose.traefik.yml +++ /dev/null @@ -1,26 +0,0 @@ -version: "3.6" -services: - amachiromaker: - build: . - image: charlie0129/amachiromaker - container_name: amachiromaker - restart: unless-stopped - volumes: - - /etc/localtime:/etc/localtime:ro - networks: - - traefik-global-proxy # change this to you network where traefik lives in - labels: - - "traefik.enable=true" - - "traefik.http.routers.amachiromaker.entrypoints=web" - - "traefik.http.routers.amachiromaker.rule=Host(`${WEBSITE_URL}`)" - - "traefik.http.middlewares.amachiromaker-https-redirect.redirectscheme.scheme=https" - - "traefik.http.routers.amachiromaker.middlewares=amachiromaker-https-redirect" - - "traefik.http.routers.amachiromaker-secure.entrypoints=websecure" - - "traefik.http.routers.amachiromaker-secure.rule=Host(`${WEBSITE_URL}`)" - - "traefik.http.routers.amachiromaker-secure.tls=true" - environment: - - "NODE_ENV=production" - -networks: - traefik-global-proxy: # change this to you network where traefik lives in - external: true diff --git a/docker-compose.yml b/docker-compose.yml index eb223bd..16a6ddb 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -8,8 +8,6 @@ services: volumes: - /etc/localtime:/etc/localtime:ro ports: - - "${PORT}:80" + - "8090:80" environment: - "NODE_ENV=production" - expose: - - "80" diff --git a/runner.sh b/runner.sh deleted file mode 100755 index bcf73ec..0000000 --- a/runner.sh +++ /dev/null @@ -1,307 +0,0 @@ -#!/bin/bash - -#+------------------------------------------------------------------------- -# -# server-app-runner -# -# Repository: https://github.com/charlie0129/server-app-runner -# -# Charlie Chiang -# -#-------------------------------------------------------------------------- - -# Variables that you may need to edit will have comments that starts with `----` - -# Colors -export BOLD="\033[1m" -export GREY="\033[1;30m" -export RED="\033[1;31m" -export GREEN="\033[1;32m" -export YELLOW="\033[1;33m" -export BLUE="\033[1;34m" -export OFF="\033[m" -export HEADER_INFO="${BLUE}[INFO]$OFF " -export HEADER_WARN="${YELLOW}[WARN]$OFF " -export HEADER_ERROR="${RED}[ERROR]$OFF " - -# The file used to store the pid of a previously started background process -export PID_FILE_NAME="started_process.pid" - -# Default states -# Skip the build process in `start` -export SKIP_BUILD=false -# Run in the background (similar to -d/--detach in `Docker`) -export DETACH=false -# Print debug messages -export VERBOSE=false - -# [Customizable] -# ---- The directory that contains the runner scripts (like `runner_scripts_prod`, etc.) -# You can also define RUNNER_SCRIPT_DIR in .env file -RUNNER_SCRIPT_DIR="." - -# Parse arguments (only parse --verbose) -POSITIONAL=() -while [[ $# -gt 0 ]]; do - key="$1" - case $key in - -v | --verbose) - VERBOSE=true - shift - ;; - *) - POSITIONAL+=("$1") - shift - ;; - esac -done - -# restore positional parameters -set -- "${POSITIONAL[@]}" - -# Load .env (always loads) -if [ -f ".env" ]; then - if [ "${VERBOSE}" = true ]; then - echo -e "${HEADER_INFO}loading environment variables from .env" - fi - export $(echo $(cat ".env" | sed 's/#.*//g' | xargs) | envsubst) -fi - -# Load .env.local (always loads) -if [ -f ".env.local" ]; then - if [ "${VERBOSE}" = true ]; then - echo -e "${HEADER_INFO}loading environment variables from .env.local" - fi - export $(echo $(cat ".env.local" | sed 's/#.*//g' | xargs) | envsubst) -fi - -# Append a `/` -RUNNER_SCRIPT_DIR+="/" -# List environments in ${RUNNER_SCRIPT_DIR} (directory), e.g. ENV_LIST = [dev, prod, test] -ENV_LIST=$(ls -d ${RUNNER_SCRIPT_DIR}runner_scripts_* 2>/dev/null) -if [ "${ENV_LIST}" = "" ]; then - echo -e "${HEADER_ERROR}Missing runner scripts. You must have runner scripts for at least one environment." - exit 1 -fi -ENV_LIST=${ENV_LIST[@]//${RUNNER_SCRIPT_DIR}runner_scripts_/} -ENV_LIST=(${ENV_LIST}) - -# [Customizable] predefine some variables -# ---- Fallback environment if no env is specified by the user (by default is the first one in the env list) -# You can also define DEFAULT_ENV in .env file -if [[ -z "${DEFAULT_ENV}" ]]; then - DEFAULT_ENV=${ENV_LIST[0]} -fi - -function usage() { - echo -e "server-app-runner" - echo -e "" - echo -e "./runner.sh start | build | stop | update [environment] [-d | --detach] [--skip-build] [-v | --verbose] [--file env] [-h | --help]" - echo -e "\t start: build your project, stop a previous process, then start a new one" - echo -e "\t build: build your project" - echo -e "\t stop: stop a previously started background process" - echo -e "\t update: update your project" - echo -e "\t environment: your custom script environments, like dev, prod, etc." - echo -e "\t --skip-build: skip build process when during \"start\"" - echo -e "\t -d --detach: start project in the background and return" - echo -e "\t -v --verbose: turn on verbose mode" - echo -e "\t --file: choose env file" - echo -e "\t -h --help: show this help and exit" - echo -e "" -} - -# Check if an array contains a certain element (helper function) -containsElement() { - local e match="$1" - shift - for e; do [[ "$e" == "$match" ]] && return 0; done - return 1 -} - -# Check if a string is a valid environment -check_is_valid_env() { - # if $1 is in ENV_LIST - if containsElement "$1" "${ENV_LIST[@]}"; then - return 0 - fi - - case $1 in - "" | --skip-build | -d | --detach | -v | --verbose | --file) - return 1 - ;; - *) - echo -e "${HEADER_ERROR}Unknown environment: ${YELLOW}$1${OFF}. Available environment(s): ${GREEN}${ENV_LIST[@]}${OFF}" - exit 1 - ;; - esac -} - -# Parse arguments -while [[ $# -gt 0 ]]; do - key="$1" - case $key in - start) - COMMAND=start - RUNNER_ENV="$2" - check_is_valid_env "$2" && shift - shift - ;; - build) - COMMAND=build - RUNNER_ENV="$2" - check_is_valid_env "$2" && shift - shift - ;; - stop) - COMMAND=stop - RUNNER_ENV="$2" - check_is_valid_env "$2" && shift - shift - ;; - update) - COMMAND=update - RUNNER_ENV="$2" - check_is_valid_env "$2" && shift - shift - ;; - --file) - # Load user specified env file - if [ -f "$2" ]; then - if [ "${VERBOSE}" = true ]; then - echo -e "${HEADER_INFO}loading environment variables from $2" - fi - export $(echo $(cat "$2" | sed 's/#.*//g' | xargs) | envsubst) - fi - shift - shift - ;; - --skip-build) - SKIP_BUILD=true - shift - ;; - -d | --detach) - export DETACH=true - shift - ;; - -h | --help) - usage - exit 0 - ;; - *) - echo -e "${HEADER_ERROR}Unknown argument: $1" - echo "" - usage - exit 1 - ;; - esac -done - -# Check arguments -if [ "${SKIP_BUILD}" = true ] && [ "${COMMAND}" != start ]; then - echo -e "${HEADER_ERROR}You can only pair --skip-build with \"start\"" - exit 1 -fi - -if [ "${DETACH}" = true ] && [ "${COMMAND}" != start ]; then - echo -e "${HEADER_ERROR}You can only pair -d --detach with \"start\"" - exit 1 -fi - -# Check environments (the user's input) -# if the env is not valid, the default value (${DEFAULT_ENV}) is used -case $RUNNER_ENV in -"" | --skip-build | -d | --detach | -v | --verbose | --file) - echo -e "${HEADER_WARN}No environment set, falling back to ${DEFAULT_ENV}" - RUNNER_ENV=${DEFAULT_ENV} - ;; -*) - ENV_FILE=".env.${RUNNER_ENV}" - ;; -esac - -# Load .env.[mode] (only loads in that environment) -if [ -f "${ENV_FILE}" ]; then - if [ "${VERBOSE}" = true ]; then - echo -e "${HEADER_INFO}loading environment variables from ${ENV_FILE}" - fi - export $(echo $(cat "${ENV_FILE}" | sed 's/#.*//g' | xargs) | envsubst) -fi - -# Load .env.[mode].local (only loads in that environment) -if [ -f "${ENV_FILE}.local" ]; then - if [ "${VERBOSE}" = true ]; then - echo -e "${HEADER_INFO}loading environment variables from ${ENV_FILE}.local" - fi - export $(echo $(cat "${ENV_FILE}.local" | sed 's/#.*//g' | xargs) | envsubst) -fi - -# Show configuration (verbose option) -if [ "${VERBOSE}" = true ]; then - echo -e "${HEADER_INFO}operation = ${BLUE}${COMMAND}${OFF}" - - echo -e "${HEADER_INFO}environment = ${BLUE}${RUNNER_ENV}${OFF}" - - COLOR=$([ "${SKIP_BUILD}" = true ] && echo "${GREEN}" || echo "${GREY}") - echo -e "${HEADER_INFO}skip_build = ${COLOR}${SKIP_BUILD}${OFF}" - - COLOR=$([ "${DETACH}" = true ] && echo "${GREEN}" || echo "${GREY}") - echo -e "${HEADER_INFO}detach = ${COLOR}${DETACH}${OFF}" -fi - -# Define some functions to run the scripts -handle_error() { - echo -e "${HEADER_ERROR}$1 failed" - exit 1 -} - -build() { - if [ "${VERBOSE}" = true ]; then - echo -e "${HEADER_INFO}building..." - fi - bash ${RUNNER_SCRIPT_DIR}runner_scripts_"${RUNNER_ENV}"/build.sh || handle_error "build" -} - -start() { - if [ "${VERBOSE}" = true ]; then - echo -e "${HEADER_INFO}application starting..." - fi - bash ${RUNNER_SCRIPT_DIR}runner_scripts_"${RUNNER_ENV}"/start.sh || handle_error "start" -} - -stop() { - if [ "${VERBOSE}" = true ]; then - echo -e "${HEADER_INFO}stopping application..." - fi - bash ${RUNNER_SCRIPT_DIR}runner_scripts_"${RUNNER_ENV}"/stop.sh || handle_error "stop" -} - -update() { - if [ "${VERBOSE}" = true ]; then - echo -e "${HEADER_INFO}updating application..." - fi - bash ${RUNNER_SCRIPT_DIR}runner_scripts_"${RUNNER_ENV}"/update.sh || handle_error "update" -} - -# Actually run the scripts, according to different environments -case $COMMAND in -start) - if [ "${SKIP_BUILD}" = false ]; then - build - fi - stop - start - ;; -build) - build - ;; -stop) - stop - ;; -update) - update - ;; -*) - echo -e "${HEADER_ERROR}You need to specify an operation" - usage - ;; -esac diff --git a/scripts/generateMakefile.js b/scripts/generateMakefile.js index 0e5f24c..e8f31cc 100644 --- a/scripts/generateMakefile.js +++ b/scripts/generateMakefile.js @@ -5,7 +5,7 @@ const fs = require('fs'); const path = require('path') -const cdnPrefix = "http://web.archive.org/web/20210130063021/https://cdn.picrew.me/app/image_maker" +const cdnPrefix = "cdn.picrew.me/app/image_maker/" const cfList = JSON.parse(fs.readFileSync(path.join(__dirname, "data", "cfList.json"), { encoding: "utf8", @@ -17,56 +17,30 @@ const imgList = JSON.parse(fs.readFileSync(path.join(__dirname, "data", "imgList flag: "r" })) -let mkContent = "all: " +let mkContent = "IMG_LIST := " imgList.forEach(imgPath => { - mkContent += `public/cdn.picrew.me/app/image_maker/${imgPath} ` + mkContent += `${cdnPrefix}${imgPath} ` }) cfList.forEach(imgPath => { - mkContent += `public/cdn.picrew.me/app/image_maker/${imgPath} ` + mkContent += `${cdnPrefix}${imgPath} ` }) -mkContent += "public/orderedLayers.json " -mkContent += "public/defaultCombination.json " +mkContent += ` -mkContent += "\n\n" +.PHONY: all +all: $(addprefix public/,$(IMG_LIST)) public/orderedLayers.json public/defaultCombination.json -imgList.forEach(imgPath => { - let mkTarget = "" - const localImgPath = `public/cdn.picrew.me/app/image_maker/${imgPath}` - mkTarget += `${localImgPath}: ` - mkTarget += "\n\t" - - const imageDownloadLink = `${cdnPrefix}/${imgPath}` - - const downloadCmd = `@curl --create-dirs --silent --show-error -L ${imageDownloadLink} --output ${localImgPath}` - - mkTarget += downloadCmd - - mkContent += mkTarget + "\n\n" -}) - -cfList.forEach(imgPath => { - let mkTarget = "" - const localImgPath = `public/cdn.picrew.me/app/image_maker/${imgPath}` - mkTarget += `${localImgPath}: ` - mkTarget += "\n\t" - - const imageDownloadLink = `${cdnPrefix}/${imgPath}` - - const downloadCmd = `@curl --create-dirs --silent --show-error -L ${imageDownloadLink} --output ${localImgPath}` - - mkTarget += downloadCmd - - mkContent += mkTarget + "\n\n" -}) +public/${cdnPrefix}%: +\t@echo "Downloading $*" && curl --create-dirs --silent --show-error -L ${cdnPrefix}$* --output public/${cdnPrefix}$* -mkContent += "public/orderedLayers.json: \n" -mkContent += "\tnode scripts/organizeData.js\n\n" +public/orderedLayers.json: +\tnode scripts/organizeData.js -mkContent += "public/defaultCombination.json: public/orderedLayers.json\n" -mkContent += "\tnode scripts/findDefaultCombination.js\n\n" +public/defaultCombination.json: public/orderedLayers.json +\tnode scripts/findDefaultCombination.js +` fs.writeFileSync(path.join(__dirname, "..", "Makefile"), mkContent, { encoding: 'utf8', flag: 'w' }) diff --git a/scripts/runner_scripts_prod-traefik/build.sh b/scripts/runner_scripts_prod-traefik/build.sh deleted file mode 100644 index d3f3e73..0000000 --- a/scripts/runner_scripts_prod-traefik/build.sh +++ /dev/null @@ -1,5 +0,0 @@ -#!/bin/bash - -docker-compose \ - --file docker-compose.traefik.yml \ - build || exit 1 diff --git a/scripts/runner_scripts_prod-traefik/start.sh b/scripts/runner_scripts_prod-traefik/start.sh deleted file mode 100644 index 339ead7..0000000 --- a/scripts/runner_scripts_prod-traefik/start.sh +++ /dev/null @@ -1,11 +0,0 @@ -#!/bin/bash - -if [ "${DETACH}" = true ]; then - docker-compose \ - --file docker-compose.traefik.yml \ - up --detach || exit 1 -else - docker-compose \ - --file docker-compose.traefik.yml \ - up || exit 1 -fi diff --git a/scripts/runner_scripts_prod-traefik/stop.sh b/scripts/runner_scripts_prod-traefik/stop.sh deleted file mode 100644 index e8cfcfb..0000000 --- a/scripts/runner_scripts_prod-traefik/stop.sh +++ /dev/null @@ -1,5 +0,0 @@ -#!/bin/bash - -docker-compose \ - --file docker-compose.traefik.yml \ - rm -s -f || exit 1 diff --git a/scripts/runner_scripts_prod-traefik/update.sh b/scripts/runner_scripts_prod-traefik/update.sh deleted file mode 100644 index bae78b0..0000000 --- a/scripts/runner_scripts_prod-traefik/update.sh +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/bash - -git pull \ No newline at end of file diff --git a/scripts/runner_scripts_prod/build.sh b/scripts/runner_scripts_prod/build.sh deleted file mode 100644 index cf8e68a..0000000 --- a/scripts/runner_scripts_prod/build.sh +++ /dev/null @@ -1,4 +0,0 @@ -#!/bin/bash - -docker-compose \ - build || exit 1 diff --git a/scripts/runner_scripts_prod/start.sh b/scripts/runner_scripts_prod/start.sh deleted file mode 100644 index 8dc7376..0000000 --- a/scripts/runner_scripts_prod/start.sh +++ /dev/null @@ -1,9 +0,0 @@ -#!/bin/bash - -if [ "${DETACH}" = true ]; then - docker-compose \ - up --detach || exit 1 -else - docker-compose \ - up || exit 1 -fi diff --git a/scripts/runner_scripts_prod/stop.sh b/scripts/runner_scripts_prod/stop.sh deleted file mode 100644 index ec67d11..0000000 --- a/scripts/runner_scripts_prod/stop.sh +++ /dev/null @@ -1,4 +0,0 @@ -#!/bin/bash - -docker-compose \ - rm -s -f || exit 1 \ No newline at end of file diff --git a/scripts/runner_scripts_prod/update.sh b/scripts/runner_scripts_prod/update.sh deleted file mode 100644 index 7d6762a..0000000 --- a/scripts/runner_scripts_prod/update.sh +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/bash - -git pull