---
layout: post
title: 如何离线安装1Panel
tags: [离线, 1Panel]
---

  Go写的程序感觉离线使用还挺方便的<!--more-->    

# 起因
  为了更好的管理服务器，我之前用过几种面板，比如宝塔，小皮，appnode还有[1Panel](https://github.com/1Panel-dev/1Panel)之类的，之所以用面板主要还是觉得这种用起来方便一些。有些脑子不合适的人看不起使用面板的人，他们可能用了比如软件包安装，或者源码编译、容器等等，结果一顿操作猛如虎，结果配置还是安装默认的，连调优都没做🤣。   
  总之最近正好需要在不能连接互联网的地方安装LEMP的环境，虽然现在的面板很多，但是似乎很少有面板支持离线安装。宝塔好像有付费的离线安装服务，但是我首先不信任宝塔，另外怎么可能给他们付钱呢😆？1Panel虽然官方不支持离线安装，但是社区中有离线安装的方法，不过好像不能使用网站管理的功能……当然经过我的测试，其实是有办法可以使用网站管理的功能，所以分享一下方法。   

# 离线安装1Panel的方法
  一般想离线安装的话搜到的文章应该就是[这篇文章](https://bbs.fit2cloud.com/t/topic/386)了吧，看起来操作有一点点复杂，不过评论里有个人整了个可以离线安装的[项目](https://github.com/wojiushixiaobai/1Panel-installer)，使用起来非常简单，连docker也一起安装了。只是使用的时候稍微有一点点坑，就是它的“--install-dir”参数默认是“/opt/1panel”，但是安装的时候会在这个目录里再建一个1panel文件夹，所以在使用的时候最好手动把参数设置为“--install-dir /opt”。   
  安装没什么问题，不过应用商店是空的，什么软件都安装不了，我在社区论坛里找了一下，好像可以把在互联网端1Panel实例中“/opt/1panel/resource/apps/remote”中的文件拷到离线设备中的“/opt/1panel/resource/apps/local”下，然后点更新就可以了，我试了一下确实可以，把镜像导出来再导入到离线设备，直接安装可能会报错，但是重建一下容器就能正常启动了。虽然容器是启动了，但是面板好像没识别到，还是不能管理，而且应用的文件被放在了“/opt/1panel/apps/local”目录下，就算能识别到，文件路径也是错的。看来得让面板认为导入的程序不是本地安装的，而是在线安装的。   

# 离线安装1Panel中应用的方法
  我在网上怎么搜，都没有找到现成的解决方法，看来只能我自己研究了😂。我找了一下，面板安装目录下有一个“/opt/1panel/db/1Panel.db”文件，应该是面板的数据库，我用sqlite3客户端打开看了一下，里面的apps表中可以看到应用被导入了，但是key在前面都被加了local，比如openresty变成了localopenresty，我对比了一下互联网端的数据库，除了这一处外，还有resource字段的内容也从remote变成了local。既然是这里有不一样的地方那就把它改成一样的呗，另外这里的字段名既然叫resource，那么肯定和那个目录也有关系，所以就得把“/opt/1panel/resource/apps/local”文件夹下的内容再全部移动到“/opt/1panel/resource/apps/remote”中，把数据库上传然后重启，离线环境中的1Panel也能正常识别了，而且安装后网站标签页也能正常创建网站之类的操作了。   
  Nginx（openresty）和MySQL这样安装都没啥问题，但是PHP出现了点问题，因为1Panel的PHP会在线下载扩展来构建镜像的，不是直接使用镜像创建的容器，所以安装会报错。不过既然能看到数据库，我发现有个runtimes表记录了PHP的状态，那么我把状态改成normal就可以了吧，试了一下还真行，改完上传然后重新导入容器，PHP也正常了。另外需要注意的是从互联网端导出的镜像名字和版本必须和离线端一样，不然可能识别不到，至于扩展啥的在互联网端选择好就可以了，离线端不需要修改。   
  所有操作完成之后试了试创建网站以及和PHP的连接之类的都可以正常使用了，就可以在内网环境下完全发挥1Panel的能力了。   

# 感想
  无论是Docker还是1Panel，能这么简单的在离线环境下安装我想可能是因为它是Go写的程序吧，能无依赖，静态编译的程序在没网的情况下还是方便啊……另外就是Docker果然也是离线使用的利器，想安什么在互联网准备好直接拿到离线端就能用，真是方便啊。