使用 Docker Compose 部署邮件服务器

news2024/12/26 11:36:23

使用 Docker Compose 部署邮件服务器

很多时候为了方便, 我们都直接使用第三方邮箱进行收发邮件。 但第三方邮箱有些要求定期修改密码,有些限制发邮箱的次数, 对于一些个人和企业来说, 有自己的域名和服务器为什么不自己搭建一个邮件服务器呢?因此, 笔者在这记录自己学习并且搭建邮箱服务器的步骤与过程。 本文主要使用 docker-mailserver 进行搭建, 其中一些资料和链接, 有需要详细了解的, 请查看参考文献

博主博客

  • https://blog.uso6.com
  • https://blog.csdn.net/dxk539687357

注: 如果有需要查看 docker docker compose 的安装, 可在笔者博客中搜索相关教程, 在这里就不进行赘述。

一、安装 docker-mailserver

1.1 创建目录文件

位置自己定, 我这里指定 ~/mailserver/ 目录。

mkdir ~/mailserver/

目录结构图是这样, 其中 compose.yamlmailserver.env 文件需要准备好, docker-data 是运行容器后自动生成的, 不需要管。

mailserver
├─compose.yaml
├─mailserver.env
└─docker-data

1.2 compose.yaml 配置文件

使用 wget 下载 compose.yaml 文件

wget -P ~/mailserver/ "https://raw.githubusercontent.com/docker-mailserver/docker-mailserver/master/compose.yaml"

把文件中的 hostname 修改为自己的域名, 比如我的是 mail.uso6.com

services:
  mailserver:
    image: ghcr.io/docker-mailserver/docker-mailserver:latest
    container_name: mailserver
    # Provide the FQDN of your mail server here (Your DNS MX record should point to this value)
    hostname: mail.uso6.com
    env_file: mailserver.env
    # More information about the mail-server ports:
    # https://docker-mailserver.github.io/docker-mailserver/latest/config/security/understanding-the-ports/
    # To avoid conflicts with yaml base-60 float, DO NOT remove the quotation marks.
    ports:
      - "25:25"    # SMTP  (explicit TLS => STARTTLS, Authentication is DISABLED => use port 465/587 instead)
      - "143:143"  # IMAP4 (explicit TLS => STARTTLS)
      - "465:465"  # ESMTP (implicit TLS)
      - "587:587"  # ESMTP (explicit TLS => STARTTLS)
      - "993:993"  # IMAP4 (implicit TLS)
    volumes:
      - ./docker-data/dms/mail-data/:/var/mail/
      - ./docker-data/dms/mail-state/:/var/mail-state/
      - ./docker-data/dms/mail-logs/:/var/log/mail/
      - ./docker-data/dms/config/:/tmp/docker-mailserver/
      - /etc/localtime:/etc/localtime:ro
    environment:
      - ENABLE_RSPAMD=1
      - ENABLE_CLAMAV=1
      - ENABLE_FAIL2BAN=1
    restart: always
    stop_grace_period: 1m
    # Uncomment if using `ENABLE_FAIL2BAN=1`:
    cap_add:
      - NET_ADMIN
    healthcheck:
      test: "ss --listening --tcp | grep -P 'LISTEN.+:smtp' || exit 1"
      timeout: 3s
      retries: 0
  • ENABLE_CLAMAV 病毒扫描。默认关闭。会占用大量的服务器资源,默认关闭。0:关闭 1:开启
  • ENABLE_FAIL2BAN 封锁尝试暴力破解的IP地址。默认关闭。0:关闭 1:开启 如果启用 Fail2Ban

1.3 mailserver.env 配置文件

使用 wget 下载 mailserver.env 文件

wget -P ~/mailserver/ "https://raw.githubusercontent.com/docker-mailserver/docker-mailserver/master/mailserver.env"

具体参数配置可以查看 这里。

1.4 运行

进入 ~/mailserver/ 目录, 然后启动容器。

# 启动容器
docker compose up -d
# 关闭容器
docker compose down

二、对 docker-mailserver 进行管理

在启动容器时, 使用 docker ps 查看容器的 ID

