Vscodeserver如何配置Python环境

这几天用vscodeserver搭了一个远程编程环境,想用它来先写写Python,结果,因为配置不熟悉浪费了不少时间,更糟糕的是网上很多的文章都是误导。

首先,像大家认为的一样,vscode确实是简单有效,出厂做了很好的配置,安装过程很顺利。

其次,实际编程还是要简单设置一下,否则各种错误。

1、Code language not supported or defined

系统建好后,新建了一个文件,写了Python测试代码,点运行,结果显示Code language not supported or defined,网上各种解释都试了一遍无效。

后来没有办法,进入系统的帮助主页,里面有系统安装、如何开始的介绍视频,其实很简单,新建文件后修改文件名,一定要加上编程语言对应的后缀,其中python程序文件的后缀是.py,这样vscode就知道这是python,会自动调用系统可用的解释,我想其它语言应该一样处理。

2、ImportError: No module named XXX

系统可用后,运行程序显示没有相应的模块,真实的情况是存在两种可能,系统真的缺少模块或找不到模块路径。

进行系统后台,用pip install安装相应,运行后系统仍然显示上述错误,显然,系统不知道安装的模块在什么地方,需要配置环境路径,这个地方网络上很多方法不一定有效。我摸索出来的方法同样相当简单。

2.1 查询系统当前默认python解释器的情况

编写一个py程序,里面就一句,print(sys.path),然后运行,查看输出信息。或者直接在终端环境输入这条语句。

系统返回:

说明现在系统运行在Python2环境,而新版的vscode安装pip时实际将模块安装在Python3环境中。

2.2 修改配置文件

a 进入设置,选用户,然后找到扩展,选择Run Code Configuration

b 修改settins.json文件

点出打开settins.json文件,找到以下代码段:

