使用宝塔过程中遇到了许多问题,本篇特地把遇到的问题的解决方法列出来。


构建docker-php开发环境

开发php项目需要在本地构建php环境;对于使用mac的用户来说比较麻烦;这里通过docker中运行宝塔来搭建php开发环境。

**旧版:**使用docker run的方式运行,缺陷就是修改端口,映射目录等比较麻烦。
**新版使用docker-compose进行管理,同时引入docker-sync解决跨文件系统同步缓存的问题。**官方的cached同步方式可以查看我的另一篇博客:https://www.leolan.top/index.php/posts/260.html#directory02939551523776544612

如果之前用了我的旧版本宝塔,现在停止运行,不要删除,安装新版后可以把数据转移过去。
切换到php的项目目录下

# 构建镜像,创建Dockerfile
# 如果不打算自己构建镜像,可以使用我的现成的:
# 注意下面docker-compose配置要对应修改https://hub.docker.com/repository/docker/leolan/baota
FROM leolan/baota:latest

VOLUME /www/wwwroot

EXPOSE 80 443 8888 888 3306 6379

# 之后自行安装mysql后不用调整也会自动启动
# 默认安装了nginx和php7.3,需要其他的请补充完整,这里决定了是否开机启动这些软件
# 注意&&是必须执行成功才会执行下面的语句,;则是不管成功与否都会执行下面的语句
CMD /etc/init.d/bt start && \
    /etc/init.d/nginx start && \
    /etc/init.d/php-fpm-73 start && \
    /etc/init.d/mysqld start; \
    /etc/init.d/redis start; \
    /bin/bash

# Mongodb比较特殊,在docker下运行会出问题,请自行尝试

---------------------------------------------------
# 配置docker-sync
sudo gem install docker-sync

# 在项目目录下创建配置文件
vim docker-sync.yml

version: '2'

options:
  verbose: false

syncs:
  php-project-sync:
    # 需要同步的目录
    src: './'
    # 同步策略 macOS 推荐 native_osx,Windows 配置为 unison
    #sync_strategy: native_osx
    # 这里的用户 ID 为 1000,请确认你的 php-fpm 为同一个用户
    #sync_userid: 1000
    # 忽略的文件
    sync_excludes: [
      '.gitignore',
      '.git/',
      '.DS_Store',
    ]

# 启动
要在项目目录下执行,会下载eugenmayer/unison:2.51.2.1镜像并启动
docker-sync start

---------------------------------------------------
# 创建docker-compose配置文件
vim docker-compose.yml

version: "3"
services:
  bt:
    # 可以直接使用我的镜像,启动够简单修改;或者自己构建镜像
    image: leolan/baota:latest
    #build: .    # 使用当前目录下的Dockerfile构建镜像
    # tty输出,不开启会导致容器退出
    tty: true
    ports:
      - 8888:8888
      - 888:888
      - 3306:3306
      - 6379:6379
      - 80:80
      - 443:443
    volumes:
      # /www/wwwroot是宝塔默认的网站根目录
      - php-project-sync:/www/wwwroot

volumes:
  # 引入外部存储,通过docker-sync同步
  php-project-sync:
    external: true


# 先启动一次,看是否异常,同时为下面操作做准备
docker-compose -f docker-compose.yml up -d
然后进宝塔安装mysql,php,redis等等,如果需要迁移旧数据,安装好后不要修改配置。

!!!注意:如果要迁移mysql的数据库,安装的mysql大版本必须和旧面板基本一致;(如5.7.15和5.7.34就是大版本一致的),否则mysql无法启动。

如果使用了我的镜像,之后又加装了一些服务并且想要开机自启动,依然可以参考**已启动容器调整**中的方法进行修改:
https://www.leolan.top/index.php/posts/260.html#directory0849484747540393312

完成之后如果需要迁移旧数据,exec进入ssh环境,执行bt命令,停止宝塔面板,窗口不要关闭
然后执行下面的命令迁移数据。

---------------------------------------------------
# 迁移数据
配置必要参数,在属主机执行命令
old_container=4b2aafa390fa  # 旧容器id
new_container=36c94ac42f8e  # 新容器id
panel_data=/www/server/panel/data  # 不要/结尾

