Pārlūkot izejas kodu

misc: add support for VSCode remote development (#1533)

* Add support for VSCode remote development

* misc: remote dev containers fixes

Co-authored-by: Nicolas Giard <github@ngpixel.com>
Lukas Frischknecht 5 gadi atpakaļ
vecāks
revīzija
a90dc8d5b5

+ 33 - 0
.devcontainer/devcontainer.json

@@ -0,0 +1,33 @@
+// How to get remote container development working with VSCode:
+// 1. Install "Remote Development" extension pack (ms-vscode-remote.vscode-remote-extensionpack)
+// 2. Select "Remote Containers - Reopen in container"
+
+{
+  "name": "Wiki.js",
+  "dockerComposeFile": [
+    "../dev/containers/docker-compose.yml"
+  ],
+  "forwardPorts": [3000, 3001],
+  "service": "wiki",
+  "workspaceFolder": "/wiki",
+  "settings": {
+    "terminal.integrated.shell.linux": "/bin/bash"
+  },
+  "extensions": [
+	"EditorConfig.editorconfig",
+	"dbaeumer.vscode-eslint",
+	"christian-kohler.path-intellisense",
+	"mrmlnc.vscode-puglint",
+	"octref.vetur",
+	"dzannotti.vscode-babel-coloring",
+	"wayou.vscode-todo-highlight",
+	"visualstudioexptteam.vscodeintellicode",
+	"lukas-tr.materialdesignicons-intellisense",
+	"codezombiech.gitignore",
+	"kumar-harsh.graphql-for-vscode",
+	"mrmlnc.vscode-duplicate",
+	"oderwat.indent-rainbow",
+	"christian-kohler.npm-intellisense"
+],
+  "postCreateCommand": ["yarn", "install"]
+}

+ 1 - 4
dev/docker-postgres/Dockerfile → dev/containers/Dockerfile

@@ -1,7 +1,7 @@
 # -- DEV DOCKERFILE --
 # -- DO NOT USE IN PRODUCTION! --
 
-FROM node:10-alpine
+FROM node:12-alpine
 LABEL maintainer "requarks.io"
 
 RUN apk update && \
@@ -9,9 +9,6 @@ RUN apk update && \
     mkdir -p /wiki
 
 WORKDIR /wiki
-COPY package.json .
-RUN yarn --silent
-COPY ./dev/docker-postgres/init.sh ./init.sh
 
 ENV dockerdev 1
 ENV DEVDB postgres

+ 0 - 0
dev/docker-postgres/config.yml → dev/containers/config.yml


+ 18 - 20
dev/docker-postgres/docker-compose.yml → dev/containers/docker-compose.yml

@@ -27,40 +27,38 @@ services:
     ports:
       - "3001:8080"
 
-  solr:
-    image: solr:7-alpine
-    logging:
-      driver: "none"
-    networks:
-      - wikinet
-    ports:
-      - "8983:8983"
-    volumes:
-      - solr-data:/opt/solr/server/solr/mycores
-    entrypoint:
-      - docker-entrypoint.sh
-      - solr-precreate
-      - wiki
+  # solr:
+  #   image: solr:7-alpine
+  #   logging:
+  #     driver: "none"
+  #   networks:
+  #     - wikinet
+  #   ports:
+  #     - "8983:8983"
+  #   volumes:
+  #     - solr-data:/opt/solr/server/solr/mycores
+  #   entrypoint:
+  #     - docker-entrypoint.sh
+  #     - solr-precreate
+  #     - wiki
 
   wiki:
     build:
-      context: .
-      dockerfile: dev/docker-postgres/Dockerfile
+      context: ../..
+      dockerfile: dev/containers/Dockerfile
     depends_on:
       - db
-      - solr
     networks:
       - wikinet
     ports:
       - "3000:3000"
     volumes:
-      - .:/wiki
+      - ../..:/wiki
       - /wiki/node_modules
-    command: ["sh", "./dev/docker-postgres/init.sh"]
 
 networks:
   wikinet:
 
 volumes:
   db-data:
-  solr-data:
+  # solr-data:

+ 0 - 178
dev/docker-common/wait.sh

@@ -1,178 +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)
-if [[ $WAITFORIT_TIMEOUT_PATH =~ "busybox" ]]; then
-        WAITFORIT_ISBUSY=1
-        WAITFORIT_BUSYTIMEFLAG="-t"
-
-else
-        WAITFORIT_ISBUSY=0
-        WAITFORIT_BUSYTIMEFLAG=""
-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

+ 0 - 21
dev/docker-mariadb/Dockerfile