CONTAINER ID   IMAGE                                                COMMAND                  CREATED          STATUS                    PORTS                                                                                                                                                                                                                       NAMES
318bbf389f9c   ghcr.io/docker-mailserver/docker-mailserver:latest   "/usr/bin/dumb-init …"   31 seconds ago   Up 30 seconds (healthy)   0.0.0.0:25->25/tcp, :::25->25/tcp, 0.0.0.0:143->143/tcp, :::143->143/tcp, 0.0.0.0:465->465/tcp, :::465->465/tcp, 0.0.0.0:587->587/tcp, :::587->587/tcp, 110/tcp, 995/tcp, 0.0.0.0:993->993/tcp, :::993->993/tcp, 4190/tcp   mailserver

可以使用下面命令查看帮助。

docker exec -it <CONTAINER NAME> setup help

比如我上面的 ID318bbf389f9c

[nukix@nukixPC mailserver]# docker exec -it 318bbf389f9c setup help
SETUP(1)

NAME
    setup - 'docker-mailserver' Administration & Configuration CLI

SYNOPSIS
    setup [ OPTIONS... ] COMMAND [ help | ARGUMENTS... ]

    COMMAND := { email | alias | quota | dovecot-master | config | relay | debug } SUBCOMMAND

DESCRIPTION
    This is the main administration command that you use for all your interactions with
    'docker-mailserver'. Initial setup, configuration, and much more is done with this CLI tool.

    Most subcommands can provide additional information and examples by appending 'help'.
    For example: 'setup email add help'

[SUB]COMMANDS
    COMMAND email :=
        setup email add <EMAIL ADDRESS> [<PASSWORD>]
        setup email update <EMAIL ADDRESS> [<PASSWORD>]
        setup email del [ OPTIONS... ] <EMAIL ADDRESS> [ <EMAIL ADDRESS>... ]
        setup email restrict <add|del|list> <send|receive> [<EMAIL ADDRESS>]
        setup email list

    COMMAND alias :=
        setup alias add <EMAIL ADDRESS> <RECIPIENT>
        setup alias del <EMAIL ADDRESS> <RECIPIENT>
        setup alias list

    COMMAND quota :=
        setup quota set <EMAIL ADDRESS> [<QUOTA>]
        setup quota del <EMAIL ADDRESS>

    COMMAND dovecot-master :=
        setup dovecot-master add <USERNAME> [<PASSWORD>]
        setup dovecot-master update <USERNAME> [<PASSWORD>]
        setup dovecot-master del [ OPTIONS... ] <USERNAME> [ <USERNAME>... ]
        setup dovecot-master list

    COMMAND config :=
        setup config dkim [ ARGUMENTS... ]

    COMMAND relay :=
        setup relay add-auth <DOMAIN> <USERNAME> [<PASSWORD>]
        setup relay add-domain <DOMAIN> <HOST> [<PORT>]
        setup relay exclude-domain <DOMAIN>

    COMMAND fail2ban :=
        setup fail2ban 
        setup fail2ban ban <IP>
        setup fail2ban unban <IP>
        setup fail2ban log
        setup fail2ban status

    COMMAND debug :=
        setup debug fetchmail
        setup debug login <COMMANDS>
        setup debug show-mail-logs

EXAMPLES
    setup email add test@example.com
        Add the email account test@example.com. You will be prompted
        to input a password afterwards since no password was supplied.

    setup config dkim keysize 2048 domain 'example.com,not-example.com'
        Creates keys of length 2048 for the domains in comma-seperated list.
        This is necessary when using LDAP as the required domains cannot be inferred.

    setup config dkim help
        This will provide you with a detailed explanation on how to use the 
        config dkim command, showing what arguments can be passed and what they do.

可以看出添加账号使用命令

docker exec -it <CONTAINER NAME> setup email add user@example.com

那么, 我需要添加一个 test@uso6.com 密码为 12345678 的邮箱则使用

docker exec -it 318bbf389f9c setup email add test@uso6.com 12345678

查看邮箱列表

docker exec -it 318bbf389f9c setup email list

三、常用的邮箱协议和端口

3.1 发送邮件协议和端口

3.1.1 非加密端口

25端口(SMTP):25 端口为 SMTP(Simple Mail Transfer Protocol,简单邮件传输协议) 服务所开放的,是用于发送邮件。如今绝大多数邮件服务器都使用该协议。当你给别人发送邮件时,你的机器的某个动态端口(大于1024)就会与邮件服务器的 25 端口建立一个连接,你发送的邮件就会通过这个连接传送到邮件服务器上,保存起来。

3.1.2 加密端口

