diff --git a/docker/jws-0.0.1/keycloak-themes/jws/login/resources/css/style.css b/docker/jws-0.0.1/keycloak-themes/jws/login/resources/css/style.css new file mode 100644 index 00000000..a4db086e --- /dev/null +++ b/docker/jws-0.0.1/keycloak-themes/jws/login/resources/css/style.css @@ -0,0 +1,159 @@ +@import url("https://fonts.googleapis.com/css2?family=Noto+Sans+Thai:wght@100;200;300;400;500;600;700;800;900&display=swap"); + +.pf-c-button.pf-m-primary { + --pf-c-button--m-primary--BackgroundColor: #1a458a; +} + +#kc-header, +#kc-header-wrapper { + padding: 0 0 0 0 !important; +} + +.pf-c-form-control[aria-invalid=true] { + background-repeat: no-repeat; +} + +[id^="input-error"] { + color: #ea2223; +} + +#kc-registration a { + color: #1a458a; + font-weight: 800; + text-decoration: none; +} + +.login-pf-page .login-pf-settings a { + color: #ea2223; + font-weight: 800; + text-decoration: none; +} + +div.kc-logo-text { + background-image: url("../img/logo.png"); + background-size: contain; + background-position: center center; + height: 150px; + width: 80%; + margin-inline: auto; +} + +.login-pf body { + font-family: "Noto Sans Thai"; + background: url("../img/bg.png") no-repeat center center fixed; + background-size: cover; + height: 100%; +} + +#kc-form-options .checkbox { + color: inherit; +} + +.card-pf { + border-top: 0; + border-radius: 1rem; + backdrop-filter: blur(16px); + background-color: hsla(0 0 100% / 0.5); +} + +#kc-info-wrapper { + background: transparent; + height: 100%; +} + +.pf-c-form-control { + border: white; + outline: none; + box-shadow: + 0 3px 5px -2px hsl(0 0 0% / 8%), + 0 7px 14px -5px hsl(0 0 0% / 10%); +} + +.pf-c-form-control:focus { + border: none; +} + +.pf-c-button.pf-m-control { + border: none; + background: transparent; +} + +.pf-c-button:after { + display: none; +} + +.pf-c-form-control { + background: white; + padding: 1.75rem 2rem !important; + border-radius: 1rem !important; +} + +.pf-c-input-group, +.pf-c-button { + border-radius: 1rem !important; + box-shadow: + 0 3px 5px -2px hsl(0 0% 0% / 8%), + 0 7px 14px -5px hsl(0 0% 0% / 10%); +} + +.pf-c-input-group .pf-c-form-control, +.pf-c-input-group .pf-c-button { + box-shadow: none; +} + +#kc-form-buttons .pf-c-button { + padding: 0.75rem 2rem !important; +} + +@media (prefers-color-scheme: dark) { + .login-pf body { + background: linear-gradient(rgba(0, 0, 0, 0.85), rgba(0, 0, 0, 0.85)), + url("../img/bg.png"); + color: white; + } + + .pf-c-button.pf-m-primary { + --pf-c-button--m-primary--BackgroundColor: #008bff; + } + + .pf-c-button.pf-m-primary:hover { + --pf-c-button--m-primary--BackgroundColor: #1971c2; + } + + #kc-locale ul { + color: white !important; + background: #212121 !important; + } + + .pf-c-dropdown__menu-item { + outline: none !important; + color: white; + background: #212121; + } + + .pf-c-dropdown__menu-item:hover { + outline: none !important; + color: white; + background: #121212; + } + + .card-pf { + color: white; + background-color: hsla(0 0% 10% / 1); + border: 1px solid hsl(0 0% 20%); + } + + .pf-c-form-control, + .pf-c-input-group { + color: white; + background-color: hsla(0 0% 15% / 1); + } + + .pf-c-input-group i { + color: white; + } + + #kc-registration a { + color: #008bff; + } +} diff --git a/docker/jws-0.0.1/keycloak-themes/jws/login/resources/img/bg.png b/docker/jws-0.0.1/keycloak-themes/jws/login/resources/img/bg.png new file mode 100644 index 00000000..0293b3a3 Binary files /dev/null and b/docker/jws-0.0.1/keycloak-themes/jws/login/resources/img/bg.png differ diff --git a/docker/jws-0.0.1/keycloak-themes/jws/login/resources/img/logo.png b/docker/jws-0.0.1/keycloak-themes/jws/login/resources/img/logo.png new file mode 100644 index 00000000..ad1f3b0b Binary files /dev/null and b/docker/jws-0.0.1/keycloak-themes/jws/login/resources/img/logo.png differ diff --git a/docker/jws-0.0.1/keycloak-themes/jws/login/theme.properties b/docker/jws-0.0.1/keycloak-themes/jws/login/theme.properties new file mode 100644 index 00000000..34dd05b9 --- /dev/null +++ b/docker/jws-0.0.1/keycloak-themes/jws/login/theme.properties @@ -0,0 +1,3 @@ +parent=keycloak +import=common/keycloak +styles=css/login.css css/style.css \ No newline at end of file diff --git a/docker/jws-0.0.1/routes.yaml b/docker/jws-0.0.1/routes.yaml new file mode 100644 index 00000000..7583390a --- /dev/null +++ b/docker/jws-0.0.1/routes.yaml @@ -0,0 +1,28 @@ + +http: + routers: + # be1-dev: + # service: org + # rule: "Host(`bma-ehr-dev1.frappet.synology.me`) && (PathPrefix(`/api/v1/Organization`)||PathPrefix(`/api/v1/PositionMaster`))" + + report-server-dev: + service: report-server-dev + rule: "Host(`bma-ehr.frappet.synology.me`) && (PathPrefix(`/api/v1/report-template`) )" + + services: + # org: + # loadBalancer: + # servers: + # - url: 'http://192.168.1.9:4053/' + report-server-dev: + loadBalancer: + servers: + - url: 'http://192.168.1.40:7001/' + + middlewares: + user-auth: # UserName:admin Password: admin123 + basicAuth: + users: #create from htpasswd + - "admin:$apr1$rKaNOONw$vJXI83by5aEK4xdtiov3W1" + - "frappet:$apr1$SeCe2hH6$DcAxZNsMSmIjd4/9TUWVC." + diff --git a/docker/jws-0.0.1/traefik.yaml b/docker/jws-0.0.1/traefik.yaml new file mode 100644 index 00000000..10b62aea --- /dev/null +++ b/docker/jws-0.0.1/traefik.yaml @@ -0,0 +1,15 @@ +entrypoints: + unsecure: + address: :80 +providers: + docker: + endpoint: "unix:///var/run/docker.sock" + exposedByDefault: false + file: + filename: /routes.yaml + watch: true +api: # enable dashboard + dashboard: true + insecure: true +log: + level: DEBUG \ No newline at end of file diff --git a/docker/jws-0.0.2/compose.yaml b/docker/jws-0.0.2/compose.yaml new file mode 100644 index 00000000..1948644f --- /dev/null +++ b/docker/jws-0.0.2/compose.yaml @@ -0,0 +1,240 @@ +version: "3.8" + +services: + # jws-traefik-v1: + # container_name: jws-traefik-v1 + # image: traefik:v2.10 + # restart: always + # ports: + # - 4020:80 + # volumes: + # - /etc/localtime:/etc/localtime:ro + # - /var/run/docker.sock:/var/run/docker.sock:ro + # - ./traefik.yaml:/traefik.yaml + # - ./routes.yaml:/routes.yaml:rw + # labels: + # - "traefik.enable=true" + # - "traefik.http.routers.tf.rule=Host(`jws-treafik-v1.frappet.synology.me`)" + # - "traefik.http.routers.tf.middlewares=user-auth@file" + # - "traefik.http.routers.tf.service=api@internal" + + # environment: + # - TZ=Asia/Bangkok + # networks: + # - jws + + jws-keycloak-v2: + container_name: jws-keycloak-v2 + image: quay.io/keycloak/keycloak:latest + restart: unless-stopped + mem_limit: "1g" + command: + - start-dev + - --proxy=edge + environment: + - KEYCLOAK_ADMIN=admin + - KEYCLOAK_ADMIN_PASSWORD=1234 + - TZ=Asia/Bangkok + ports: + - "18080:8080" + volumes: + - keycloak-data-v2:/opt/keycloak/data + - ./keycloak-themes:/opt/keycloak/themes:rw + networks: + - jws + + jws-mariadb-v2: + container_name: jws-mariadb-v2 + image: mariadb:lts + restart: unless-stopped + ports: + - 13306:3306 + volumes: + - mariadb-data-v2:/var/lib/mysql + environment: + - TZ=Asia/Bangkok + - MARIADB_ROOT_PASSWORD=1234 + networks: + - jws + + jws-postgres-v2: + container_name: jws-postgres-v2 + image: postgres:alpine + restart: unless-stopped + ports: + - 15433:5432 + volumes: + - postgres-data-v2:/var/lib/postgresql/data + environment: + - POSTGRES_PASSWORD=1234 + networks: + - jws + + jws-elasticsearch-v2: + build: + context: . + dockerfile_inline: | + FROM elasticsearch:8.12.0 + RUN /usr/share/elasticsearch/bin/elasticsearch-plugin install --batch analysis-icu + image: elasticsearch-local:8.12.0 + deploy: + resources: + limits: + memory: 1G + restart: unless-stopped + container_name: jws-elasticsearch-v2 + ports: + - 19201:9200 + volumes: + - elasticsearch-data-v2:/usr/share/elasticsearch/data + environment: + - TZ=Asia/Bangkok + - xpack.security.enabled=false + - discovery.type=single-node + networks: + - jws + + jws-kibana-v2: + container_name: jws-kibana-v2 + image: kibana:8.12.0 + deploy: + resources: + limits: + memory: 1G + restart: unless-stopped + depends_on: + - jws-elasticsearch-v2 + ports: + - 15602:5601 + volumes: + - kibana-data-v2:/usr/share/kibana/data + environment: + - TZ=Asia/Bangkok + - ELASTICSEARCH_HOSTS=http://jws-elasticsearch-v2:9200 + networks: + - jws + + jws-rabbitmq-v2: + container_name: jws-rabbitmq-v2 + image: rabbitmq:3-management-alpine + restart: unless-stopped + ports: + - 25673:5672 + - 35673:15672 + volumes: + - rabbitmq-data-v2:/var/lib/rabbitmq + environment: + - TZ=Asia/Bangkok + - RABBITMQ_DEFAULT_USER=admin + - RABBITMQ_DEFAULT_PASS=1234 + - RABBITMQ_DEFAULT_VHOST=vhost + networks: + - jws + + jws-minio-v2: + container_name: jws-minio-v2 + image: minio/minio:latest + deploy: + resources: + limits: + memory: 1G + restart: unless-stopped + command: server --console-address ":9001" /data + ports: + - 19002:9000 + - 19003:9001 + volumes: + - minio-data-v2:/data + environment: + - TZ=Asia/Bangkok + - MINIO_ROOT_USER=admin + - MINIO_ROOT_PASSWORD=12345678 + networks: + - jws + + jws-n8n-v2: + container_name: jws-n8n-v2 + image: docker.n8n.io/n8nio/n8n + restart: unless-stopped + ports: + - 15678:5678 + # extra_hosts: + # - host.docker.internal:host-gateway + volumes: + - n8n-data-v2:/home/node/.n8n + environment: + - GENERIC_TIMEZONE=Asia/Bangkok + networks: + - jws + + # Backend + jws-backend-v2: + container_name: jws-backend-v2 + image: docker.frappet.com/jws/jws-backend:version-0.0.2 + restart: unless-stopped + depends_on: + - jws-postgres-v2 + ports: + - 20008:3000 + labels: + - "traefik.enable=true" + - "traefik.http.routers.jws-backend-v2.rule=Host(`jws-v2.frappet.synology.me`) && PathPrefix(`/api`)" + - "traefik.http.routers.jws-backend-v2.entrypoints=unsecure" + environment: + - TZ=Asia/Bangkok + - KC_URL=https://jws-keycloak-v2.frappet.synology.me + - KC_REALM=dev + - KC_SERVICE_ACCOUNT_CLIENT_ID=dev-service + - KC_SERVICE_ACCOUNT_SECRET=ztEypXzLccvk4ngyBRkVactqLJAIDDrs + - APP_HOST=0.0.0.0 + - APP_PORT=3000 + - MINIO_HOST=jws-minio-v2 + - MINIO_PORT=9000 + - MINIO_ACCESS_KEY=lN5i4Jsoni8Pp3tfRDBr + - MINIO_SECRET_KEY=eLSOGjnogMJ0SK97SpO6E8gribdDyzloCipklyIH + - MINIO_BUCKET=jws-dev + - ELASTICSEARCH_PROTOCOL=http + - ELASTICSEARCH_HOST=jws-elasticsearch-v2 + - ELASTICSEARCH_PORT=9200 + - ELASTICSEARCH_INDEX=jws-log-index + - DATABASE_URL=postgresql://postgres:1234@jws-postgres-v2:5432/dev_1?schema=public + # extra_hosts: + # - host.docker.internal:host-gateway + networks: + - jws + + # Frontend + jws-frontend-v2: + container_name: jws-frontend-v2 + image: docker.frappet.com/jws/jws-frontend:version-0.0.2 + restart: unless-stopped + depends_on: + - jws-backend-v2 + ports: + - 20009:8080 + labels: + - traefik.enable=true + - traefik.http.routers.jws-frontend-v2.rule=Host(`jws-v2.frappet.synology.me`) + - "traefik.http.routers.jws-frontend-v2.entrypoints=unsecure" + environment: + TZ: Asia/Bangkok + API_BASE_URL: https://jws-v2.frappet.synology.me/api + KC_URL: https://jws-keycloak-v2.frappet.synology.me + KC_REALM: dev + KC_CLIENT_ID: dev-service + networks: + - jws + +volumes: + keycloak-data-v2: + mariadb-data-v2: + postgres-data-v2: + elasticsearch-data-v2: + kibana-data-v2: + rabbitmq-data-v2: + minio-data-v2: + n8n-data-v2: + +networks: + jws: + external: true \ No newline at end of file diff --git a/docker/jws-0.0.2/keycloak-themes/jws/login/resources/css/style.css b/docker/jws-0.0.2/keycloak-themes/jws/login/resources/css/style.css new file mode 100644 index 00000000..a4db086e --- /dev/null +++ b/docker/jws-0.0.2/keycloak-themes/jws/login/resources/css/style.css @@ -0,0 +1,159 @@ +@import url("https://fonts.googleapis.com/css2?family=Noto+Sans+Thai:wght@100;200;300;400;500;600;700;800;900&display=swap"); + +.pf-c-button.pf-m-primary { + --pf-c-button--m-primary--BackgroundColor: #1a458a; +} + +#kc-header, +#kc-header-wrapper { + padding: 0 0 0 0 !important; +} + +.pf-c-form-control[aria-invalid=true] { + background-repeat: no-repeat; +} + +[id^="input-error"] { + color: #ea2223; +} + +#kc-registration a { + color: #1a458a; + font-weight: 800; + text-decoration: none; +} + +.login-pf-page .login-pf-settings a { + color: #ea2223; + font-weight: 800; + text-decoration: none; +} + +div.kc-logo-text { + background-image: url("../img/logo.png"); + background-size: contain; + background-position: center center; + height: 150px; + width: 80%; + margin-inline: auto; +} + +.login-pf body { + font-family: "Noto Sans Thai"; + background: url("../img/bg.png") no-repeat center center fixed; + background-size: cover; + height: 100%; +} + +#kc-form-options .checkbox { + color: inherit; +} + +.card-pf { + border-top: 0; + border-radius: 1rem; + backdrop-filter: blur(16px); + background-color: hsla(0 0 100% / 0.5); +} + +#kc-info-wrapper { + background: transparent; + height: 100%; +} + +.pf-c-form-control { + border: white; + outline: none; + box-shadow: + 0 3px 5px -2px hsl(0 0 0% / 8%), + 0 7px 14px -5px hsl(0 0 0% / 10%); +} + +.pf-c-form-control:focus { + border: none; +} + +.pf-c-button.pf-m-control { + border: none; + background: transparent; +} + +.pf-c-button:after { + display: none; +} + +.pf-c-form-control { + background: white; + padding: 1.75rem 2rem !important; + border-radius: 1rem !important; +} + +.pf-c-input-group, +.pf-c-button { + border-radius: 1rem !important; + box-shadow: + 0 3px 5px -2px hsl(0 0% 0% / 8%), + 0 7px 14px -5px hsl(0 0% 0% / 10%); +} + +.pf-c-input-group .pf-c-form-control, +.pf-c-input-group .pf-c-button { + box-shadow: none; +} + +#kc-form-buttons .pf-c-button { + padding: 0.75rem 2rem !important; +} + +@media (prefers-color-scheme: dark) { + .login-pf body { + background: linear-gradient(rgba(0, 0, 0, 0.85), rgba(0, 0, 0, 0.85)), + url("../img/bg.png"); + color: white; + } + + .pf-c-button.pf-m-primary { + --pf-c-button--m-primary--BackgroundColor: #008bff; + } + + .pf-c-button.pf-m-primary:hover { + --pf-c-button--m-primary--BackgroundColor: #1971c2; + } + + #kc-locale ul { + color: white !important; + background: #212121 !important; + } + + .pf-c-dropdown__menu-item { + outline: none !important; + color: white; + background: #212121; + } + + .pf-c-dropdown__menu-item:hover { + outline: none !important; + color: white; + background: #121212; + } + + .card-pf { + color: white; + background-color: hsla(0 0% 10% / 1); + border: 1px solid hsl(0 0% 20%); + } + + .pf-c-form-control, + .pf-c-input-group { + color: white; + background-color: hsla(0 0% 15% / 1); + } + + .pf-c-input-group i { + color: white; + } + + #kc-registration a { + color: #008bff; + } +} diff --git a/docker/jws-0.0.2/keycloak-themes/jws/login/resources/img/bg.png b/docker/jws-0.0.2/keycloak-themes/jws/login/resources/img/bg.png new file mode 100644 index 00000000..0293b3a3 Binary files /dev/null and b/docker/jws-0.0.2/keycloak-themes/jws/login/resources/img/bg.png differ diff --git a/docker/jws-0.0.2/keycloak-themes/jws/login/resources/img/logo.png b/docker/jws-0.0.2/keycloak-themes/jws/login/resources/img/logo.png new file mode 100644 index 00000000..ad1f3b0b Binary files /dev/null and b/docker/jws-0.0.2/keycloak-themes/jws/login/resources/img/logo.png differ diff --git a/docker/jws-0.0.2/keycloak-themes/jws/login/theme.properties b/docker/jws-0.0.2/keycloak-themes/jws/login/theme.properties new file mode 100644 index 00000000..34dd05b9 --- /dev/null +++ b/docker/jws-0.0.2/keycloak-themes/jws/login/theme.properties @@ -0,0 +1,3 @@ +parent=keycloak +import=common/keycloak +styles=css/login.css css/style.css \ No newline at end of file diff --git a/docker/jws-0.0.2/routes.yaml b/docker/jws-0.0.2/routes.yaml new file mode 100644 index 00000000..7583390a --- /dev/null +++ b/docker/jws-0.0.2/routes.yaml @@ -0,0 +1,28 @@ + +http: + routers: + # be1-dev: + # service: org + # rule: "Host(`bma-ehr-dev1.frappet.synology.me`) && (PathPrefix(`/api/v1/Organization`)||PathPrefix(`/api/v1/PositionMaster`))" + + report-server-dev: + service: report-server-dev + rule: "Host(`bma-ehr.frappet.synology.me`) && (PathPrefix(`/api/v1/report-template`) )" + + services: + # org: + # loadBalancer: + # servers: + # - url: 'http://192.168.1.9:4053/' + report-server-dev: + loadBalancer: + servers: + - url: 'http://192.168.1.40:7001/' + + middlewares: + user-auth: # UserName:admin Password: admin123 + basicAuth: + users: #create from htpasswd + - "admin:$apr1$rKaNOONw$vJXI83by5aEK4xdtiov3W1" + - "frappet:$apr1$SeCe2hH6$DcAxZNsMSmIjd4/9TUWVC." + diff --git a/docker/jws-0.0.2/traefik.yaml b/docker/jws-0.0.2/traefik.yaml new file mode 100644 index 00000000..10b62aea --- /dev/null +++ b/docker/jws-0.0.2/traefik.yaml @@ -0,0 +1,15 @@ +entrypoints: + unsecure: + address: :80 +providers: + docker: + endpoint: "unix:///var/run/docker.sock" + exposedByDefault: false + file: + filename: /routes.yaml + watch: true +api: # enable dashboard + dashboard: true + insecure: true +log: + level: DEBUG \ No newline at end of file