服务器设置基础

194 阅读22分钟

服务器设置基础

这篇帖子是我很久以来就想写的。虽然解释如何设置自托管应用程序很简单,但在薄弱的基础上托管应用程序是没有意义的。每次开始都用服务器设置部分来介绍,这对我来说非常痛苦,所以我也为自己写了这篇帖子,作为如何为托管的应用程序设置服务器的参考。我将从基本的东西开始,比如用 SSH 正确登录、设置非 root 用户以及为每个应用程序创建用户。我还将介绍 NGINX 设置、一些使服务器管理更容易的优质生活工具、日志管理和基本网络安全。

SSH

首先是登录。您需要一种安全访问设备的方法。用户名和密码都不要乱用。您需要使用 SSH(安全外壳)并确保 SSH 是唯一的登录方式。为此,您需要一个 SSH 密钥和一个新用户帐户。在新配置的 VPS 上,您将以 root 身份登录,并且您需要保护 root 帐户。首先在 VPS 或远程计算机上创建一个新的常规用户,并使用以下命令将其添加到“sudo”组:

sudo adduser newuser

sudo usermod -aG sudo newuser

现在在您的本地机器上运行:

ssh-keygen -t ed25519 -C "your_email@example.com"

按照说明操作,它会询问您要将文件保存在哪里以及是否需要密码。请确保设置一个字符串。要将公钥复制到您的服务器,请在本地计算机上运行:

ssh-copy-id -i ~/.ssh/id_ed25519.pub newuser@your_server_ip

请记住,newuser@your-server-ip 是用户名和您尝试将公钥复制到的远程设备。当系统提示您输入密码时,它将是远程设备上帐户的密码,而不是您刚刚为 SSH 密钥设置的密码。验证后,它将复制公钥,您现在可以通过 SSH 登录。要关闭用户名和密码登录,请输入:

sudo nano /etc/ssh/sshd_config

找到这些值并按照您在此处看到的方式进行设置。‍

Port 2222     # Change default port (use a number between 1024 and 65535)
PermitRootLogin no                 # Disable root login
PasswordAuthentication no          # Disable password authentication
PubkeyAuthentication yes           # Enable public key authentication
AuthorizedKeysFile .ssh/authorized_keys # Specify authorized_keys file location
AllowUsers newuser                 # Only allow specific users to login

这将禁止您复制公钥的用户使用除 SSH 之外的所有登录方法。停止以 Root 身份登录,只允许您指定的用户登录。按 CTL+S 保存,按 CTL+x 退出文件编辑器。重新启动 SSH:

sudo service ssh restart

这可能会将您踢出会话。如果确实如此,这是测试其他登录方法的好时机,看看它们是否被拒绝,然后再继续。另外,不用多说,您需要妥善保管私钥,如果丢失了私钥,您将无法再远程登录。您可以使用以下方法进一步锁定您的登录:

Protocol 2                 # Use only SSH protocol version 2
MaxAuthTries 3             # Limit authentication attempts
ClientAliveInterval 300    # Client alive interval in seconds
ClientAliveCountMax 2      # Maximum client alive count

现在,让我们更深入地了解用户,看看如何利用他们来进行组织和安全。

用户

在管理 Linux 服务器时,用户非常重要。服务器管理中有一个理念,称为“最小权限原则”,这基本上意味着您希望为应用程序或进程提供完成其工作所需的最小权限。Root 拥有无限的权力,没有应用程序真正需要它。为您正在运行的应用程序创建用户可实现一些功能。如果您正在运行的应用程序受到威胁,它可以限制潜在的损害。它在运行多个应用程序时增加隔离,它有助于审核,以便您知道哪个应用程序正在使用哪些系统资源。

简而言之,用户是帮助组织系统并帮助您在出现问题时进行故障排除的好方法。要添加新用户,请运行:

sudo useradd -rms /usr/sbin/nologin -c "a comment" youruser

此命令创建一个用户并为他们提供应用程序数据的主目录,但不允许以用户身份登录。 -c 标志是可选的,但最好知道用户的用途,例如“运行 Nextcloud”或其他。使用以下命令将应用程序文件克隆到 /opt 目录中:

