source.md 15.8 KB
Newer Older
1 2 3 4 5 6
---
stage: Release
group: Release Management
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#designated-technical-writers
---

7 8
# GitLab Pages administration for source installations

9 10 11 12
>**Note:**
Before attempting to enable GitLab Pages, first make sure you have
[installed GitLab](../../install/installation.md) successfully.

13 14 15 16 17 18 19 20 21 22 23 24 25
This is the documentation for configuring a GitLab Pages when you have installed
GitLab from source and not using the Omnibus packages.

You are encouraged to read the [Omnibus documentation](index.md) as it provides
some invaluable information to the configuration of GitLab Pages. Please proceed
to read it before going forward with this guide.

We also highly recommend that you use the Omnibus GitLab packages, as we
optimize them specifically for GitLab, and we will take care of upgrading GitLab
Pages to the latest supported version.

## Overview

26
GitLab Pages makes use of the [GitLab Pages daemon](https://gitlab.com/gitlab-org/gitlab-pages), a simple HTTP server
27 28 29
written in Go that can listen on an external IP address and provide support for
custom domains and custom certificates. It supports dynamic certificates through
SNI and exposes pages using HTTP2 by default.
30 31
You are encouraged to read its [README](https://gitlab.com/gitlab-org/gitlab-pages/blob/master/README.md)
to fully understand how it works.
32 33 34 35 36 37 38 39 40 41 42 43

In the case of [custom domains](#custom-domains) (but not
[wildcard domains](#wildcard-domains)), the Pages daemon needs to listen on
ports `80` and/or `443`. For that reason, there is some flexibility in the way
which you can set it up:

1. Run the Pages daemon in the same server as GitLab, listening on a secondary IP.
1. Run the Pages daemon in a separate server. In that case, the
   [Pages path](#change-storage-path) must also be present in the server that
   the Pages daemon is installed, so you will have to share it via network.
1. Run the Pages daemon in the same server as GitLab, listening on the same IP
   but on different ports. In that case, you will have to proxy the traffic with
44
   a load balancer. If you choose that route note that you should use TCP load
45 46 47 48 49 50
   balancing for HTTPS. If you use TLS-termination (HTTPS-load balancing) the
   pages will not be able to be served with user provided certificates. For
   HTTP it's OK to use HTTP or TCP load balancing.

In this document, we will proceed assuming the first option. If you are not
supporting custom domains a secondary IP is not needed.
51 52 53

## Prerequisites

54 55 56 57 58 59
Before proceeding with the Pages configuration, make sure that:

1. You have a separate domain under which GitLab Pages will be served. In
   this document we assume that to be `example.io`.
1. You have configured a **wildcard DNS record** for that domain.
1. You have installed the `zip` and `unzip` packages in the same server that
60
   GitLab is installed since they are needed to compress and decompress the
61 62 63
   Pages artifacts.
1. (Optional) You have a **wildcard certificate** for the Pages domain if you
   decide to serve Pages (`*.example.io`) under HTTPS.
64
1. (Optional but recommended) You have configured and enabled the [Shared Runners](../../ci/runners/README.md)
65 66 67 68 69
   so that your users don't have to bring their own.

### DNS configuration

GitLab Pages expect to run on their own virtual host. In your DNS server/provider
70
you need to add a [wildcard DNS A record](https://en.wikipedia.org/wiki/Wildcard_DNS_record) pointing to the
71 72
host that GitLab runs. For example, an entry would look like this:

73
```plaintext
N
Natho 已提交
74
*.example.io. 1800 IN A 192.0.2.1
75 76 77
```

where `example.io` is the domain under which GitLab Pages will be served
N
Natho 已提交
78
and `192.0.2.1` is the IP address of your GitLab instance.
79 80 81 82 83

> **Note:**
You should not use the GitLab domain to serve user pages. For more information
see the [security section](#security).

84 85
## Configuration

86 87 88 89
Depending on your needs, you can set up GitLab Pages in 4 different ways.
The following options are listed from the easiest setup to the most
advanced one. The absolute minimum requirement is to set up the wildcard DNS
since that is needed in all configurations.
90

91
### Wildcard domains
92

93 94 95 96 97
**Requirements:**

- [Wildcard DNS setup](#dns-configuration)

URL scheme: `http://page.example.io`
98

99
This is the minimum setup that you can use Pages with. It is the base for all
100
other setups as described below. NGINX will proxy all requests to the daemon.
101
The Pages daemon doesn't listen to the outside world.
102 103 104

1. Install the Pages daemon:

105
   ```shell
106 107 108 109 110 111
   cd /home/git
   sudo -u git -H git clone https://gitlab.com/gitlab-org/gitlab-pages.git
   cd gitlab-pages
   sudo -u git -H git checkout v$(</home/git/gitlab/GITLAB_PAGES_VERSION)
   sudo -u git -H make
   ```
112

113 114
1. Go to the GitLab installation directory:

115
   ```shell
116 117
   cd /home/git/gitlab
   ```
118 119 120

1. Edit `gitlab.yml` and under the `pages` setting, set `enabled` to `true` and
   the `host` to the FQDN under which GitLab Pages will be served:
121

122 123 124 125 126 127
   ```yaml
   ## GitLab Pages
   pages:
     enabled: true
     # The location where pages are stored (default: shared/pages).
     # path: shared/pages
128

129 130 131 132
     host: example.io
     port: 80
     https: false
   ```
133

134 135 136
1. Edit `/etc/default/gitlab` and set `gitlab_pages_enabled` to `true` in
   order to enable the pages daemon. In `gitlab_pages_options` the
   `-pages-domain` must match the `host` setting that you set above.
137

138
   ```ini
139 140 141
   gitlab_pages_enabled=true
   gitlab_pages_options="-pages-domain example.io -pages-root $app_root/shared/pages -listen-proxy 127.0.0.1:8090"
   ```
142

143
1. Copy the `gitlab-pages` NGINX configuration file:
144

145
   ```shell
146 147 148
   sudo cp lib/support/nginx/gitlab-pages /etc/nginx/sites-available/gitlab-pages.conf
   sudo ln -sf /etc/nginx/sites-{available,enabled}/gitlab-pages.conf
   ```
149 150

1. Restart NGINX
151
1. [Restart GitLab](../restart_gitlab.md#installations-from-source)
152

153
### Wildcard domains with TLS support
154

155 156 157 158 159 160
**Requirements:**

- [Wildcard DNS setup](#dns-configuration)
- Wildcard TLS certificate

URL scheme: `https://page.example.io`
161

162
NGINX will proxy all requests to the daemon. Pages daemon doesn't listen to the
163
outside world.
164 165 166

1. Install the Pages daemon:

167
   ```shell
168 169 170 171 172 173
   cd /home/git
   sudo -u git -H git clone https://gitlab.com/gitlab-org/gitlab-pages.git
   cd gitlab-pages
   sudo -u git -H git checkout v$(</home/git/gitlab/GITLAB_PAGES_VERSION)
   sudo -u git -H make
   ```
174

175
1. In `gitlab.yml`, set the port to `443` and https to `true`:
176

177
   ```yaml
178 179 180 181 182
   ## GitLab Pages
   pages:
     enabled: true
     # The location where pages are stored (default: shared/pages).
     # path: shared/pages
183

184 185 186 187
     host: example.io
     port: 443
     https: true
   ```
188

189 190 191 192 193 194
1. Edit `/etc/default/gitlab` and set `gitlab_pages_enabled` to `true` in
   order to enable the pages daemon. In `gitlab_pages_options` the
   `-pages-domain` must match the `host` setting that you set above.
   The `-root-cert` and `-root-key` settings are the wildcard TLS certificates
   of the `example.io` domain:

195
   ```ini
196
   gitlab_pages_enabled=true
197
   gitlab_pages_options="-pages-domain example.io -pages-root $app_root/shared/pages -listen-proxy 127.0.0.1:8090 -root-cert /path/to/example.io.crt -root-key /path/to/example.io.key"
198
   ```
199

200
1. Copy the `gitlab-pages-ssl` NGINX configuration file:
201

202
   ```shell
203 204 205
   sudo cp lib/support/nginx/gitlab-pages-ssl /etc/nginx/sites-available/gitlab-pages-ssl.conf
   sudo ln -sf /etc/nginx/sites-{available,enabled}/gitlab-pages-ssl.conf
   ```
206 207

1. Restart NGINX
208
1. [Restart GitLab](../restart_gitlab.md#installations-from-source)
209

210 211 212 213 214 215
## Advanced configuration

In addition to the wildcard domains, you can also have the option to configure
GitLab Pages to work with custom domains. Again, there are two options here:
support custom domains with and without TLS certificates. The easiest setup is
that without TLS certificates.
216

217 218
### Custom domains

219 220 221 222 223 224
**Requirements:**

- [Wildcard DNS setup](#dns-configuration)
- Secondary IP

URL scheme: `http://page.example.io` and `http://domain.com`
225

226
In that case, the pages daemon is running, NGINX still proxies requests to
227 228
the daemon but the daemon is also able to receive requests from the outside
world. Custom domains are supported, but no TLS.
229 230 231

1. Install the Pages daemon:

232
   ```shell
233 234 235 236 237 238
   cd /home/git
   sudo -u git -H git clone https://gitlab.com/gitlab-org/gitlab-pages.git
   cd gitlab-pages
   sudo -u git -H git checkout v$(</home/git/gitlab/GITLAB_PAGES_VERSION)
   sudo -u git -H make
   ```
239

240 241 242 243 244
1. Edit `gitlab.yml` to look like the example below. You need to change the
   `host` to the FQDN under which GitLab Pages will be served. Set
   `external_http` to the secondary IP on which the pages daemon will listen
   for connections:

245 246 247 248 249
   ```yaml
   pages:
     enabled: true
     # The location where pages are stored (default: shared/pages).
     # path: shared/pages
250

251 252 253
     host: example.io
     port: 80
     https: false
254

255 256
     external_http: 192.0.2.2:80
   ```
257

258 259 260 261 262
1. Edit `/etc/default/gitlab` and set `gitlab_pages_enabled` to `true` in
   order to enable the pages daemon. In `gitlab_pages_options` the
   `-pages-domain` and `-listen-http` must match the `host` and `external_http`
   settings that you set above respectively:

263
   ```ini
264 265 266
   gitlab_pages_enabled=true
   gitlab_pages_options="-pages-domain example.io -pages-root $app_root/shared/pages -listen-proxy 127.0.0.1:8090 -listen-http 192.0.2.2:80"
   ```
267

268
1. Copy the `gitlab-pages-ssl` NGINX configuration file:
269

270
   ```shell
271 272 273
   sudo cp lib/support/nginx/gitlab-pages /etc/nginx/sites-available/gitlab-pages.conf
   sudo ln -sf /etc/nginx/sites-{available,enabled}/gitlab-pages.conf
   ```
274

275
1. Edit all GitLab related configs in `/etc/nginx/site-available/` and replace
N
Natho 已提交
276
   `0.0.0.0` with `192.0.2.1`, where `192.0.2.1` the primary IP where GitLab
277
   listens to.
278
1. Restart NGINX
279
1. [Restart GitLab](../restart_gitlab.md#installations-from-source)
280

281
### Custom domains with TLS support
282

283 284 285 286 287 288 289
**Requirements:**

- [Wildcard DNS setup](#dns-configuration)
- Wildcard TLS certificate
- Secondary IP

URL scheme: `https://page.example.io` and `https://domain.com`
290

291
In that case, the pages daemon is running, NGINX still proxies requests to
292 293
the daemon but the daemon is also able to receive requests from the outside
world. Custom domains and TLS are supported.
294 295 296

1. Install the Pages daemon:

297
   ```shell
298 299 300 301 302 303
   cd /home/git
   sudo -u git -H git clone https://gitlab.com/gitlab-org/gitlab-pages.git
   cd gitlab-pages
   sudo -u git -H git checkout v$(</home/git/gitlab/GITLAB_PAGES_VERSION)
   sudo -u git -H make
   ```
304

305 306 307 308
1. Edit `gitlab.yml` to look like the example below. You need to change the
   `host` to the FQDN under which GitLab Pages will be served. Set
   `external_http` and `external_https` to the secondary IP on which the pages
   daemon will listen for connections:
309

310 311 312 313 314 315
   ```yaml
   ## GitLab Pages
   pages:
     enabled: true
     # The location where pages are stored (default: shared/pages).
     # path: shared/pages
316

317 318 319
     host: example.io
     port: 443
     https: true
320

321 322 323
     external_http: 192.0.2.2:80
     external_https: 192.0.2.2:443
   ```
324

325 326 327 328 329 330 331
1. Edit `/etc/default/gitlab` and set `gitlab_pages_enabled` to `true` in
   order to enable the pages daemon. In `gitlab_pages_options` the
   `-pages-domain`, `-listen-http` and `-listen-https` must match the `host`,
   `external_http` and `external_https` settings that you set above respectively.
   The `-root-cert` and `-root-key` settings are the wildcard TLS certificates
   of the `example.io` domain:

332
   ```ini
333
   gitlab_pages_enabled=true
334
   gitlab_pages_options="-pages-domain example.io -pages-root $app_root/shared/pages -listen-proxy 127.0.0.1:8090 -listen-http 192.0.2.2:80 -listen-https 192.0.2.2:443 -root-cert /path/to/example.io.crt -root-key /path/to/example.io.key"
335
   ```
336

337
1. Copy the `gitlab-pages-ssl` NGINX configuration file:
338

339
   ```shell
340 341 342
   sudo cp lib/support/nginx/gitlab-pages-ssl /etc/nginx/sites-available/gitlab-pages-ssl.conf
   sudo ln -sf /etc/nginx/sites-{available,enabled}/gitlab-pages-ssl.conf
   ```
343

344
1. Edit all GitLab related configs in `/etc/nginx/site-available/` and replace
N
Natho 已提交
345
   `0.0.0.0` with `192.0.2.1`, where `192.0.2.1` the primary IP where GitLab
346
   listens to.
347
1. Restart NGINX
348
1. [Restart GitLab](../restart_gitlab.md#installations-from-source)
349 350 351 352 353 354 355 356 357

## NGINX caveats

>**Note:**
The following information applies only for installations from source.

Be extra careful when setting up the domain name in the NGINX config. You must
not remove the backslashes.

358
If your GitLab Pages domain is `example.io`, replace:
359

360
```nginx
361 362 363 364 365
server_name ~^.*\.YOUR_GITLAB_PAGES\.DOMAIN$;
```

with:

366
```nginx
367 368 369 370 371 372
server_name ~^.*\.example\.io$;
```

If you are using a subdomain, make sure to escape all dots (`.`) except from
the first one with a backslash (\). For example `pages.example.io` would be:

373
```nginx
374 375 376
server_name ~^.*\.pages\.example\.io$;
```

377 378
## Access control

379
> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/33422) in GitLab 11.5.
380 381

GitLab Pages access control can be configured per-project, and allows access to a Pages
382 383 384 385 386 387 388 389 390 391 392 393 394
site to be controlled based on a user's membership to that project.

Access control works by registering the Pages daemon as an OAuth application
with GitLab. Whenever a request to access a private Pages site is made by an
unauthenticated user, the Pages daemon redirects the user to GitLab. If
authentication is successful, the user is redirected back to Pages with a token,
which is persisted in a cookie. The cookies are signed with a secret key, so
tampering can be detected.

Each request to view a resource in a private site is authenticated by Pages
using that token. For each request it receives, it makes a request to the GitLab
API to check that the user is authorized to read that site.

395
From [GitLab 12.8](https://gitlab.com/gitlab-org/omnibus-gitlab/-/merge_requests/3689) onward,
396 397 398 399
Access Control parameters for Pages are set in a configuration file, which
by convention is named `gitlab-pages-config`. The configuration file is passed to
pages using the `-config flag` or CONFIG environment variable.

400
Pages access control is disabled by default. To enable it:
401 402

1. Modify your `config/gitlab.yml` file:
403

404 405 406 407
   ```yaml
   pages:
     access_control: true
   ```
408

409
1. [Restart GitLab](../restart_gitlab.md#installations-from-source).
410
1. Create a new [system OAuth application](../../integration/oauth_provider.md#adding-an-application-through-the-profile).
411 412
   This should be called `GitLab Pages` and have a `Redirect URL` of
   `https://projects.example.io/auth`. It does not need to be a "trusted"
413
   application, but it does need the `api` scope.
414
1. Start the Pages daemon by passing a configuration file with the following arguments:
415

416
   ```shell
417 418 419 420 421
     auth-client-id=<OAuth Application ID generated by GitLab>
     auth-client-secret=<OAuth code generated by GitLab>
     auth-redirect-uri='http://projects.example.io/auth'
     auth-secret=<40 random hex characters>
     auth-server=<URL of the GitLab instance>
422
   ```
423

424
1. Users can now configure it in their [projects' settings](../../user/project/pages/introduction.md#gitlab-pages-access-control-core).
425

426 427 428 429 430 431 432 433 434
## Change storage path

Follow the steps below to change the default path where GitLab Pages' contents
are stored.

1. Pages are stored by default in `/home/git/gitlab/shared/pages`.
   If you wish to store them in another location you must set it up in
   `gitlab.yml` under the `pages` section:

435 436 437 438 439 440
   ```yaml
   pages:
     enabled: true
     # The location where pages are stored (default: shared/pages).
     path: /mnt/storage/pages
   ```
441

442
1. [Restart GitLab](../restart_gitlab.md#installations-from-source)
443 444 445

## Set maximum Pages size

446 447
The maximum size of the unpacked archive per project can be configured in
**Admin Area > Settings > Preferences > Pages**, in **Maximum size of pages (MB)**.
448 449 450 451
The default is 100MB.

## Backup

452
Pages are part of the [regular backup](../../raketasks/backup_restore.md) so there is nothing to configure.
453 454 455

## Security

456
You should strongly consider running GitLab Pages under a different hostname
457
than GitLab to prevent XSS attacks.