Deje correr el fantasma de estibador en apoyo Ali nube OSS

Tal como se usa en este documento, "Atribución 4.0 Internacional (CC BY 4.0)" contrato de licencia, bienvenido a imprimir, modificar o re-uso, pero la necesidad de especificar la fuente. Atribución 4.0 Internacional (CC BY 4.0)

Autor: Su Yang

De creación: March 14 2020
Estadísticas de palabras: 8133 palabras
de lectura: 17 minutos para leer
este enlace artículo: https://soulteary.com/2020/03/14/ghost-running-in-docker-supports-alibaba-cloud -oss.html


Deje correr el fantasma de estibador en apoyo Ali nube OSS

En historia reciente de gestión de contenidos para optimizar el uso de Ghost como una línea, utilice la línea como un sistema, a diferencia de MIS interna, fiabilidad y rendimiento de las aplicaciones requiere un cierto grado de protección.

Resolver los problemas de rendimiento, la solución más sencilla consiste en escalar horizontalmente, y sabemos que si usted quiere hacer un servicio para alcanzar el nivel de escalabilidad, además de la aplicación que desea ejecutar un estado separado del forastero duración, almacenamiento de documentos debe hacerse persistencia , objetos de la plataforma de almacenamiento en la nube es una solución de archivo de persistencia buena.

Ghost es una aplicación típica única, versión v3.x del documento no es en realidad mucho contenedor, y describe cómo utilizar el documento Aliyun OSS no es, tirar el proceso sigue siendo muy interesante, ficha, con la esperanza de ayuda para detrás de la demanda estudiantes.

EDITORIAL

Los documentos oficiales utilizando parte de almacenamiento personalizada fabricante está escrito en realidad no es muy buena:

  1. Alarde acerca de la validez del documento, aunque el contenido mencionado en apoyo Ali nube, pero la lista de la nube Ali OSS plug-in sólo en la versión 1.x, que Ali nube SDK es relativamente antigua, cuando el entorno de nodo es también muy antigua.
  2. Documento personalizado falta de detalles técnicos, así como una descripción completa de la necesidad de verificar a través de la práctica y leer el código fuente.
  3. Absolutamente ninguna mención de cómo el espejo en el recipiente, especialmente una réplica oficial con plug-ins.

En este artículo, para resolver los problemas anteriores a través del contenedor opuesta a la del flujo del programa.

Artículo anterior "hablar de la costumbre Santo optimización de la imagen Dockerfile" , los métodos de entrada chinos ERROR reparación de fantasmas han mencionado, "¿Cómo fantasma de un paquete de contenedores", los estudiantes interesados pueden entender la siguiente.

Después de "repetida salto cruzado" entró en un pozo de pila, relativamente seguro, programa de mantenimiento de bajo costo es prepararse para el fantasma de la versión actual del plug-in de almacenamiento, y una imagen de espejo del contenedor basado en el parche oficial.

Antes de escribir plug-ins, es necesario confirmar la versión oficial del entorno de nodos, con el fin de determinar la sintaxis de símbolo:

docker run --rm -it --entrypoint /usr/local/bin/node ghost:3.9.0-alpine -v

Después de ejecutar el comando anterior, obtendrá v12.16.1 resultado, parece que se puede utilizar directamente async/awaitreducir la cantidad de código para escribir plug-ins.

Escribir tienda OSS plug-in

Hacer referencia a las plantillas oficiales , así como plug-in completa de almacenamiento de nube Ali OSS SDK unos minutos diez para obtener el código correspondiente He subido a GitHub , si la necesidad de embalaje secundario, se puede utilizar y referencia.

/**
 * Ghost v3 Storage Adapter (Aliyun OSS)
 * @author soulteary([email protected])
 */

const AliOSS = require("ali-oss");
const GhostStorage = require("ghost-storage-base");
const { createReadStream } = require("fs");
const { resolve } = require("path");

class AliOSSAdapter extends GhostStorage {
  constructor(config) {
    super();
    this.config = config || {};
    this.oss = new AliOSS({
      region: config.region,
      accessKeyId: config.accessKeyId,
      accessKeySecret: config.accessKeySecret,
      bucket: config.bucket
    });

    this.ossURL = `${config.bucket}.${config.region}.aliyuncs.com`;
    this.regexp = new RegExp(`^https?://${this.ossURL}`, "i");
    this.domain = config.domain || null;
    this.notfound = config.notfound || null;
  }

  async exists(filename, targetDir = this.getTargetDir("/")) {
    try {
      const { status } = await this.oss.head(resolve(targetDir, filename));
      return status === 404;
    } catch (err) {
      return false;
    }
  }
  delete() {
    // it's unnecessary
    // Ghost missing UX
  }
  serve() {
    return function(req, res, next) {
      next();
    };
  }

