Conan 服务器

重要

此服务器主要用于测试(尽管对于小型团队来说也可能正常工作)。我们推荐使用免费的 Artifactory Community Edition for C/C++ 进行私有开发,或者使用 Artifactory Pro 作为企业级解决方案。

配置

默认情况下,您的服务器配置保存在 ~/.conan_server/server.conf 下。但是,您可以通过设置 CONAN_SERVER_HOME 环境变量或使用 -d--server_dir 命令行参数后跟所需路径来启动服务器来修改此行为。如果您使用其中一个选项,您的配置文件将存储在 server_directory/server.conf 下。请注意,命令行参数将覆盖环境变量。您可以在启动服务器之前修改 server.conf 中的配置值。请注意,服务器不支持热重载,因此要查看配置更改,您需要手动重新启动服务器。

服务器配置文件默认是

[server]
jwt_secret: IJKhyoioUINMXCRTytrR
jwt_expire_minutes: 120

ssl_enabled: False
port: 9300

public_port:
host_name: localhost

authorize_timeout: 1800

disk_storage_path: ./data
disk_authorize_timeout: 1800
updown_secret: HJhjujkjkjkJKLUYyuuyHJ

[write_permissions]
# "opencv/2.3.4@lasote/testing": default_user,default_user2

[read_permissions]
*/*@*/*: *

[users]
demo: demo

服务器参数

注意

Conan 服务器支持相对 URL,这允许您避免设置 host_namepublic_portssl_enabled。用于上传/下载包的 URL 将在客户端中根据远程 URL 自动生成。这允许从不同网络访问 Conan 服务器。

  • port: conan_server 将运行的端口。

  • 客户端服务器授权通过 JWT 完成。jwt_secret 是用于生成认证令牌的随机字符串。您可以随时安全地更改它(事实上,这是一个好习惯)。更改只会强制用户重新登录。jwt_expire_minutes 是用户在客户端内保持登录状态的时间,而无需再次输入凭据。

  • host_name: 如果您设置了 host_name,则必须使用运行服务器的机器的 IP(或域名),例如 host_name: 192.168.1.100。此 IP(或域名)必须能够被 Conan 客户端可见(并解析),因此如果您的服务器有多个网络接口,请考虑到这一点。

  • public_port: 在运行虚拟化、Docker 或任何其他类型的端口重定向时可能需要。文件上传/下载是通过系统生成的自己的 URL 提供服务的,因此文件存储后端是独立的。这些 URL 需要公开端口才能从外部通信。如果留空,将使用 port 的值。

    示例: 在 Docker 容器中使用 conan_server,该容器内部运行在 9300 端口,但暴露 9999 端口(客户端将连接到该端口)。

    docker run ... -p9999:9300 ... # Check Docker docs for that
    

    server.conf

    [server]
    
    ssl_enabled: False
    port: 9300
    public_port: 9999
    host_name: localhost
    
  • ssl_enabled Conan 不直接处理 SSL 流量,但您可以使用 Nginx 等代理将 SSL 流量重定向到您的 Conan 服务器。如果您的 Conan 客户端使用“https”连接,请将 ssl_enabled 设置为 True。这样 conan_server 将生成“https”而不是“http”的上传/下载 URL。

注意

重要提示: Conan 客户端默认会验证服务器 SSL 证书,如果证书无效则不会连接。如果您有自签名证书,则有两个选项:

  1. 使用 conan remote 命令禁用 SSL 证书检查。例如,conan remote add/update myremote https://somedir False

  2. 如果使用 Conan 客户端中的 core.net.http:cacert_path 配置,请将服务器 .crt 文件的内容附加到 cacert.pem 位置。

上传的包存储的文件夹(即您想要备份的文件夹)在 disk_storage_path 中定义。存储后端可能使用不同的通道,上传/下载的授权时间最多为 authorize_timeout 秒。该值应足够长,以避免大文件下载/上传被拒绝,但又不至于太大而导致文件传输挂起。disk_authorize_timeout 值目前未使用。文件传输通过使用 updown_secret 密钥生成的专用令牌进行授权。此值应与上面的 jwt_secret 不同。

权限参数

默认情况下,当服务器配置为读取时,可以匿名进行,但上传需要您是注册用户。用户可以在 [users] 部分轻松注册,通过为每个用户定义一对 login: password。目前使用明文密码,但由于服务器是本地部署的(在防火墙后面),您只需要信任您的系统管理员 :)

如果您想限制对特定包的读/写访问,请配置 [read_permissions][write_permissions] 部分。这些部分以以下形式指定模式和授权用户的序列:

# use a comma-separated, no-spaces list of users
package/version@user/channel: allowed_user1,allowed_user2

例如:

