Server Deployment

19年底部署了个web应用,20年初发现404了(微笑)为了纪念成功踩雷,于是有了这篇博客。
20年中数据库被黑客攻击,勒索我 0.03 btc(按当日,近两千人民币),于是更新了这篇博客。

SRE

购买个服务器&域名

这显然是一句废话,目前买的比较多的是阿里云、腾讯云,笔者就是趁双11租了腾讯云最便宜的服务器(虽说都有学生优惠活动,但优惠力度还没有双11大)之后跨年夜晚上腾讯小哥还亲切就域名申请致电了我半小时: )

初始化

  1. 远程登录ssh,可以选择密钥登录 sudo ssh -i keyfile <user>@ip 或者 密码登录 ssh-copy-id USER_NAME@IP_ADDRESS 进入远程服务器。

  2. 安装最新版本的docker,对下列步骤如有疑惑,请详见docker官网教程

    • 首先,更新现有的软件包列表并安装一些必备软件包:
      sudo apt-get update
      sudo apt install apt-transport-https ca-certificates \
      curl software-properties-common

    • 然后将官方Docker存储库的GPG密钥添加到系统中:
      curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

    • 将Docker存储库添加到APT源:
      sudo add-apt-repository \
      "deb [arch=amd64] https://download.docker.com/linux/ubuntu bionic stable"

    • 使用新添加的存储库中的Docker软件包更新软件包数据库:
      sudo apt update

    • 确保要从Docker存储库而不是默认的Ubuntu存储库进行安装:
      apt-cache policy docker-ce

    • 最后,终于到了安装Docker这一步:
      sudo apt install docker-ce

    • 启动守护程序,并启用启动过程。检查它是否正在运行:
      sudo systemctl status docker

    注意此时使用docker需要加sudo关键字,例如 sudo docker ps

Portainer管理

部署Portainer Server方便管理别的docker容器,详情见官网教程。
$ docker volume create portainer_data
$ docker run -d -p 8000:8000 -p 9000:9000 --name=portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer

部署完在浏览器中打开服务器的9000端口,注册完后选择local即可。

配置nginx

  1. 在服务器上安装nginx 用sudo apt install nginx即可。

  2. 打开/etc/nginx/sites-enabled/新建一个conf配置文件,写入nginx配置。写完后执行生效并检查:
    sudo service nginx restart
    sudo nginx -t

pull相关镜像

  1. Registries -> Add registry -> Custom registry -> URL: registry.cn-shanghai.aliyuncs.com -> Authentication -> Username: stardust567 (这是我在阿里云的镜像仓库)
  2. Stacks > Add stack 加上你想加的镜像即可,具体配置可参考教程文档
  3. 理论上现在整个项目就跑起来了,可以sudo docker ps查看相关CONTAINER ID,然后sudo docker logs [CONTAINER ID]查看相关日志。

Security

起因

1
2
3
4
5
6
sudo ssh -i 567top ubuntu@118.25.70.50
sudo docker ps
sudo docker exec -it f62b0da943e3 /bin/bash
mysql> show databases;
mysql> use infoweb
mysql> show tables;

然后一个大大的WARNING出现在我眼前,让我意识到了之前忽视的软件安全的重要性。

改root密码

1
mysql> SET PASSWORD FOR 'root'@'localhost' = PASSWORD('new_password');

改root用户名

1
2
3
mysql> USE mysql;
mysql> UPDATE user SET user="another_username" WHERE user="root";
mysql> FLUSH PRIVILEGES;

mysql默认root账户无法远程登录,哪怕你改名改密码也不行,会出现ERROR 1045 (28000)

创建新用户

1
mysql> CREATE USER 'username'@'%' IDENTIFIED BY 'password';

@后面跟登入IP,%为通配符,表示任意IP都可登录。

赋予用户权限

1
mysql> grant all privileges on infoweb.* to 'stardust567'@'%';

info是相关数据库的名字,为’stardust567’@’%’赋予infoweb上的所有权限。

服务器方面

建议在服务器设置上关掉3306(mysql)端口,只开80(http)和443(https)端口。