准备
服务器使用阿里云, 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