docker cp $old_container:$panel_data/default.db . && \
docker cp default.db $new_container:$panel_data

docker cp $old_container:$panel_data/system.db . && \
docker cp system.db $new_container:$panel_data

docker cp $old_container:$panel_data/port.pl . && \
docker cp port.pl $new_container:$panel_data

docker cp $old_container:$panel_data/admin_path.pl . && \
docker cp admin_path.pl $new_container:$panel_data

# 下面这段是迁移mysql数据,mysql版本必须和旧面板版本基本一致(如5.7.15和5.7.34就是大版本一致的),
否则mysql无法启动。
docker cp $old_container:/www/server/data . && \
docker cp data $new_container:/www/server/

rm -rf default.db system.db port.pl admin_path.pl data

回到上面的窗口修改文件权限(在容器内修改权限)
chown -R root:root /www/server/panel/data
chown -R mysql:mysql /www/server/data

# 如果迁移了mysql的数据,需要执行以下操作
以下是mysql8会出现的问题;mysql8以下一般不会有问题,如果出问题,参考以下解决方法。
执行上面迁移数据的命令后,重启一次mysql,一般是可以正常启动的,如果失败了,看日志:/www/server/data/xxx.err
启动后是无密码的,宝塔面板的问题,在mysql管理中重置mysql的root密码,提示修改成功(实际上未成功,可以点同步数据库按钮测试)
记住这个root密码;回到命令行中,设置mysql8的密码(此时mysql8的密码为空)
mysqladmin -u root -p password [刚刚记录的root密码]
回车后提示输入旧密码(旧密码为空,直接回车);修改成功;此时回到面板可以同步了。一切正常,数据库数据都在。


完成后退出容器;重启容器(在项目目录下执行下面命令)
docker-compose -f docker-compose.yml stop
注意不要使用down,会删除容器,导致数据丢失

docker-compose -f docker-compose.yml start
再次登录宝塔检查数据是否已恢复。

Mac开机启动项

# 编写启动脚本
vim /Users/leolan/git_data/php_project/startup.sh

#!/bin/bash

cd /Users/leolan/git_data/php_project

# php_project_bt_1是容器的名称,docker ps可以看到
# 写成循环是因为开机后docker服务没有那么快启动完成
while [[ $(docker inspect -f '{{.State.Running}}' php_project_bt_1) != "true" ]]
do
  echo "宝塔面板正在启动。。。"
  # 启动文件同步服务
  docker-sync start
  sleep 10
  # 不要使用docker-compose up -d会重建容器,未挂载的卷数据丢失。
  docker-compose -f docker-compose.yml start
  sleep 30
done


chmod +x startup.sh

