[{"content":"Mailu是一个简单但功能齐全的邮件服务器，通过一套Docker镜像来组织服务。当然它是自由软件。该项目提供了一个易于设置、易于维护和功能齐全的邮件服务器，同时不提供专有软件中经常出现的无关功能。\n建议以开发者给出的文档为主要参考，本文仅作为补充。本文安装的版本是1.9稳定版。写下本文时，podman-compose还不能正确解析mailu的docker-compose.yml文件中的子网设置部分，因此除非后续podman-compose更新解决这一问题，否则不要用podman来替代docker。安装docker的方法此处略过。\n配置DNS 访问域名供应商或者DNS服务供应商。向DNS中添加A类记录。a.b.c.d是服务器的地址。\nmail.mydomain.com. IN A a.b.c.d 再添加一条MX类记录，指向服务器mail.mydomain.com。\nmydomain.com. IN MX 10 mail.mydomain.com. 再访问VPS供应商，写入一条rDNS记录。rDNS记录是从IP地址a.b.c.d到域名mail.mydomain.com的反向解析，因此需要通过VPS供应商来设置。\n配置防火墙 通过SSH连接到服务器后，首先配置防火墙。可以选择安装ufw来间接配置或者直接配置iptables，我觉得ufw更加方便。配置防火墙需要以root身份或使用sudo。\nufw自带了根据应用预设的防火墙配置，需要打开其中的OpenSSH、Nginx Full、Mail submission、SMTP、POP3、POP3S、IMAP、IMAPS。注意OpenSSH一定要打开，否则会和服务器丢失连接，如果修改过SSH的端口，也要记得打开相应端口。除了以上预设配置外，需要额外开启端口465用于TLS的SMTP通信、端口587用于STARTLS的SMTP通信，端口5432用于Mailu从其容器中访问Postgresql。ufw添加规则的方法如下。\n添加预设规则（如Mail submission）：\nsudo ufw allow \u0026quot;Mail submission\u0026quot; 打开指定端口（如465）的TCP功能：\nsudo ufw allow 465/tcp 添加后使用以下命令查看规则。\nsudo ufw status numbered 根据以上命令列出的规则编号删除规则。比如删除11号规则：\nsudo ufw delete 11 以上命令删除多个规则时，不能一次填写多个编号。由于删除规则后规则编号会变化，需要重新查看规则编号，修改后再次执行以上命令。\n设置好规则后激活生效。\nsudo ufw enable 安装和配置Postgresql 为了方便，我也使用docker来安装postgresql数据库管理软件。以下的配置里Postgresql的容器和Mailu的容器运行在同一个服务器上。\n使用docker时需要以root身份或使用sudo，本文中的docker相关操作都通过sudo运行。为了方便之后的配置，这里最好使用默认端口号5432。注意替换POSTGRES_PASSWORD=your-password部分。\nsudo docker run -it --name postgresql-default --restart always -e POSTGRES_PASSWORD=your-password -v /srv/postgresql-data:/var/lib/postgresql/data -e POSTGRES_INITDB_ARGS=\u0026quot;--data-checksums\u0026quot; -p 5432:5432 postgres 连接到docker中配置数据库\nsudo docker exec -it postgresql-default psql -U postgres -d postgres 之后创建mailu用户和相应的数据库。注意替换my_secure_pass部分。\npostgres=# create user mailu; postgres=# alter user mailu password 'my_secure_pass'; postgres=# create database mailu owner mailu; postgres=# \\c mailu mailu=# create extension citext; mailu=# \\q 注意记录数据库用户mailu的密码。由于Mailu服务的各个容器位于另一个子网中，为了Mailu能够顺利访问数据库，需要设置Postgresql的访问权限。\n在当前目录创建pg_hba.conf文件，其中的内容类似于：\n# TYPE DATABASE USER ADDRESS METHOD # \u0026quot;local\u0026quot; is for Unix domain socket connections only local all all trust # IPv4 local connections: host all all 127.0.0.1/32 trust # IPv6 local connections: host all all ::1/128 trust # Allow replication connections from localhost, by a user with the # replication privilege. local replication all trust host replication all 127.0.0.1/32 trust host replication all ::1/128 trust host mailu mailu 172.17.0.0/16 md5 注意将类似host all all all scram-sha-256的部分删除，阻止其他远程访问请求。限定除了本机通信外（如127.0.0.1/32和::1/128），只有用户mailu能从Docker的网段172.17.0.0/16访问数据库mailu。 然后将配置文件覆盖到Postgresql的容器中并重启数据库。\nsudo docker cp ~/pg_hba.conf postgresql-default:/var/lib/postgresql/data/pg_hba.conf sudo docker restart postgresql-default 为了验证数据库可用，可以尝试在服务器的Shell中尝试连接到数据库。\npsql -U mailu -d mailu -h 127.0.0.1 生成Mailu配置文件 Mailu的开发者们提供了一个Web应用来生成配置文件。开发者提供了配置建议，非常方便。需要注意的是 TLS certificates 、Database preferences 和 IPv4 listen address 选项。\n由于我打算使用外置的Nginx服务器作为反向代理，因此 TLS certificates 可以选择 mail 或者 mail-letsencrypt 。这两个选项意味着将Web的TLS交给反向代理服务器来处理，Mailu的Web服务只需处理HTTP协议的通信，而IMAP、POP、SMTP的TLS还是由Mailu来处理。选项 mail 意味着使用手动安装的证书，需要在 Mailu storage path 项目里填写的目录下创建 certs 文件夹，并在其中安装证书文件cert.pem和密钥文件key.pem。当然也可以在之后生成的mailu.env文件中通过变量TLS_CERT_FILENAME和TLS_KEYPAIR_FILENAME来更改这两个文件的名称。如果选择mail-letsencrypt，则Mailu服务会自动申请并安装证书。服务器上没有其他占用80和443端口的服务时，可以不使用反向代理，此时这里可以选择letsencrypt。\n如果和我一样使用外置的Postgresql数据库管理软件，则在Database preferences中选择postgresql并填写上一步里配置的信息即可。注意在数据库的地址栏中要填写数据库的真实地址，不要填写127.0.0.1。也不要添加端口号，如果在地址里添加了端口号（如1.1.1.1:5432），会导致后续解析数据库地址时出错，因此之前配置数据库时建议不要更改默认端口。\nMailu的开发者建议在 IPv4 listen address 中填写实际的IPv4地址。注意在此处填写实际IPv4地址时，Nginx的配置需要做针对性修改，在下文中将会说明。\n为了方便使用，我选择安装了WebUI（对应选项WebMail）和管理员后台AdminUI。在WebMail处可以根据喜好选择两种不同风格的UI。\n根据提示填写完所有信息后，点击生成按钮。此时根据跳转后页面中Step1的提示，创建项目文件夹并下载生成的配置文件docker-compose.yml和mailu.env。此时先不要按Step3操作。\n配置Nginx服务器 由于服务器上会运行各不相同的服务，相应的配置也千差万别，因此本节仅说明配置Nginx作为反向代理时可能出错的地方。如果不想使用反向代理，可以直接跳过这一节。\n首先修改之前生成并下载到本地的配置文件docker-compose.yml。找到# Core services部分，修改容器中的80和443在服务器上对应的端口，比如我改为了8080和8443。这样就不会和监听80和443端口的Nginx冲突。修改后的ports前两行如下：\nports: - \u0026quot;x.x.x.x:8080:80\u0026quot; - \u0026quot;x.x.x.x:8443:443\u0026quot; 修改mailu.env文件中的REAL_IP_HEADER和REAL_IP_FROM部分。x.x.x.x替换为服务器真实IPv4地址。\nREAL_IP_HEADER=X-Real-IP REAL_IP_FROM=x.x.x.x 此处给出Nginx配置文件的一种写法，更多的配置模板请参考文档。修改Nginx配置后需要重新加载Nginx服务。\nserver { listen 443 ssl http2 reuseport; server_name mail.yourdomain.com; charset utf-8; # ssl ssl_protocols TLSv1.2 TLSv1.3; ssl_prefer_server_ciphers on; ssl_session_cache shared:SSL:40m; ssl_session_timeout 5m; ssl_session_tickets off; ssl_certificate /path/to/fullchain.pem; ssl_certificate_key /path/to/privkey.pem; # OCSP stapling ssl_stapling on; ssl_stapling_verify on; add_header Strict-Transport-Security \u0026quot;max-age=63072000\u0026quot;; location / { proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header WL-Proxy-SSL true; proxy_set_header X-Forwarded-For $remote_addr; client_max_body_size 64M; proxy_pass http://a.b.c.d:8080; } } server_name处需要根据之前的DNS记录填写，ssl_certificate和ssl_certificate_key处需要填写SSL证书的路径。如果还没有证书，可以通过acme.sh获取证书。此处略过获取证书的过程。\nlocation中的proxy_set_header参照以上例子填写即可。但需要特别注意proxy_pass后需要填写服务器的真实IPv4地址，而不能填写127.0，0，1之类的地址，后续遇到502错误时可以重点检查此处的信息是否填写正确。\n安装和运行Mailu容器 确认配置文件无误后按照Step3的提示进入项目目录并启动服务。\ncd /srv/mailu sudo docker-compose -p mailu up -d 服务启动后添加管理员用户，以adminuser为例。\nsudo docker-compose -p mailu exec admin flask mailu admin adminuser yourdomain.com PASSWORD 参照Step3的说明，PASSWORD处的初始密码可以在之后进入管理界面修改。如果在添加用户这一步报错，并提示无法访问Postgresql，需要检查Postgresql的访问设置pg_hba.conf和防火墙的设置。先关闭Mailu服务。\nsudo docker-compose -p mailu down 修改相关设置后重启服务。\nsudo docker-compose -p mailu up -d 如果添加用户过程中出现过错误，需要删除Postgresql中的数据库mailu并按照上文中的方法新建数据库mailu，否则会遇到Postgresql找不到域(Domain)的错误。\n之后可以添加一个普通用户（比如myuser）来测试收发邮件是否正常。\nsudo docker-compose exec admin flask mailu user myuser yourdomain.com 'password123' 用网页访问mail.mydomain.com，登陆后即可测试相关功能。\n维护服务器 后续维护和功能设置可以参考文档。\n","date":"2022-10-05T00:00:00Z","image":"/p/%E5%AE%89%E8%A3%85%E5%92%8C%E9%85%8D%E7%BD%AE%E7%94%B5%E5%AD%90%E9%82%AE%E4%BB%B6%E6%9C%8D%E5%8A%A1%E7%AB%AF%E8%BD%AF%E4%BB%B6-mailu/mailu_webui.png","permalink":"/p/%E5%AE%89%E8%A3%85%E5%92%8C%E9%85%8D%E7%BD%AE%E7%94%B5%E5%AD%90%E9%82%AE%E4%BB%B6%E6%9C%8D%E5%8A%A1%E7%AB%AF%E8%BD%AF%E4%BB%B6-mailu/","title":"安装和配置电子邮件服务端软件 Mailu"},{"content":"最近打算向身边的朋友推广开源通信软件和开放的通信协议，因此打算自建一个稳定好用的通信服务。XMPP和Matrix是目前较为流行的两个开放的、支持端对端加密的通信协议。 我个人其实更喜欢XMPP，因为它有成熟且资源占用更小的服务端软件，能够在很少资源的VPS上承载很大的通信流量（省钱）。 但是支持XMPP的客户端除了Android平台上Conversations之外少有美观好用的，桌面端更是如此。另外我身边的朋友们更喜欢Element的跨平台的一致体验和Matrix更丰富的功能，所以我最终选择Matrix协议。\nMatrix官方的Go语言服务端Dendrite相比官方的Python服务端Synapse更加高效，且占用资源更少，但目前还处于Beta阶段且缺少很多功能。虽然Synapse在用户加入规模大的群聊时会占用很多的内存，但胜在稳定和功能全面，资料丰富，而且我的服务器仅用于小规模的朋友之间的通信，不太可能遇到加入规模大的群聊的情况。因此，为了朋友们有更好的体验以便推广开源开放的通信软件，我选择部署Synapse。\nAnsible是一个自动化的运维工具。通过热心开发者提供的Ansible Playbook ，我能方便地自动化部署Matrix服务端软件Synapse和其他相关服务。\n除了配置SSH时需要登陆到VPS上操作，其余操作均在本地完成。\n获取Playbook 通过git下载仓库。通过本地的包管理器下载安装Ansible。\ngit clone https://github.com/spantaleev/matrix-docker-ansible-deploy.git 设置DNS 默认的DNS设置 主要的两条DNS记录。由于我需要matrix服务器来托管基础域名，因此还需要将基础域名地址指向matrix服务器。\nType Host Priority Weight Port Target A matrix - - - matrix-server-IP CNAME element - - - matrix.\u0026lt;your-domain\u0026gt; 其他DNS设置 我需要配置dimension用于插件管理，stats用于查看服务器状态，ntfy用于消息推送。\nType Host Priority Weight Port Target SRV _matrix-identity._tcp 10 0 443 matrix.\u0026lt;your-domain\u0026gt; CNAME dimension - - - matrix.\u0026lt;your-domain\u0026gt; CNAME jitsi - - - matrix.\u0026lt;your-domain\u0026gt; CNAME stats - - - matrix.\u0026lt;your-domain\u0026gt; CNAME goneb - - - matrix.\u0026lt;your-domain\u0026gt; CNAME sygnal - - - matrix.\u0026lt;your-domain\u0026gt; CNAME ntfy - - - matrix.\u0026lt;your-domain\u0026gt; CNAME hydrogen - - - matrix.\u0026lt;your-domain\u0026gt; CNAME cinny - - - matrix.\u0026lt;your-domain\u0026gt; CNAME buscarron - - - matrix.\u0026lt;your-domain\u0026gt; 根据需求修改配置文件 创建配置文件 在 inventory/host_vars中建立以matrix.\u0026lt;your-domain\u0026gt;为名的文件夹。复制模板到该文件夹cp examples/vars.yml inventory/host_vars/matrix.\u0026lt;your-domain\u0026gt;/vars.yml。根据模板中的注释填入基本的配置信息。\n复制模板（cp examples/hosts inventory/hosts）并根据自己的服务器SSH信息修改hosts文件。\n配置 Synapse 修改inventory/host_vars/matrix.DOMAIN/vars.yml文件。\n配置workers实现负载均衡，对每个支持的服务类型都使用workers matrix_synapse_workers_enabled: true matrix_synapse_workers_preset: one-of-each\n禁用 Element 由于我的服务器不打算提供 Web APP，因此禁用Element，也不开启 Hydrogen 和 Cinny。\n修改inventory/host_vars/matrix.DOMAIN/vars.yml文件。\nmatrix_client_element_enabled: false 配置 Synapse Admin 修改inventory/host_vars/matrix.DOMAIN/vars.yml文件。\nmatrix_synapse_admin_enabled: true Synapse Admin需要Synapse的Admin APIs来运行，添加该配置项后会自动开放相关API。\n配置用于存储媒体文件的对象存储 修改inventory/host_vars/matrix.DOMAIN/vars.yml文件。\nmatrix_s3_media_store_enabled: true matrix_s3_media_store_bucket_name: \u0026quot;your-bucket-name\u0026quot; matrix_s3_media_store_aws_access_key: \u0026quot;access-key-goes-here\u0026quot; matrix_s3_media_store_aws_secret_key: \u0026quot;secret-key-goes-here\u0026quot; matrix_s3_media_store_custom_endpoint_enabled: true matrix_s3_media_store_custom_endpoint: \u0026quot;your-custom-endpoint\u0026quot; 配置SSL证书 如果使用集成的Nginx，那么该 Ansible playbook 会根据配置文件中指定开启的服务来自动获取各个服务或插件对应域名的SSL证书。因此我这里仅仅指定证书的加密算法。\nmatrix_ssl_lets_encrypt_key_type: ecdsa 基础域名服务 由于运行Synapse的联邦发现服务需要服务器委托（在基础域名下提供/.well-known/matrix/*等文件）。相比较为麻烦的自建网页服务器方案，我选择通过matrix集成的网页服务器来托管基础域名。\n修改inventory/host_vars/matrix.DOMAIN/vars.yml文件。\nmatrix_nginx_proxy_base_domain_serving_enabled: true 由于我需要使用自定义的主页，因此需要额外添加以下配置： matrix_nginx_proxy_base_domain_homepage_enabled: false\n有了这个配置，Ansible就不会再处理/matrix/nginx-proxy/data/matrix-domain/index.html文件。 然后，可以将任何静态网站文件上传到/matrix/nginx-proxy/data/matrix-domain。更复杂的网站建议使用自建网页服务器的方案。\nTURN 服务器 为了方便客户端能在 NAT-ed 网络环境中视频/语音通话，需要配置 TURN 服务器。默认情况下该 Ansible playbook 会自动配置，因此无需额外配置。\n遥测数据 该 Ansible playbook 会自动配置为不发送服务器的使用情况，因此无需额外配置。\n更改联邦通信的端口到443 修改此项内容会导致matrix-nginx-proxy.service服务因为443端口被docker-pr占用而无法正常启动，故暂时不配置此项内容。\n为了防止可能的DOS/DDOS攻击，我需要使用CDN。将用于联邦通信的端口改到443后，将能正常使用CDN。\n修改inventory/host_vars/matrix.DOMAIN/vars.yml文件。\nmatrix_synapse_http_listener_resource_names: [\u0026quot;client\u0026quot;,\u0026quot;federation\u0026quot;] matrix_federation_public_port: 443 matrix_synapse_federation_port_enabled: false 以下修改是为了适应一些CDN而做出的，可以先尝试一下，看看在设置以下内容为true的情况下，联邦通信是否工作。如果不行再修改为false。\nmatrix_synapse_tls_federation_listener_enabled: true 邮件设置 可以通过matrix_mailer_sender_address变量来指定Matrix服务的发件人。默认为matrix@\u0026lt;your-domain-name\u0026gt;，这里我保持默认。\n身份服务 我的服务不打算开启ma1sd身份服务，因此不额外配置。\n设置反垃圾信息服务 修改inventory/host_vars/matrix.DOMAIN/vars.yml文件。\nmatrix_synapse_ext_spam_checker_synapse_simple_antispam_enabled: true matrix_synapse_ext_spam_checker_synapse_simple_antispam_config_blocked_homeservers: - example.com - another.com 防火墙设置 需要开放的端口有80和443用于Web,8448用于联邦通信,3478、5349、49152-49172用于TURN。如果配置了其他服务，其他可能用到端口可以在服务启动后通过docker ps命令查看。\n安装 运行以下命令安装：\nansible-playbook -i inventory/hosts setup.yml --tags=setup-all 安装过程中可能需要输入SSH登陆信息。\nNotes:\n如果你 不使用 SSH keys 来登陆服务器, 而是使用一般的密码，那在ansible-playbook指令后添加--ask-pass。 如果你 使用 SSH keys 来登陆服务器, 并且 登陆用户不是root，而是能使用sudo的用户，你可能需要在ansible-playbook指令后添加 -K (--ask-become-pass) 来让Ansible运行特权指令。 检查服务是否正确安装 运行以下命令开启服务：\nansible-playbook -i inventory/hosts setup.yml --tags=start 在Federation Tester上输入你的服务器域名后可以测试联邦通信服务是否正常工作。\n运行以下命令检查服务：\nansible-playbook -i inventory/hosts setup.yml --tags=self-check 创建用户 接下来的很多组件需要用到已有的账户，因此在配置安装这些组件前需要先创建他们。通过以下命令可以创建账户：\nansible-playbook -i inventory/hosts setup.yml --extra-vars='username=\u0026lt;your-username\u0026gt; password=\u0026lt;your-password\u0026gt; admin=\u0026lt;yes|no\u0026gt;' --tags=register-user 通过以下命令可以获取账户的访问令牌：\ncurl -X POST --header 'Content-Type: application/json' -d '{ \u0026quot;identifier\u0026quot;: { \u0026quot;type\u0026quot;: \u0026quot;m.id.user\u0026quot;, \u0026quot;user\u0026quot;: \u0026quot;YourBotUsername\u0026quot; }, \u0026quot;password\u0026quot;: \u0026quot;YourBotPassword\u0026quot;, \u0026quot;type\u0026quot;: \u0026quot;m.login.password\u0026quot; }' 'https://matrix.YOURDOMAIN/_matrix/client/r0/login' 注意修改 YourBotUsername, YourBotPassword, 和 YOURDOMAIN 为合适的值。\n配置安装其他组件 设置 Dimension 创建名为dimension的非管理员用户，并获取令牌。\n修改inventory/host_vars/matrix.DOMAIN/vars.yml文件。\nmatrix_dimension_enabled: true matrix_dimension_admins: - \u0026quot;@dimension:{{ matrix_domain }}\u0026quot; matrix_dimension_access_token: \u0026quot;YOUR ACCESS TOKEN HERE\u0026quot; 服务器运行情况图表 修改inventory/host_vars/matrix.DOMAIN/vars.yml文件。\nmatrix_prometheus_enabled: true # You can remove this, if unnecessary. matrix_prometheus_node_exporter_enabled: true # You can remove this, if unnecessary. matrix_prometheus_postgres_exporter_enabled: true matrix_grafana_enabled: true matrix_grafana_anonymous_access: false # This has no relation to your Matrix user id. It can be any username you'd like. # Changing the username subsequently won't work. matrix_grafana_default_admin_user: \u0026quot;some_username_chosen_by_you\u0026quot; # Changing the password subsequently won't work. matrix_grafana_default_admin_password: \u0026quot;some_strong_password_chosen_by_you\u0026quot; 默认的管理员账户和密码与matrix服务器的账户无关，自行选择设置即可。安装后可登陆https://stats.DOMAIN查看服务器资源占用情况和历史数据。\n设置注册机器人 matrix-registration-bot 出于安全和服务器承载能力的考虑，我不打算开放注册。因此需要工具来管理邀请令牌。matrix-registration缺乏维护且存在bug，因此我选择部署matrix-registration-bot服务。 创建一个管理员用户，名称不限，并获取令牌。该服务默认使用的管理员账户名称是@bot.matrix-registration-bot:DOMAIN。\n修改inventory/host_vars/matrix.DOMAIN/vars.yml文件，添加以下内容。\nmatrix_bot_matrix_registration_bot_enabled: true # Token obtained via logging into the bot account (see above) matrix_bot_matrix_registration_bot_bot_access_token: \u0026quot;syt_bW9hbm9z_XXXXXXXXXXXXXr_2kuzbE\u0026quot; # Enables registration matrix_synapse_enable_registration: true # Restrict registration to users with a token matrix_synapse_registration_requires_token: true 如果需要用自定义的管理员账户，添加\nmatrix_bot_matrix_registration_bot_matrix_user_id_localpart: XXX 该服务安装完成后，创建一个非加密的聊天室，邀请你创建的机器人的账号进入该聊天室。注意不要直接查找机器人账号后开启聊天，这种方式创建的聊天室是加密的，机器人无法在加密的聊天室中使用。\n在该聊天室中发送help命令即可了解详细的使用方法。\n其他信息可以查看 使用说明.\n如果更换过机器人的账户或者机器人账户的令牌，再次部署前需要删除/matrix/matrix-registration-bot/data/session.txt，否则会部署失败。\nReCaptcha验证 本次使用的Ansible Playbook对于Synapse只支持Google的ReCaptcha，如果使用Dendrite的话额外支持hCapcha。因此我只能选择部署ReCaptcha服务。\n首先需要通过以下链接申请ReCaptcha的公钥和私钥。\nhttp://www.google.com/recaptcha/admin\n注意reCAPTCHA类型要选择 第2版 和 “进行人机身份验证”复选框。\n之后复制公钥（发送给用户）和私钥（用于Synapse服务器和Google的reCAPTCHA服务器之间通信）。\n修改inventory/host_vars/matrix.DOMAIN/vars.yml文件，添加以下内容。\nmatrix_synapse_enable_registration_captcha: true matrix_synapse_recaptcha_public_key: 'YOUR_SITE_KEY' matrix_synapse_recaptcha_private_key: 'YOUR_SECRET_KEY' 备份 borg backup TODO 推送服务 ntfy是一个使用UnifiedPush标准的推送服务器，可以替代Google的FCM或者Apple的APN服务。\n修改inventory/host_vars/matrix.DOMAIN/vars.yml文件，添加以下内容。\n# Enabling it is the only required setting matrix_ntfy_enabled: true # Some other options matrix_server_fqn_ntfy: \u0026quot;ntfy.{{ matrix_domain }}\u0026quot; matrix_ntfy_configuration_extension_yaml: | log_level: DEBUG 再次配置服务 修改配置文件后运行以下命令再次配置服务。\nansible-playbook -i inventory/hosts setup.yml --tags=setup-all,start 更新服务 用git pull更新仓库后阅读changelog，确认配置文件无误后运行以下命令。\nansible-playbook -i inventory/hosts setup.yml --tags=setup-all,ensure-matrix-users-created,start 总结 虽然研究如何修改Ansible Playbook花费了不少时间，但修改完成后的自动部署就非常方便了，输入部署命令后只需要开着终端等待就行。刚开始因为一些配置问题导致部署失败，但根据软件仓库的issue信息找到问题并解决了。目前大部分有关Matrix服务器的教程都没有用到Ansible，因此我记录下我的部署过程作为参考，希望能给读者提供另一种部署Matrix服务的思路。固然直接部署灵活性更高，且如果仅仅部署Synapse本体，花费时间未必比使用Ansible多，但如果需要部署大量配套服务，还是Ansible更加方便省力。个人认为这个Ansible Playbook的唯一问题就是部署时间长，在单核VPS上每次部署都要等待20分钟以上。\n补充 2022-12-28：\n如果在MacOS下运行Ansible时可能会在配置PostgreSQL时遇到crypt.crypt not supported on Mac OS X/Darwin错误，按提示安装Python包py-passlib； 由于matrix-docker-ansible-deploy项目的更新，老用户的inventory/host_vars/matrix.\u0026lt;your-domain\u0026gt;/vars.yml文件中的matrix_postgres_开头的模块需要替换为devture_postgres_开头才能正常使用，新用户不受影响。 ","date":"2022-08-12T00:00:00Z","image":"/p/%E9%80%9A%E8%BF%87-ansible-playbook-%E5%AE%89%E8%A3%85%E5%92%8C%E9%85%8D%E7%BD%AE-matrix-%E6%9C%8D%E5%8A%A1%E7%AB%AF%E8%BD%AF%E4%BB%B6-synapse/element_Login_en.png","permalink":"/p/%E9%80%9A%E8%BF%87-ansible-playbook-%E5%AE%89%E8%A3%85%E5%92%8C%E9%85%8D%E7%BD%AE-matrix-%E6%9C%8D%E5%8A%A1%E7%AB%AF%E8%BD%AF%E4%BB%B6-synapse/","title":"通过 Ansible playbook 安装和配置 Matrix 服务端软件 Synapse"},{"content":"概述 高效的经济管理系统只能建立在以下三个部分正确组合的基础上：\n组织 经济机制 信息处理 60年代进行的评估表明，高效地管理苏联经济需要不少于每秒3亿次算术计算的算力（0.3GOPS）。但如果认为仅仅依靠高算力的计算机就能解决所有经济管理问题那就大错特错了。高效的经济管理系统只能建立在人机系统对话的基础上。在经济管理系统发展的任何阶段，都需要人来制定管理的目标和任务、评价解决方案并赋予这些方案法律效力。\n解决经济管理问题需要数千名专家的对话，其中的大部分需要处理系统低层次的连接问题，这需要中心化的和去中心化原则的合理组合。也就是说，国家计算网络中心需要在苏联全境被建立。\n全国经济管理系统并不能简单地理解为自动收集处理信息和相应地数学模型。更重要的是在系统中人的关系的组织和人机交互控制模型。\n科学革命快速提高了经济管理的复杂性。 主要体现在以下四个方面：\n产品多样性的提高 产品生产复杂性和产品生产技术的明显增长 急剧加速的产品换代 对技术进步的管理提出了新的任务 优化经济管理的每一步都比前一步更难。\n确定计划经济的复杂性需要先考虑一类不依赖于管理组织结构的任务——客观物质流（可以被称为客观需求。这类任务包括何时、何地需要生产什么数量，何时、何地从哪里获取哪些种类和什么数量的计划生产所需的物质技术保障。这类任务的复杂度取决于逼近最优化结果的准确度：如果确定一个合理的近似，我们就能分析任务的复杂度。如果能制定一些指标，我们能更快计算出结果。\n如果不考虑企业之间的联系，那么管理任务的复杂度和产品总量之间是线性关系。由于在经济增长条件下更快提高了企业之间的联系，管理复杂度增长会比产品数量的增长更快。与此同时，劳动力的增长也比产品总量的增长速度慢。因此很明显管理任务的复杂性增长速度一直比参与经济活动的人的增长速度快。有研究表明管理任务的复杂度增长速度是参与经济活动的人的增长速度的平方关系，因此在技术革命的时代管理任务的复杂度总会超过处理信息的人的能力。这个时刻被称为“第二信息瓶颈”。（第一信息瓶颈指的是管理经济的复杂度超过一个人的处理能力。克服第一信息障碍引入了商品市场来扩展参与经济活动的管理人员（消费者通过购买行为向生产者传递信息）。但是最理想的经济和组织机制也没有办法越过第二信息瓶颈。只有在自动化控制的过程中才能有提高劳动生产率的措施。\n第一章 经济管理任务的总体说明 ","date":"2022-03-11T00:00:00Z","permalink":"/p/%E5%AE%8F%E8%A7%82%E7%BB%8F%E6%B5%8E%E6%A8%A1%E5%9E%8B%E4%B8%8Eogas%E7%BB%84%E5%BB%BA%E5%8E%9F%E5%88%99%E8%AF%BB%E4%B9%A6%E7%AC%94%E8%AE%B0/","title":"《宏观经济模型与OGAS组建原则》读书笔记"}]