19年底部署了个web应用,20年初发现404了(微笑)为了纪念成功踩雷,于是有了这篇博客。
20年中数据库被黑客攻击,勒索我 0.03 btc(按当日,近两千人民币),于是更新了这篇博客。
SRE
购买个服务器&域名
这显然是一句废话,目前买的比较多的是阿里云、腾讯云,笔者就是趁双11租了腾讯云最便宜的服务器(虽说都有学生优惠活动,但优惠力度还没有双11大)之后跨年夜晚上腾讯小哥还亲切就域名申请致电了我半小时: )
初始化
远程登录ssh,可以选择密钥登录
sudo ssh -i keyfile <user>@ip
或者 密码登录ssh-copy-id USER_NAME@IP_ADDRESS
进入远程服务器。安装最新版本的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
在服务器上安装nginx 用
sudo apt install nginx
即可。打开
/etc/nginx/sites-enabled/
新建一个conf配置文件,写入nginx配置。写完后执行生效并检查:sudo service nginx restart
sudo nginx -t
pull相关镜像
- Registries -> Add registry -> Custom registry -> URL: registry.cn-shanghai.aliyuncs.com -> Authentication -> Username: stardust567 (这是我在阿里云的镜像仓库)
- Stacks > Add stack 加上你想加的镜像即可,具体配置可参考教程文档。
- 理论上现在整个项目就跑起来了,可以
sudo docker ps
查看相关CONTAINER ID,然后sudo docker logs [CONTAINER ID]
查看相关日志。
Security
起因
1 | sudo ssh -i 567top ubuntu@118.25.70.50 |
然后一个大大的WARNING出现在我眼前,让我意识到了之前忽视的软件安全的重要性。
改root密码
1 | mysql> SET PASSWORD FOR 'root'@'localhost' = PASSWORD('new_password'); |
改root用户名
1 | mysql> USE mysql; |
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)端口。