  async read(options) {
    try {
      const { meta } = await this.oss.head(options.path);
      if (meta && meta.path) {
        return meta.path;
      } else {
        return this.notfound;
      }
    } catch (err) {
      console.error(`Read Image Error ${err}`);
      return this.notfound;
    }
  }

  async save(image, targetDir = this.getTargetDir("/")) {
    try {
      const filename = await this.getUniqueFileName(image, targetDir);
      const { url } = await this.oss.put(filename, createReadStream(image.path));

      if (url && url.indexOf(`://${this.ossURL}`) > -1) {
        return this.domain ? url.replace(this.regexp, this.domain) : url;
      } else {
        return this.notfound;
      }
    } catch (err) {
      console.error(`Upload Image Error ${err}`);
      return this.notfound;
    }
  }
}

module.exports = AliOSSAdapter;

Contenido configuraciones aquí soportados incluyen:

{
  "storage": {
    "active": "ghost-aliyun-oss-store",
    "ghost-aliyun-oss-store": {
      "accessKeyId": "YOUR_ACCESS_KEY_ID",
      "accessKeySecret": "YOUR_ACCESS_SERCET",
      "bucket": "YOUR_BUCKET_NAME",
      "region": "oss-cn-beijing",
      "domain": "https://your-public-domian",
      "notfound": "https://s3-img.meituan.net/v1/mss_3d027b52ec5a4d589e68050845611e68/ff/n0/0k/4n/3s_73850.jpg"
    }
  }
}

El cual domianes opcional, si es necesario utilizar el dominio CDN, configure en este campo.

OSS paquete de soporte a la creación de reflejo plug-ins

Con el fin de garantizar el funcionamiento de reflejar el rendimiento es lo suficientemente alta, de tamaño relativamente pequeño, tenemos que usar descargador de múltiples etapas de construcción del programa.

definir en primer lugar la imagen de base, e instalar el plugin OSS Santo Aliyun acaba de escribir.

FROM ghost:3.9.0-alpine as oss
LABEL maintainer="[email protected]"
WORKDIR $GHOST_INSTALL/current
RUN su-exec node yarn --verbose add ghost-aliyun-oss-store

operación de espejo se utiliza en la definición.

FROM ghost:3.9.0-alpine
LABEL maintainer="[email protected]"
COPY --chown=node:node --from=oss $GHOST_INSTALL/current/node_modules $GHOST_INSTALL/current/node_modules
RUN mkdir -p $GHOST_INSTALL/current/content/adapters/storage/
RUN echo "module.exports = require('ghost-aliyun-oss-store');" > $GHOST_INSTALL/current/content/adapters/storage/ghost-aliyun-oss-store.js

La anterior referencia de dos artículos, si se quiere resolver el problema "no puede ser la entrada de China normal" y extraer el contenido del edificio, se puede añadir lo siguiente en el espejo:

COPY ./docker-assets/admin-views  $GHOST_INSTALL/current/core/server/web/admin/views
COPY ./docker-assets/built/assets $GHOST_INSTALL/current/core/built/assets

Si no desea configurar un archivo separado abstracto, se puede añadir el siguiente contenido.

RUN set -ex; \
    su-exec node ghost config storage.active ghost-aliyun-oss-store; \
    su-exec node ghost config storage.ghost-aliyun-oss-store.accessKeyId YOUR_ACCESS_KEY_ID; \
    su-exec node ghost config storage.ghost-aliyun-oss-store.accessKeySecret YOUR_ACCESS_SERCET; \
    su-exec node ghost config storage.ghost-aliyun-oss-store.bucket YOUR_BUCKET_NAME; \
    su-exec node ghost config storage.ghost-aliyun-oss-store.region oss-cn-beijing; \
    su-exec node ghost config storage.ghost-aliyun-oss-store.domain https://your-public-domian; \
    su-exec node ghost config storage.ghost-aliyun-oss-store.notfound https://s3-img.meituan.net/v1/mss_3d027b52ec5a4d589e68050845611e68/ff/n0/0k/4n/3s_73850.jpg; \
    su-exec node ghost config privacy.useUpdateCheck false; \
    su-exec node ghost config privacy.useGravatar false; \
    su-exec node ghost config privacy.useRpcPing false; \
    su-exec node ghost config privacy.useStructuredData false; \

Por supuesto, con el fin de actualizar más fácilmente el contenido, abstraído como un archivo separado es una mejor opción, ya que el siguiente ejemplo la preparación de dichos config.production.jsonperfiles.

{
  "server": {
    "port": 2368,
    "host": "0.0.0.0"
  },
  "privacy": {
    "useUpdateCheck": false,
    "useGravatar": false,
    "useRpcPing": false,
    "useStructuredData": false
  },
  "storage": {
    "active": "ghost-aliyun-oss-store",
    "ghost-aliyun-oss-store": {
      "accessKeyId": "YOUR_ACCESS_KEY_ID",
      "accessKeySecret": "YOUR_ACCESS_SERCET",
      "bucket": "baai-news-upload",
      "region": "oss-cn-beijing",
      "domain": "https://your-public-domian",
      "notfound": "https://s3-img.meituan.net/v1/mss_3d027b52ec5a4d589e68050845611e68/ff/n0/0k/4n/3s_73850.jpg"
    }
  }
}

