mirror of
				https://github.com/zulip/zulip.git
				synced 2025-11-04 05:53:43 +00:00 
			
		
		
		
	Initial attempt at Vagrantization
This is slightly hacky; it doesn't support as many arches as I'd like, but it works. (imported from commit 5993014b0518d6d6dd2856fbf73180830e934b5f)
This commit is contained in:
		
							
								
								
									
										32
									
								
								README.dev
									
									
									
									
									
								
							
							
						
						
									
										32
									
								
								README.dev
									
									
									
									
									
								
							@@ -1,6 +1,32 @@
 | 
			
		||||
Getting started
 | 
			
		||||
===============
 | 
			
		||||
 | 
			
		||||
Using Vagrant
 | 
			
		||||
-------------
 | 
			
		||||
 | 
			
		||||
This is the recommended approach, but is only supported on Ubuntu 14.04.
 | 
			
		||||
 | 
			
		||||
  sudo apt-get install vagrant lxc lxc-templates cgroup-lite redir
 | 
			
		||||
  vagrant plugin install vagrant-lxc
 | 
			
		||||
  vagrant up --provider=lxc
 | 
			
		||||
  vagrant ssh
 | 
			
		||||
  # Now inside the container
 | 
			
		||||
  sudo apt-get update
 | 
			
		||||
  sudo apt-get install python-pbs
 | 
			
		||||
  cd /srv/zulip && python provision.py
 | 
			
		||||
 | 
			
		||||
To run the development server:
 | 
			
		||||
  vagrant ssh -- -L9991:localhost:9991
 | 
			
		||||
  # Now inside the container
 | 
			
		||||
  cd /srv/zulip
 | 
			
		||||
  source /srv/zulip-venv/bin/activate
 | 
			
		||||
  ./tools/run-dev.py
 | 
			
		||||
 | 
			
		||||
You can now visit <http://localhost:9991/> in your browser.
 | 
			
		||||
 | 
			
		||||
By hand
 | 
			
		||||
-------
 | 
			
		||||
 | 
			
		||||
Install the following non-Python dependencies:
 | 
			
		||||
 * libffi-dev — needed for some Python extensions
 | 
			
		||||
 * postgresql 9.1 or later — our database (also install development headers)
 | 
			
		||||
@@ -19,7 +45,11 @@ On Debian or Ubuntu systems:
 | 
			
		||||
  wget https://dl.dropboxusercontent.com/u/283158365/zuliposs/postgresql-9.1-tsearch-extras_0.1.2_amd64.deb
 | 
			
		||||
  sudo dpkg -i postgresql-9.1-tsearch-extras_0.1.2_amd64.deb
 | 
			
		||||
 | 
			
		||||
  # If on 14.04, wait for us to support it.
 | 
			
		||||
  # If on 14.04:
 | 
			
		||||
  sudo apt-get install postgresql-9.3
 | 
			
		||||
  wget https://dl.dropboxusercontent.com/u/283158365/zuliposs/postgresql-9.3-tsearch-extras_0.1.2_amd64.deb
 | 
			
		||||
  sudo dpkg -i postgresql-9.3-tsearch-extras_0.1.2_amd64.deb
 | 
			
		||||
 | 
			
		||||
  # If on 15.04 or jessie:
 | 
			
		||||
  sudo apt-get install postgresql-9.4
 | 
			
		||||
  wget https://dl.dropboxusercontent.com/u/283158365/zuliposs/postgresql-9.4-tsearch-extras_0.1_amd64.deb
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										118
									
								
								Vagrantfile
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										118
									
								
								Vagrantfile
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,118 @@
 | 
			
		||||
# -*- mode: ruby -*-
 | 
			
		||||
# vi: set ft=ruby :
 | 
			
		||||
 | 
			
		||||
# Vagrantfile API/syntax version. Don't touch unless you know what you're doing!
 | 
			
		||||
