Added a guide to run multiple instances

This commit is contained in:
Fabrício Godoy
2014-03-30 19:55:02 -03:00
parent bc14092e24
commit d22e576244

View File

@@ -0,0 +1,167 @@
```
Distribution : Independent
GitLab version : 6.0 - 6.7
Web Server : apache
Init system : sysvinit
Database : Independent
Contributors : @skarllot
```
## Overview
To run multiple instances into same computer, some changes are needed to GitLab
function properly. Each instance will run completely independent, no resource
sharing or redundancy will be supported.
Before you follow this guide you should know how install GitLab as single
instance. This guide focus only on changes needed to another instances run
properly, not into installation itself.
### Important Notes
These steps was tested into CentOS GNU/Linux, but should run into another
flavours with (almost) no differences.
## 1. System Users
Each instance must run into its own user. There's no way to gitlab-shell known
which instance you are calling.
Then, create a new user to a new GitLab instance.
## 2. GitLab Shell
The following changes are needed to `config.yml`
- **user**: the new user created from previous step.
- **gitlab_url**: instance-unique http(s) address.
- **repos_path**: instance-unique repository directory.
- **auth_file**: must be changed to match SSH user directory from the created user.
- **redis:namespace**: instance-unique Redis namespace.
Example:
```yaml
# GitLab user. git by default
user: user2
# Url to gitlab instance. Used for api calls. Should end with a slash.
gitlab_url: "https://user2.example.com/"
http_settings:
# user: someone
# password: somepass
# ca_file: /etc/ssl/cert.pem
# ca_path: /etc/pki/tls/certs
self_signed_cert: false
# Repositories path
# Give the canonicalized absolute pathname,
# REPOS_PATH MUST NOT CONTAIN ANY SYMLINK!!!
# Check twice that none of the components is a symlink, including "/home".
repos_path: "/home/user2/repositories"
# File used as authorized_keys for gitlab user
auth_file: "/home/user2/.ssh/authorized_keys"
# Redis settings used for pushing commit notices to gitlab
redis:
bin: /usr/bin/redis-cli
host: 127.0.0.1
port: 6379
# socket: /tmp/redis.socket # Only define this if you want to use sockets
namespace: resque:gitlab:user2
(...)
```
## 3. Database
Each GitLab instance should handle its own database schema. It's recommended
that each instance have its own database user.
## 4. GitLab
You must do the following changes to `config/gitlab.yml`
- **gitlab:host**: instance-unique FQDN.
- **gitlab:user**: the user created at first step.
- **satellites:path**: the path where satellites of new user will be created.
- **gitlab_shell:path**: the path where instance's GitLab Shell was installed.
- **gitlab_shell:repos_path**: the path where instance's Git repositories will be stored.
- **gitlab_shell:hooks_path**: the path where GitLab Shell store its hooks.
Next, change the following to `config/unicorn.rb`
- **working_directory**: the path where GitLab was installed.
- **listen[socket]**: change to match instance's GitLab install.
- **listen[TCP]**: instance-unique TCP port.
- **pid**, **stderr_path** and **stdout_path**: change to match instance's GitLab install.
Next, you need to change `config/initializers/4_sidekiq.rb` to use the same
Redis namespace as configured at second step.
Example:
```ruby
# Custom Redis configuration
config_file = Rails.root.join('config', 'resque.yml')
resque_url = if File.exists?(config_file)
YAML.load_file(config_file)[Rails.env]
else
"redis://localhost:6379"
end
Sidekiq.configure_server do |config|
config.redis = {
url: resque_url,
namespace: 'resque:gitlab:user2'
}
end
Sidekiq.configure_client do |config|
config.redis = {
url: resque_url,
namespace: 'resque:gitlab:user2'
}
end
```
### Database
Next, you should ensure that `config/database.yml` is not sharing the same
database from others instances. Then create the database with `gitlab:setup`.
### Init Script
Each instance must have its own init script (eg: `/etc/init.d/gitlab-user2`).
Next, modify the init script as follows
- **USER**: the name of the user created at first step.
- **APP_PATH**: the path where GitLab was installed.
- **ULOCK**: instance-unique path to Unicorn lock file.
- **SLOCK**: instance-unique path to Sidekiq lock file.
### LogRotate
Each instance must have its own logrotate script (eg:
`/etc/logrotate.d/gitlab-user2`).
Next you must modify the paths from logrotate script to match where the logs are
written.
## 5. Web Server
### Apache
Each instance must have its own Apache configuration file (eg:
`gitlab-user2.conf`).
The following changes must be made to configuration file
- **ServerName**: instance-unique FQDN.
- **ProxyPassReverse** and **RewriteRule**: must change to the port where instance's Unicorn is listening.
- **ErrorLog** and **CustomLog**: instance-unique path where the Apache logs will be written.