archivo de diseño de envases llenos

Lo anterior hemos hablado mucho de opciones de personalización, por lo que un mínimo de configuración de la disposición de contenedores disponibles es lo que? De hecho, probablemente menos de diez líneas, es suficiente para satisfacer nuestras necesidades básicas.

FROM ghost:3.9.0-alpine as oss
WORKDIR $GHOST_INSTALL/current
RUN su-exec node yarn --verbose add ghost-aliyun-oss-store

FROM ghost:3.9.0-alpine
LABEL maintainer="[email protected]"
COPY --chown=node:node --from=oss $GHOST_INSTALL/current/node_modules $GHOST_INSTALL/current/node_modules
RUN mkdir -p $GHOST_INSTALL/current/content/adapters/storage/
RUN echo "module.exports = require('ghost-aliyun-oss-store');" > $GHOST_INSTALL/current/content/adapters/storage/ghost-aliyun-oss-store.js

El contenido de arriba se guarda Dockerfile, si necesita otras características, consulte el contenido de la anterior con las modificaciones apropiadas.

docker build -t soulteary/ghost-with-oss:3.9.0 -f Dockerfile .

Implementación del comando anterior, espere un momento, una se deriva del fantasma oficial Espejo, espejo en el soporte de construcción de contenedores OSS se ha completado.

Cómo utilizar el espejo

Este es un archivo de diseño completo para su referencia, si no desea utilizar Traefik, sólo es necesario el puerto puede estar expuesto de forma individual.

Como Traefik cómo el uso, se refiere a mi artículo anterior , después de lo familiar, se puede descubrir un nuevo mundo.

version: "3.6"

services:

  ghost-with-oss:
    image: soulteary/ghost-with-oss:3.9.0
    expose:
      - 2368
    environment:
      url: https://ghost.lab.io
      database__client: mysql
      database__connection__host: ghost-db
      database__connection__port: 3306
      database__connection__user: root
      database__connection__password: ghost
      database__connection__database: ghost
      NODE_ENV: production
    volumes:
      # 这里参考前篇文章,或者本篇文章内容,选择性使用
      # 解决 Ghost 中文输入的问题
      # - ./docker-assets/built/assets:/var/lib/ghost/versions/current/core/built/assets:ro
      # - ./docker-assets/admin-views:/var/lib/ghost/current/core/server/web/admin/views:ro
      - ./config.production.json:/var/lib/ghost/config.production.json    
    extra_hosts:
      - "ghost.lab.io:127.0.0.1"
    networks:
      - traefik
    labels:
      - "traefik.enable=true"
      - "traefik.docker.network=traefik"
      - "traefik.http.routers.ghostweb.entrypoints=http"
      - "traefik.http.routers.ghostweb.middlewares=https-redirect@file"
      - "traefik.http.routers.ghostweb.rule=Host(`ghost.lab.io`)"
      - "traefik.http.routers.ghostssl.middlewares=content-compress@file"
      - "traefik.http.routers.ghostssl.entrypoints=https"
      - "traefik.http.routers.ghostssl.tls=true"
      - "traefik.http.routers.ghostssl.rule=Host(`ghost.lab.io`)"
      - "traefik.http.services.ghostbackend.loadbalancer.server.scheme=http"
      - "traefik.http.services.ghostbackend.loadbalancer.server.port=2368"

networks:
  traefik:
    external: true

El contenido de arriba se guarda docker-compose.yml, uso docker-compose up -dpara iniciar la aplicación, apellido dominio visitado definido en la configuración para comenzar a utilizar OSS para admitir esta función Santo.

Por supuesto, si usted no tiene bases de datos en línea también se pueden utilizar docker-composepara iniciar una base de datos:

version: '3'
services:

  db:
    image: mysql:5.7
    container_name: ghost-db
    expose:
      - 3306
    networks:
      - traefik
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: ghost
    volumes:
      - ./localdb:/var/lib/mysql

networks:
  traefik:
    external: true

finalmente

En esta parte, a la imagen fantasma personalizado encapsulado en base a una simple ilustración de cómo se extiende una réplica oficial y simple demostración de estibador en varias etapas de construcción y Aliyun OSS versión 3.x fantasma de cómo utilizar.

Tal vez el próximo contenido hablará, Santo no es compatible con este tipo de aplicación originalmente SSO sola señal de lo rápido acceso SSO.

--EOF

Supongo que te gusta

Origin yq.aliyun.com/articles/749679
Recomendado
Clasificación