@@ -1,21 +0,0 @@
-# -- DEV DOCKERFILE --
-# -- DO NOT USE IN PRODUCTION! --
-
-FROM node:10-alpine
-LABEL maintainer "requarks.io"
-
-RUN apk update && \
-    apk add bash curl git python make g++ nano openssh gnupg --no-cache && \
-    mkdir -p /wiki
-
-WORKDIR /wiki
-COPY package.json .
-RUN yarn --silent
-COPY ./dev/docker-mariadb/init.sh ./init.sh
-
-ENV dockerdev 1
-ENV DEVDB mariadb
-
-EXPOSE 3000
-
-CMD ["tail", "-f", "/dev/null"]

+ 0 - 10
dev/docker-mariadb/config.yml

@@ -1,10 +0,0 @@
-port: 3000
-bindIP: 0.0.0.0
-db:
-  type: mariadb
-  host: db
-  port: 3306
-  user: wikijs
-  pass: wikijsrocks
-  db: wiki
-logLevel: info

+ 0 - 50
dev/docker-mariadb/docker-compose.yml

@@ -1,50 +0,0 @@
-# -- DEV DOCKER-COMPOSE --
-# -- DO NOT USE IN PRODUCTION! --
-
-version: "3"
-services:
-  db:
-    image: mariadb:10.3
-    environment:
-      MYSQL_DATABASE: wiki
-      MYSQL_PASSWORD: wikijsrocks
-      MYSQL_USER: wikijs
-      MYSQL_ROOT_PASSWORD: wikijsrocks
-    logging:
-      driver: "none"
-    volumes:
-      - db-data:/var/lib/mysql
-    networks:
-      - wikinet
-    ports:
-      - "13306:3306"
-
-  adminer:
-    image: adminer:latest
-    logging:
-      driver: "none"
-    networks:
-      - wikinet
-    ports:
-      - "3001:8080"
-
-  wiki:
-    build:
-      context: .
-      dockerfile: dev/docker-mariadb/Dockerfile
-    depends_on:
-      - db
-    networks:
-      - wikinet
-    ports:
-      - "3000:3000"
-    volumes:
-      - .:/wiki
-      - /wiki/node_modules
-    command: ["sh", "./dev/docker-mariadb/init.sh"]
-
-networks:
-  wikinet:
-
-volumes:
-  db-data:

+ 0 - 6
dev/docker-mariadb/init.sh

@@ -1,6 +0,0 @@
-#!/bin/sh
-
-echo "Waiting for mariadb to start up..."
-bash ./dev/docker-common/wait.sh db:3306
-echo "=== READY ==="
-tail -f /dev/null

+ 0 - 21
dev/docker-mssql/Dockerfile

@@ -1,21 +0,0 @@
-# -- DEV DOCKERFILE --
-# -- DO NOT USE IN PRODUCTION! --
-
-FROM node:10-alpine
-LABEL maintainer "requarks.io"
-
-RUN apk update && \
-    apk add bash curl git python make g++ nano openssh gnupg --no-cache && \
-    mkdir -p /wiki
-
-WORKDIR /wiki
-COPY package.json .
-RUN yarn --silent
-COPY ./dev/docker-mssql/init.sh ./init.sh
-
-ENV dockerdev 1
-ENV DEVDB mssql
-
-EXPOSE 3000
-
-CMD ["tail", "-f", "/dev/null"]

+ 0 - 10
dev/docker-mssql/config.yml

@@ -1,10 +0,0 @@
-port: 3000
-bindIP: 0.0.0.0
-db:
-  type: mssql
-  host: db
-  port: 1433
-  user: SA
-  pass: W1kiJSR0cks!
-  db: wiki
-logLevel: info

+ 0 - 40
dev/docker-mssql/docker-compose.yml

@@ -1,40 +0,0 @@
-# -- DEV DOCKER-COMPOSE --
-# -- DO NOT USE IN PRODUCTION! --
-
-version: "3"
-services:
-  db:
-    image: mcr.microsoft.com/mssql/server:2017-latest
-    environment:
-      ACCEPT_EULA: 'Y'
-      MSSQL_PID: Developer
-      SA_PASSWORD: W1kiJSR0cks!
-    logging:
-      driver: "none"
-    volumes:
-      - db-data:/var/opt/mssql
-    networks:
-      - wikinet
-    ports:
-      - "11433:1433"
-
-  wiki:
-    build:
-      context: .
-      dockerfile: dev/docker-mssql/Dockerfile
-    depends_on:
-      - db
-    networks:
-      - wikinet
-    ports:
-      - "3000:3000"
-    volumes:
-      - .:/wiki
-      - /wiki/node_modules
-    command: ["sh", "./dev/docker-mssql/init.sh"]
-
-networks:
-  wikinet:
-
-volumes:
-  db-data:

+ 0 - 6
dev/docker-mssql/init.sh

