¡Configure el entorno de desarrollo y producción de software para el sistema Linux recién instalado, de modo que su eficiencia de desarrollo se dispare!

En el artículo anterior, presentamos cómo configurar el servidor, cómo instalar el sistema y el refuerzo de la seguridad: configuración del servidor Dell e instalación del sistema operativo Ubuntu Server20.04, ¡muy detallada! . El artículo de hoy presentará cómo construir un entorno de producción de manera estable y ordenada en un servidor en blanco, para que pueda evitar una serie de problemas causados ​​por un entorno de desarrollo complejo.
Se trata principalmente de la dirección de ingeniería de software, incluyendo: Java, Node, Docker, MySQL, Redis, Gitlab, RabbitMQ... Se realizará la configuración de servidores GPU en dirección a AI (CUDA, cuDNN, virtualización LXD, etc.). actualizado en un artículo separado más adelante, porque los dos usos son muy diferentes, generalmente no en una sola máquina.

Pre planeado

Nuestro desarrollo de software presta atención al esquema de diseño de arriba hacia abajo, y no es una excepción en el proceso de configuración del servidor.Necesitamos configurar primero el software subyacente. De esta forma, algunos paquetes de software que dependen del SDK subyacente también pueden ejecutarse libremente.Por ejemplo, debe tener un entorno Java antes de ejecutar Nacos. Así que he enumerado aquí una secuencia básica de instalación y configuración, que se puede instalar y configurar secuencialmente de abajo hacia arriba.
inserte la descripción de la imagen aquí
Dado que mi computadora está instalada con el sistema Ubuntu Server 20.04, no diré mucho sobre el entorno básico existente. A continuación, seguiré este servidor como el principal para operar e instalar el proceso de configuración.

1. La base subyacente

1.1 Java

En el último artículo, dije por qué me gusta usar la instalación de apt, así que si hay apt, básicamente lo instalaré de esta manera.
Solo un comando, sin necesidad de wget, sin necesidad de configurar variables de entorno, simplemente sin preocupaciones.

sudo apt install openjdk-11-jdk
java -version
java version "11.0.12" 2021-07-20 LTS
Java(TM) SE Runtime Environment 18.9 (build 11.0.12+8-LTS-237)
Java HotSpot(TM) 64-Bit Server VM 18.9 (build 11.0.12+8-LTS-237, mixed mode)

1.2 experto

sudo apt install maven
mvn -version
Maven home: /usr/share/maven
Java version: 11.0.12, vendor: Oracle Corporation, runtime: /data/src/jdk-11.0.12
Default locale: en_US, platform encoding: UTF-8
OS name: "linux", version: "5.4.0-81-generic", arch: "amd64", family: "unix"

Maven Aquí configuramos la fuente Maven de Alibaba Cloud, abrimos /etc/maven/settings.xmlel archivo y agregamos el siguiente contenido:


<mirror>
      <id>aliyun</id>
      <mirrorOf>central</mirrorOf>
      <name>aliyun-nexus</name>
      <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
</mirror>

1.3 Nodo

sudo apt install nodejs npm
nodejs --version
npm --version

inserte la descripción de la imagen aquí

1.4 ventana acoplable

Aquí se recomienda seguir paso a paso el sitio web oficial e instalar Docker en Ubuntu . También explicaré cada paso dos veces aquí.
Primero, use el script oficial para desinstalar la versión anterior, y está bien ejecutarlo sin él:

 sudo apt-get remove docker docker-engine docker.io containerd runc

Instale el paquete de dependencia apt para recuperar el almacén a través de HTTPS:

sudo apt-get update
sudo apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg \
    lsb-release

Agregue la clave GPG oficial de Docker:

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

Configure un repositorio estable:

echo \
  "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

Instale la última versión de Docker Engine-Community y Containerd:

sudo apt-get install docker-ce docker-ce-cli containerd.io

Una vez completada la instalación, podemos ejecutar este comando para probarlo:

sudo docker run hello-world

Si puede ver la siguiente información, significa que la instalación se realizó correctamente.
inserte la descripción de la imagen aquí
Finalmente, configuremos el acceso remoto de Docker y habilitemos la API remota para acceder al puerto 2375, de modo que la API pueda usarse para controlar Docker.

# vim /usr/lib/systemd/system/docker.service
[Service]
ExecStart=
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix://var/run/docker.sock

Principalmente en la sección [Servicio], agregue la siguiente oración: -H tcp://0.0.0.0:2375 -H unix://var/run/docker.socky luego reinicie:

systemctl daemon-reload
systemctl restart docker

1.5 Composición de Docker

Cómo volar Docker sin Compose, ¡instálalo a continuación! También puede consultar la documentación oficial .
Primero use curl para descargar el archivo Compose al directorio /usr/local/bin:

sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

Una vez completada la descarga, aplique permisos ejecutables al archivo:

 sudo chmod +x /usr/local/bin/docker-compose

Entonces la configuración es exitosa, verifíquelo:

docker-compose --version

inserte la descripción de la imagen aquí

2. Soporte del sistema

2.1 Nginx

sudo apt install nginx
sudo systemctl status nginx

Después de la instalación, no se apresure a visitarlo. No olvide que abrimos el firewall UFW en el artículo anterior. Abramos aquí. Puede abrirlo directamente con un alias:

sudo ufw allow 'Nginx Full'

Comandos comunes de Nginx:

# 停止服务
systemctl stop nginx
# 启动服务
systemctl start nginx
# 重启服务
systemctl restart nginx
# 重新加载配置文件 
nginx -s reload -c /etc/nginx/nginx.conf

Después de modificar el archivo de configuración de Nginx, puede realizar una recarga sin reiniciar el servicio.

2.2 MySQL

sudo apt install mysql-server

Una vez completada la instalación, el servicio MySQL se iniciará automáticamente. Para verificar que el servidor MySQL se está ejecutando, ingrese:

sudo systemctl status mysql

El resultado debe mostrar que el servicio está habilitado y ejecutándose:

● mysql.service - MySQL Community Server
     Loaded: loaded (/lib/systemd/system/mysql.service; enabled; vendor preset: enabled)
     Active: active (running) since Fri 2021-08-27 11:15:38 UTC; 2 days ago
   Main PID: 1796 (mysqld)
     Status: "Server is operational"
      Tasks: 58 (limit: 76922)
     Memory: 513.4M
     CGroup: /system.slice/mysql.service
             └─1796 /usr/sbin/mysqld

Después de la instalación, puede usar el script de seguridad que viene con MySQL para configurar la seguridad:

sudo mysql_secure_installation

Luego complete la seguridad de su contraseña, la contraseña raíz y las configuraciones relacionadas en línea de acuerdo con los requisitos.

Securing the MySQL server deployment.

Connecting to MySQL using a blank password.

VALIDATE PASSWORD COMPONENT can be used to test passwords
and improve security. It checks the strength of password
and allows the users to set only those passwords which are
secure enough. Would you like to setup VALIDATE PASSWORD component?

Press y|Y for Yes, any other key for No: y
There are three levels of password validation policy:

LOW    Length >= 8
MEDIUM Length >= 8, numeric, mixed case, and special characters
STRONG Length >= 8, numeric, mixed case, special characters and dictionary                  file

Please enter 0 = LOW, 1 = MEDIUM and 2 = STRONG: 2
Please set the password for root here.
New password: 
Re-enter new password:

Una vez completada la configuración, sudo mysqlpuede ejecutarla directamente para ingresar a mysql. No es necesario que ingrese la contraseña que acaba de ingresar. Esto se debe a que el método de autenticación predeterminado de MySQL 8 es el auth_socketmétodo, no el nombre de usuario y la contraseña. Puede modificar el método de autenticación raíz en la tabla Usuario. :

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'very_strong_password';
FLUSH PRIVILEGES;

Eso sí, es recomendable que crees una nueva cuenta de administrador, que es más segura:

# 创建账户:
create user '用户名'@'访问主机' identified by '密码';