465端口(SMTP SSL):465 端口是为 SMTP SSL(SMTP-over-SSL) 协议服务开放的,这是 SMTP 协议基于 SSL 安全协议之上的一种变种协议,它继承了 SSL 安全协议的非对称加密的高度安全可靠性,可防止邮件泄露。SMTPSSMTP 协议一样,也是用来发送邮件的,只是更安全些,防止邮件被黑客截取泄露,还可实现邮件发送者抗抵赖功能。防止发送者发送之后删除已发邮件,拒不承认发送过这样一份邮件。

587端口STARTTLS 协议的 属于 TLS 通讯协议 只是他是在 STARTTLS 命令执行后才对之后的原文进行保护的。

3.2 接收邮件协议和端口

3.2.1 非加密端口

143端口(IMAP):143 端口是为 IMAP(INTERNET MESSAGE ACCESS PROTOCOL) 服务开放的,是用于接收邮件的。

110端口(POP3):110 端口是为 POP3(Post Office Protocol Version 3,邮局协议3) 服务开放的,是用于接收邮件的。

3.2.2 加密端口

993端口(IMAP SSL):993 端口是为 IMAP SSL(IMAP-over-SSL) 协议服务开放的,这是 IMAP 协议基于 SSL 安全协议之上的一种变种协议,它继承了 SSL 安全协议的非对称加密的高度安全可靠性,可防止邮件泄露。 IMAPSIMAP 协议一样,也是用来接收邮件的,只是更安全些,防止邮件被黑客截取泄露,还可实现邮件接收方抗抵赖功能。防止收件者收件之后删除已收邮件,拒不承认收到过这样一封邮件。

995端口(POP3 SSL):995 端口是为 POP3 SSSL(POP3-over-SSL) 协议服务开放的,这是 POP3 协议基于 SSL 安全协议之上的一种变种协议,它继承了 SSL 安全协议的非对称加密的高度安全可靠性,可防止邮件泄露。 POP3SPOP3 协议一样,也是用来接收邮件的,只是更安全些,防止邮件被黑客截取泄露,还可实现邮件接收方抗抵赖功能。防止收件者收件之后删除已收邮件,拒不承认收到过这样一封邮件。

3.3 IMAP 与 POP3 的区别

POP3 协议允许电子邮件客户端下载服务器上的邮件, 但是在客户端的操作(如移动邮件、标记已读等), 不会反馈到服务器上。

IMAP 协议提供 webmail 与电子邮件客户端之间的双向通信, 客户端的操作都会反馈到服务器上, 对邮件进行的操作, 服务器上的邮件也会做相应的动作。

四、防火墙配置(这里针对 iptables)

建议放行 25587465993 端口。

[nukix@nukixPC mailserver]# vim /etc/sysconfig/iptables

-A INPUT -p tcp --dport 25 -j ACCEPT
-A INPUT -p tcp --dport 587 -j ACCEPT
-A INPUT -p tcp --dport 465 -j ACCEPT
-A INPUT -p tcp --dport 993 -j ACCEPT

使用 systemctl restart iptables 重启 iptables 防火墙。

五、生成 DKIM 签名

使用下面命令进行生成签名

docker exec -it <CONTAINER NAME> setup config dkim

使用下面命令获取签名公钥, 记得路径中的域名替换成你自己的

[nukix@nukixPC mailserver]# cat ~/mailserver/docker-data/dms/config/opendkim/keys/uso6.com/mail.txt

mail._domainkey IN      TXT     ( "v=DKIM1; h=sha256; k=rsa; "
        "p=MIIBIjANBgkqhkiG9w0BAQEFACAQ8AMIIBCgKCAQEAaH5KuPYPSF3Ppkt466BDMAFGOA4mgqn4oPjZ5BbFlYA9l5jU3bgzRj3l6/Q1n5a9lQs5fNZ7A/HtY0aMvs3nGE4oi+LTejt1jblMhV/OfJyRCunQBIGp0s8G9kIUBzyKJpDayk2+KJSJt/lxL9Iiy0DE5hIv62ZPP6AaTdHBAsJosLFeAzuLFHQ6USyQRojefqFQtgYqWQ2JiZQ3"
        "iqq3bD/BVlwKRp5gH6TEYEmx8EBJUuDxrJhkWRUk2VDl1fqhVBy8A9O7Ah+85nMrlOHIFsTaYo9o6+cDJ6t1i6G1gu+bZD0d3/3bqGLPBQV9LyEL1Rona5V7TJBGg099NQkTz1IwIDAQAB" )  ; ----- DKIM key mail for uso6.com