@@ -1,6 +0,0 @@
-#!/bin/sh
-
-echo "Waiting for mssql to start up..."
-bash ./dev/docker-common/wait.sh db:1433
-echo "=== READY ==="
-tail -f /dev/null

+ 0 - 21
dev/docker-mysql/Dockerfile

@@ -1,21 +0,0 @@
-# -- DEV DOCKERFILE --
-# -- DO NOT USE IN PRODUCTION! --
-
-FROM node:10-alpine
-LABEL maintainer "requarks.io"
-
-RUN apk update && \
-    apk add bash curl git python make g++ nano openssh gnupg --no-cache && \
-    mkdir -p /wiki
-
-WORKDIR /wiki
-COPY package.json .
-RUN yarn --silent
-COPY ./dev/docker-mysql/init.sh ./init.sh
-
-ENV dockerdev 1
-ENV DEVDB mysql
-
-EXPOSE 3000
-
-CMD ["tail", "-f", "/dev/null"]

+ 0 - 10
dev/docker-mysql/config.yml

@@ -1,10 +0,0 @@
-port: 3000
-bindIP: 0.0.0.0
-db:
-  type: mysql
-  host: db
-  port: 3306
-  user: wikijs
-  pass: wikijsrocks
-  db: wiki
-logLevel: info

+ 0 - 50
dev/docker-mysql/docker-compose.yml

@@ -1,50 +0,0 @@
-# -- DEV DOCKER-COMPOSE --
-# -- DO NOT USE IN PRODUCTION! --
-
-version: "3"
-services:
-  db:
-    image: mysql:5.7
-    environment:
-      MYSQL_DATABASE: wiki
-      MYSQL_PASSWORD: wikijsrocks
-      MYSQL_USER: wikijs
-      MYSQL_ROOT_PASSWORD: wikijsrocks
-    logging:
-      driver: "none"
-    volumes:
-      - db-data:/var/lib/mysql
-    networks:
-      - wikinet
-    ports:
-      - "13306:3306"
-
-  adminer:
-    image: adminer:latest
-    logging:
-      driver: "none"
-    networks:
-      - wikinet
-    ports:
-      - "3001:8080"
-
-  wiki:
-    build:
-      context: .
-      dockerfile: dev/docker-mysql/Dockerfile
-    depends_on:
-      - db
-    networks:
-      - wikinet
-    ports:
-      - "3000:3000"
-    volumes:
-      - .:/wiki
-      - /wiki/node_modules
-    command: ["sh", "./dev/docker-mysql/init.sh"]
-
-networks:
-  wikinet:
-
-volumes:
-  db-data:

+ 0 - 6
dev/docker-mysql/init.sh

@@ -1,6 +0,0 @@
-#!/bin/sh
-
-echo "Waiting for mysql to start up..."
-bash ./dev/docker-common/wait.sh db:3306
-echo "=== READY ==="
-tail -f /dev/null

+ 0 - 6
dev/docker-postgres/init.sh

@@ -1,6 +0,0 @@
-#!/bin/sh
-
-echo "Waiting for postgres to start up..."
-bash ./dev/docker-common/wait.sh db:5432
-echo "=== READY ==="
-tail -f /dev/null

+ 0 - 20
dev/docker-sqlite/Dockerfile

@@ -1,20 +0,0 @@
-# -- DEV DOCKERFILE --
-# -- DO NOT USE IN PRODUCTION! --
-
-FROM node:10-alpine
-LABEL maintainer "requarks.io"
-
-RUN apk update && \
-    apk add bash curl git python make g++ nano openssh gnupg sqlite --no-cache && \
-    mkdir -p /wiki
-
-WORKDIR /wiki
-COPY package.json .
-RUN yarn --silent
-
-ENV dockerdev 1
-ENV DEVDB sqlite
-
-EXPOSE 3000
-
-CMD ["tail", "-f", "/dev/null"]

+ 0 - 6
dev/docker-sqlite/config.yml

@@ -1,6 +0,0 @@
-port: 3000
-bindIP: 0.0.0.0
-db:
-  type: sqlite
-  storage: /wiki/db.sqlite
-logLevel: info

+ 0 - 22
dev/docker-sqlite/docker-compose.yml

@@ -1,22 +0,0 @@
-# -- DEV DOCKER-COMPOSE --
-# -- DO NOT USE IN PRODUCTION! --
-
-version: "3"
-services:
-  wiki:
-    build:
-      context: .
-      dockerfile: dev/docker-sqlite/Dockerfile
-    networks:
-      - wikinet
-    ports:
-      - "3000:3000"
-    volumes:
-      - .:/wiki
-      - /wiki/node_modules
-
-networks:
-  wikinet:
-
-volumes:
-  db-data: