阿里云部署个人博客

March 2, 2022

    准备

    服务器使用阿里云, CentOS 7.6 系统,拥有一个域名并且解析到服务器,国内备案。

    安装 Docker :

    sudo yum install docker-ce # 安装 docker
    
    docker -v              # 检查版本
    
    systemctl start docker # 启动 docker
    
    systemctl enable docker    # 设置开机启动
    

    安装 Portainer :

    docker run -d -p 9443:9443 \       # 服务器端口:container 端口
      --restart=always \                # 自动重启
      -v /var/run/docker.sock:/var/run/docker.sock \
      -v portainer_data:/data \         # 挂载 data volume,portainer 数据不受重装影响
      --name prtainer \portainer/portainer-ce:latest
    

    在阿里云管理界面添加防火墙规则,协议 TCP ,端口为前面设置的端口。访问 example.com:9443 设置 Portainer。

    在 Volumes tab 中 Add volume,自行取名无需其他设置,按需添加一个以上 volume。

    安装 Bludit :

    docker run --name bludit \
        -p 80:80 \          # http
      -p 431:431 \          # https
      -v ~/bludit:/usr/share/nginx/html/bl-content \    # 绑定 主机文件夹:bludit文章文件夹,文章不受重装影响
      -v bludit_themes:/usr/share/nginx/html/bl-themes \    # 绑定 设置的volume名字:bludit主题文件夹
      -v bludit_etc:/etc \  # 绑定(必须) 设置的volume名称:bludit etc目录
      -d bludit/docker:latest
    

    访问 example.com 设置 Bludit 。

    安装 FileBrowser :

    在 Portainer 界面 Containers tab 选 Add container。自行设置 Name,Image 输入 filebrowser/fileborwser:latest。

    Manual network port publishing 中选择 publish a new network port。host 自行设置,container 为 80,点击 Deploy the container。

    阿里云添加对应规则。访问设置的 host port 配置 FileBrowser。

    返回 Portainer containers 界面,点击 FileBrowser,选择 Duplicate/Edit。在 Advanced container settings 中 Volumes tab 选择 map additional volumes。container 内填写 /srv/example_name,volume 选择之前设置的 volume。重复操作将 bludit 绑定的 volume 都 map 完成。点击 Deploy。

    访问 FileBrowser 即可图形化管理 volumes 内的文件。

    配置 HTTPS

    安装 acme.sh

    curl https://get.acme.sh | sh -s email=my@example.com      # 安装
    
    alias acme.sh=~/.acme.sh/acme.sh       # 设置alias
    
    acme.sh  --upgrade  --auto-upgrade # 自动更新
    
    crontab -e     # 查看是否有 acme 的任务
    
    acme.sh --set-default-ca --server letsencrypt      # 选择 SSL 服务
    

    进入阿里云 RAM 访问控制管理界面,添加用户,访问方式为 Open API。授予 DNS、Domain 相关的权限,保存好 AccessKey ID 和 Secret。

    export Ali_Key="***********"           # 填写获得的 ID
    export Ali_Secret="***********"     # 填写 Secret
    
    acme.sh --issue --dns dns_ali -d example.com       # 获取证书
    

    安装证书,bludit_etc 替换为绑定 /etc 目录的 volume 名。

    acme.sh --install-cert -d example.com \
    --key-file       /var/lib/docker/volumes/bludit_etc/_data/letsencrypt/live/example.com/privkey.pem  \
    --fullchain-file /var/lib/docker/volumes/bludit_etc/_data/letsencrypt/live/example.com/fullchain.pem \
    

    配置 Bludit

    Bludit/docker 使用 nginx 服务。

    进入 Portainer 打开 Bludit container 的终端,输入:

    openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048
    

    打开 FileBrowser 进入 /etc/nginx/conf.d/,创建 bludit.conf 文件:

    server {
        listen 443 ssl;
        server_name example.com;    # replace your domain
        root /usr/share/nginx/html;
        index index.php;
    
        access_log /var/log/nginx/example.log;
        error_log /var/log/nginx/example.log;
    
        ssl_certificate         /etc/letsencrypt/live/example.com/fullchain.pem;    # replace your domain
        ssl_certificate_key     /etc/letsencrypt/live/example.com/privkey.pem;  # replace your domain
        ssl_dhparam             /etc/ssl/certs/dhparam.pem;
    
        ssl_session_cache       shared:SSL:50m;
        ssl_session_timeout     10m;
    
        ssl_prefer_server_ciphers   on;
        # ssl_stapling            on;
        # ssl_stapling_verify     on;
        ssl_protocols           TLSv1.2;
        ssl_ciphers         "HIGH:!aNULL:!MD5";
    
        # add_header Strict-Transport-Security "max-age=31557600; includeSubDomains";
        location ~ \.(jpg|jpeg|gif|png|css|js|ico|svg|eot|ttf|woff|woff2|otf)$ {
            access_log        off;
            expires           30d;
        }
    
        location ~ \.php$ {
            fastcgi_pass    unix:/var/run/php-fpm.sock;
            fastcgi_index   index.php;
            include         fastcgi.conf;
            fastcgi_param   HTTPS on;
        }
    
        location / {
            try_files $uri $uri/ /index.php?$args;
        }
    
        location ^~ /bl-content/databases/ { deny all; }
        location ^~ /bl-content/workspaces/ { deny all; }
        location ^~ /bl-content/pages/ { deny all; }
        location ^~ /bl-kernel/*.php { deny all; }
    }
    
    # Redirect from HTTP to HTTPS
    server {
        listen 80;
        server_name example.com;    # replace your domain
        return 301 https://example.com$request_uri; # replace your domain
    }
    

    进入 Bludit 管理界面 设置-高级-网站网址:填写 https://example.com

    在 Portainer 里重启 Bludit,访问网站查看 HTTPS 是否生效。

    acme.sh 应该会每 60 天自动更新,但是 nginx 有可能需要重启或者 force-reload 证书。

    测试 SSL

    访问 https://ssllabs.com Test your server,Rating 应为 A。

    重定向子域名到其他端口

    首先在 DNS 管理添加子域名解析到服务器,重复上述证书申请安装流程,然后配置文件:

    # Redirect test.example.com
    server {
        listen 443 ssl;
        server_name test.example.com;
    
        ssl_certificate         /etc/letsencrypt/live/test.example.com/fullchain.pem;
        ssl_certificate_key     /etc/letsencrypt/live/test.example.com/privkey.pem;
    
        location / {
            proxy_pass http://localhost:port;
        }
    }
    

    重启 Bludit 即可。

    使用主题

    将主题文件夹放置于 /usr/share/nginx/html/bl-themes,即可在 Bludit 后台勾选主题。本文不涉及主题制作。

    配置 Favicon

    最直接的方式是在 /usr/share/nginx/html 放置相关文件,并且在 html head 中写入。

    访问 http://realfavicongenerator.net 上传 Icon 矢量图,根据需求调整,下载得到所需文件并放置于上述目录。在 php 文件中加入网站提供的 html ,如:

    <head>
        <!-- favicons -->
        <link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png">
        <link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png">
        <link rel="icon" type="image/png" sizes="16x16" href="/favicon-16x16.png">
        <link rel="manifest" href="/site.webmanifest">
        <link rel="mask-icon" href="/safari-pinned-tab.svg" color="#264d73">
        <meta name="msapplication-TileColor" content="#9cb0c9">
        <meta name="theme-color" content="#eff2f5">
    

    重新检测 Favicon 即可。

    挂载 OSS 至主机

    以 CentOS7 为例,使用 ossfs 将阿里云 OSS 挂载至主机文件管理:

    # download and install
    wget http://gosspublic.alicdn.com/ossfs/ossfs_1.80.6_centos7.0_x86_64.rpm
    sudo yum install ossfs_1.80.6_centos7.0_x86_64.rpm
    # set RAM user for OSS
    echo BucketName:yourAccessKeyId:yourAccessKeySecret > /etc/passwd-ossfs
    chmod 640 /etc/passwd-ossfs
    # mount
    ossfs BucketName mountfolder -o url=Endpoint
    

    开机自动挂载,在 /etc/init.d/ 创建 ossfs 文件并且添加

    ossfs your_bucket your_mountpoint -ourl=your_url -oallow_other
    

    修改权限,把ossfs启动脚本作为其他服务:

    chmod a+x /etc/init.d/ossfs
    chkconfig ossfs on
    

    安装 Tailscale 并且开启 exit node

    Install the Yum repository manager:

    sudo yum install yum-utils
    

    Add the Tailscale repository and install Tailscale:

    sudo yum-config-manager --add-repo https://pkgs.tailscale.com/stable/centos/7/tailscale.repo
    sudo yum install tailscale
    

    Use systemctl to enable and start the service:

    sudo systemctl enable --now tailscaled
    

    Connect your machine to your Tailscale network and authenticate in your browser:

    sudo tailscale up
    

    Enable IP forwarding:

    echo 'net.ipv4.ip_forward = 1' | sudo tee -a /etc/sysctl.conf
    echo 'net.ipv6.conf.all.forwarding = 1' | sudo tee -a /etc/sysctl.conf
    sudo sysctl -p /etc/sysctl.conf
    

    Advertise the device as an exit node and cancel the DROP role that conflict with Aliyun:

    sudo tailscale up --advertise-exit-node --netfilter-mode off
    

    Allow the exit node from the admin console. If your Linux node uses firewalld, you may need to also allow masquerading due to a known issue.

    sudo iptables -A FORWARD -i tailscale0 -j ACCEPT
    sudo iptables -t nat -A POSTROUTING -o ens5 -j MASQUERADE