月度归档: 2022 年 3 月

  • 红帽8.X添加EPEL源

    RHEL以及他的衍生发行版如CentOS、Scientific Linux为了稳定,官方的rpm repository提供的rpm包往往是很滞后的,虽然滞后,但提供了超长的维护周期,当然了,这样做这是无可厚非的,毕竟这是服务器版本,安全稳定是重点,官方的rpm repository提供的rpm包也不够丰富,很多时候需要自己编译那太辛苦了,而EPEL恰恰可以解决这两方面的问题。

    EPEL (Extra Packages for Enterprise Linux)是基于Fedora的一个项目,为“红帽系”的操作系统提供额外的软件包,适用于RHEL、CentOS和Scientific Linux.

    1. 首先你需要使用SSH等方式连接到你需要安装EPEL的机器上

    2. 使用以下命令安装epel repository

      sudo dnf install https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm
    3. 查看现有存储库,确认已经出现epel和epel-modular

      yum repolist
    4. 刷新缓存

      sudo dnf clean dbcache
      sudo dnf update

    现在你就可以使用下面的命令搜索包了

    dnf search [Package Name]

    如使用下面的命令安装neofetch

    dnf install neofetch

    您可以同时使用 yum 或 dnf 命令。事实上,yum 与 dnf 是软链接的,并且出于向后兼容的原因,它被保留在 Red Hat Enterprise Linux 8.x 上。

  • 如何在Ubuntu 20.04上添加swap空间

    在轻量云上安装了Mastodon后由于sidekiq调用ffmpeg导致轻量云的2G内存很紧张,甚至出现Out of memory的情况,ssh也无法相应,所以准备增加2GB的Swap

    检查系统的交换信息

    在开始之前,我们可以检查系统是否已经有一些可用的交换空间。 可以有多个交换文件或交换分区,但通常一个就足够了。

    我们可以通过键入以下内容来查看系统是否有任何已配置的交换:

    sudo  swapon --show

    如果您没有返回任何输出,这意味着您的系统当前没有可用的交换空间。

    也可以使用free验证:

    free -h
    Output
                  total        used        free      shared  buff/cache   available
    Mem:          987Mi       784Mi        85Mi       0.0Ki       116Mi        73Mi
    Swap:            0B          0B          0B

    正如您在输出的Swap行中看到的那样,系统上没有活动的交换。

    检查硬盘分区上的可用空间

    在我们创建我们的交换文件之前,我们将检查我们当前的磁盘使用情况以确保我们有足够的空间。 通过输入:

    df -h
    Output
    Filesystem      Size  Used Avail Use% Mounted on
    udev            479M     0  479M   0% /dev
    tmpfs            99M  476K   99M   1% /run
    /dev/vda1        40G  7.7G   30G  21% /
    tmpfs           494M  8.0K  494M   1% /dev/shm
    tmpfs           5.0M     0  5.0M   0% /run/lock
    tmpfs           494M     0  494M   0% /sys/fs/cgroup
    tmpfs            99M     0   99M   0% /run/user/1000

    该设备与/在里面Mounted on在这种情况下,列是我们的磁盘。 在这个例子中,我们有足够的可用空间(仅使用了 7.7G)。 您的用法可能会有所不同。

    尽管对于交换空间的适当大小有很多意见,但这实际上取决于您的个人喜好和您的应用程序要求。 通常,等于或两倍于系统上的 RAM 量是一个很好的容量。 另一个好的经验法则是,如果您只是将其用作 RAM 后备,那么任何超过 4G 的交换都可能是不必要的。

    创建交换文件

    现在我们知道了可用的硬盘空间,我们可以在我们的文件系统上创建一个交换文件。 我们将分配一个我们想要调用的大小的文件swapfile在我们的根(/) 目录。

    创建交换文件的最佳方法是使用fallocate程序。 此命令会立即创建指定大小的文件。

    由于我们示例中的服务器有 1G 的 RAM,我们将在本指南中创建一个 4G 的文件。 调整此项以满足您自己的服务器的需求:

    sudo fallocate -l 4G /swapfile

    我们可以通过键入以下内容来验证是否保留了正确的空间量:

    ls -lh /swapfile
    -rw-r--r-- 1 root root 4.0G Mar  7 17:04 /swapfile

    我们的文件已创建并预留了正确的空间量。

    启用交换空间

    现在我们有了一个正确大小的可用文件,我们需要将其实际转换为交换空间。

    首先,我们需要锁定文件的权限,以便只有具有root权限的用户才能读取内容。 这会阻止普通用户访问该文件,这将产生重大的安全隐患。

    内容使该文件只能root通过键入以下指令:

    sudo chmod 600 /swapfile

    通过键入以下内容验证权限更改:

    ls -lh /swapfile
    Output
    -rw------- 1 root root 4.0G Mar  7 17:04 /swapfile

    如您所见,只有root用户启用了读写标志。

    我们现在可以通过键入以下内容将文件标记为交换空间:

    sudo mkswap /swapfile
    Output
    Setting up swapspace version 1, size = 4 GiB (4294963200 bytes)
    no label, UUID=15085099-a7fc-489f-86d6-c785ec646495

    标记文件后,我们可以启用交换文件,让我们的系统开始使用它:

    sudo swapon /swapfile

    通过键入以下内容验证交换是否可用:

    sudo swapon --show
    Output
    NAME      TYPE SIZE   USED PRIO
    /swapfile file   4G     0B   -2

    我们可以检查输出 free实用程序再次证实我们的发现:

    free -h
    Output
                  total        used        free      shared  buff/cache   available
    Mem:          987Mi       779Mi       104Mi       0.0Ki       102Mi        86Mi
    Swap:         4.0Gi        19Mi       4.0Gi

    我们的交换已成功设置,我们的操作系统将根据需要开始使用它。

    使交换文件永久化

    我们最近的更改已启用当前会话的交换文件。 但是,如果我们重新启动,服务器将不会自动保留交换设置。 我们可以通过将交换文件添加到我们的/etc/fstab文件。

    备份/etc/fstab文件以防出现任何问题:

    sudo cp /etc/fstab /etc/fstab.bak

    将交换文件信息添加到您的末尾/etc/fstab通过键入文件:

    echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab

    接下来,我们将查看一些可以更新以调整交换空间的设置。

    调整您的交换设置

    您可以配置一些选项,这些选项会在处理交换时影响系统的性能。

    调整 Swappiness 属性

    swappiness参数配置系统将数据从 RAM 交换到交换空间的频率。 这是一个介于 0 和 100 之间的值,表示百分比。

    当值接近零时,除非绝对必要,否则内核不会将数据交换到磁盘。 请记住,与交换文件的交互是“昂贵的”,因为它们比与 RAM 的交互花费的时间要长得多,并且会导致性能显着降低。 告诉系统不要过多地依赖交换通常会使您的系统更快。

    接近 100 的值将尝试将更多数据放入交换中,以保持更多 RAM 空间可用。 根据您的应用程序的内存配置文件或您使用服务器的目的,在某些情况下这可能会更好。

    我们可以通过键入以下内容查看当前的交换值:

    cat /proc/sys/vm/swappiness
    Output
    60

    对于家用电脑,swappiness 设置为 60 并不是一个坏值。 对于服务器,大部分时候您可能希望将其移近 0。

    我们可以使用 sysctl 命令将 swappiness 设置为不同的值。

    例如,要将 swappiness 设置为 10,我们可以输入:

    sudo sysctl vm.swappiness=10
    Output
    vm.swappiness = 10

    此设置将持续到下一次重新启动。 我们可以在重启时自动设置这个值,方法是在我们的/etc/sysctl.conf文件:

    sudo nano /etc/sysctl.conf

    在底部,您可以添加:

    vm.swappiness=10

    完成后保存并关闭文件。

    调整缓存压力设置

    您可能要修改的另一个相关值是vfs_cache_pressure。此设置配置系统将选择缓存多少inodedentry信息而不是其他数据。

    基本上,这是关于文件系统的访问数据。 这通常查找成本非常高,并且请求非常频繁,因此对您的系统进行缓存是一件好事。 您可以通过查询来查看当前值 proc再次文件系统:

    cat /proc/sys/vm/vfs_cache_pressure
    Output
    100

    按照目前的配置,我们的系统从缓存中删除 inode 信息的速度太快了。 我们可以通过键入以下命令将其设置为更保守的设置,例如 50:

    sudo sysctl vm.vfs_cache_pressure=50
    Output
    vm.vfs_cache_pressure = 50

    同样,这仅对我们当前的会话有效。 我们可以通过将其添加到我们的配置文件中来更改它,就像我们对 swappiness 设置所做的那样:

    sudo nano /etc/sysctl.conf

    在底部,添加指定新值的行:

    vm.vfs_cache_pressure=50

    完成后保存并关闭文件。

    配置完毕后重启一下系统

    总结

    遵循本指南中的步骤将为您的程序提供一些喘息空间,否则会导致内存不足异常。 交换空间对于避免其中一些常见问题非常有用。

    如果您遇到 OOM(内存不足)错误,或者您发现您的系统无法使用您需要的应用程序,最好的解决方案是优化您的应用程序配置或升级您的服务器。

    一键脚本

    添加swap(单位MB)

    #!/bin/sh
    
    # size of swapfile in megabytes
    swapsize=512
    
    # does the swap file already exist?
    grep -q "swapfile" /etc/fstab
    
    # if not then create it
    if [ $? -ne 0 ]; then
        echo 'swapfile not found. Adding swapfile.'
        fallocate -l ${swapsize}M /swapfile
        chmod 600 /swapfile
        mkswap /swapfile
        swapon /swapfile
        echo '/swapfile none swap defaults 0 0' >> /etc/fstab
    else
        echo 'swapfile found. No changes made.'
    fi
    
    # output results to terminal
    cat /proc/swaps
    cat /proc/meminfo | grep Swap

    移除SWAP

    #!/bin/sh
    
    # does the swap file exist?
    grep -q "swapfile" /etc/fstab
    
    # if it does then remove it
    if [ $? -eq 0 ]; then
        echo 'swapfile found. Removing swapfile.'
        sed -i '/swapfile/d' /etc/fstab
        echo "3" > /proc/sys/vm/drop_caches
        swapoff -a
        rm -f /swapfile
    else
        echo 'No swapfile found. No changes made.'
    fi
    
    # output results to terminal
    cat /proc/swaps
    cat /proc/meminfo | grep Swap

    参考与翻译自digitalocean

  • ubuntu20.04LTS终端没有颜色——给黑底白字的终端染色

    相关的几个文件,或许更多

    vim /etc/bash.bashrc
    vim /etc/profile
    vim ~/.bashrc
    vim ~/.bash_profile

    终端颜色由 PS1 变量进行定义,上面这些文件中就有 PS1 变量。
    1.去掉 ~/.bashrc 中的 force_color_prompt=yes 注释,保存后并 source ~/.bashrc 之后如果终端颜色已经上色,这就达到目的了。
    2.终端执行 export TERM=xterm-256color 开启256真彩色试试结果,如果有效,把这行代码追加到 ~/.bashrc 或者 /etc/profile 文件的末行。
    3.试试下面的命令,其实就是开启 force_color_prompt=yes

    # 首先将bashrc备份
    cp /etc/bash.bashrc /etc/bash.bashrc.bak
    
    # 将配置写入bashrc
    cat << EOF >> /etc/bash.bashrc
    # uncomment for a colored prompt, if the terminal has the capability; turned
    # off by default to not distract the user: the focus in a terminal window
    # should be on the output of commands, not on the prompt
    force_color_prompt=yes
     
    if [ -n "$force_color_prompt" ]; then
        if [ -x /usr/bin/tput ] && tput setaf 1 >&/dev/null; then
            # We have color support; assume it's compliant with Ecma-48
            # (ISO/IEC-6429). (Lack of such support is extremely rare, and such
            # a case would tend to support setf rather than setaf.)
            color_prompt=yes
        else
            color_prompt=
        fi
    fiif [ "$color_prompt" = yes ]; then
        PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '
    else
        PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '
    fi
    EOF
  • 在Ubuntu 20.04上安装Mastodon

    Mastodon(又称长毛象或万象)是一个免费开源的去中心化的分布式微博客社交网络。它的用户界面和操作方式跟推特和微博类似,但是整个网络并非由单一机构运作,却是由多个由不同营运者独立运作的服务器以联邦方式交换数据而组成的去中心化社交网络。每个Mastodon的营运站点被称为“实例(Instance)”,用户可到任何开放登记的实体登记,任何一个实体上的用户可以与其他实体上的用户沟通。用户在推特中发布的内容称为“推文”,而在Mastodon中发布的内容则称为“嘟文(Toot)”,用户可以调整隐私设置限制嘟文被其他人或实体读取或查看。

    最近注意到有一个使用ActivityPub协议的去中心化个人社交媒体系统,准备搭建一个,搜索了一下资料,也自己实践了一下,虽然中文社区都建议使用docker建立,而且我用docker开起来了一个,但对整体的架构都不太熟悉,还是希望在正式服务上使用从源安装的方案,经过测试后发现官方的文档和目前的配置有一定的出入,因为完全按照官方的命令,并不能让程序完全运行起来,所以在这里记一下。

    首先需要准备

    1. 域名
    2. 主机(内存不小于2GB,1GB的话可以考虑Misskey

    安装Node.js

    Ubuntu:

    curl -fsSL https://deb.nodesource.com/setup_12.x | sudo -E bash -
    sudo apt-get install -y nodejs

    Debian:

    curl -fsSL https://deb.nodesource.com/setup_12.x | bash -
    apt-get install -y nodejs

    安装Yarn

    curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add -
    echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list

    安装相关软件包

    apt update
    apt install -y \
      imagemagick ffmpeg libpq-dev libxml2-dev libxslt1-dev file git-core \
      g++ libprotobuf-dev protobuf-compiler pkg-config nodejs gcc autoconf \
      bison build-essential libssl-dev libyaml-dev libreadline6-dev \
      zlib1g-dev libncurses5-dev libffi-dev libgdbm6 libgdbm-dev \
      nginx redis-server redis-tools postgresql postgresql-contrib \
      certbot python3-certbot-nginx yarn libidn11-dev libicu-dev libjemalloc-dev

    安装 Ruby

    因为使用 rbenv 可以更容易的获得正确的版本并在新版本发布后进行更新,我们将使用 rbenv 来管理Ruby版本。rbenv 必须安装在单个Linux用户中,因此,我们首先需要使用以下命令创建一个Mastodon用户:

    adduser --disabled-login mastodon

    切换到mastodon用户:

    su - mastodon

    执行以下步骤安装 rbenv 和 rbenv-build:

    git clone https://github.com/rbenv/rbenv.git ~/.rbenv
    cd ~/.rbenv && src/configure && make -C src
    echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bashrc
    echo 'eval "$(rbenv init -)"' >> ~/.bashrc
    exec bash
    git clone https://github.com/rbenv/ruby-build.git ~/.rbenv/plugins/ruby-build

    上述操作完成,我们便可以安装正确的 Ruby 版本:

    RUBY_CONFIGURE_OPTS=--with-jemalloc rbenv install 2.7.4
    rbenv global 2.7.4

    如果在后续安装的时候提示 rbenv: version '1.2.3' is not installed (set by /home/mastodon/live/.ruby-version) 尝试将rbenv 的版本切换为软件需要的版本

    我们同样需要安装 bundler:

    gem install bundler --no-document

    返回root用户:

    exit

    配置 PostgreSQL

    安装PostgreSQL

    由于Ubuntu自带的库里已经有postgersql 12了,所以直接安装即可

    apt-get install postgresql-12 

    如果需要postgresql 14 可以执行下面的步骤

    sudo sh -c 'echo "deb http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list'
    wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -
    sudo apt-get update
    sudo apt-get -y install postgresql

    创建帐户

    你需创建一个供Mastodon使用的PostgreSQL帐户。创建一个使用“ident”认证方式的帐户是最容易的配置方法,即PostgreSQL帐户不需要独立的密码并由同名Linux用户使用。

    sudo -u postgres psql

    在控制台中执行:

    CREATE USER mastodon CREATEDB;
    \q

    配置 Mastodon

    现在该下载Mastodon代码了。切换至mastodon用户:

    su - mastodon

    检出代码

    使用git下载最新稳定版Mastodon:

    git clone https://github.com/tootsuite/mastodon.git live && cd live
    git checkout $(git tag -l | grep -v 'rc[0-9]*
    
    
    

    #039; | sort -V | tail -n 1)

    安装依赖

    现在,安装Ruby和JavaScript依赖:

    bundle config deployment 'true'
    bundle config without 'development test'
    bundle install -j$(getconf _NPROCESSORS_ONLN)
    yarn install --pure-lockfile

    两个bundle config命令仅仅第一次安装依赖时需要。如果你之后进行升级或重安装依赖,只需要bundle install就够了。

    生成配置文件

    运行交互式安装向导:

    RAILS_ENV=production bundle exec rake mastodon:setup

    生成配置文件生成器执行下面的三个步骤

    1. 创建一个配置文件
    2. 预编译静态文件
    3. 创建数据库schema

    配置的问题范例:

    Your instance is identified by its domain name. Changing it afterward will break things.
    Domain name: example.com
    
    Single user mode disables registrations and redirects the landing page to your public profile.
    Do you want to enable single user mode? No
    
    Are you using Docker to run Mastodon? no
    
    PostgreSQL host: /var/run/postgresql
    PostgreSQL port: 5432
    Name of PostgreSQL database: mastodon
    Name of PostgreSQL user: mastodon
    Password of PostgreSQL user: 
    Database configuration works! 🎆
    
    Redis host: localhost
    Redis port: 6379
    Redis password: 
    Redis configuration works! 🎆
    
    Do you want to store uploaded files on the cloud? No
    
    Do you want to send e-mails from localhost? yes
    E-mail address to send e-mails "from": "Mastodon <[email protected]>"
    Send a test e-mail with this configuration right now? no
    
    This configuration will be written to .env.production
    Save configuration? Yes
    
    Now that configuration is saved, the database schema must be loaded.
    

    安装完毕后从mastodon账户中退出,切换到root中

    exit

    配置 nginx

    首先你需要先安装nginx

    sudo apt install nginx

    从Mastodon目录复制配置文件模版到nginx:

    cp /home/mastodon/live/dist/nginx.conf /etc/nginx/sites-available/mastodon
    ln -s /etc/nginx/sites-available/mastodon /etc/nginx/sites-enabled/mastodon

    编辑 /etc/nginx/sites-available/mastodon,替换 example.com 为你自己的域名,你可以根据自己的需求做出其它的一些调整。
    重载 nginx 以使变更生效:

    systemctl reload nginx.service

    这时候会报错,我们暂时不用管

    获取SSL证书

    我们将使用 Let’s Encrypt 获取一个免费的SSL证书:
    官方给的指令是让nginx自动更新,但官方的默认nginx配置无法根据下面的指令获取证书

    certbot --nginx -d example.com

    我们需要先手动获取证书

    systemctl stop nginx //停止nginx,让certbot能够占用80端口
    certbot certonly --standalone -d example.com  //获取证书

    获取证书也可以用下面的指令,非交互式一句话

    certbot certonly --standalone -n --agree-tos --email [email protected] --preferred-challenges http -d example.com
    • -n 非交互式
    • --email 指定账户
    • --agree-tos 同意服务协议

    如果成功的话,证书文件应该在下面的目录里,将这两个目录地址记下来,后面修改nginx配置的时候会用到:

    /etc/letsencrypt/live/example.com/fullchain.pem
    /etc/letsencrypt/live/example.com/privkey.pem

    现在你应该配置certbot自动续约证书

    crontab -e

    在输入框中写入计划任务

    0 0 * * * /usr/bin/certbot renew --quiet

    这样配置好了后,certbot会在每天的0点检查证书是否过期,如果过期就自动续约证书。

    接着再次修改nginx的配置

    vim /etc/nginx/sites-available/mastodon

    将上面的证书路径填入到ssl的部分

    ssl_certificate     /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;

    再次启动nginx

    systemctl start nginx

    现在你应该能够通过浏览器访问你的域名,然后看到一只大象锤击电脑屏幕的错误页面。这是因为我们还没有启动Mastodon进程。

    配置 systemd 服务

    从Mastodon目录复制systemd服务模版:

    su root
    cp /home/mastodon/live/dist/mastodon-*.service /etc/systemd/system/

    然后编辑文件以确保用户名和路径正确:

    • /etc/systemd/system/mastodon-web.service
    • /etc/systemd/system/mastodon-sidekiq.service
    • /etc/systemd/system/mastodon-streaming.service

    最后,启动并启用新的systemd服务:

    systemctl daemon-reload
    systemctl start mastodon-web mastodon-sidekiq mastodon-streaming

    可以检查一下服务是否正常运行

    systemctl status mastodon-web.service
    systemctl status mastodon-sidekiq.service
    systemctl status mastodon-streaming.service

    如果一切正常的话,将服务设置为开机自启动

    systemctl enable mastodon-web mastodon-sidekiq mastodon-streaming

    现在你应该可以通过浏览器看到你的mastodon主页啦!


    由于之前配置的Sendmail效果不是太好,所以后面将邮件服务改成由飞书的smtp发送,分享一下配置,也顺便备注一下

    SMTP_SERVER=smtp.feishu.cn
    SMTP_PORT=465
    SMTP_LOGIN=你在飞书绑定的邮箱
    SMTP_PASSWORD=飞书给的SMTP密码
    SMTP_AUTH_METHOD=login
    SMTP_OPENSSL_VERIFY_MODE=none
    # Can be: 'none', 'peer', 'client_once', 'fail_if_no_peer_cert', see http://api.rubyonrails.org/classes/ActionMailer/Base.html
    SMTP_TLS=ssl
    SMTP_ENABLE_STARTTLS_AUTO = true
    SMTP_FROM_ADDRESS= ' Mastodon <你在飞书绑定的邮箱> '
    

    参考相关:官方文档 Rin404° 羊毛 于光年外遥望