# 赋予权限:
grant 权限列表 on 数据库 to '用户名'@'访问主机' WITH GRANT OPTION; ;

Finalmente, si desea acceder de forma remota, no olvide configurar el archivo de configuración de mysql:

vim /etc/mysql/mysql.conf.d/mysqld.cnf
# 将下面这句话注释
# bind-adress = 127.0.0.1
service mysql restart

Después de reiniciar, puede acceder de forma remota.

2.3 redis

sudo apt install redis-server

Compruebe si se ejecuta con éxito:

sudo systemctl status redis-server

Para garantizar la seguridad, configuramos una contraseña aquí:

vim /etc/redis.conf
# 取消注释下面这行配置
requirepass YOUR_PASSWORD

Reinicie el servicio Redis:

systemctl restart redis-server

Aquí se recomienda un cliente de Redis gratuito y de código abierto: AnotherRedisDesktopManager , que no es peor que el RDM de pago.
inserte la descripción de la imagen aquí

2.4 Puerto

Harbor es un proyecto de registro de nivel empresarial de código abierto de VMware, cuyo objetivo es ayudar a los usuarios a crear rápidamente un servicio de registro de Docker de nivel empresarial. Se puede instalar y desplegar a través de docker-compose.
Descargue el paquete en ejecución del almacén oficial de Github: goharbor/harbor , puede descargarlo directamente con wget, o puede descargarlo en su computadora y cargarlo en el servidor.

# 解压缩包
tar xvf harbor-offline-installer-v2.3.2.tgz
# 修改配置文件
vim harbor/harbor.cfg
# hostname 设置访问地址,支持IP,域名,主机名,禁止设置127.0.0.1
hostname = reg.mydomain.com
# 访问协议,可设置 http,https
ui_url_protocol = http

# 邮件通知, 配置邮件通知。
email_identity =
email_server = smtp.mydomain.com
email_server_port = 25
email_username = [email protected]
email_password = abc
email_from = admin <[email protected]>
email_ssl = false
email_insecure = false

# harbor WEB UI登陆使用的密码
harbor_admin_password = Harbor12345

# 认证方式,这里支持多种认证方式,默认是 db_auth ,既mysql数据库存储认证。
# 这里还支持 ldap 以及 本地文件存储方式。
auth_mode = db_auth
# ldap 服务器访问地址。
ldap_url = ldaps://ldap.mydomain.com
ldap_basedn = uid=%s,ou=people,dc=mydomain,dc=com

Los ajustes de configuración se completan, ejecute el script de instalación:

sudo ./install.sh

Este script lo ayudará a generar un archivo Docker-Compose.yaml e iniciarlo automáticamente, y puede operar directamente esta composición en el futuro. Para cambiar la configuración de Harbor, primero detenga la instancia de Harbor existente y actualice harbour.cfg. Luego, ejecute prepareel script para completar la configuración y, finalmente, vuelva a crear e inicie la instancia de Harbour:

docker-compose down -v
# 注:其实上面是停止 docker-compose.yml 中定义的所有容器
vim harbor.cfg
prepare
docker-compose up -d

El servicio Docker debe iniciar sesión primero para usar Harbor:

# 镜像推送
docker login https://***.com:8001
# 查看 cat ~/.docker/config.json
# 镜像打包时候需要按一定规则 tag
docker pull nginx
docker tag nginx ***.com:8001/library/nginx:latest
docker push ***.com:8001/library/nginx
docker rmi -f ***.com:8001/library/nginx:latest

Nota: si https no está configurado, Docker no podrá iniciar sesión de forma predeterminada. Aquí debe configurarlo de acuerdo con esta publicación de blog .
Puede hacer clic en el comando de extracción directamente en la página en la imagen desplegable de Harbor:
inserte la descripción de la imagen aquí

2.5 Nexo

Aquí podemos crear directamente un archivo docker-compose.yml, la configuración es la siguiente:

version: '3.1'
services:
  nexus:
    restart: always
    image: sonatype/nexus3
    container_name: nexus
    ports:
      - 6005:8081
    volumes:
      - /data/Docker/nexus/data:/nexus-data                                         