VAGRANTFILE_API_VERSION = "2"
 | 
			
		||||
 | 
			
		||||
Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
 | 
			
		||||
  # All Vagrant configuration is done here. The most common configuration
 | 
			
		||||
  # options are documented and commented below. For a complete reference,
 | 
			
		||||
  # please see the online documentation at vagrantup.com.
 | 
			
		||||
 | 
			
		||||
  # Every Vagrant virtual environment requires a box to build off of.
 | 
			
		||||
  config.vm.box = "fgrehm/trusty64-lxc"
 | 
			
		||||
 | 
			
		||||
  # Disable automatic box update checking. If you disable this, then
 | 
			
		||||
  # boxes will only be checked for updates when the user runs
 | 
			
		||||
  # `vagrant box outdated`. This is not recommended.
 | 
			
		||||
  # config.vm.box_check_update = false
 | 
			
		||||
 | 
			
		||||
  # Create a forwarded port mapping which allows access to a specific port
 | 
			
		||||
  # within the machine from a port on the host machine. In the example below,
 | 
			
		||||
  # accessing "localhost:8080" will access port 80 on the guest machine.
 | 
			
		||||
  config.vm.network "forwarded_port", guest: 9991, host: 9991, host_ip: "127.0.0.1"
 | 
			
		||||
 | 
			
		||||
  # Create a private network, which allows host-only access to the machine
 | 
			
		||||
  # using a specific IP.
 | 
			
		||||
  # config.vm.network "private_network", ip: "192.168.33.10"
 | 
			
		||||
 | 
			
		||||
  # Create a public network, which generally matched to bridged network.
 | 
			
		||||
  # Bridged networks make the machine appear as another physical device on
 | 
			
		||||
  # your network.
 | 
			
		||||
  # config.vm.network "public_network"
 | 
			
		||||
 | 
			
		||||
  # If true, then any SSH connections made will enable agent forwarding.
 | 
			
		||||
  # Default value: false
 | 
			
		||||
  # config.ssh.forward_agent = true
 | 
			
		||||
 | 
			
		||||
  # Share an additional folder to the guest VM. The first argument is
 | 
			
		||||
  # the path on the host to the actual folder. The second argument is
 | 
			
		||||
  # the path on the guest to mount the folder. And the optional third
 | 
			
		||||
  # argument is a set of non-required options.
 | 
			
		||||
  config.vm.synced_folder ".", "/vagrant", disabled: true
 | 
			
		||||
  config.vm.synced_folder ".", "/srv/zulip"
 | 
			
		||||
 | 
			
		||||
  # Provider-specific configuration so you can fine-tune various
 | 
			
		||||
  # backing providers for Vagrant. These expose provider-specific options.
 | 
			
		||||
 | 
			
		||||
  config.vm.provider "virtualbox" do |vb|
 | 
			
		||||
    override.vm.box = "ubuntu/trusty64"
 | 
			
		||||
  end
 | 
			
		||||
  #
 | 
			
		||||
  # View the documentation for the provider you're using for more
 | 
			
		||||
  # information on available options.
 | 
			
		||||
 | 
			
		||||
  # Enable provisioning with CFEngine. CFEngine Community packages are
 | 
			
		||||
  # automatically installed. For example, configure the host as a
 | 
			
		||||
  # policy server and optionally a policy file to run:
 | 
			
		||||
  #
 | 
			
		||||
  # config.vm.provision "cfengine" do |cf|
 | 
			
		||||
  #   cf.am_policy_hub = true
 | 
			
		||||
  #   # cf.run_file = "motd.cf"
 | 
			
		||||
  # end
 | 
			
		||||
  #
 | 
			
		||||
  # You can also configure and bootstrap a client to an existing
 | 
			
		||||
  # policy server:
 | 
			
		||||
  #
 | 
			
		||||
  # config.vm.provision "cfengine" do |cf|
 | 
			
		||||
  #   cf.policy_server_address = "10.0.2.15"
 | 
			
		||||
  # end
 | 
			
		||||
 | 
			
		||||
  # Enable provisioning with Puppet stand alone.  Puppet manifests
 | 
			
		||||
  # are contained in a directory path relative to this Vagrantfile.
 | 
			
		||||
  # You will need to create the manifests directory and a manifest in
 | 
			
		||||
  # the file default.pp in the manifests_path directory.
 | 
			
		||||
  #
 | 
			
		||||
  # config.vm.provision "puppet" do |puppet|
 | 
			
		||||
  #   puppet.manifests_path = "manifests"
 | 
			
		||||
  #   puppet.manifest_file  = "default.pp"
 | 
			
		||||
  # end
 | 
			
		||||
 | 
			
		||||
  # Enable provisioning with chef solo, specifying a cookbooks path, roles
 | 
			
		||||
  # path, and data_bags path (all relative to this Vagrantfile), and adding
 | 
			
		||||
  # some recipes and/or roles.
 | 
			
		||||
  #
 | 
			
		||||
  # config.vm.provision "chef_solo" do |chef|
 | 
			
		||||
  #   chef.cookbooks_path = "../my-recipes/cookbooks"
 | 
			
		||||
  #   chef.roles_path = "../my-recipes/roles"
 | 
			
		||||
  #   chef.data_bags_path = "../my-recipes/data_bags"
 | 
			
		||||
  #   chef.add_recipe "mysql"
 | 
			
		||||
  #   chef.add_role "web"
 | 
			
		||||
  #
 | 
			
		||||
  #   # You may also specify custom JSON attributes:
 | 
			
		||||
  #   chef.json = { mysql_password: "foo" }
 | 
			
		||||
  # end
 | 
			
		||||
 | 
			
		||||
  # Enable provisioning with chef server, specifying the chef server URL,
 | 
			
		||||
  # and the path to the validation key (relative to this Vagrantfile).
 | 
			
		||||
  #
 | 
			
		||||
  # The Opscode Platform uses HTTPS. Substitute your organization for
 | 
			
		||||
  # ORGNAME in the URL and validation key.
 | 
			
		||||
  #
 | 
			
		||||
  # If you have your own Chef Server, use the appropriate URL, which may be
 | 
			
		||||
  # HTTP instead of HTTPS depending on your configuration. Also change the
 | 
			
		||||
  # validation key to validation.pem.
 | 
			
		||||
  #
 | 
			
		||||
  # config.vm.provision "chef_client" do |chef|
 | 
			
		||||
  #   chef.chef_server_url = "https://api.opscode.com/organizations/ORGNAME"
 | 
			
		||||
  #   chef.validation_key_path = "ORGNAME-validator.pem"
 | 
			
		||||
  # end
 | 
			
		||||
  #
 | 
			
		||||
  # If you're using the Opscode platform, your validator client is
 | 
			
		||||
  # ORGNAME-validator, replacing ORGNAME with your organization name.
 | 
			
		||||
  #
 | 
			
		||||
  # If you have your own Chef Server, the default validation client name is
 | 
			
		||||
  # chef-validator, unless you changed the configuration.
 | 
			
		||||
  #
 | 
			
		||||
  #   chef.validation_client_name = "ORGNAME-validator"
 | 
			
		||||
