Explorar o código

update and add docker files for v3

Pouria Ezzati hai 1 ano
pai
achega
d3d81bd28f
Modificáronse 8 ficheiros con 129 adicións e 304 borrados
  1. 0 71
      .docker.env
  2. 0 2
      .dockerignore
  3. 17 16
      Dockerfile
  4. 41 0
      docker-compose.mysql.yml
  5. 40 0
      docker-compose.postgres.yml
  6. 23 0
      docker-compose.sqlite-redis.yml
  7. 8 33
      docker-compose.yml
  8. 0 182
      wait-for-it.sh

+ 0 - 71
.docker.env

@@ -1,71 +0,0 @@
-# App port to run on
-PORT=3000
-
-# The name of the site where Kutt is hosted
-SITE_NAME=Kutt
-
-# The domain that this website is on
-DEFAULT_DOMAIN=localhost:3000
-
-# Generated link length
-LINK_LENGTH=6
-
-# Postgres database credential details
-DB_HOST=postgres
-DB_PORT=5432
-DB_NAME=postgres
-DB_USER=
-DB_PASSWORD=
-DB_SSL=false
-
-# Redis host and port
-REDIS_HOST=redis
-REDIS_PORT=6379
-REDIS_PASSWORD=
-REDIS_DB=
-
-# Disable registration
-DISALLOW_REGISTRATION=false
-
-# Disable anonymous link creation
-DISALLOW_ANONYMOUS_LINKS=false
-
-# The daily limit for each user
-USER_LIMIT_PER_DAY=50
-
-# Create a cooldown for non-logged in users in minutes
-# Set 0 to disable
-NON_USER_COOLDOWN=0
-
-# Max number of visits for each link to have detailed stats
-DEFAULT_MAX_STATS_PER_LINK=5000
-
-# Use HTTPS for links with custom domain
-CUSTOM_DOMAIN_USE_HTTPS=false
-
-# A passphrase to encrypt JWT. Use a long and secure key.
-JWT_SECRET=securekey
-
-# Admin emails so they can access admin actions on settings page
-# Comma seperated
-ADMIN_EMAILS=
-
-# Google Cloud API to prevent from users from submitting malware URLs.
-# Get it from https://developers.google.com/safe-browsing/v4/get-started
-GOOGLE_SAFE_BROWSING_KEY=
-
-# Your email host details to use to send verification emails.
-# More info on http://nodemailer.com/
-# Mail from example "Kutt <support@kutt.it>". Leave empty to use MAIL_USER
-MAIL_HOST=
-MAIL_PORT=
-MAIL_SECURE=true
-MAIL_USER=
-MAIL_FROM=
-MAIL_PASSWORD=
-
-# The email address that will receive submitted reports.
-REPORT_EMAIL=
-
-# Support email to show on the app
-CONTACT_EMAIL=

+ 0 - 2
.dockerignore

@@ -1,4 +1,2 @@
-.env
 .git
 node_modules
-production-server

+ 17 - 16
Dockerfile

@@ -1,24 +1,25 @@
-FROM node:18-alpine
+# specify node.js image
+FROM node:22-alpine
 
-RUN apk add --update bash
+# use production node environment by default
+ENV NODE_ENV=production
 
-# Setting working directory. 
-WORKDIR /usr/src/app
+# set working directory.
+WORKDIR /kutt
 
-# Installing dependencies
-COPY package*.json ./
-RUN npm install
+# download dependencies while using Docker's caching
+RUN --mount=type=bind,source=package.json,target=package.json \
+    --mount=type=bind,source=package-lock.json,target=package-lock.json \
+    --mount=type=cache,target=/root/.npm \
+    npm ci --omit=dev
 
-# Copying source files
-COPY . .
-
-# Give permission to run script
-RUN chmod +x ./wait-for-it.sh
+RUN mkdir -p /var/lib/kutt
 
-# Build files
-RUN npm run build
+# copy the rest of source files into the image
+COPY . .
 
+# expose the port that the app listens on
 EXPOSE 3000
 