sudo mkdir /opt/myapp

此命令创建一个用户并为他们提供应用程序数据的主目录,但不允许以用户身份登录。 -c 标志是可选的,但最好知道用户的用途,例如“运行 Nextcloud”或其他。使用以下命令将应用程序文件克隆到 /opt 目录中:

sudo chown appuser:appuser /opt/myapp

好的,这样你的登录名就被锁定了,你应该对如何使用用户有一个大致的了解。接下来是日志。‍

日志

日志对于系统管理至关重要。它们跟踪系统运行状况、帮助解决问题和检测威胁。因此,您需要设置适当的日志轮换,以便它们不会占用系统太多空间,而且更易于阅读和管理。要设置适当的日志轮换,您需要编辑位于 /etc 中的 logrotate.conf 文件。单个应用程序配置通常存储在 /etc/logrotate.d/ 中,因此 NGINX 的示例配置如下所示:

/var/log/nginx/*.log {
    weekly
    missingok
    rotate 52
    compress
    delaycompress
    notifempty
    create 0640 www-data adm
    sharedscripts
    postrotate
        [ -f /var/run/nginx.pid ] && kill -USR1 `cat /var/run/nginx.pid`
    endscript
}

此配置每周轮换一次日志,保留 52 周的日志,压缩旧日志,使用正确的权限创建新日志,然后向 NGINX 发出信号,在轮换后重新打开日志文件。您可以使用以下命令进行测试:

sudo logrotate -d /etc/logrotate.conf

这将显示它在不实际旋转日志的情况下会做什么。完成所有这些设置后,您可以开始执行更高级的操作,例如根据日志条目触发警报。现在,这对于单个服务器来说很好,但如果您管理多个服务器,最好研究一下 Grafana Loki、Graylog 和 Fluentd 等工具。我不会在这里详细介绍,但如果您想提高您的日志水平,这些都是不错的起点。‍

备份

备份,更重要的是测试备份,在服务器管理中极其重要。请记住:只有经过测试的备份才算是备份。未经测试的备份基本上是无用的。

备份主要有三种类型。完整、差异、增量。完整备份是磁盘上所有数据的完整副本。占用的资源最多,但最容易恢复。差异备份会备份自上次完整备份以来的所有更改,它是兼顾空间和恢复速度的备份中间策略。增量备份会备份自上次备份以来更改的数据,这是最快的备份选项,但恢复起来可能最复杂。

我是这样想的。我使用增量备份来备份照片和文档或经常编辑的项目文件和文件夹。我将使用完整备份来备份整个服务器或磁盘。我将使用差异备份来备份完整的文件夹,如 /etc、/opt 和日志文件夹。

现在存储怎么样?如果您遵循 3-2-1 规则,那么您将大获成功。3 份数据副本、2 种存储类型和 1 个异地备份。我想说,如果这看起来太多了,那么“异地”存储是最重要的,不能忽略。如果发生灾难性的崩溃,拥有一个包含备份的硬盘是非常宝贵的。异地/离线备份还可以使您免受勒索软件的侵害。所以请记住这一点。市面上有大量的备份软件。此链接[1]用于探索一些更专业的备份工具。此链接[2]具有文件同步、传输和云存储解决方案。我使用 sync-thing、Borg 备份和传统的 FTP 的组合。

请记住,备份、日志和服务器监控是一个根据您的需求不断发展的过程。您实施的具体策略应根据您的需求和数据的关键性量身定制。

基本网络安全

保护服务器的下一步是锁定不需要暴露给互联网的端口,并禁止那些试图登录但不应该登录的东西。UFW 和 Fail2Ban 是两种广泛使用的工具。它们简单易用,UFW 允许您为端口设置流量规则,而 Fail2Ban 将在 IP 地址敲击不应该的端口或在某些预定义规则后登录失败时禁止 IP 地址。UFW 或简单的防火墙通常预装在许多 VPS 服务上,Fail2Ban 也是如此,但如果您使用的是新机器并且不确定,请运行:

sudo apt install ufw

sudo apt install fail2ban

UFW

我们稍后再考虑 Fail2Ban,现在让我们专注于 UFW 设置。首先运行一些默认策略:

sudo ufw default deny incoming
 
sudo ufw allow outgoing

这被认为是最佳实践,因为它遵循了我之前提到的“最小权限”理念。它减少了机器的攻击面,并让您精确控制您暴露的内容。简而言之,这种配置在安全性和功能性之间创造了平衡。您的服务器可以根据需要连接到互联网,但外部实体只能以您明确允许的方式连接到您的服务器。现在让我们允许一些东西进来。‍

sudo ufw allow ssh
sudo ufw allow 80
sudo ufw allow 443

如果您要运行 Web 服务器,则需要打开端口 80 和端口 443。80 是 HTTP,443 是 HTTPS。默认情况下,端口 22 是 SSH,如果您更改了此设置,则需要指定端口,而不是使用“allow ssh”命令。以下是其他一些有用的命令:

#List rules with numbers:
sudo ufw status numbered
#Delete by number:
sudo ufw delete NUMBER
#Delete by rule specification:
sudo ufw delete allow 80
#You can allow connections from specific IP addresses:
sudo ufw allow from 192.168.1.100
#You can also only allow an IP to connect to a specfic port with: 
sudo ufw allow from 192.168.1.100 to any port 22
#If you neeed to allow a range of ports: 
sudo ufw allow 6000:6007/tcp
#To further protect from brut force attacks you can rate limit specific ports with: 
sudo ufw limit ssh
#This would limit port 22 to 6 connections in 30 seconds from a single IP. To see the status of the firewall you can use: 

#Adding this goves you more info
sudo ufw status verbose
#and to reset incase you need to start over: 
sudo ufw reset
#and to enable and disable: 
sudo ufw enable 
sudo ufw disable 

#finaly to enable logging and adjusting the log level: 
sudo ufw logging on
sudo ufw logging medium # levels are low, medium, high, full 

现在转到 Fail2Ban。

Fail2Ban

主要配置:

sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local

sudo nano /etc/fail2ban/jail.local

jail.local 部分的 [DEFAULT] 部分中有:

bantime = 10m
findtime = 10m
maxretry = 5

封禁时间是 IP 被封禁的时间。查找时间是 Fail2Ban 查找重复失败的时间范围,最大重试次数是 IP 被封禁前的失败次数。您可以根据需要调整这些。您还可以设置自定义监狱,Fail2Ban 还支持 SSH 等常用服务的监狱。您可以采取更多步骤,但我认为这涵盖了基础知识。

NGINX

您可以使用一些 Web 服务器。Apache、Caddy、nginx、IIS 等。我使用 Nginx。这是我所了解的,而且它工作得非常好。Nginx(发音为 engine-x)是一个 Web 服务器、反向代理和负载均衡器。作为 Web 服务器,它擅长提供静态内容,并且可以以相当低的资源使用率处理大量并发连接。作为反向代理,它可以位于您的应用程序服务器前面并将流量转发给它们,同时确保应用程序的安全性。它的负载平衡方面可以有效地平衡服务器之间的流量,提高可靠性和可扩展性。

通过 apt 安装时,nginx 的默认位置是 /etc/nginx/nginx.conf 主要用于全局服务器配置,包括 /etc/nginx/sites-enabled 文件夹中的文件。这种模块化结构可以轻松管理多个站点。需要注意的两个文件夹是 sites-enabled 文件夹和 sites-available 文件夹。您可以将可用站点视为测试站点配置的暂存位置,而启用的站点则用于实时站点和应用。一种常见的做法是在可用站点中的站点中设置和测试您的配置,然后在您准备好上线并获得 SSL 证书时,将文件链接到启用站点的文件夹。您可以使用以下方法执行此操作:

ln -s /etc/nginx/sites-available/yoursitefile /etc/nginx/sites-enabled

然后重新加载 nginx 并使用以下命令仔细检查 nginx 状态:

sudo systemctl reload nginx

sudo systemctl status nginx

您的网站现在应该可以上线了。

下面,我将向您展示一些样板 Nginx 网站配置。请务必查看您的应用或网站需求,因为这些只是起点。对于静态网站来说,这是一个不错的起点。 

基本静态网站配置:

server {
    listen 80;
    listen [::]:80;
    server_name example.com www.example.com;
    root /var/www/example.com/html;
    index index.html index.htm;
    location / {
        try_files $uri $uri/ =404;
    }
    # Security headers
    add_header X-Frame-Options "SAMEORIGIN" always;
    add_header X-XSS-Protection "1; mode=block" always;
    add_header X-Content-Type-Options "nosniff" always;
    add_header Referrer-Policy "no-referrer-when-downgrade" always;
    add_header Content-Security-Policy "default-src 'self' http: https: data: blob: 'unsafe-inline'" always;

    # Logging
    access_log /var/log/nginx/example.com.access.log;
    error_log /var/log/nginx/example.com.error.log warn;

    # SSL configuration (uncomment after running Certbot)
    # listen 443 ssl http2;
    # listen [::]:443 ssl http2;
    # ssl_protocols TLSv1.2 TLSv1.3;
    # ssl_prefer_server_ciphers on;
    # ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;

    # Certbot will add its own SSL certificate paths
    # ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    # ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
}

代理通行证配置:

server {
    listen 80;
    listen [::]:80;
    server_name app.example.com;
    location / {
        proxy_pass http://localhost:3000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
    # Security headers
    add_header X-Frame-Options "SAMEORIGIN" always;
    add_header X-XSS-Protection "1; mode=block" always;
    add_header X-Content-Type-Options "nosniff" always;
    add_header Referrer-Policy "no-referrer-when-downgrade" always;
    add_header Content-Security-Policy "default-src 'self' http: https: data: blob: 'unsafe-inline'" always;

    # Logging
    access_log /var/log/nginx/app.example.com.access.log;
    error_log /var/log/nginx/app.example.com.error.log warn;

    # SSL configuration (uncomment after running Certbot)
    # listen 443 ssl http2;
    # listen [::]:443 ssl http2;
    # ssl_protocols TLSv1.2 TLSv1.3;
    # ssl_prefer_server_ciphers on;
    # ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;

    # Certbot will add its own SSL certificate paths
    # ssl_certificate /etc/letsencrypt/live/app.example.com/fullchain.pem;
    # ssl_certificate_key /etc/letsencrypt/live/app.example.com/privkey.pem;
}

WebSocket 升级配置:

server {
    listen 80;
    listen [::]:80;
    server_name ws.example.com;
    location / {
        proxy_pass http://localhost:8080;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
    # Security headers
    add_header X-Frame-Options "SAMEORIGIN" always;
    add_header X-XSS-Protection "1; mode=block" always;
    add_header X-Content-Type-Options "nosniff" always;
    add_header Referrer-Policy "no-referrer-when-downgrade" always;
    add_header Content-Security-Policy "default-src 'self' http: https: data: blob: 'unsafe-inline'" always;

    # WebSocket timeout settings
    proxy_read_timeout 300s;
    proxy_send_timeout 300s;
    # Logging
    access_log /var/log/nginx/ws.example.com.access.log;
    error_log /var/log/nginx/ws.example.com.error.log warn;

    # SSL configuration (uncomment after running Certbot)
    # listen 443 ssl http2;
    # listen [::]:443 ssl http2;
    # ssl_protocols TLSv1.2 TLSv1.3;
    # ssl_prefer_server_ciphers on;
    # ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;

    # Certbot will add its own SSL certificate paths
    # ssl_certificate /etc/letsencrypt/live/ws.example.com/fullchain.pem;
    # ssl_certificate_key /etc/letsencrypt/live/ws.example.com/privkey.pem;
}

基本配置用于服务一个简单的静态站点。它指定域名,在端口 80 上监听 IPv4 和 IPv6,设置站点的根目录,使用 try_files 配置错误处理,添加一些基本的标头以防止常见的 Web 漏洞,设置访问和错误的日志记录,并包含一个注释掉的 SSL 部分。大多数 SSL 配置将由 certbot 处理,但其中有几行添加了一些 SSL 安全性,可以在运行 certbot 后取消注释。
‍代理传递配置类似于基本配置,但它不是直接提供文件,而是将请求代理到本地应用程序(在本例中,在端口 3000 上运行)。

第三个配置文件面向需要网站连接的应用程序,它与代理传递配置非常相似,但有一些更改以允许 Web 套接字。  

好吧,如果不谈论 SSL,任何关于 Web 服务器的内容都是不完整的。对于普通用途,certbot 是平民最好的朋友。它是免费的,它很快,而且它他妈的工作得很好。我使用 certbot 的 Python 版本。你可以使用以下命令安装它 :

sudo apt install certbot python3-certbot-nginx

安装完成后,您只需在终端中运行“certbot”,它将检测您 sites-enabled 文件夹中的配置并询问您要执行的操作(续订、重新颁发等)。按照说明操作,certbot 会为您提供非常简单明了的操作。‍
因此,现在 certbot 在获取新证书时会为您设置自动续订,因此这是一项无需担心的任务。但为了确保它有效,您可以运行:

sudo systemctl status certbot.timer

如果一切正常,并且您正在使用 systemd,那么一切就都好了。‍

生活质量工具

关于使系统管理更容易的工具,我将介绍一些我在服务器上使用的工具,我认为它们使管理变得更好。我不会深入介绍任何工具。所有这些都是可选的,没有特定的顺序。我在终端宝库 (terminal trove)[3]网站上找到了许多这些工具,如果你和我一样是个终端迷,这个网站值得一看。 

第一个工具是Btop[4] ,这是我的个人必备清单之一。Btop 是一个资源终端监视器。它以视觉效果显示机器的 CPU、RAM、磁盘、网络和运行状况的使用情况。它是用 C++ 编写的,可以通过大多数包管理器安装。 

对于具有大量外部连接(即 nostr 中继)的服务器,像Neoss[5]这样的工具会很有帮助。Neoss 旨在取代通常的 ss 命令以供基本使用。它提供了正在使用的 TCP 和 UDP 套接字及其各自的统计信息列表。与 SS 原始输出相比,它的主要优势在于其清晰简单的 TUI(终端用户界面),可让您对连接到您的机器的内容进行排序、刷新和导航。它通过 NPM 安装,这意味着您需要安装 JavaScript。GoAccess

是[6]一个基于终端的 Web 服务器日志分析器。它非常适合在终端中快速实时查看日志,但它也可以生成实时 HTML、JSON 和 CSV 报告。GoAccess 可以通过大多数包管理器安装,适用于所有平台。 

列表中的下一个是MC 或“午夜指挥官”[7]它是一个功能强大的基于文本的文件管理器,具有双面板显示和许多用于操作文件和目录的功能。它也是跨平台的,可以通过大多数包管理器安装。 

在同一个服务器文件管理线程中的是NCDU[8]。这个在我的必备清单中。它是一个磁盘使用情况分析器,旨在查找占用空间大的问题。它速度快,使用非常简单。它可以安装在大多数系统和包管理器上。Windows 需要安装 Linux 子系统才能使用它。 

希望您能从中找到一些用处。我想谈的最后一个主题是 DNS,这是一个有点话题,所以我不会进行深入探讨,但如果您是自行托管,那么掌握一些 DNS 基础知识会有所帮助。 ing 不起作用。

DNS

DNS 或域名系统是我们所知的互联网运作的核心部分。喜欢它或讨厌它,如果你想访问更广泛的互联网,这就是我们必须使用的东西。(我不喜欢它现在的样子,但我不会在这里打开这个潘多拉魔盒。)基本上,将 DNS 视为电话簿。它允许你在每次需要搜索互联网时输入 duckduckgo.com 而不是“52.250.42.157”。它将人类容易记住的东西转换成计算机实际访问“duckduckgo.com”所需的信息。

如果你在 VPS 上托管,你真正需要知道的唯一事情是在决定使用哪个域后知道如何将 A 记录指向你服务器的 IP。几乎所有的 VPS 主机都可以为你提供静态 IP,所以这主要是设置和忘记类型的交易。

在家托管会带来一些挑战。一个突出的挑战是(也是我经常听到的一个有效问题)没有静态 IP 地址。如今,随着需要 IP 地址的在线设备数量的增加,我们不得不进行大量的调整,除非您向 ISP 付费,否则大多数 IP 地址都是动态分配的。但有一个解决方案。答案是动态 DNS 或 DDNS。这允许每次 IP 地址更改时自动更新 DNS 服务器。设置动态 DNS 的方法有很多种。您可以托管自己的服务或使用主机。以下是一些主机和项目的链接,[9]您可以查看。

简而言之,它的工作原理如下。您选择提供商或设置自己的提供商。您获得一个域,在您的家庭路由器或服务器上安装客户端,客户端会定期检查 IP 地址是否已更改,如果是,它会更新该域的 DNS 记录。 

Docker

我不会在这里介绍如何安装 docker。无论如何,最好遵循官方安装[10]指南。但我想谈谈几件事。首先,docker 对于测试新应用程序非常有用。但这就是我所了解的。我个人不太喜欢使用 docker,如果可能的话,我会直接运行应用程序。以下是一些需要记住的利弊。

Docker 的优点

一致性是一个很大的问题,它可以使开发、测试和部署之间的事情更加一致,如果您的系统可以运行docker,那么您就可以运行大多数docker应用程序。它可以帮助隔离,减少应用程序之间的冲突。在某些情况下,它可以帮助提高效率,因为它比传统的虚拟机占用更少的资源。它可以帮助扩展,因为启动更多容器非常容易,而且微服务架构很有用,因为您可以将应用程序分解为更小的可管理服务,从而允许独立扩展所述服务。最后,社区很大,所以文档很好,社区支持总是有帮助的,此外还有各种随时可用的docker镜像可供部署。

Docker 缺点

我先从开销开始。虽然它比传统的虚拟机更好,但它使用的资源比直接在主机上运行某些东西要多,而且 I/O 操作可能会更慢。docker 共享系统内核这一事实意味着受损的应用程序可能会影响系统。持久数据是可行的,但增加了一层复杂性,可能会导致新用户的数据丢失,这也使备份变得更加复杂。使用 docker 的网络也可能更加复杂,使其不那么简单。值得注意的是,如果您使用 UFW 或 Firewalld 作为防火墙,docker 会绕过这些规则。Docker 仅与 iptables 兼容。此外,虽然管理良好的 docker 容器可以帮助管理服务器资源,但管理不当也会损害资源。容器可能会变得太大,影响磁盘大小,配置错误可能会使用太多的服务器资源。在监控和调试应用程序时,尤其是在跨多个容器时,它还会增加额外的复杂性。

归根结底,这是你的系统。但我想列出使用 Docker 的一些利弊。继续。 

包起来

好了,服务器设置和工具的基础知识就这些了。我编写了一个脚本,[11]可以帮您完成大部分工作。我编写它是为了让我自己的服务器设置更快。您可以在这里获取它,它包括我所有必备的东西,并进行了一些基本配置。根据您自己的需要进行调整,并像往常一样保持安全。

原文:becomesovran.com/blog/server…

引用链接

[1] 此链接: github.com/awesome-fos…
[2] 此链接: github.com/awesome-sel…
[3] 终端宝库 (terminal trove): terminaltrove.com/
[4] Btop: terminaltrove.com/btop/
[5] Neoss: terminaltrove.com/neoss/
[6] 是: github.com/allinurl/go…
[7] MC 或“午夜指挥官”: terminaltrove.com/mc/
[8] NCDU: dev.yorhel.nl/ncdu
[9] 以下是一些主机和项目的链接,: dynamic.domains/dynamic-dns…
[10] 官方安装: docs.docker.com/engine/inst…
[11] 我编写了一个脚本,: git.sovbit.dev/Enki/sovran…