Preste atención a reemplazar la última línea para montar el volumen con la ruta que desee y luego ejecute directamente: docker-compose up -d.

3. Aplicación básica

3.1 GitLab

Aquí hay dos situaciones: si ya tiene un almacén de GitLab y desea cambiar a un nuevo servidor, debe mantener la versión de GitLab consistente para que pueda restaurar el archivo de copia de seguridad. Si se trata de una instalación nueva, puede usar directamente la última versión de acuerdo con la documentación del sitio web oficial .

$ GITLAB_HOME = /home/docker/gitlab     # 建立gitlab本地目录
$ docker run -d \
--hostname gitlab.example.com\          # 指定容器域名,创建镜像仓库用
-p 8443:443 \                           # 容器443端口映射到主机8443端口(https)
-p 8080:80 \                            # 容器80端口映射到主机8080端口(http)
-p 2222:22 \                            # 容器22端口映射到主机2222端口(ssh)
--name gitlab \                         # 容器名称
--restart always \                      # 容器退出后自动重启
-v $GITLAB_HOME/config:/etc/gitlab \    # 挂载本地目录到容器配置目录
-v $GITLAB_HOME/logs:/var/log/gitlab \  # 挂载本地目录到容器日志目录
-v $GITLAB_HOME/data:/var/opt/gitlab \  # 挂载本地目录到容器数据目录
gitlab/gitlab-ce:latest                 # 使用的镜像:版本

Modifique el archivo de configuración:

sudo vi /home/docker/gitlab/config
# 修改完成后可以直接重启容器
docker restart gitlab

Hay demasiadas cosas que GitLab puede configurar, así que no me extenderé aquí. Hablando principalmente sobre la copia de seguridad, puede ingresar al contenedor para ejecutar: gitlab-rake gitlab:backup:createcomando, que dividirá todo el contenido en el directorio gitlab/backups/. Después de copiar a la nueva máquina, debe configurar los permisos: chomd 777 1561597102_2021_07_21_22.0.1_gitlab_backup.tar.

gitlab-ctl stop unicorn
gitlab-ctl stop sidekiq
# 例如:备份文件名为1561597102_2021_07_21_22.0.1_gitlab_backup.tar,则编号为1561597102_2021_07_21_22.0.1。
gitlab-rake gitlab:backup:restore BACKUP=备份文件编号

Una vez completada la recuperación, reinicie el contenedor directamente.

3.2 Corredor de GitLab

Aquí usamos directamente GitLab Runner para construir CI/CD, puede optar por usar Jenkins.

# 添加GitLab官方库:
 curl -L https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.deb.sh | sudo bash
# 通过命令安装
sudo apt-get install gitlab-ci-multi-runner

Esto está instalado Para obtener el tutorial específico de Gitlab Runner, consulte mi artículo: Implemente rápidamente la implementación automática del proyecto Spring Gitlab basado en Docker .

3.3 MÍNIMO

Para instalar aquí, también tenemos que usar la forma de un paquete comprimido, el documento oficial .

wget http://dl.minio.org.cn/server/minio/release/darwin-amd64/minio
chmod +x minio

Ejecución Te sugiero que puedas hacer un script de shell:

vim ./start.sh
# 复制到sh文件中
export MINIO_ACCESS_KEY=username
export MINIO_SECRET_KEY=password
nohup sudo /usr/local/minio/minio server --address=0.0.0.0:9000 --config-dir /etc/minio /data/minioData > /usr/local/minio/minio.log 2>&1&

Asigne el permiso de ejecución al usuario chmod u+x *.sh, y luego ejecútelo para que se ejecute. Puede abrir directamente el puerto 9000 para verlo.
Cliente MINIO:

wget https://dl.min.io/client/mc/release/linux-amd64/mc
chmod +x mc
./mc --help

Puede iniciar sesión en MINIO directamente a través de los siguientes comandos.

mc config host add minio http://xxx:7002 minioadmin minioadmin --api s3v4

Después de iniciar sesión correctamente, puede realizar algunas configuraciones en MINIO.