-# Running the app
-CMD [ "npm", "start" ]
+# intialize database and run the app
+CMD npm run migrate && npm start

+ 41 - 0
docker-compose.mysql.yml

@@ -0,0 +1,41 @@
+services:
+  server:
+    build:
+      context: .
+    environment:
+        DB_CLIENT: mysql2
+        DB_HOST: mariadb
+        REDIS_ENABLED: true
+        REDIS_HOST: redis
+        REDIS_PORT: 6379
+    ports:
+      - 3000:3000
+    depends_on:
+      mariadb:
+        condition: service_healthy
+      redis:
+        condition: service_started
+  mariadb:
+    image: mariadb:10
+    restart: always
+    healthcheck:
+      test: ['CMD-SHELL', 'mysql ${DB_NAME} --user=${DB_USER} --password=${DB_PASSWORD} --execute "SELECT 1;"']
+      interval: 3s
+      retries: 5
+      start_period: 30s
+    volumes:
+      - db_data_mariadb:/var/lib/mysql
+    environment:
+      MARIADB_DATABASE: ${DB_NAME}
+      MARIADB_USER: ${DB_USER}
+      MARIADB_PASSWORD: ${DB_PASSWORD}
+      MARIADB_ROOT_PASSWORD: ${DB_PASSWORD}
+    expose:
+      - 3306
+  redis:
+    image: redis:alpine
+    restart: always
+    expose:
+      - 6379
+volumes:
+  db_data_mariadb:

+ 40 - 0
docker-compose.postgres.yml

@@ -0,0 +1,40 @@
+services:
+  server:
+    build:
+      context: .
+    environment:
+        DB_CLIENT: pg
+        DB_HOST: postgres
+        REDIS_ENABLED: true
+        REDIS_HOST: redis
+        REDIS_PORT: 6379
+    ports:
+      - 3000:3000
+    depends_on:
+      postgres:
+        condition: service_healthy
+      redis:
+        condition: service_started
+  postgres:
+    image: postgres
+    restart: always
+    user: ${DB_USER}
+    volumes:
+      - db_data_pg:/var/lib/postgresql/data
+    environment:
+      POSTGRES_DB: ${DB_NAME}
+      POSTGRES_PASSWORD: ${DB_PASSWORD} 
+    expose:
+      - 5432
+    healthcheck:
+      test: [ "CMD", "pg_isready" ]
+      interval: 10s
+      timeout: 5s
+      retries: 5
+  redis:
+    image: redis:alpine
+    restart: always
+    expose:
+      - 6379
+volumes:
+  db_data_pg:

+ 23 - 0
docker-compose.sqlite-redis.yml

@@ -0,0 +1,23 @@
+services:
+  server:
+    build:
+      context: .
+    volumes:
+       - db-data:/var/lib/kutt
+    environment:
+      DB_FILENAME: "/var/lib/kutt/data.sqlite"
+      REDIS_ENABLED: true
+      REDIS_HOST: redis
+      REDIS_PORT: 6379
+    ports:
+      - 3000:3000
+    depends_on:
+      redis:
+        condition: service_started
+  redis:
+    image: redis:alpine
+    restart: always
+    expose:
+      - 6379
+volumes:
+  db-data:

+ 8 - 33
docker-compose.yml

@@ -1,37 +1,12 @@
-version: "3"
-
 services:
-  kutt:
-    image: kutt/kutt
-    depends_on:
-      - postgres
-      - redis
-    command: ["./wait-for-it.sh", "postgres:5432", "--", "npm", "start"]
-    ports:
-      - "3000:3000"
-    env_file:
-      - .env
-    environment:
-      DB_HOST: postgres
-      DB_NAME: kutt
-      DB_USER: user
-      DB_PASSWORD: pass
-      REDIS_HOST: redis
-
-  redis:
-    image: redis:6.0-alpine
+  server:
+    build:
+      context: .
     volumes:
-      - redis_data:/data
-
-  postgres:
-    image: postgres:12-alpine
+       - db_data_sqlite:/var/lib/kutt
     environment:
-      POSTGRES_USER: user
-      POSTGRES_PASSWORD: pass
-      POSTGRES_DB: kutt
-    volumes:
-      - postgres_data:/var/lib/postgresql/data
-
+      DB_FILENAME: "/var/lib/kutt/data.sqlite"
+    ports:
+      - 3000:3000
 volumes:
-  redis_data:
-  postgres_data:
+  db_data_sqlite:

+ 0 - 182
wait-for-it.sh

@@ -1,182 +0,0 @@
-#!/usr/bin/env bash
-# Use this script to test if a given TCP host/port are available
-
-WAITFORIT_cmdname=${0##*/}
-
-echoerr() { if [[ $WAITFORIT_QUIET -ne 1 ]]; then echo "$@" 1>&2; fi }
-
-usage()
-{
-    cat << USAGE >&2
-Usage:
-    $WAITFORIT_cmdname host:port [-s] [-t timeout] [-- command args]
-    -h HOST | --host=HOST       Host or IP under test
-    -p PORT | --port=PORT       TCP port under test
-                                Alternatively, you specify the host and port as host:port
-    -s | --strict               Only execute subcommand if the test succeeds
-    -q | --quiet                Don't output any status messages
-    -t TIMEOUT | --timeout=TIMEOUT
-                                Timeout in seconds, zero for no timeout
-    -- COMMAND ARGS             Execute command with args after the test finishes
-USAGE
-    exit 1
-}
-
-wait_for()
-{
-    if [[ $WAITFORIT_TIMEOUT -gt 0 ]]; then
-        echoerr "$WAITFORIT_cmdname: waiting $WAITFORIT_TIMEOUT seconds for $WAITFORIT_HOST:$WAITFORIT_PORT"
-    else
-        echoerr "$WAITFORIT_cmdname: waiting for $WAITFORIT_HOST:$WAITFORIT_PORT without a timeout"
-    fi
-    WAITFORIT_start_ts=$(date +%s)
-    while :
-    do
-        if [[ $WAITFORIT_ISBUSY -eq 1 ]]; then
-            nc -z $WAITFORIT_HOST $WAITFORIT_PORT
-            WAITFORIT_result=$?
-        else
-            (echo > /dev/tcp/$WAITFORIT_HOST/$WAITFORIT_PORT) >/dev/null 2>&1
-            WAITFORIT_result=$?
-        fi
-        if [[ $WAITFORIT_result -eq 0 ]]; then
-            WAITFORIT_end_ts=$(date +%s)
-            echoerr "$WAITFORIT_cmdname: $WAITFORIT_HOST:$WAITFORIT_PORT is available after $((WAITFORIT_end_ts - WAITFORIT_start_ts)) seconds"
-            break
-        fi
-        sleep 1
-    done
-    return $WAITFORIT_result
-}
-
-wait_for_wrapper()
-{
-    # In order to support SIGINT during timeout: http://unix.stackexchange.com/a/57692
-    if [[ $WAITFORIT_QUIET -eq 1 ]]; then
-        timeout $WAITFORIT_BUSYTIMEFLAG $WAITFORIT_TIMEOUT $0 --quiet --child --host=$WAITFORIT_HOST --port=$WAITFORIT_PORT --timeout=$WAITFORIT_TIMEOUT &
-    else
-        timeout $WAITFORIT_BUSYTIMEFLAG $WAITFORIT_TIMEOUT $0 --child --host=$WAITFORIT_HOST --port=$WAITFORIT_PORT --timeout=$WAITFORIT_TIMEOUT &
-    fi
-    WAITFORIT_PID=$!
-    trap "kill -INT -$WAITFORIT_PID" INT
-    wait $WAITFORIT_PID
-    WAITFORIT_RESULT=$?
-    if [[ $WAITFORIT_RESULT -ne 0 ]]; then
-        echoerr "$WAITFORIT_cmdname: timeout occurred after waiting $WAITFORIT_TIMEOUT seconds for $WAITFORIT_HOST:$WAITFORIT_PORT"
-    fi
-    return $WAITFORIT_RESULT
-}
-
-# process arguments
-while [[ $# -gt 0 ]]
-do
-    case "$1" in
-        *:* )
-        WAITFORIT_hostport=(${1//:/ })
-        WAITFORIT_HOST=${WAITFORIT_hostport[0]}
-        WAITFORIT_PORT=${WAITFORIT_hostport[1]}
-        shift 1
-        ;;
-        --child)
-        WAITFORIT_CHILD=1
-        shift 1
-        ;;
-        -q | --quiet)
-        WAITFORIT_QUIET=1
-        shift 1
-        ;;
-        -s | --strict)
-        WAITFORIT_STRICT=1
-        shift 1
-        ;;
-        -h)
-        WAITFORIT_HOST="$2"
-        if [[ $WAITFORIT_HOST == "" ]]; then break; fi
-        shift 2
-        ;;
-        --host=*)
-        WAITFORIT_HOST="${1#*=}"
-        shift 1
-        ;;
-        -p)
-        WAITFORIT_PORT="$2"
-        if [[ $WAITFORIT_PORT == "" ]]; then break; fi
-        shift 2
-        ;;
-        --port=*)
-        WAITFORIT_PORT="${1#*=}"
-        shift 1
-        ;;
-        -t)
-        WAITFORIT_TIMEOUT="$2"
-        if [[ $WAITFORIT_TIMEOUT == "" ]]; then break; fi
-        shift 2
-        ;;
-        --timeout=*)
-        WAITFORIT_TIMEOUT="${1#*=}"
-        shift 1
-        ;;
-        --)
-        shift
-        WAITFORIT_CLI=("$@")
-        break
-        ;;
-        --help)
-        usage
-        ;;
-        *)
-        echoerr "Unknown argument: $1"
-        usage
-        ;;
-    esac
-done
-
-if [[ "$WAITFORIT_HOST" == "" || "$WAITFORIT_PORT" == "" ]]; then
-    echoerr "Error: you need to provide a host and port to test."
-    usage
-fi
-
-WAITFORIT_TIMEOUT=${WAITFORIT_TIMEOUT:-15}
-WAITFORIT_STRICT=${WAITFORIT_STRICT:-0}
-WAITFORIT_CHILD=${WAITFORIT_CHILD:-0}
-WAITFORIT_QUIET=${WAITFORIT_QUIET:-0}
-
-# Check to see if timeout is from busybox?
-WAITFORIT_TIMEOUT_PATH=$(type -p timeout)
-WAITFORIT_TIMEOUT_PATH=$(realpath $WAITFORIT_TIMEOUT_PATH 2>/dev/null || readlink -f $WAITFORIT_TIMEOUT_PATH)
-
-WAITFORIT_BUSYTIMEFLAG=""
-if [[ $WAITFORIT_TIMEOUT_PATH =~ "busybox" ]]; then
-    WAITFORIT_ISBUSY=1
-    # Check if busybox timeout uses -t flag
-    # (recent Alpine versions don't support -t anymore)
-    if timeout &>/dev/stdout | grep -q -e '-t '; then
-        WAITFORIT_BUSYTIMEFLAG="-t"
-    fi
-else
-    WAITFORIT_ISBUSY=0
-fi
-
-if [[ $WAITFORIT_CHILD -gt 0 ]]; then
-    wait_for
-    WAITFORIT_RESULT=$?
-    exit $WAITFORIT_RESULT
-else
-    if [[ $WAITFORIT_TIMEOUT -gt 0 ]]; then
-        wait_for_wrapper
-        WAITFORIT_RESULT=$?
-    else
-        wait_for
-        WAITFORIT_RESULT=$?
-    fi
-fi
-
-if [[ $WAITFORIT_CLI != "" ]]; then
-    if [[ $WAITFORIT_RESULT -ne 0 && $WAITFORIT_STRICT -eq 1 ]]; then
-        echoerr "$WAITFORIT_cmdname: strict mode, refusing to execute subprocess"
-        exit $WAITFORIT_RESULT
-    fi
-    exec "${WAITFORIT_CLI[@]}"
-else
-    exit $WAITFORIT_RESULT
-fi