六、配置域名 DNS 解析

x.x.x.x 代表部署邮件服务器的 IP, DKIM 不会拼接的可以看我上面跟下面怎么拼接成即可。

Type		Name				IPv4 address
A			mail				x.x.x.x
MX			@					mail.uso6.com
TXT			@					v=spf1 mx -all
TXT			mail._domainkey		v=DKIM1; h=sha256; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFACAQ8AMIIBCgKCAQEAaH5KuPYPSF3Ppkt466BDMAFGOA4mgqn4oPjZ5BbFlYA9l5jU3bgzRj3l6/Q1n5a9lQs5fNZ7A/HtY0aMvs3nGE4oi+LTejt1jblMhV/OfJyRCunQBIGp0s8G9kIUBzyKJpDayk2+KJSJt/lxL9Iiy0DE5hIv62ZPP6AaTdHBAsJosLFeAzuLFHQ6USyQRojefqFQtgYqWQ2JiZQ3iqq3bD/BVlwKRp5gH6TEYEmx8EBJUuDxrJhkWRUk2VDl1fqhVBy8A9O7Ah+85nMrlOHIFsTaYo9o6+cDJ6t1i6G1gu+bZD0d3/3bqGLPBQV9LyEL1Rona5V7TJBGg099NQkTz1IwIDAQAB

其中 MX 记录需要指向 A 地址。

  • v=spf1 表示这是 SPF 记录的版本号,目前只有一个版本
  • mx 表示授权由域名对应的 MX 记录中列出的 IP 地址发送邮件
  • SoftFail 和 HardFail 是两种策略,用于指定未经授权的发件人邮件如何处理
    • ~all 宽容策略。如果发件人的 IP 地址不在 SPF 记录中指定的允许列表中,那么收件方的邮件服务器不会拒绝该邮件,而是将该邮件标记为“软失败”,并将其放入接收方的垃圾邮件文件夹或者标记为垃圾邮件。
    • -all 严格策略。如果发件人的IP地址不在 SPF 记录中指定的允许列表中,那么收件方的邮件服务器会拒绝该邮件,并将其退回给发件人或者直接删除

更多的 SPF 语法规则可以看这里 http://www.open-spf.org/SPF_Record_Syntax/。

设置 PTR 记录(或者叫 rDNS),可以通过 IP 地址反向解析出邮箱域名。 不设置也没关系,但是会被某些服务器标记为垃圾邮件。

rDNS 主要在控制台进行配置, 比如我用的是 CloudConeVPS, 如下图所示。
CloudCone rDNS

DNS添加DMARC记录(可选)

DMARC(Domain-based Message Authentication, Reporting, and Conformance)是一种邮件验证技术,它可以帮助域名所有者控制其域名下的邮件发送,防止电子邮件被伪造和滥用。DMARC 是 SPF 和 DKIM 的补充,可以对 SPF 和 DKIM 的验证结果进行汇总和分析,并指定如何处理未经验证或验证失败的邮件。
1.DMARC生成器
2.ruaruf 的邮箱地址要正确,用于接收邮件头和邮件体等相信信息以及邮件被拒绝的原因,并进行必要的调整。

邮件相关DNS配置规范

关于DNS解析配置一些深入理解,尤其针对邮件服务器的配置,上述提到的spf, dkim, dmarc等, 有兴趣可以查看:

  • dns mx: https://www.cloudflare.com/learning/dns/dns-records/dns-mx-record/
  • dns txt: https://www.cloudflare.com/learning/dns/dns-records/dns-txt-record/
  • dns dkim: https://www.cloudflare.com/learning/dns/dns-records/dns-dkim-record/
  • dns dmarc: https://www.cloudflare.com/learning/dns/dns-records/dns-dmarc-record/
  • dns spf: https://www.cloudflare.com/learning/dns/dns-records/dns-spf-record/
  • dns: https://www.cloudflare.com/learning

七、SSL 证书配置

这里就放一段官方的配置, 跟 nginxSSL 配置差不多, 看不懂的话可以先看看我另外一篇文章 通过阿里云域名服务让 nginx 配置 SSL

volumes:
  - /usr/syno/etc/certificate/_archive/<your-folder>/:/tmp/dms/custom-certs/
