一、搭建环境
1)Docker version 25.0.3, build 4debf41
2)CentOS Linux release 7.9.2009 (Core)
二、安装PostgreSQL
要在 Docker 中安装 PostgreSQL,可以使用官方提供的 PostgreSQL Docker 镜像。以下是一些简单的步骤:
1、获取 PostgreSQL Docker 镜像:
在终端或命令行中运行以下命令以获取 PostgreSQL Docker 镜像:
docker pull postgres
![](https://fangjunyu.com/wp-content/uploads/2024/04/图片-1.png)
2、创建并运行 PostgreSQL 容器:
使用以下命令创建并启动 PostgreSQL 容器:
docker run --name postgres -p 5432:5432 -e POSTGRES_PASSWORD=secretpassword -d postgres
–name postgres:指定容器的名称为 postgres,可以根据需要更改名称。
-e POSTGRES_PASSWORD=secretpassword:设置 PostgreSQL 数据库的密码为 secretpassword。可以根据需要更改密码。
-p 5432:5432,表示通过主机的 IP 地址和映射的5432端口来访问 PostgreSQL 数据库
-d:以守护进程(后台)模式运行容器。
postgres: 这个是指定使用的 Docker 镜像名称。在这个命令中,我们使用了官方提供的 PostgreSQL 镜像,其名称为 postgres。当 Docker 运行这个命令时,它会从 Docker Hub 下载 PostgreSQL 镜像(如果本地没有缓存的话),然后使用该镜像创建一个容器实例。
整个命令的含义是:创建一个名为 postgres 的容器,使用 PostgreSQL 官方镜像,并设置 PostgreSQL 数据库的密码为 secretpassword,并以后台模式运行。
注意,一定要配置 -p 端口,否则无法通过互联网访问该Docker容器。
![](https://fangjunyu.com/wp-content/uploads/2024/04/图片-2.png)
3、连接到 PostgreSQL 容器:
使用以下命令连接到刚刚创建的 PostgreSQL 容器:
docker exec -it postgres psql -U postgres
这将打开一个交互式的 PostgreSQL shell,可以在其中执行 SQL 命令。
docker exec: 这个命令用于在运行中的容器中执行命令。
-it: 这两个选项结合起来,创建了一个交互式的终端会话。-i 表示保持标准输入流 (stdin) 打开,-t 表示分配一个伪终端 (pseudo-tty)。
postgres: 这是要执行命令的容器的名称。在这个命令中,我们使用的容器名称是 postgres,这是在之前创建 PostgreSQL 容器时指定的名称。
psql: 这是 PostgreSQL 的命令行工具,用于与 PostgreSQL 数据库进行交互。
-U postgres: 这个选项指定了要连接到 PostgreSQL 数据库的用户名,这里是 postgres。通常,postgres 是默认的超级用户。这意味着我们将以 postgres 用户的身份连接到 PostgreSQL 数据库。
因此,整个命令的含义是:在名为 postgres 的容器中以 postgres 用户身份启动一个交互式的 PostgreSQL psql 终端会话。
4、使用 PostgreSQL 容器:
使用 psql 命令行工具或任何支持 PostgreSQL 的客户端工具连接到 PostgreSQL 服务器,以创建数据库、用户等。
5、停止和删除容器(可选):
如果不再需要 PostgreSQL 容器,可以停止并删除它。首先,停止容器:
docker stop postgres
然后,删除容器:
docker rm postgres
这将停止并删除名为 postgres 的 PostgreSQL 容器。
三、配置PostgreSQL
在上面的连接到 PostgreSQL 容器这一步,通过下面命令连接正在运行的 PostgreSQL 容器中的数据库服务器
docker exec -it postgres psql -U postgres
![](https://fangjunyu.com/wp-content/uploads/2024/04/图片-3.png)
接着,我们开始创建Postgres数据库和Postgres普通用户。
\l
可以列出所有的数据库列表
CREATE DATABASE shynet;
创建名为 shynet 的数据库,注意CREATE DATEBASE 等标识一定要大写,小写可能会报错,同时语句最后的 ; 不要忘记,不然操作不会成功。
![](https://fangjunyu.com/wp-content/uploads/2024/04/图片-4.png)
接着,我们开始在 psql shell 中,使用以下命令创建新的数据库用户:
CREATE USER username WITH PASSWORD 'password';
在这个命令中,username 是要创建的新用户的名称,而 password 则是该用户的密码。请务必使用安全的密码。
为新用户授予权限(可选):
默认情况下,新用户创建时不会授予任何特权。如果需要,可以使用 GRANT 命令授予新用户适当的权限,比如给予创建数据库、创建表等权限:
GRANT ALL PRIVILEGES ON DATABASE database_name TO username;
在这个命令中,database_name 是希望新用户拥有权限的数据库名称,username 是刚刚创建的新用户的名称。
![](https://fangjunyu.com/wp-content/uploads/2024/04/图片-5.png)
以上配置完成之后,我们新增了Postgre数据库和用户,因此我们获得了
1)数据库名称:shynet(自行配置)
2)数据库用户 shynet(自行配置)
3)数据库密码(自行配置)
4)数据库主机:服务器的ip
5)数据库端口:5432(Postgres默认端口,如有修改,则自行配置)
一切都配置完成了,我们使用下面的 \q 命令,退出Postgre数据库
postgres-# \q
四、配置Shynet网络分析工具
1、配置env文件
首先在本地创建一个 .env文件,然后点击下方的Github仓库地址,将TEMPLATE.env的文件内容拷贝到 .env文件中。
https://github.com/milesmcc/shynet/blob/master/TEMPLATE.env
然后,修改DB部分的数据库名称、密码等信息,还有ALLOWED_HOSTS字段,否则会导致Django应用收到了一个带有无效HTTP_HOST头的请求,应用提示400 Bad Request。
# Database settings (PostgreSQL)
DB_NAME=<数据库名称>
DB_USER=<用户名称>
DB_PASSWORD=<用户密码>
DB_HOST=<服务器ip>
DB_PORT=5432
# Email 设置,不需要则注释掉
# EMAIL_HOST_USER=example
# EMAIL_HOST_PASSWORD=example_password
# EMAIL_HOST=smtp.example.com
# EMAIL_PORT=465
# EMAIL_USE_SSL=True
# 允许的主机列表,必须配置自己的域名
ALLOWED_HOSTS=www.fangjunyu.com,fangjunyu.com
# 时区设置为亚洲/上海
TIME_ZONE=Asia/Shanghai
TEMPLATE.env是一个配置文件模板,用于配置 Shynet 应用程序的环境变量。以下是配置文件模版的相关参数(参考)
- 数据库设置 (PostgreSQL):
- DB_NAME: 数据库名称。
- DB_USER: 数据库用户。
- DB_PASSWORD: 数据库用户的密码。
- DB_HOST: 数据库主机地址。
- DB_PORT: 数据库端口号。
- 邮件设置 (可选):
- EMAIL_HOST_USER: 邮件服务器用户名。
- EMAIL_HOST_PASSWORD: 邮件服务器密码。
- EMAIL_HOST: 邮件服务器主机地址。
- EMAIL_PORT: 邮件服务器端口号。
- EMAIL_USE_SSL: 是否使用 SSL 连接到邮件服务器。
- 一般 Django 设置:
- DJANGO_SECRET_KEY: Django 应用程序的密钥。
- 域名设置:
- ALLOWED_HOSTS: 允许的主机列表。
- CSRF_TRUSTED_ORIGINS: CSRF 信任的域名。
- 本地化设置:
- LANGUAGE_CODE: 语言代码。
- TIME_ZONE: 时区。
- 账户设置:
- ACCOUNT_SIGNUPS_ENABLED: 是否允许用户注册。
- ACCOUNT_EMAIL_VERIFICATION: 是否验证用户邮箱。
- HTTPS 设置:
- SCRIPT_USE_HTTPS: 是否使用 HTTPS。
- 其他设置:
- PORT: 网站应该绑定到的端口号。
- SHOW_SHYNET_VERSION: 是否在前端显示 Shynet 版本信息。
2、安装Shynet
通过Docker拉取Shynet镜像
docker pull milesmcc/shynet:latest
![](https://fangjunyu.com/wp-content/uploads/2024/04/图片-7.png)
注意:这里可能会存在拉取失败的情况,可能是镜像仓库存在影响,建议使用阿里云的镜像加速器。
1、获取镜像加速器:https://help.aliyun.com/zh/acr/user-guide/accelerate-the-pulls-of-docker-official-images
2、镜像加速器地址:https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors
![](https://fangjunyu.com/wp-content/uploads/2024/04/图片-8.png)
配置后,如果仍然存在镜像拉取失败的情况,则建议晚上或凌晨重新进行拉取镜像,我是早上7点重新拉取成功的。
3、配置Shynet
参考配置命令:
docker run -d -p 8080:8080 --env-file=<your env file> --name=shynet --restart=always milesmcc/shynet:latest
./manage.py registeradmin <your email>
./manage.py whitelabel <whitelabel>
./manage.py hostname <your domain>
下面是我具体执行的命令
docker run -d -p 8080:8080 --env-file=.env --name=shynet --restart=always milesmcc/shynet:latest
此命令会启动一个名为 “shynet” 的容器,并将其映射到主机的 8080 端口。
然后,通过下面的命令进入Shynet容器:
docker exec -it shynet /bin/bash
配置 Shynet:在容器内部,使用 ./manage.py 脚本来配置 Shynet。
1)运行以下命令来注册管理员用户:
./manage.py registeradmin <your email>
参考命令:
./manage.py registeradmin fangjunyu.com@gmail.com
提示成功创建了一个Shynet超级用户,并可以使用电子邮件地址和密码登录Shynet面板。
2)运行以下命令来设置Shynet面板:
./manage.py whitelabel <whitelabel>
参考命令:
./manage.py whitelabel fangjunyu.com@gmail.com
![](https://fangjunyu.com/wp-content/uploads/2024/04/图片-9.png)
4、完成配置
最后,到互联网访问端口号即可访问Shynet服务,大功告成!
![](https://fangjunyu.com/wp-content/uploads/2024/04/图片-10.png)
本教程大功告成,完结撒花🎉🎉撒花。
本教程花费了大约2天的时间,从学习到配置Shynet和踩坑,希望对大家能有所帮助。
五、踩坑经历
1、创建Shynet超级用户后,忘记了密码。
我们可以删除掉现有的用户并创建新用户,具体操作如下:
1)进入Shynet容器后,进入Python shell
python manage.py shell
在 Python shell 中,您可以执行以下命令删除用户:
(1)auth.User用户模型执行:
from django.contrib.auth.models import User
User.objects.filter(email='fangjunyu.com@gmail.com').delete()
(2)core.User用户模型执行:
from core.models import User # 导入正确的用户模型
User.objects.filter(email='fangjunyu.com@gmail.com').delete()
2)重新创建用户:删除用户后,您可以使用相同的电子邮件地址注册管理员用户。您可以再次运行您之前尝试的命令:
./manage.py registeradmin fangjunyu.com@gmail.com
这将重新创建具有指定电子邮件地址的管理员用户。
2、配置完成后,访问报Bad Request (400)。
![](https://fangjunyu.com/wp-content/uploads/2024/04/图片-11.png)
如果配置容器后发生报错,可以通过查看Shynet容器的日志了解更多信息
docker logs shynet
![](https://fangjunyu.com/wp-content/uploads/2024/04/图片-12.png)
根据日志的报错,了解到Django应用收到了一个带有无效HTTP_HOST头的请求。HTTP_HOST头应该是客户端发送请求时的主机名,但在这种情况下,主机名被设置为”www.fangjunyu.com:8080″,其中包含端口号8080。
为了解决这个问题,需要删除Shynet容器,并设置.env文件的ALLOWED_HOSTS字段,具体请查看上面“配置env文件”这一段内容。
还有一种就是Nginx配置错误导致的,我打算配置Shynet的Https,但是没有成功,也报了类似的错误,目前只能不走Nginx服务器。
六、参考资料
1、搭建 Shynet 网站流量统计分析工具:https://atpx.com/blog/build-shynet-web-analytics/
2、Shynet官网教程:https://github.com/milesmcc/shynet/blob/master/GUIDE.md#installation