end
 | 
			
		||||
							
								
								
									
										100
									
								
								provision.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										100
									
								
								provision.py
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,100 @@
 | 
			
		||||
import os
 | 
			
		||||
 | 
			
		||||
try:
 | 
			
		||||
    import sh
 | 
			
		||||
except ImportError:
 | 
			
		||||
    import pbs as sh
 | 
			
		||||
 | 
			
		||||
APT_DEPENDENCIES = {
 | 
			
		||||
    "trusty": [
 | 
			
		||||
        "libffi-dev",
 | 
			
		||||
        "memcached",
 | 
			
		||||
        "rabbitmq-server",
 | 
			
		||||
        "libldap2-dev",
 | 
			
		||||
        "redis-server",
 | 
			
		||||
        "postgresql-server-dev-all",
 | 
			
		||||
        "libmemcached-dev",
 | 
			
		||||
        "postgresql-9.3",
 | 
			
		||||
        "python-dev",
 | 
			
		||||
        "hunspell-en-us",
 | 
			
		||||
        "nodejs",
 | 
			
		||||
        "python-virtualenv",
 | 
			
		||||
        "git",
 | 
			
		||||
    ]
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# tsearch-extras is an extension to postgres's built-in full-text search.
 | 
			
		||||
# TODO: use a real APT repository
 | 
			
		||||
TSEARCH_URL_BASE = "https://dl.dropboxusercontent.com/u/283158365/zuliposs/"
 | 
			
		||||
TSEARCH_PACKAGE_NAME = {
 | 
			
		||||
    "trusty": "postgresql-9.3-tsearch-extras"
 | 
			
		||||
}
 | 
			
		||||
TSEARCH_VERSION = "0.1.2"
 | 
			
		||||
# TODO: this path is platform-specific!
 | 
			
		||||
TSEARCH_STOPWORDS_PATH = "/usr/share/postgresql/9.3/tsearch_data/"
 | 
			
		||||
REPO_STOPWORDS_PATH = os.path.join(
 | 
			
		||||
    ZULIP_PATH,
 | 
			
		||||
    "puppet",
 | 
			
		||||
    "zulip",
 | 
			
		||||
    "files",
 | 
			
		||||
    "postgresql",
 | 
			
		||||
    "zulip_english.stop",
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
# TODO: support other architectures
 | 
			
		||||
ARCH = "amd64"
 | 
			
		||||
 | 
			
		||||
VENV_PATH="/srv/zulip-venv"
 | 
			
		||||
ZULIP_PATH="/srv/zulip"
 | 
			
		||||
 | 
			
		||||
with sh.sudo:
 | 
			
		||||
    sh.apt_get.update()
 | 
			
		||||
 | 
			
		||||
    # TODO(lfaraone): add support for other distros
 | 
			
		||||
    sh.apt_get.install("-y", *APT_DEPENDENCIES["trusty"])
 | 
			
		||||
 | 
			
		||||
temp_deb_path = sh.mktemp("--tmpdir", "package_XXXXXX.deb")
 | 
			
		||||
 | 
			
		||||
sh.wget(
 | 
			
		||||
    "{}/{}_{}_{}.deb".format(
 | 
			
		||||
        TSEARCH_URL_BASE,
 | 
			
		||||
        TSEARCH_PACKAGE_NAME["trusty"],
 | 
			
		||||
        TSEARCH_VERSION,
 | 
			
		||||
        ARCH,
 | 
			
		||||
    ),
 | 
			
		||||
    output_document=temp_deb_path,
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
with sh.sudo:
 | 
			
		||||
    sh.dpkg("--install", temp_deb_path)
 | 
			
		||||
 | 
			
		||||
with sh.sudo:
 | 
			
		||||
    sh.rm("-rf", VENV_PATH)
 | 
			
		||||
    sh.mkdir("-p", VENV_PATH)
 | 
			
		||||
    sh.chown("{}:{}".format(os.getuid(), os.getgid()), VENV_PATH)
 | 
			
		||||
 | 
			
		||||
sh.virtualenv(VENV_PATH)
 | 
			
		||||
 | 
			
		||||
orig_path = os.environ["PATH"]
 | 
			
		||||
os.environ["PATH"] = os.pathsep.join((
 | 
			
		||||
        os.path.join(ZULIP_PATH, "tools"),
 | 
			
		||||
        os.path.join(ZULIP_PATH, "scripts", "setup"),
 | 
			
		||||
        orig_path
 | 
			
		||||
))
 | 
			
		||||
 | 
			
		||||
activate_this = os.path.join(VENV_PATH, "bin", "activate_this.py")
 | 
			
		||||
execfile(activate_this, dict(__file__=activate_this))
 | 
			
		||||
 | 
			
		||||
sh.pip.install(r="requirements.txt")
 | 
			
		||||
with sh.sudo:
 | 
			
		||||
    sh.cp(TSEARCH_STOPWORDS_PATH, REPO_STOPWORDS_PATH)
 | 
			
		||||
 | 
			
		||||
os.chdir(ZULIP_PATH)
 | 
			
		||||
 | 
			
		||||
import sys
 | 
			
		||||
 | 
			
		||||
sh.configure_rabbitmq()
 | 
			
		||||
sh.postgres_init_db()
 | 
			
		||||
sh.do_destroy_rebuild_database()
 | 
			
		||||
sh.postgres_init_test_db()
 | 
			
		||||
sh.do_destroy_rebuild_test_database()
 | 
			
		||||
		Reference in New Issue
	
	Block a user