environment:
  - SSL_TYPE=manual
  - SSL_CERT_PATH=/tmp/dms/custom-certs/fullchain.pem
  - SSL_KEY_PATH=/tmp/dms/custom-certs/privkey.pem

八、注意

阿里云 安全违规行为类型说明 里面规定要稍微注意一下。

未经阿里云授权报备,不得将云产品用作邮箱服务器或用于连接第三方邮箱服务器。

违规具体情形:未经阿里云授权报备,不得将云产品(包括但不限于ECS,弹性Web托管,云虚拟主机等)用作邮箱服务器或用于连接第三方邮箱服务器。

九、在线测试网站

1.MX Toolbox
2.DMARC Analyzer
3.mail-tester.com
4.multiRBL.valli.org
5.internet.nl

十、发送/接收邮件

docker-mailserver 没有提供图形化界面进行发送与接收邮件, 所以需要借助第三方邮箱。在这推荐使用 eM Client, 用这个邮件客户端的主要原因在于如果连接有问题,它会给出一些提示。

参考文献

  • docker-mailserver GitHub 地址
  • docker-mailserver 官网
  • 目前为止最详细的教程:搭建自己的邮箱服务器|Docker-Mailserver详细教程|避坑指南
  • docker-mailserver 搭建邮件服务器

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1564760.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

PEFT-LISA

LISA是LoRA的简化版&#xff0c;但其抓住了LoRA微调的核心&#xff0c;即LoRA侧重更新LLM的底层embedding和顶层head。 根据上述现象&#xff0c;LISA提出两点改进&#xff1a; 始终更新LLM的底层embedding和顶层head随机更新中间层的hidden state 实验结果 显存占用 毕竟模型…

ZKP价值链路的垂直整合

1. ZKP proof生命周期 从ZKP&#xff08;zero-knowledge proof&#xff09;生命周期&#xff0c;先看围绕ZKP的价值链路形成&#xff1a; 1&#xff09;User intent用户意图&#xff1a;以某用户意图为起点&#xff0c;如想要在某zk-rollup上swap某token、证明其身份、执行某…

HarmonyOS 和 OpenHarmony

HarmonyOS 和 OpenHarmony 支持的 shell 命令不同&#xff0c;因此有时候需要做一做区分&#xff0c;目前有些文档上没有标注&#xff0c;因此可能产生歧义。 HarmonyOS 支持 getprop&#xff1a; getprop hw_sc.build.os.apiversion # 查看API版本OpenHarmony 上支持 param…

华为ensp中ospf多区域管理 原理及配置命令(详解)

作者主页&#xff1a;点击&#xff01; ENSP专栏&#xff1a;点击&#xff01; ————前言———— OSPF 多区域的主要作用是缩小链路状态数据库和路由表的规模&#xff0c;减少路由更新的频率&#xff0c;提高网络的可扩展性&#xff0c;实现路由过滤和路由汇总&#xff0…

Java多线程实战-从零手搓一个简易线程池(三)线程工厂,核心线程与非核心线程逻辑实现

&#x1f3f7;️个人主页&#xff1a;牵着猫散步的鼠鼠 &#x1f3f7;️系列专栏&#xff1a;Java全栈-专栏 &#x1f3f7;️本系列源码仓库&#xff1a;多线程并发编程学习的多个代码片段(github) &#x1f3f7;️个人学习笔记&#xff0c;若有缺误&#xff0c;欢迎评论区指正…

使用ARCore深度API实现点云采集

一、深度API 本小节内容摘自ARCore官方文档。 ARCore 深度API Depth API 可助力实现对象遮挡、提升沉浸感和新颖的互动体验&#xff0c;从而增强 AR 体验的真实感。 在下图中&#xff0c;右侧画面是采用深度API进行遮挡后的效果&#xff0c;与左侧图相比更加真实。 深度值 给…

【热门话题】WebKit架构简介

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 WebKit架构简介一、引言二、WebKit概览1. 起源与发展2. 模块化设计 三、WebCore…

补充知识

补充知识1 内存的本质是对数据的临时存储 内存与磁盘进行交互时&#xff0c; 最小单位是4kb叫做页框(内存)和页帧(磁盘) 也就是&#xff0c; 如果我们要将磁盘的内容加载到内存中&#xff0c; 可是文件大小只有1kb&#xff0c; 我们也要拿出4kb来存他&#xff0c; 多余的就直…

element-ui card 组件源码分享