---------------------------------------------------
# 配置plist启动配置文件
sudo vim /Library/LaunchDaemons/com.bt-panel.plist

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" " [http://www.apple.com/DTDs/PropertyList-1.0.dtd](http://www.apple.com/DTDs/PropertyList-1.0.dtd) ">
<plist version="1.0">
  <dict>
	<!-- Launch Daemon 不一定有权限访问所有需要的环境变量;在没有权限的时候,启动项执行会失败,所以我们在这里配置一下脚本需要的环境变量 -->
    <key>EnvironmentVariables</key>
    <dict>
      <key>PATH</key>
      <string>/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:</string>
    </dict>
    <key>Label</key>
	<!-- 习惯上,我们会用一个 identifier 样式的名字来作为启动项的名称 -->
    <string>com.bt-panel</string>
    <key>Program</key>
	<!-- 要执行的脚本的绝对路径 -->
    <string>/Users/leolan/git_data/php_project/startup.sh</string>
	<!-- 这个 key 告诉系统在启动的时候执行我们的脚本;对于 daemons 来说是系统启动之后,对于 agent 来说则是用户登录之后 -->
    <key>RunAtLoad</key>
    <true/>
	<!-- 判断是按需启动我们的启动项,还是永远运行下去;现在我们自己跑的是自己的脚本,按需启动就可以了 -->
    <key>KeepAlive</key>
    <false/>
    <key>LaunchOnlyOnce</key>        
    <true/>
	<!-- 在调试脚本的时候很好用,可以指定脚本正常/错误输出的路径 -->
    <key>StandardOutPath</key>
    <string>/tmp/startup.stdout</string>
    <key>StandardErrorPath</key>
    <string>/tmp/startup.stderr</string>
    <key>root</key>
	<!-- 执行脚本的用户 -->
    <string>davidleee</string>
  </dict>
</plist>

# `-w` 会把 plist 永久添加到 Launch Daemon 里面
sudo launchctl load -w /Library/LaunchDaemons/com.bt-panel.plist

# 取消自启动
sudo launchctl unload -w /Library/LaunchDaemons/com.bt-panel.plist

参考:https://www.jishuwen.com/d/2cAv


插件安装

OSS挂载

原网址:https://www.bt.cn/bbs/thread-20503-1-1.html
插件可在宝塔面板中安装。
填写外链域名时不要包含 Bucket 名称!!!


git 同步(类 CI)

原网址:https://www.bt.cn/bbs/thread-21803-1-2.html


共享带宽赚钱

原网址:https://www.bt.cn/bbs/thread-30909-1-1.html


redis 管理插件

原网址:https://www.bt.cn/bbs/thread-20816-1-3.html
1、登录服务器执行pip install redis
2、执行 shell后重启面板服务。安装命令:bash xxx.sh install

#!/bin/bash
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH

#配置插件下载地址和安装目录
download_url=http://bt.dayuanren.net/redisutil
install_path=/www/server/panel/plugin/redisutil

#安装
Install()
{
	#创建插件目录
	mkdir -p $install_path
	echo '正在下载文件...'
	wget -O $install_path/redisutil_main.py  $download_url/redisutil_main.py
	wget -O $install_path/index.html $download_url/index.html
	wget -O $install_path/info.json $download_url/info.json
	wget -O $install_path/icon.png $download_url/icon.png
	wget -O $install_path/install.sh $download_url/install.sh
        # 以下是通过安装包安装 python-redis,前面已使用 pip 安装了。
        # wget --no-check-certificate https://pypi.python.org/packages/source/r/redis/redis-2.8.0.tar.gz
        # tar -zvxf redis-2.8.0.tar.gz
	# rm -f redis-2.8.0.tar.gz
        # mv redis-2.8.0 $install_path/python-redis-2.8.0
        # cd $install_path/python-redis-2.8.0
        # python setup.py install
	echo '================================================'
	echo '安装完成'
}

#卸载
Uninstall()
{
	rm -rf $install_path
}

#操作判断
if [ "${1}" == 'install' ];then
	Install
elif [ "${1}" == 'uninstall' ];then
	Uninstall
else
	echo 'Error!';
fi

WebHooks

WebHooks插件,用于处理一些请求,目前有用在自动部署CI方面,参考:https://www.leolan.top/index.php/posts/283.html


Gitlab

使用宝塔面板安装的Gitlab

不要使用gitlab-ctl reconfigure

如果修改了配置,并使用gitlab-ctl reconfigure更新配置,容易导致nginx二进制文件被删除,导致nginx无法启动。

# 排查
gitlab-ctl tail
# 报错
chpst: fatal: unable to run: /opt/gitlab/embedded/sbin/nginx: file does not exist

修复:cp /opt/gitlab/embedded/sbin/gitlab-web /opt/gitlab/embedded/sbin/nginx

如果修改了配置,可以使用gitlab-ctl reconfigure更新配置,然后执行一次修复步骤。
gitlab-ctl reconfigure必须在“部分服务”启动的状态下才可以执行成功。
如果只是更改nginx配置,则在命令行修改模板文件;然后直接在宝塔中重启Gitlab即可!!!

参考:http://www.bt.cn/bbs/forum.php?mod=viewthread&tid=12190&highlight=gitlab


启用HTTPS(Let's Encrypt)

在宝塔中新建站点,绑定域名,申请证书,开启强制SSL;再设置反代:127.0.0.1:8099,传递域名,如:gitlab.leolan.top

vim /etc/gitlab/gitlab.rb
# 修改为如下,注意,一定要为http,如果写了https会开启证书,导致配置出错。
external_url 'http://gitlab.leolan.top'

gitlab-ctl reconfigure
执行完之后使用gitlab.leolan.top就能访问了,虽然在gitlab中切换到http协议显示的是http,也是可以使用https的,不影响。

启用HTTPS(自签证书)

vim /etc/gitlab/gitlab.rb

#13行的 http >> https
external_url 'https://ip:port'

#修改nginx配置
nginx['redirect_http_to_https'] =true
nginx['ssl_certificate'] = "/etc/gitlab/ssl/server.crt"
nginx['ssl_certificate_key'] = "/etc/gitlab/ssl/server.key"


#秘钥脚本,将以下内容保存为shell脚本,然后运行(这里是自签证书)
#出现提示输入信息的地方输入信息,先输入域名然后4次证书密码,任意密码,四次保持一致。
#!/bin/sh

# create self-signed server certificate:

read -p "Enter your domain [139.199.125.93]: " DOMAIN
echo "Create server key..."
openssl genrsa -des3 -out $DOMAIN.key 1024

echo "Create server certificate signing request..."
SUBJECT="/C=US/ST=Mars/L=iTranswarp/O=iTranswarp/OU=iTranswarp/CN=$DOMAIN"
openssl req -new -subj $SUBJECT -key $DOMAIN.key -out $DOMAIN.csr

echo "Remove password..."
mv $DOMAIN.key $DOMAIN.origin.key
openssl rsa -in $DOMAIN.origin.key -out $DOMAIN.key

echo "Sign SSL certificate..."
openssl x509 -req -days 3650 -in $DOMAIN.csr -signkey $DOMAIN.key -out $DOMAIN.crt

echo "TODO:"
echo "Copy $DOMAIN.crt to /etc/nginx/ssl/$DOMAIN.crt"
echo "Copy $DOMAIN.key to /etc/nginx/ssl/$DOMAIN.key"
echo "Add configuration in nginx:"
echo "server {"
echo "    ..."
echo "    listen 443 ssl;"
echo "    ssl_certificate     /etc/nginx/ssl/$DOMAIN.crt;"
echo "    ssl_certificate_key /etc/nginx/ssl/$DOMAIN.key;"
echo "}"

mkdir -p /etc/gitlab/ssl
cp 139.199.125.93.crt /etc/gitlab/ssl/server.crt
cp 139.199.125.93.key /etc/gitlab/ssl/server.key
chmod -R 700 /etc/gitlab/ssl/

# 更新配置,可能会导致nginx文件被清除掉,执行上面的步骤修复!!!
# 可以使用gitlab-ctl tail查看日志,确保nginx没有报错
gitlab-ctl reconfigure


# 修改nginx配置
vim /var/opt/gitlab/nginx/conf/gitlab-http.conf
此时可以看到已经增加了301跳转,但是是死循环(http的端口和https端口一样,且为301)。
修改http的端口为其他端口,https端口还是8099保持不变。

然后修改HTTPS部分的配置
listen *:8099 ssl http2;修改为:listen *:8099 default ssl;
然后在宝塔中重启Gitlab,即可正常工作。

参考:https://www.cnblogs.com/xieshuang/p/8488458.html



MongoDB

设置密码

登录服务器,命令行运行以下命令
mongo
use admin
# 管理组为admin,用户名为root,密码自行设置
db.createUser(
	{
		user:'root',
		pwd:'密码',
		roles:[
				{role:'dbAdminAnyDatabase',db:'admin'},
				{role:'userAdminAnyDatabase',db:'admin'}
			]
	}
)

# 验证刚刚创建的用户
db.auth('root','密码')   # 返回1表示成功
或者:
db.createUser({user:'root',pwd:'密码',roles:[{role:'root',db:'admin'}]})

# 创建普通用户
use admin
db.auth("root", "123456")

# 创建数据库:leotest,创建用户leo,给予管理该库的权限。
use leotest
db.createUser(
  {
    user: "leo",
    pwd: "123456",
    roles: [ { role: "dbAdmin", db: "leotest" },
             { role: "readWrite", db: "leotest" }
           ]
  }
)
# 不给readWrite读写权限无法读写数据库
# 关于role角色,参考:https://www.jianshu.com/p/79caa1cc49a5

完成之后登录宝塔,修改配置文件,然后重启服务

security:
  authorization: enabled   #修改为enabled

可以同时修改绑定IP,端口等

重启后登录账户密码是:leo + 密码!
认证方式:3.0版本以后采用的是“SCRAM-SHA-1”, 之前的版本采用的是“MONGODB-CR”。

参考:https://www.jianshu.com/p/79caa1cc49a5


新增数据库、用户

# 连接
mongo --host 127.0.0.1 --port 27017

# MongoDB的权限设计是每个库的权限、用户都是独立的,权限细分。
# 认证管理权限
use admin
db.auth('root', '密码')

# 授权成功再切换到新数据库,没有的库会自动创建
use WechatAPP

# 如果是新库;在该库上创建用户,授予管理权限和读写权限
db.createUser(
  {
    user: "leolan",
    pwd: "123456",
    roles: [ { role: "dbAdmin", db: "WechatAPP" },
             { role: "readWrite", db: "WechatAPP" }
           ]
  }
)

# 如果是旧库,修改权限和用户;切换到admin进行授权才有效
use admin
db.grantRolesToUser( 'user2', [{role:"readWrite", db:"WechatAPP"}])

Redis

redis设置密码

修改配置,同时可以修改绑定IP,端口,保护模式
requirepass newpasswd

修改完成后是无法重启的,会报一个警告(应该是宝塔的一个bug);可以点停止,状态还是运行的,可以看linux中的端口,然后在点重载服务,即可启动成功。

注意!!!:如果改了配置,不小心点到了重载服务,redis很大概率启动不了。这时只能登录ssh,删除pid进程文件,rm /var/run/redis_6379.pid然后再执行任何操作都会启动。


Docker启动报错

安装docker后启动报错,一般是python2和pip2的问题,宝塔dokcer依赖python2环境。
最大的可能是升级了pip版本,在centos 7中,自带的pip不要升级,升级到18.0后非常多问题。
检测:

python3
pip3 -V

python
pip -V
# 此时发现pip -V显示的是在pip3的目录。(两个pip变同一个了)
which pip
ll /usr/bin/pip3
ll /usr/bin/pip
两者都不是软链接

rm -rf /usr/bin/pip
yum reinstall python2-pip

# 再次检查
python3
pip3 -V

python
pip -V
没问题,登录宝塔面板,卸载重装Docker!!!

终端工具(含Docker的终端工具)报错

连接SSH服务失败!

# 情况一,启用了密钥登录,关闭了密码登录
# 确认依赖没有问题,注意pip是pip2的,centos 7的yum源中的版本,不要升级pip!!!
pip install paramiko==2.0.2
bt reload

# 把本机密钥加入认证的主机列表
cat /root/.ssh/id_rsa.pub
如果上一句提示文件不存在,则执行下面一句
ssh-keygen -q -t rsa -P "" -f /root/.ssh/id_rsa
如果存在执行下面两句
cat /root/.ssh/id_rsa.pub >> /root/.ssh/authorized_keys
chmod 600 /root/.ssh/authorized_keys

owncloud

1、面板安装mysql,创建数据库
2、安装php7.3(最新10.4.1版本貌似不支持php7.4),并安装插件:fileinfo、memcached、redis(如果没安装redis也会自动装上,有密码要修改)、apcu、opcache;同时删除禁用函数putenv。
3、新建网站,上传owncloud程序:https://github.com/owncloud/core/releases
4、安装PM2管理器,会自动安装node、npm、nvm
打开命令行,解压程序,进入目录,执行make编译静态文件
5、打开新建的网站(注意设置owncloud目录为网站根目录,注意权限),按提示安装。
6、安装完成后在设置中把定时任务设置为Cron模式。

命令行增加文件
界面上传有时候很麻烦,或者需要上传服务器上其他磁盘的文件;可以按以下操作

# 移动文件到指定目录
mv xxxx /owncloud_install_dir/data/[用户名]/files
# 扫描所有用户的所有文件
cd /owncloud_install_dir && sudo -u www php occ files:scan --all

更多命令:https://www.orgleaf.com/2400.html

参考:https://www.dujin.org/13563.html


nextcloud

类似owncloud;安装方法,同步文件方法也类似。


Seafile

类似owncloud,是企业级的云盘;安装方法类似。
CentOS 7一键安装Seafile搭建私有云存储:https://www.xiaoz.me/archives/8480

文章作者: Leo
版权声明: 本站所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 LeoLan的小站
Dev Python 环境搭建 宝塔面板
喜欢就支持一下吧