*/*@*/*: * # allow all users to all packages
PackageA/*@*/*: john,peter # allow john and peter access to any PackageA
*/*@project/*: john # Allow john to access any package from the "project" user

规则按顺序评估。如果模式的左侧匹配,则应用该规则,并且不会继续搜索匹配项。

身份验证

默认情况下,Conan 在 server.conf 文件中提供简单的 user: password 用户列表。

还有一个插件机制用于设置其他身份验证方法。安装其中任何一种的步骤非常简单,只需两步:

  1. 将身份验证器源文件复制到 .conan_server/plugins/authenticator 文件夹。

  2. server.conf 的 [server] 部分添加 custom_authenticator: authenticator_name

这是一个可用身份验证器的列表,请访问它们的 URL 以获取它们,同时也可以报告问题和进行协作:

创建您自己的自定义身份验证器

如果您想创建自己的身份验证器,请在 ~/.conan_server/plugins/authenticator/my_authenticator.py 中创建一个 Python 模块。

示例

def get_class():
    return MyAuthenticator()


class MyAuthenticator(object):
    def valid_user(self, username, plain_password):
        return username == "foo" and plain_password == "bar"

该模块必须实现:

  • 一个工厂函数 get_class(),它返回一个具有 valid_user() 方法实例的类。

  • 包含 valid_user() 的类,该方法必须返回 True(如果用户和密码有效)或 False(否则)。

授权

默认情况下,Conan 使用 [read_permissions][write_permissions] 部分的内容来授权或拒绝请求。

还有一个插件系统可用于自定义授权机制。安装此类插件只需简单的两步:

  1. 将授权器源文件复制到 .conan_server/plugins/authorizer 文件夹。

  2. server.conf 的 [server] 部分添加 custom_authorizer: authorizer_name

创建您自己的自定义授权器

如果您想创建自己的授权器,请在 ~/.conan_server/plugins/authorizer/my_authorizer.py 中创建一个 Python 模块。

示例

from conan.internal.errors import AuthenticationException, ForbiddenException

def get_class():
    return MyAuthorizer()

class MyAuthorizer(object):
    def _check_conan(self, username, ref):
        if ref.user == username:
            return

        if username:
            raise ForbiddenException("Permission denied")
        else:
            raise AuthenticationException()

    def _check_package(self, username, pref):
       self._check(username, pref.ref)

    check_read_conan = _check_conan check_write_conan = _check_conan
    check_delete_conan = _check_conan check_read_package = _check_package
    check_write_package = _check_package check_delete_package = _check_package

该模块必须实现:

  • 一个工厂函数 get_class(),它返回一个符合授权器接口的类的实例。

  • 一个实现授权器接口中所有方法的类。
    • check_read_conan() 用于决定是否允许对配方(recipe)进行读取访问。

    • check_write_conan() 用于决定是否允许对配方进行写入访问。

    • check_delete_conan() 用于决定是否允许删除配方。

    • check_read_package() 用于决定是否允许对包进行读取访问。

    • check_write_package() 用于决定是否允许对包进行写入访问。

    • check_delete_package() 用于决定是否允许删除包。

check_*_conan() 方法将使用用户名和 `conans.model.ref.ConanFileReference` 实例作为参数进行调用。同时,`check_*_package()` 方法将使用用户名和 `conans.model.ref.PackageReference` 实例作为参数。这些方法应该引发异常,除非用户被允许执行请求的操作。

使用 Nginx 运行带 SSL 的 Conan 服务器

server.conf

[server] port: 9300

nginx 配置文件

server {
    listen 443; server_name myservername.mydomain.com;

    location / {
      proxy_pass http://0.0.0.0:9300;
    } ssl on; ssl_certificate /etc/nginx/ssl/server.crt; ssl_certificate_key
    /etc/nginx/ssl/server.key;
}

Conan 客户端中的远程配置

$ conan remote add myremote https://myservername.mydomain.com

在子目录中使用 Nginx 运行带 SSL 的 Conan 服务器

server.conf

[server] port: 9300

nginx 配置文件

server {

       listen 443; ssl on; ssl_certificate /usr/local/etc/nginx/ssl/server.crt;
       ssl_certificate_key /usr/local/etc/nginx/ssl/server.key; server_name
       myservername.mydomain.com;

       location /subdir/ {
          proxy_pass http://0.0.0.0:9300/;
       }
  }

Conan 客户端中的远程配置

$ conan remote add myremote https://myservername.mydomain.com/subdir/

使用 Apache 运行 Conan 服务器

您需要安装 mod_wsgi。如果您想使用从 pip 安装的 Conan,配置文件应类似于以下示例:

Apache 配置文件(例如,/etc/apache2/sites-available/0_conan.conf)

<VirtualHost *:80>
    WSGIScriptAlias /
    /usr/local/lib/python3.6/dist-packages/conans/server/server_launcher.py
    WSGICallableObject app WSGIPassAuthorization On

    <Directory /usr/local/lib/python3.6/dist-packages/conans>
        Require all granted
    </Directory>
</VirtualHost>

如果您想使用从源代码检出的 Conan,例如在 /srv/conan 中,配置文件应如下所示:

Apache 配置文件(例如,/etc/apache2/sites-available/0_conan.conf)

<VirtualHost *:80>
    WSGIScriptAlias / /srv/conan/conans/server/server_launcher.py
    WSGICallableObject app WSGIPassAuthorization On

    <Directory /srv/conan/conans>
        Require all granted
    </Directory>
</VirtualHost>

需要 WSGIPassAuthorization On 指令才能将 HTTP 基本身份验证传递给 Conan。

同时请注意,服务器配置文件位于配置的 Apache 用户的主目录下,例如 var/www/.conan_server,因此请记住使用该目录来配置您的 Conan 服务器。

另请参阅