文章目录
git克隆项目
git clone https://github.com/Gerapy/Gerapy.git
修改挂载目录
打开docker-compose.yml文件,可以看出挂载目录是gerapy:/home/gerapy,也就是说直接存到根目录了,而且没有自动创建
version: "3.9"
services:
gerapy:
image: germey/gerapy
build: .
container_name: gerapy
restart: always
volumes:
- gerapy:/home/gerapy
ports:
- 8000:8000
volumes:
gerapy:
这里个人选择存放在/home/gerapy下,先创建目录
mkdir -p /home/gerapy
修改docker-compose.yml文件如下
version: "3.9"
services:
gerapy:
image: germey/gerapy
build: .
container_name: gerapy
restart: always
volumes:
- /home/gerapy:/home/gerapy
ports:
- 8000:8000
volumes:
gerapy:
通过docker-compose.yml文件安装容器
docker-compose up
修改密码
- 因为gerapy是使用python的django进行开发的,所以使用django管理面板修改即可
- 访问网址:http://your-gerapy-domain/admin/
- 在页面右上角,点击. CHANGE PASSWORD 进行修改即可
后台运行
如果已经通过docker-compose up运行,按Ctrl+C退出即可,然后在执行一下指令
docker-compose up -d
停止gerapy
docker-compose down
重启gerapy
docker-compose restart
打包失败问题
项目安装完正常能启动后,在“项目管理”,点进项目后,点击“打包”项目,出现“打包失败”的提示,页面上没有具体的提示,只能通过自行排查。排查问题首先从日志入手,有两种方式,如下:
- 第一种:通过容器日志查看
docker logs gerapy
- 第二种:通过/home/gerapy/logs下的日志查看
但查看后查看到的log都只有简单的信息
ERROR - 2024-01-10 13:43:12,554 - process: 28 - build.py - gerapy.server.core.build - 78 - build - error occurred (1, ['/usr/local/bin/python', 'setup.py', 'clean', '-a', 'bdist_uberegg', '-d', '/tmp/gerapy-fhxtp8iu'])
INFO - 2024-01-10 13:43:12,554 - process: 28 - build.py - gerapy.server.core.build - 24 - build - successfully build project jujia_scrapy to egg file None
根本无从入手,于是只能从源码入手,通过搜索“successfully build project”查找到源码相应位置:
def build_project(project):
"""
build project
:param project:
:return:
"""
egg = build_egg(project)
logger.info('successfully build project %s to egg file %s', project, egg)
return egg
def build_egg(project):
'''
build project to egg file
:param project:
:return:
'''
work_path = os.getcwd()
try:
path = os.path.abspath(join(os.getcwd(), PROJECTS_FOLDER))
project_path = join(path, project)
os.chdir(project_path)
settings = config(project_path, 'settings', 'default')
setup_file_path = join(project_path, 'setup.py')
create_default_setup_py(
setup_file_path, settings=settings, project=project)
d = tempfile.mkdtemp(prefix='gerapy-')
o = open(os.path.join(d, 'stdout'), 'wb')
e = open(os.path.join(d, 'stderr'), 'wb')
retry_on_eintr(check_call, [sys.executable, 'setup.py', 'clean', '-a', 'bdist_uberegg', '-d', d],
stdout=o, stderr=e)
o.close()
e.close()
egg = glob.glob(os.path.join(d, '*.egg'))[0]
# Delete Origin file
if find_egg(project_path):
os.remove(join(project_path, find_egg(project_path)))
shutil.move(egg, project_path)
return join(project_path, find_egg(project_path))
except Exception as e:
logger.error('error occurred %s', e.args)
finally:
os.chdir(work_path)
对于看源码和分析的细节,个人就不透露了。有需要的V281523824。
对此,可以了解到打包项目的时候会在/tmp目录下生成一个gerapy-前缀的文件夹,然后在里面打包,并会输出stderr,这个很关键,这个就是我们可以排查的文件,对此我们需要进到容器里面找到这个文件
进入容器
docker exec -it gerapy bash
转到/temp/gerapy-dcvhg文件夹(dcvhg是随机生成的,自己查看进入),由于是容器,只能直接cat输出
cat stderr
可以看到以下错误内容
File "/home/gerapy/projects/jujia_scrapy/setup.py", line 5, in <module>
setup(
File "/usr/local/lib/python3.10/site-packages/setuptools/__init__.py", line 87, in setup
return distutils.core.setup(**attrs)
File "/usr/local/lib/python3.10/site-packages/setuptools/_distutils/core.py", line 185, in setup
return run_commands(dist)
File "/usr/local/lib/python3.10/site-packages/setuptools/_distutils/core.py", line 201, in run_commands
dist.run_commands()
File "/usr/local/lib/python3.10/site-packages/setuptools/_distutils/dist.py", line 968, in run_commands
self.run_command(cmd)
File "/usr/local/lib/python3.10/site-packages/setuptools/dist.py", line 1217, in run_command
super().run_command(command)
File "/usr/local/lib/python3.10/site-packages/setuptools/_distutils/dist.py", line 987, in run_command
cmd_obj.run()
File "/usr/local/lib/python3.10/site-packages/uberegg.py", line 37, in run
log.warn(
File "/usr/local/lib/python3.10/site-packages/setuptools/_distutils/log.py", line 49, in warn
self._log(WARN, msg, args)
File "/usr/local/lib/python3.10/site-packages/setuptools/_distutils/log.py", line 25, in _log
msg = msg % args
TypeError: must be real number, not str
看了一圈,根据个人从业经验,这个跟gerapy代码和依赖关系都不大,反而是setuptools这个工具的问题。所以我删除了setuptools,然后升级了一下pip,再重新安装了一下,问题就解决了
pip uninstall setuptools
pip install --upgrade pip
pip install setuptools
特此记录这个问题,一方面是巩固自己的docker使用和问题排查经验。这种问题,换做以前可能看到了错误日志,也都还是找不出原因,现在做久了,看到类似报错,都能有灵机一动了。
但也有疑问,docker-compose安装出来的,怎么还有python版本和包兼容的问题。不是应该都是统一了吗?作者肯定是有自测的,所以程序这种东西,不是最新就最好,最合适才是最重要。
打包失败问题2.0
项目根目录下不能有requirements.txt文件
通过git克隆同步代码
安装git
首先需要进入到容器中进行安装
docker exec -it gerapy bash
安装git指令
apt-get install -y git
这里有一点个人的题外话,因为自己的gitlab是使用docker搭建的,端口映射是8087—>80,所以gitlab.rb配置文件中还不能直接修改external_url ‘http://gitlab.example.com:8087’。所以,只能手动在git链接上添加8087端口,属于个人问题,可以跳过
克隆命令
git clone http://username:password@host:port/my_scrapy.git
使用以上格式即可通过http,然后无需手动输入账号密码的方式直接克隆项目
- 特别注意:基于安全性的问题,如果你的gitlab上面有很多项目,那需要创建一个gitlab的账号,然后这个账号仅有读取权限,确保安全
提示克隆成功,但实际没有代码
- 另外千万注意username和password中不要使用符号,类似@#¥%这些,这些会影响到解析,导致莫名错误。如下
fatal: unable to access 'http://127.0.0.1:8087/python/clean.git/': URL using bad/illegal format or missing URL
此时需要你修改一下代码即可
结言
gerapy相比scrapydweb有一点不好,就是发布的项目没有版本管理,只能是最新的,有一种场景,就是爬虫大改后,上线正式,出现问题了,想回退版本,就只能重新拉取对应版本的代码,比较麻烦
而scrapydweb可以选择版本进行发布,相比方便一些