今日简单分享 card 组件源码&#xff0c;主要从以下两个方面&#xff1a; 一、card 组件页面结构 二、card 组件属性 2.1 header 属性&#xff0c;设置 header&#xff0c;也可以通过 slot#header 传入 DOM&#xff0c;类型 string&#xff0c;无默认值。 组件使用部分&#…

Redis.配置文件

基础篇Redis 6.1.2 .配置文件 spring:redis:host: 192.168.150.101port: 6379password: 123321lettuce:pool:max-active: 8 #最大连接max-idle: 8 #最大空闲连接min-idle: 0 #最小空闲连接max-wait: 100ms #连接等待时间6.1.3.测试代码 SpringBootTest class RedisDemo…

Android 360度全景图功能

方法一&#xff1a;OpenGL ES 1.在build.gradle文件中添加依赖 allprojects {repositories {maven { url https://jitpack.io }} } 高版本AS中settings.gradle.kts&#xff1a; dependencyResolutionManagement {repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_RE…

增强Java技能:使用OkHttp下载www.dianping.com信息

在这篇技术文章中&#xff0c;我们将探讨如何使用Java和OkHttp库来下载并解析www.dianping.com上的商家信息。我们的目标是获取商家名称、价格、评分和评论&#xff0c;并将这些数据存储到CSV文件中。此外&#xff0c;我们将使用爬虫代理来绕过任何潜在的IP限制&#xff0c;并实…

构建第一个JS应用(FA模型)

创建JS工程 若首次打开DevEco Studio&#xff0c;请点击Create Project创建工程。如果已经打开了一个工程&#xff0c;请在菜单栏选择File > New > Create Project来创建一个新工程。选择Application应用开发&#xff08;本文以应用开发为例&#xff0c;Atomic Service对…

Mybatis——一对多关联映射

一对多关联映射 一对多关联映射有两种方式&#xff0c;都用到了collection元素 以购物网站中用户和订单之间的一对多关系为例 collection集合的嵌套结果映射 创建两个实体类和映射接口 package org.example.demo;import lombok.Data;import java.util.List;Data public cla…

【Linux】进程管理(2):进程控制

一、进程创建&#xff1a;fork函数 我们在命令行中输入man fork 即可得到fork函数的函数接口的函数的使用方法。 我们可以看到&#xff0c;fork函数位于man手册的第2部分&#xff0c;由于第2部分通常是用于描述系统调用和库函数&#xff0c;所以我们可以了解到fork函数实际是一…

鸿蒙南向开发案例:【智能养花机】

样例简介 智能养花机通过感知花卉、盆栽等植宠生长环境的温度、湿度信息&#xff0c;适时为它们补充水分。在连接网络后&#xff0c;配合数字管家应用&#xff0c;用户可远程进行浇水操作。用户还可在应用中设定日程&#xff0c;有计划的按日、按周进行浇水。在日程中用户可添…

HBase详解(1)

HBase 简介 概述 HBase是Yahoo!公司开发的后来贡献给了Apache的一套开源的、分布式的、可扩展的、基于Hadoop的非关系型数据库(Non-Relational Database)&#xff0c;因此HBase并不支持SQL(几乎所有的非关系型数据库都不支持SQL)&#xff0c;而是提供了一套单独的命令和API操…

基于tensorflow和kereas的孪生网络推理图片相似性

一、环境搭建 基础环境&#xff1a;cuda 11.2 python3.8.13 linux ubuntu18.04 pip install tensorflow-gpu2.11.0 验证&#xff1a;# 查看tensorflow版本 import tensorflow as tf tf.__version__ # 是否能够成功启动GPU from tensorflow.python.client import device_lib pr…

【HTML】制作一个简单的动态SVG图形

目录 前言 开始 HTML部分 CSS部分 效果图 总结 前言 无需多言&#xff0c;本文将详细介绍一段HTML和CSS代码&#xff0c;该代码用于创建一个动态的SVG图形&#xff0c;具体内容如下&#xff1a; 开始 首先新建文件夹&#xff0c;创建两个文本文档&#xff0c;其中HTML的文…

数据可视化看板大屏-全屏组件#记录

记录一下&#xff0c;最近工作中经常大屏项目&#xff0c;现记录一下封装的看板大屏全屏组件。 一、以下是大屏全屏组件代码 <template><div :class"{full-box:true,active-full:isFull,quit-full:!isFull}" :style"${isActiveFull? position: fi…