- 
                Notifications
    
You must be signed in to change notification settings  - Fork 142
 
Deployment
Please see the Cloud Images Wiki page for the list of images available. If you intend to deploy a local instance (without GitHub), you can use one of the images above but add following directives to rcloud.conf:
gist.backend: gitgist
gist.git.root: ${ROOT}/data/gists
Exec.auth: as-local
and make sure permissions leading to /data/rcloud/data/gists are sufficient:
sudo chgrp -R rcloud /data/rcloud/data
sudo chmod -R g+rwx /data/rcloud/data
If you want to support multiple users in the instance, you will have to run the QAP service as root and enable PAM authentication. To do that, make sure SessionKeyServer has been compiled with PAM support and then in rcloud.conf use:
Exec.auth: pam
Exec.match.user: login
In order to run the QAP service as root edit /data/rcloud/services/rcloud-qap and replace
exec su - rcloud /data/rcloud/services/rcloud-start
with
exec /data/rcloud/services/rcloud-start
Again, adjust the permissions of the gist directory:
sudo chmod a+rx /data/rcloud/data
sudo chmod 0777 /data/rcloud/data/gists
Finally, run
sudo usermod -a -G shadow ubuntu
(see below why) and restart.
On some systems PAM using pam_unix.so will fail to authenticate users due to a restriction in unix_chkpwd. The error message will be cryptic:
unix_chkpwd[1444]: check pass; user unknown 
despite the fact that the user is actually correct and known. The full explanation is in this post. The most practical fix is to add the user running SKS into the shadow group (or whatever group owns /etc/shadow), e.g. for our Ubuntu cloud images that would be
sudo usermod -a -G shadow ubuntu
redis (valkey or redict) can be run directly in the services directory, or it is possible to use the system-managed service. However, modern Linux distributions run the redis-server service in a sandbox, so it is important to adjust the service settings when changing the data directory. For example, if using /data/redis then the following steps are required:
systemctl edit redis-server
add the following section at the top:
[Service]
ReadWriteDirectories=/data/redis
Then reload and restart the service:
systemctl daemon-reload
systemctl restart redis-server
Note that incorrect settings lead to silent failures: the redis service will work for some time, but will start issuing errors when it finds out that the dump cannot be saved. This may manifest itself by wrong star counts or that new notebooks are not visible after reload (they can still be loaded by their ID).
For highly scalable deployments it is advisable to use nginx as reverse-proxy for load-balancing in front of a pool of RCloud compute instances. This is an example configuration:
# enable websocket upgrades
map $http_upgrade $connection_upgrade {
    	default	upgrade;
	''	close;
}
upstream rcloud_servers {
    # least_conn is load balancing based on selecting a server from the pool which has the
    # least active sessions from nginx. Default is round robin.
    least_conn;
    # List all of the rcloud server pool machines/VMs in the format
    # server <FQDN>:<PORT>;
    # For automatic scaling use externally managed file:
    include /etc/rcloud-servers;
}
server {
        ## put your basic server details here ... (protocols, ports, etc.)
	location / {
		try_files $uri $uri/ @proxy;
	}
	location @proxy {
		proxy_pass		http://rcloud_servers;
		proxy_set_header	X-Real-IP  $remote_addr;
		# allow connection upgrade to WebSockets
		proxy_http_version 1.1;
		proxy_set_header Upgrade $http_upgrade;
		proxy_set_header Connection $connection_upgrade;
		# we may serve long-running queries,
		# so we set this really high
		proxy_read_timeout 30m;
	}
}
The above assumes you have a file /etc/rcloud-servers which lists all currently available compute instances, e.g.:
server 10.2.0.2:8080;
server 10.2.0.3:8080;
This list can be automatically managed, e.g., the forward proxy has support for srvmgr (see forward -S <host>[:<port>] option) which adds instances when forward is started and removes them when they shut down. Thus when a compute VM is started it automatically registers with the RCloud instance and later removes itself form the list when shut down.
If only simple setup is required, you can just the servers directly in the nginx config file.
Optionally, you can have the root point to the rcloud/htdocs directory in which can nginx will serve static content directly instead of asking the RCloud forward proxy.