"code-runner.executorMap": {

        "javascript": "node",
        "java": "cd $dir && javac $fileName && java $fileNameWithoutExt",
        "c": "cd $dir && gcc $fileName -o $fileNameWithoutExt && $dir$fileNameWithoutExt",
        "cpp": "cd $dir && g++ $fileName -o $fileNameWithoutExt && $dir$fileNameWithoutExt",
        "objective-c": "cd $dir && gcc -framework Cocoa $fileName -o $fileNameWithoutExt && $dir$fileNameWithoutExt",
        "php": "php",
        "python": "python -u",
        "perl": "perl",
        "perl6": "perl6",
        "ruby": "ruby",

将其中的”python”: “python -u”,改成”python”: “python3 -u”,即可。关闭退出。重新运行程序,程序就可以Python3环境运行了。

nextcloud和onlyoffic

用Docker安装Nextcloud 出现无法连接外部数据库以及集成onlyoffice时报错,尤其是nextcloud和onlyoffice的集成几乎成了’世界性’难题,我尝试的一些方法也许可以供大家参与。

一、当前对这套系统的安装普遍的看法

1、两个软件不要在一个局域网内安装,更不能在同一台服务器上安装。

2、两个软件只能进行SSL安全连接,都要用CA证书或自签证书。

二、我折腾以后的几点体会

1、局域网安装可以,安装在同一台电脑上也可以。

2、用SSL以https连接可以,内网用ip连接也可以,用http连接还是可以的。

3、nextcloud这个软件在网络设计上有问题,最少不够聪明,应该尽快改进。对nextcloud 和onlyoffice地址格式要求不清楚,是最大的问题。

三、几个问题解决的基本经过

1.在使用nextcloud 集成onlyoffice时,会出现提示 :host violates local access rules

cd到/var/www/html/config,需要在配置文件 config.php 中增加下列语句,允许外网远程访问:

‘allow_local_remote_servers’ => true,

2.连接数据库提示错误,确认用户名密码正确,多试几次。这位网友的文章可供参考。

https://post.smzdm.com/p/a5kq92vk/

3、nextcloud集成onlyoffice时报错,一般安装步骤可以参考网络,错误会有各种信息,最后反复出现如下提示:

Error while downloading the document file to be converted.

这个时候,nextcloud和onlyoffice无论在内网还是在外网均能独立访问,单个软件内部操作都没有问题,就是没有办法将两个软件集成在一起,百度了全网多数环境不同不具有参考价值,但有两位网友的分析文章给了我很大的启发,他们的观点是:

a nextcloud集成onlyoffice文档服务器时,会根据你打开nextcloud时的环境生成文档服务器的请求链接。这句话的意思是要么按纯外网环境配置,要么按纯内网环境配置,如果集成链接地址中内外网地址混填,则很有可能两个软件不能正常交互。

b 生成的服务请求链接要在nextcloud和onlyoffice自身环境得到正确的域名(ip)解释。

c 最终所有的问题在于两者相互传递信息时能正确连接。

根据这个思路,做了两个重要改进:

第一,建立内网DNS SERVER,我是群晖系统比较方便,设置好后使得外网使用的域名在内网也能得到解释。这样做了之后,你无论是在外网还是在内网都能以域名访问。

第二,用不同的组合填入onlyoffice服务器设置的三个选项中,但一直不成功。

后来想到不接自己的服务器,先连一下onlyoffice的演示服务器,看看需要什么样的条件,发现“用于文档编辑服务内部请求的服务器的地址”需要填写正确的nextcloud外网地址。然后尝试在“文档编辑服务地址”填入onlyoffice服务器的外网地址,成功连接。中间那个可以不填。

4、还是在nextcloud中打开onlyoffice文件的问题

这次出现的问题是,两者都集成好了,平时使用也没有什么问题,但在单位内网连接到外网打开nextcloud中的office文档时,报告无法下载文件,文件无法保存并返回文件列表,问题的现象是nextcloud能调用onlyoffice,但onlyoffice打不开文件。

以上问题现象说明,nextcloud能与onlyoffice正确连接,但onlyoffice有问题,提示无法下载可能表示onlyoffice无法读取文件,而提示无法保存可能表示onlyoffice无法按设置找到存储文件的地方,这可能是一个网络连接问题。

回到局域网环境下调用onlyoffice,发现能顺利打开office文档,再回到外网环境下调用onlyoffice,发现问题解决。

结合前面安装集成onlyoffice时解决问题的过程,这种情况似乎还是一个网络访问的问题,两者集成是相互调用时地址解释的问题,而onlyoffice读取保存文件仍然有一个地址解释的问题,在单位内网连接外网时经过了多次NAT,又是用的域名访问,造成不能正确翻译IP地址,当在局域网用域名调用后,onlyoffice找到了域名对应的正确IP,再回外网调用时可以利用内部缓存正确找到外网中的服务器。

以上仅是推断,没有花时间去验证,可能不正确。

三、关于onlyoffice的中文字体

1、对编辑要求高的人,可以在系统fonts目录加入中文字体,onlyoffice字体下拉菜单长,设置字体的时候找到需要字体比较费劲,要求不高的人完全可以删除onlyoffice的自带的字体,利用系统字体就可以了。

cd /var/www/onlyoffice/documentserver/core-fonts/
rm -rf *

但建议/documentserver/core-fonts/目录中最少保留一个字体 ancient-scripts,这个是数学公式字体,如果删除写学术文章就不好办了。

2、添加进系统字体目录的中文字体最好不要用相关软件进行名称属性的修改,修改后在onyoffice中使用没有问题,但当你把写好的文件保存为docx等格式并下载到本地电脑上,再用微软office打开时就有可能会丢掉全部字体格式,因为word找不到对应的字体,如果中文字体来自windows,也不改动,则下载文件打开时word就能正确识别。

四、关于Nextcloud上传文件限制

我的系统信息中显示PHP对上传文件大小有限制:

为了证实实际限制情况,做了几个上传文件实验,最大传了一个1.5GB的文件,并没有实际的限制,并且传输速度也没有任何异常。所以,系统到底有没有文件大小的限制可以先试一下。

四、onlyoffice文档服务器限制连接服务

默认状态下onlyoffice文档服务器安装后是没有连接限制的,在可以外网访问的情况下,任何一台电脑输入服务器的地址都能连接上去,无限制的访问显然面临基本的安全问题。onlyoffice内部的配置文件有用于限制访问的内容,只要正确配置就可以增加安全性。

一种配置是用调用浏览器的地址来限制访问,只允许特定的IP访问onlyoffice服务器,这种配置方法用于公司比较合适。

另一种配置是设置JWT访问令牌,在配置文件设置好访问密钥,然后在nextcloud的集成插件中正确填入该密钥就可以了。

1、SSH进入系统后台,并修登入onlyoffice的容器内部。

2、用文本编辑器打开/etc/onlyoffice/documentserver/default.json

3、修改以下几项内容

此图像的alt属性为空;文件名为截屏2021-01-05-下午1.48.01.png

3.1 图中的几个红色的secret全部改成想要设置的密码。

3.2 将下面token中的browser、inbox、outbox三项改成true,原设置是false

4、在nextcloud的onlyoffice插件设置中,在密钥选项下的空格中填入上一步设置的密码。

五、几点说明:

1、系统环境,nextcloud和onlyoffice均是官方docker镜像最新版部署在群晖NAS上,数据库利用系统套件DB10,与其它程序共用。

2、两个软件均只映射http端口,没有使用证书,而是通过系统的反向代理安全连接到外网,所以上述地址是https。

3、通过测试表明,局域网环境两者相互连接情况复杂,以上措施实际是利用搭建内网域名服务器模拟了外网环境。如果不在外网使用,纯内网则直接用ip地址是可以连接的,而且只需要填“文档编辑服务地址”。

附两位网友的博文:

nextcloud+onlyoffice同局域网部署网络不通分析与解决(原创)https://www.jianshu.com/p/21ebf3ef5cfc

https://www.orgleaf.com/3589.html

Docker实现Python的Jupyterhub远程开发环境集成

python可以有多种编程环境,notebook简单好用,基本代码块的编写调试是不错的。如果能将整个环境打包成docker容器,并部署成远程多用户安全连接就更好了,实现这个过程克服了不少问题,这里记录一下基本实现方法。

基本目的:

1、全部docker安装,这样所有组件与本地系统隔离,不容易搞乱操作系统而且可以移植、保存,实现一次部署分发使用。

2、用jupyterhub实现多用户远程外网使用。

3、用系统反向代理实现https安全连接。

实现方法:

1、docker安装一个有linux环境的基础镜像,并完成基础配置

linux的一般发行版都可以,最好已经带了python环境,如果没有python自己安装。基本步骤是:

1.1 拉取一个有linux环境的镜像。

1.2 按要求启动容器。

1.3 从终端进行容器内部,update linux操作系统到最新列表,添加系统用户并设置密码,以后notebook就用这些系统用户帐户登录。

1.4 在容器内安装python、安装pip(或者conda)。

2、docker容器中安装notebook

2.1 pip3 install jupyterhub安装jupyterhub服务器,这一步要做一些配置,按网上教程。配置以下几项就可以了。

c.JupyterHub.ip = '172.17.0.***'
c.JupyterHub.port = ****
c.JupyterHub.statsd_prefix = 'jupyterhub'
    
# 白名单用户
c.Authenticator.whitelist ={'user_name_1','user_name_2','user_name_3'}

因为安装在docker中,这里的ip地址要填容器内部真实ip,如果不清楚可终端进入容器内部,用ifconfig查看,如果系统提示未找到命令,可以先安装net-tools工具,因为容器都是极简系统有可能没有集成网络工具。

注:系统运行很长一段时间后进行了Docker版本的升级,再次运行容器时发现JupyterHub无法运行,在Supervisor工具的管理下反复重启,多处查看都不清楚原因,认为可能是Docker升级造成容器不兼容,准备重装该容器,再读这篇文章,“这里的ip地址要填容器内部真实ip”,想到系统更新可能造成内部ip变化,进入系统查看果然如此,修改配置文件中的参数,容器立刻稳定运行。

2.2 pip3 install jupyter安装notebook服务器。如果系统提示缺少依赖,一样pip install。如何不想启动本地的notebook编辑器,则notebook可以不配置。

3、退出容器,并停止容器运行,用容器管理工具将c.JupyterHub.ip指定的端口映射到宿主机的本地端,这一步可以提前在启动基础镜像时就映射好,有可能有些系统容器运行后不好再添加端口。

4、再次运行容器,进入容器,启动notebook服务。

cd 到jupyterhub配置文件目录,输入

nohup jupyterhub > jupyterhub.log & 让服务后台运行

打开浏览器输入ip:port验证系统是否真正已部署好,这里有可能会有问题,按网上教程应该都能解决。

5、利用宿主机的nginx反向代理实现SSL安全连接

5.1 准备需要SSL连接的域名和证书,按网上教程自行注册购买,都有免费的,一样好用,如果已有就没问题了。

5.2 宿主机安装nginx服务器,配置好wss,将jupyterhub容器的http连接配置成通过https反向代理。按通用配置就可以,不用考虑jupyterhub的特殊性,这是docker安装jupyterhub的一大优点,如果在主机上直接安装jupyterhub就必须按官网要求对nginx的配置进行修改,非常麻烦。

6、几点提醒:

6.1 容器内部相当于一个独立的操作系统环境,安装过程中缺少组件可以直接安装,python环境库比较多,必须满足依赖要求。

6.2 安装了pip3后,最好装一下conda,有极少数软件只有conda可以装。

6.3 基本安装完成后先局域网调试通过,确保运行常,如何连接有问题建议重新安装jupyter

6.4 用命令让jupyterhub后台运行,这样不会因为终端退出服务也跟着退出,用ps -a 命令检查进程是否真正运行,如果命令不能挂起可先回车再查看,不行再次运行挂起命令。少数时候因内部端口冲突会造成挂不起来,但每次运行挂起命令会用不同的端口,这样就可以避开冲突了。

6.5 在内网可以正常连接jupyterhub的情况下,用域名可以登入jupyterhub但显示无法连接python内核是因为nginx配置中没有正确设置好websocket。

6.6 最好在开始安装阶段将linux和pip的源改成国内的,否则有些安装可能无法进行下去。

6.7 现在可参考资料都要求安装anaconda配置虚拟环境,本文没有涉及,不同系统是否有不同没有更多的测试。