# 查看现有桶
./mc ls minio
# 设置每个桶的访问权限
mc policy set public minio/video

Ejemplo de código de Java accediendo a MINIO:

MinioClient minioClient = MinioClient.builder()
                .endpoint("http://xxx:6002")
                .credentials("minioadmin", "minioadmin")
                .build();
minioClient.putObject(
                    PutObjectArgs.builder().bucket("bucket").object(filename).stream(
                            file.getResource().getInputStream(), -1, 10485760)
                            .contentType("image/" + suffix)
                            .build());
String imageUrl = "https://xxx:6002/bucket/" + filename;

3.4 Nacos

Dado que Nacos aún no es compatible con JDK 11, ejecutamos directamente en Docker. Documentación oficial de instalación

git clone --depth 1 https://github.com/nacos-group/nacos-docker.git
cd nacos-docker
docker-compose -f example/standalone-derby.yaml up

3.5 RabbitMQ

Implemente directamente con Docker, el siguiente es el archivo de redacción:

docker run -d \
--restart=always \
--name rmqnamesrv \
-p 7008:9876 \
-v /usr/local/docker/rocketmq/namesrv/logs:/root/logs \
-v /usr/local/docker/rocketmq/namesrv/store:/root/store \
-e "MAX_POSSIBLE_HEAP=100000000" \
rocketmqinc/rocketmq \
sh mqnamesrv

docker run -d  \
--restart=always \
--name rmqbroker \
--link rmqnamesrv:namesrv \
-p 7009:7009 \
-p 10909:10909 \
-v /usr/local/docker/rocketmq/broker/logs:/root/logs \
-v /usr/local/docker/rocketmq/broker/store:/root/store \
-v /usr/local/docker/rocketmq/broker/conf/broker.conf:/opt/rocketmq-4.4.0/conf/broker.conf \
-e "NAMESRV_ADDR=namesrv:9876" \
-e "MAX_POSSIBLE_HEAP=200000000" \
rocketmqinc/rocketmq \
sh mqbroker -c /opt/rocketmq-4.4.0/conf/broker.conf

docker run -d \
--restart=always \
--name rmqadmin \
-e "JAVA_OPTS=-Drocketmq.namesrv.addr=xxx:7008 \
-Dcom.rocketmq.sendMessageWithVIPChannel=false" \
-p 6001:8080 \
pangliang/rocketmq-console-ng

Archivo de configuración del intermediario:

# 所属集群名称,如果节点较多可以配置多个
brokerClusterName = DefaultCluster
#broker名称,master和slave使用相同的名称,表明他们的主从关系
brokerName = broker-a
#0表示Master,大于0表示不同的slave
brokerId = 0
#表示几点做消息删除动作,默认是凌晨4点
deleteWhen = 04
#在磁盘上保留消息的时长,单位是小时
fileReservedTime = 48
#有三个值:SYNC_MASTER,ASYNC_MASTER,SLAVE;同步和异步表示Master和Slave之间同步数据的机制;
brokerRole = ASYNC_MASTER
#刷盘策略,取值为:ASYNC_FLUSH,SYNC_FLUSH表示同步刷盘和异步刷盘;SYNC_FLUSH消息写入磁盘后才返回成功状态,ASYNC_FLUSH不需要;
flushDiskType = ASYNC_FLUSH
# 设置broker节点所在服务器的ip地址
brokerIP1 = xxx
listenPort=7009

4. Aplicación superior

En este punto, puedes instalar lo que quieras. Lo que instalo aquí es todo el software que está fuertemente relacionado con el negocio del desarrollo. Por ejemplo, la aplicación implementada a través de GitLab Runner, el YAPI del documento de interfaz para la visualización de front-end y back-end, y el ELK de análisis de registros...

fin

Este es un artículo de registro de un servidor que acabo de instalar durante el fin de semana. Si te resulta útil, dale un pulgar hacia arriba. Si tiene alguna pregunta, puede dejar un mensaje para comunicarse ~

Supongo que te gusta

Origin blog.csdn.net/u012558210/article/details/119989794
Recomendado
Clasificación