Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Changes In Branch server-docs Through [1c50073d31] Excluding Merge-Ins
This is equivalent to a diff from 0996347d4a to 1c50073d31
|
2019-08-19
| ||
| 00:01 | Merged the lists of socket listener daemons into the Socket Listener section of www/server/index.html: the list of known-working daemons down from the numbered list at the top of the article, and the list of potentially-working daemons up from the <noscript>-cloaked document matrix below. Also reordered the sections from simplest to most complex. check-in: d9ab9c567c user: wyoung tags: server-docs | |
|
2019-08-18
| ||
| 10:26 | Improvements to the nonce='$NONCE' substitution mechanism. check-in: 1c50073d31 user: drh tags: server-docs | |
| 08:52 | Implemented the first version of the JavaScript tutorial chooser in www/server/index.html, complete with fallbacks for the noscript case, optional display of the static document matrix, and pretty CSS transitions between the states. check-in: 0cbdbc725c user: wyoung tags: server-docs | |
|
2019-08-16
| ||
| 03:33 | Relaxed the "enforcing" language around the planned change of hash policy from "auto" to "sha3" in Fossil 2.10 within section 2.8 of the fossil-v-git.wiki doc, and clarified what will actually happen with that release as compared to the current release. check-in: c5461fb599 user: wyoung tags: trunk | |
| 01:58 | Merged recent spell check fixes into this branch so we don't revert any of them. check-in: a9fd086f13 user: wyoung tags: server-docs | |
| 01:57 | Another spell check pass on www/* using a different dictionary than in the prior pass. ([79c2cb083152]) check-in: 0996347d4a user: wyoung tags: trunk | |
|
2019-08-13
| ||
| 23:29 | Additional documentation on CGI configuration options. Updates to the change log. New hyperlinks interconnecting the various documents. check-in: fbc3b2f72e user: drh tags: trunk | |
Changes to src/doc.c.
| ︙ | ︙ | |||
511 512 513 514 515 516 517 518 | /* ** Transfer content to the output. During the transfer, when text of ** the following form is seen: ** ** href="$ROOT/ ** action="$ROOT/ ** | > | > | < | > > | | | < | | > > > > > > > | 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 |
/*
** Transfer content to the output. During the transfer, when text of
** the following form is seen:
**
** href="$ROOT/
** action="$ROOT/
** nonce="$NONCE"
**
** Convert $ROOT to the root URI of the repository and $NONCE to the
** CSP nonce returned by style_nonce(). Allow ' in place of "
** and any case for href or action or nonce.
*/
void convert_href_and_output(Blob *pIn){
int i, base;
int n = blob_size(pIn);
char *z = blob_buffer(pIn);
for(base=0, i=7; i<n; i++){
if( z[i]=='$'
&& (z[i-1]=='\'' || z[i-1]=='"')
&& i-base>=9 ) {
blob_append(cgi_output_blob(), &z[base], i-base);
if( strncmp(&z[i],"$ROOT/", 6)==0
&& (fossil_strnicmp(&z[i-7]," href=", 6)==0 ||
fossil_strnicmp(&z[i-9]," action=", 8)==0)
){
blob_appendf(cgi_output_blob(), "%R");
base = i+5;
} else if( strncmp(&z[i],"$NONCE", 6)==0
&& (fossil_strnicmp(&z[i-8]," nonce=", 6)==0)
&& z[i+6]==z[i-1]
) {
blob_append(cgi_output_blob(), style_nonce(), -1);
base = i+6;
}
}
}
blob_append(cgi_output_blob(), &z[base], i-base);
}
/*
** Render a document as the reply to the HTTP request. The body
|
| ︙ | ︙ |
Changes to www/embeddeddoc.wiki.
| ︙ | ︙ | |||
91 92 93 94 95 96 97 98 99 100 101 102 103 104 | Then the standard Fossil header and footer are added to the document prior to being displayed. The "class='fossil-doc'" attribute is required for this to occur. The "data-title='...'" attribute is optional, but if it is present the text will become the title displayed in the Fossil header. An example of this can be seen in the text of the [/artifact/84b4b3d041d93a?txt=1 | Index Of Fossil Documentation] document. <h2>Examples</h2> This file that you are currently reading is an example of embedded documentation. The name of this file in the fossil source tree is "<b>www/embeddeddoc.wiki</b>". You are perhaps looking at this | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 |
Then the standard Fossil header and footer are added to the document
prior to being displayed. The "class='fossil-doc'" attribute is
required for this to occur. The "data-title='...'" attribute is
optional, but if it is present the text will become the title displayed
in the Fossil header. An example of this can be seen in the text
of the [/artifact/84b4b3d041d93a?txt=1 | Index Of Fossil Documentation]
document.
<h2>Server-Side Text Substitution</h2>
Fossil can do a few types of substitution of server-side information
into the embedded document.
<h3>1. $ROOT</h3>
To allow for repositories [./server/ | served deeper than the root of the
URL hierarchy], Fossil can substitute the repository's root in the URL
scheme into HTML <tt>href</tt> and <tt>action</tt> attributes. For
example:
<nowiki><pre>
[$ROOT/doc.wiki | doc at project root]
</pre></nowiki>
might become this in the rendered HTML:
<nowiki><pre>
<a href="/project/root/doc.wiki">doc at project root</a>
</pre></nowiki>
As you can see, this happens for all source document types that end up
rendering as HTML, not just source documents in the HTML
<tt>fossil-doc</tt> format described at the end of the prior section.
<h3>2. $NONCE</h3>
If you put the string <tt>nonce="$NONCE"</tt> or <tt>nonce='$NONCE'</tt>
anywhere in your document, the server's per-page CSP nonce value is
substituted into the document at that point. This is most useful in
combination with the HTML embedded doc type when using
<tt><script></tt> and <tt><style></tt> tags to allow that
tag to be accepted by Fossil's default
[https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP | CSP settings].
<h3>3. TH1 Documents</h3>
Fossil will substitute the value of [./th1.md | TH1 expressions] within
<tt>{</tt> curly braces <tt>}</tt> into the output HTML if you have
configured it with the <tt>--with-th1-docs</tt> option, which is
disabled by default.
<h2>Examples</h2>
This file that you are currently reading is an example of
embedded documentation. The name of this file in the fossil
source tree is "<b>www/embeddeddoc.wiki</b>".
You are perhaps looking at this
|
| ︙ | ︙ |
Changes to www/env-opts.md.
| ︙ | ︙ | |||
430 431 432 433 434 435 436 | If the default VFS underneath SQLite is not suitable, an alternative can be selected with either the `--vfs VFSNAME` option or the `FOSSIL_VFS` environment variable. The `--vfs` option takes precedence. | | | 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 | If the default VFS underneath SQLite is not suitable, an alternative can be selected with either the `--vfs VFSNAME` option or the `FOSSIL_VFS` environment variable. The `--vfs` option takes precedence. ### <a name="temp"></a>Temporary File Location Fossil places some temporary files in the checkout directory. Most notably, supporting files related to merge conflicts are placed in the same folder as the merge result. Other temporary files need a different home. The rules for choosing one are complicated. |
| ︙ | ︙ |
Added www/loadmgmt.md.
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 |
# Managing Server Load
A Fossil server is very efficient and normally presents a very light
load on the server. The Fossil [self-hosting server][sh] is a 1/24th
slice VM at [Linode.com][lin] hosting 65 other repositories in addition
to Fossil, including some very high-traffic sites such as
<http://www.sqlite.org> and <http://system.data.sqlite.org>. This small
VM has a typical load of 0.05 to 0.1. A single HTTP request to Fossil
normally takes less than 10 milliseconds of CPU time to complete, so
requests can be arriving at a continuous rate of 20 or more per second,
and the CPU can still be mostly idle.
However, there are some Fossil web pages that can consume large amounts
of CPU time, especially on repositories with a large number of files or
with long revision histories. High CPU usage pages include
[`/zip`](/help/zip), [`/tarball`](/help/tarball),
[`/annotate`](/help/annotate), and others. On very large repositories,
these commands can take 15 seconds or more of CPU time. If these kinds
of requests arrive too quickly, the load average on the server can grow
dramatically, making the server unresponsive.
Fossil provides two capabilities to help avoid server overload problems
due to excessive requests to expensive pages:
1. An optional cache is available that remembers the 10 most recently
requested `/zip` or `/tarball` pages and returns the precomputed
answer if the same page is requested again.
2. Page requests can be configured to fail with a
“[503 Server Overload][503]” HTTP error if an expensive request is
received while the host load average is too high.
Both of these load-control mechanisms are turned off by default, but
they are recommended for high-traffic sites.
The webpage cache is activated using the [`fossil cache
init`](/help/cache) command-line on the server. Add a `-R` option to
specify the specific repository for which to enable caching. If running
this command as root, be sure to “`chown`” the cache database to give
the Fossil server write permission for the user ID of the web server;
this is a separate file in the same directory and with the same name as
the repository but with the “`.fossil`” suffix changed to “`.cache`”.
To activate the server load control feature visit the Admin → Access
setup page in the administrative web interface; in the “**Server Load
Average Limit**” box enter the load average threshold above which “503
Server Overload” replies will be issued for expensive requests. On the
self-hosting Fossil server, that value is set to 1.5, but you could
easily set it higher on a multi-core server.
The maximum load average can also be set on the command line using
commands like this:
fossil set max-loadavg 1.5
fossil all set max-loadavg 1.5
The second form is especially useful for changing the maximum load
average simultaneously on a large number of repositories.
Note that this load-average limiting feature is only available on
operating systems that support the [`getloadavg()`][gla] API. Most
modern Unix systems have this interface, but Windows does not, so the
feature will not work on Windows.
Because Linux implements `getloadavg()` by accessing the `/proc/loadavg`
virtual file, you will need to make sure `/proc` is available to the
Fossil server. The most common reason for it to not be available is that
you are running a Fossil instance [inside a `chroot(2)`
jail](./chroot.md) and you have not mounted the `/proc` virtual file
system inside that jail. On the [self-hosting Fossil repositories][sh],
this was accomplished by adding a line to the `/etc/fstab` file:
chroot_jail_proc /home/www/proc proc ro 0 0
The `/home/www/proc` pathname should be adjusted so that the `/proc`
component is at the root of the chroot jail, of course.
To see if the load-average limiter is functional, visit the
[`/test_env`][hte] page of the server to view the current load average.
If the value for the load average is greater than zero, that means that
it is possible to activate the load-average limiter on that repository.
If the load average shows exactly "0.0", then that means that Fossil is
unable to find the load average. This can either be because it is in a
`chroot(2)` jail without `/proc` access, or because it is running on a
system that does not support `getloadavg()` and so the load-average
limiter will not function.
[503]: http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.5.4
[hte]: /help?cmd=/test_env
[gla]: https://linux.die.net/man/3/getloadavg
[lin]: http://www.linode.com
[sh]: ./selfhost.wiki
|
Deleted www/server.wiki.
|
| < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < |
Added www/server/any/althttpd.md.
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
# Serving via althttpd
The public SQLite and Fossil web sites are not purely served by Fossil
for two reasons:
1. We want access to these sites to be secured with TLS, which we do
[via `stunnel`](./stunnel.md).
2. Parts of these web sites are static, stored as plain files on disk,
not as Fossil artifacts. We serve such files using a separate web
server called [`althttpd`][ah], written by the primary author of
both SQLite and Fossil, D. Richard Hipp. `althttpd` is a lightweight
HTTP-only web server. It handles the static HTTP hits on
<tt>sqlite.org</tt> and <tt>fossil-scm.org</tt>, delegating HTTPS
hits to `stunnel` and dynamic content hits to Fossil [via
CGI][cgi].
The largest single chunk of static content served directly by `althttpd`
rather than via Fossil is the [SQLite documentation][sd], which is built
[from source files][ds]. We don’t want those output files stored in
Fossil; we already keep that process’s *input* files in Fossil. Thus the
choice to serve the output statically.
In addition to the [server’s documentation page][ah], there is a large,
helpful header comment in the server’s [single-file C
implementation][ac]. Between that and the generic [Serving via CGI][cgi]
docs, you should be able to figure out how to serve Fossil via
`althttpd`.
[ac]: https://sqlite.org/docsrc/file/misc/althttpd.c
[ah]: https://sqlite.org/docsrc/doc/trunk/misc/althttpd.md
[cgi]: ./cgi.md
[ds]: https://sqlite.org/docsrc/
[sd]: https://sqlite.org/docs.html
|
Added www/server/any/cgi.md.
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 |
# Serving via CGI
A Fossil server can be run from most ordinary web servers as a CGI
program. This feature allows Fossil to seamlessly integrate into a
larger website. We use CGI for the [self-hosting Fossil repository web
site](../../selfhost.wiki).
To run Fossil as CGI, create a CGI script (here called "repo") in the
CGI directory of your web server with content like this:
#!/usr/bin/fossil
repository: /home/fossil/repo.fossil
Adjust the paths appropriately. It may be necessary to set certain
permissions on this file or to modify an `.htaccess` file or make other
server-specific changes. Consult the documentation for your particular
web server. The following permissions are *normally* required, but,
again, may be different for a particular configuration:
* The Fossil binary (`/usr/bin/fossil` in the example above)
must be readable/executable.
* *All* directories leading up to the Fossil binary must be readable
by the process which executes the CGI.
* The CGI script must be executable for the user under which it will
run, which often differs from the one running the web server.
Consult your site's documentation or the web server’s system
administrator.
* *All* directories leading to the CGI script must be readable by the
web server.
* The repository file *and* the directory containing it must be
writable by the same account which executes the Fossil binary.
(This might differ from the user the web server normally runs
under.) The directory holding the repository file(s) needs to be
writable so that SQLite can write its journal files.
* Fossil must be able to create temporary files in a
[directory that varies by host OS](../../env-opts.md#temp). When the
CGI process is operating [within a chroot](../../chroot.md),
ensure that this directory exists and is readable/writeable by the
user who executes the Fossil binary.
Once the CGI script is set up correctly, and assuming your server is
also set correctly, you should be able to access your repository with a
URL like: <b>http://mydomain.org/cgi-bin/repo</b> This is assuming you
are running a web server like Apache that uses a “`cgi-bin`” directory
for scripts like our “`repo`” example.
To serve multiple repositories from a directory using CGI, use the
"directory:" tag in the CGI script rather than "repository:". You
might also want to add a "notfound:" tag to tell where to redirect if
the particular repository requested by the URL is not found:
#!/usr/bin/fossil
directory: /home/fossil/repos
notfound: http://url-to-go-to-if-repo-not-found/
Once deployed, a URL like: <b>http://mydomain.org/cgi-bin/repo/XYZ</b>
will serve up the repository `/home/fossil/repos/XYZ.fossil` if it
exists.
Additional options available to the CGI script are [documented
separately](../../cgi.wiki).
|
Added www/server/any/inetd.md.
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 |
# Serving via inetd
A Fossil server can be launched on-demand by `inetd` by using the
[`fossil http`](/help/http) command. To do so, add a line like the
following to its configuration file, typically `/etc/inetd.conf`:
80 stream tcp nowait.1000 root /usr/bin/fossil /usr/bin/fossil http /home/fossil/repo.fossil
In this example, you are telling `inetd` that when an incoming
connection appears on TCP port 80 that it should launch the program
`/usr/bin/fossil` with the arguments shown. Obviously you will need to
modify the pathnames for your particular setup. The final argument is
either the name of the fossil repository to be served or a directory
containing multiple repositories.
If you use a non-standard TCP port on systems where the port
specification must be a symbolic name and cannot be numeric, add the
desired name and port to `/etc/services`. For example, if you want your
Fossil server running on TCP port 12345 instead of 80, you will need to
add:
fossil 12345/tcp # fossil server
and use the symbolic name “`fossil`” instead of the numeric TCP port
number (“12345” in the above example) in `inetd.conf`.
Notice that we configured `inetd` to launch Fossil as root. See the
top-level section on “[The Fossil Chroot
Jail](../../chroot.md)” for the consequences of this and
alternatives to it.
You can instead configure `inetd` to bind to a higher-numbered TCP port,
allowing Fossil to be run as a normal user. In that case, Fossil will
not put itself into a chroot jail, because it assumes you have set up
file permissions and such on the server appropriate for that user.
The `inetd` daemon must be enabled for this to work, and it must be
restarted whenever its configuration file changes.
This is a more complicated method than the [standalone HTTP server
method](./none.md), but it has the advantage of only using system
resources when an actual connection is attempted. If no one ever
connects to that port, a Fossil server will not (automatically) run. It
has the disadvantage of requiring "root" access, which may not be
available to you, either due to local IT policy or because of
restrictions at your shared Internet hosting service.
For further details, see the relevant section in your system's
documentation. The FreeBSD Handbook covers `inetd` in [this
chapter](https://www.freebsd.org/doc/en/books/handbook/network-inetd.html).
|
Added www/server/any/none.md.
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
# Standalone HTTP Server
The easiest way to set up a Fossil server is to use either the
[`server`](/help/server) or [`ui`](/help/ui) command:
* **fossil server** _REPOSITORY_
* **fossil ui** _REPOSITORY_
The _REPOSITORY_ argument is either the name of the repository file or a
directory containing many repositories named “`*.fossil`”. Both of these
commands start a Fossil server, usually on TCP port 8080, though a
higher numbered port will be used instead if 8080 is already occupied.
You can access these using URLs of the form **http://localhost:8080/**,
or if _REPOSITORY_ is a directory, URLs of the form
**http://localhost:8080/**_repo_**/** where _repo_ is the base name of
the repository file without the “`.fossil`” suffix.
There are several key differences between “`ui`” and “`server`”:
* “`ui`” always binds the server to the loopback IP address (127.0.0.1)
so that it cannot serve to other machines.
* Anyone who visits this URL is treated as the all-powerful Setup
user, which is why the first difference exists.
* “`ui`” launches a local web browser pointed at this URL.
You can omit the _REPOSITORY_ argument if you run one of the above
commands from within a Fossil checkout directory to serve that
repository:
$ fossil ui # or...
$ fossil server
You can abbreviate Fossil sub-commands as long as they are unambiguous.
“`server`” can currently be as short as “`ser`”.
You can serve a directory containing multiple `*.fossil` files like so:
$ fossil server --port 9000 --repolist /path/to/repo/dir
There is an [example script](/file/tools/fslsrv) in the Fossil
distribution that wraps `fossil server` to produce more complicated
effects. Feel free to take it, study it, and modify it to suit your
local needs.
See the [online documentation](/help/server) for more information on the
options and arguments you can give to these commands.
|
Added www/server/any/scgi.md.
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 |
# Serving via SCGI
There is an alternative to running Fossil as a [standalone HTTP
server](./none.md), which is to run it in SimpleCGI (a.k.a. SCGI) mode,
which uses the same [`fossil server`](/help/server) command as for HTTP
service. Simply add the `--scgi` command-line option and the stand-alone
server will speak the SCGI protocol rather than raw HTTP.
This can be used with a web server such as [nginx](http://nginx.org)
which does not support [Fossil’s CGI mode](./cgi.md).
A basic nginx configuration to support SCGI with Fossil looks like this:
location /example/ {
include scgi_params;
scgi_pass localhost:9000;
scgi_param SCRIPT_NAME "/example";
scgi_param HTTPS "on";
}
Start Fossil so that it will respond to nginx’s SCGI calls like this:
fossil server /path/to/repo.fossil --scgi --localhost --port 9000
The `--scgi` option switches Fossil into SCGI mode from its default,
which is [stand-alone HTTP server mode](./none.md). All of the other
options discussed in that linked document — such as the ability to serve
a directory full of Fossil repositories rather than just a single
repository — work the same way in SCGI mode.
The `--localhost` option is simply good security: we’re using nginx to
expose Fossil service to the outside world, so there is no good reason
to allow outsiders to contact this Fossil SCGI server directly.
Giving an explicit non-default TCP port number via `--port` is a good
idea to avoid conflicts with use of Fossil’s default TCP service port,
8080, which may conflict with local uses of `fossil ui` and such.
Fossil requires the `SCRIPT_NAME` environment variable in order to
function properly, but nginx does not provide this variable by default,
so it is necessary to provide it in the configuration. Failure to do
this will cause Fossil to return an error.
The [example `fslsrv` script](/file/tools/fslsrv) shows off these same
concepts in a more complicated setting. You might want to mine that
script for ideas.
You might want to next read one of the platform-specific versions of this
document, which goes into more detail:
* [Debian/Ubuntu](../debian/nginx.md)
There is a [separate article](../../tls-nginx.md) showing how to add TLS
encryption to this basic SCGI + nginx setup.
|
Added www/server/any/stunnel.md.
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 |
# Serving via stunnel
[`stunnel`](https://www.stunnel.org/) is a TLS/SSL proxy for programs
that themselves serve only via HTTP, such as Fossil. (Fossil *can* speak
HTTPS, but only as a client.) `stunnel` decodes the HTTPS data from the
outside world as HTTP before passing it to Fossil, and it encodes the
HTTP replies from Fossil as HTTPS before sending them to the remote host
that made the request.
You can run `stunnel` in one of two modes: socket listener — much like
in our [`inetd` doc](./inetd.md) — and as an HTTP reverse proxy. We’ll
cover both cases here, separately.
## S<a name="sa"></a>ocket Activation
The following `stunnel.conf` configuration configures it to run Fossil
in socket listener mode, launching Fossil only when an HTTPS hit comes
in, then shutting it back down as soon as the transaction is complete:
```dosini
[fossil]
accept = 443
TIMEOUTclose = 0
exec = /usr/bin/fossil
execargs = /usr/bin/fossil http /home/fossil/ubercool.fossil --https
cert = /etc/letsencrypt/live/ubercool-project.org/fullchain.pem
key = /etc/letsencrypt/live/ubercool-project.org/privkey.pem
ciphers = ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:AES256-GCM-SHA384:AES128-GCM-SHA256:AES256-SHA256:AES128-SHA256:AES128-SHA:DES-CBC3-SHA
options = CIPHER_SERVER_PREFERENCE
```
This configuration shows the TLS certificate generated by the [Let’s
Encrypt](https://letsencrypt.org) [Certbot](https://certbot.eff.org) in
[certonly mode](https://certbot.eff.org/lets-encrypt/debianbuster-other).
There are other ways to get TLS certificates, but this is a popular and
free option.
You will need to adjust the site names and paths in this example. Where
this file goes varies by OS type, so check the man pages on your system
to find out where it should be locally.
See the `stunnel` documentation for further details about this
configuration file.
It is important that the [`fossil http`](/help/http) command in that
configuration include the `--https` option to let Fossil know to use
“`https://`” instead of “`http://`” in generated hyperlinks.
## <a name="proxy"></a>Reverse Proxy
You can instead have Fossil running in the background in [standalone
HTTP server mode](./none.md), bound to a high random TCP port number on
localhost via the `--localhost` and `--port` flags, then configure
`stunnel` to reverse proxy public HTTPS connections down to it via HTTP.
The configuration is the same as the above except that you drop the
`exec` and `execargs` directives and add this instead:
```dosini
connect = 9000
```
That tells `stunnel` to connect to an already-running process listening
on the given TCP port number.
There are a few advantages to this mode:
1. At the cost of some server memory and a tiny bit of idle CPU time,
Fossil remains running so that hits can be served a smidge faster
than in socket listener mode, where the Fossil binary has to be
loaded and re-initialized on each HTTPS hit.
2. The socket listener mode doesn’t work on all platforms that
`stunnel` runs on, particularly [on Windows](../windows/stunnel.md).
|
Added www/server/any/xinetd.md.
> > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
# Serving via xinetd
Some operating systems have replaced the old Unix `inetd` daemon with
`xinetd`, which has a similar mission but with a very different
configuration file format.
The typical configuration file is either `/etc/xinetd.conf` or a subfile
in the `/etc/xinetd.d` directory. You need a configuration something
like this for Fossil:
service http
{
port = 80
socket_type = stream
wait = no
user = root
server = /usr/bin/fossil
server_args = http /home/fossil/repos/
}
This example configures Fossil to serve multiple repositories under the
`/home/fossil/repos/` directory.
Beyond this, see the general commentary in our article on [the `inetd`
method](./inetd.md) as they also apply to service via `xinetd`.
|
Added www/server/debian/nginx.md.
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 |
# Serving via nginx on Debian and Ubuntu
This document is an extension of [the platform-independent SCGI
instructions][scgii], which may suffice for your purposes if your needs
are simple.
Here, we add more detailed information on nginx itself, plus details
about running it on Debian type OSes. We focus on Debian 10 (Buster) and
Ubuntu 18.04 here, which are common Tier 1 OS offerings for [virtual
private servers][vps]. This material may not work for older OSes. It is
known in particular to not work as given for Debian 9 and older!
If you want to add TLS to this configuration, that is covered [in a
separate document][tls] which was written with the assumption that
you’ve read this first.
[scgii]: ../any/scgi.md
[tls]: ../../tls-nginx.md
[vps]: https://en.wikipedia.org/wiki/Virtual_private_server
## <a name="benefits"></a>Benefits
This scheme is considerably more complicated than the [standalone HTTP
server](../any/none.md) and [CGI options](../any/cgi.md). Even with the
benefit of this guide and pre-built binary packages, it requires quite a
bit of work to set it up. Why should you put up with this complexity?
Because it gives many benefits that are difficult or impossible to get
with the less complicated options:
* **Power** — nginx is one of the most powerful web servers in the
world. The chance that you will run into a web serving wall that you
can’t scale with nginx is very low.
To give you some idea of the sort of thing you can readily
accomplish with nginx, your author runs a single public web server
that provides transparent name-based virtual hosting for four
separate domains:
* One is entirely static, not involving any dynamic content or
Fossil integration at all.
* Another is served almost entirely by Fossil, with a few select
static content exceptions punched past Fossil, which are handled
entirely via nginx.
* The other two domains are aliases for one another — e.g.
`example.com` and `example.net` — with most of the content being
static. This pair of domains has three different Fossil repo
proxies attached to various sections of the URI hierarchy.
By using nginx, I was able to do all of the above with minimal
repetition between the site configurations.
* **Integration** — Because nginx is so popular, it integrates with
many different technologies, and many other systems integrate with it in
turn. This makes it great middleware, sitting between the outer web
world and interior site services like Fossil. It allows Fossil to
participate seamlessly as part of a larger web stack.
* **Availability** — nginx is already in most operating system binary
package repositories, so you don’t need to go out of your way to get it.
## <a name="modes"></a>Fossil Service Modes
Fossil provides four major ways to access a repository it’s serving
remotely, three of which are straightforward to use with nginx:
* **HTTP** — Fossil has a built-in HTTP server: [`fossil
server`](/help/server). While this method is efficient and it’s
possible to use nginx to proxy access to another HTTP server, this
option is overkill for our purposes. nginx is itself a fully
featured HTTP server, so we will choose in this guide not to make
nginx reinterpret Fossil’s implementation of HTTP.
* **CGI** — This method is simple but inefficient, because it launches
a separate Fossil instance on every HTTP hit.
Since Fossil is a relatively small self-contained program, and it’s
designed to start up quickly, this method can work well in a
surprisingly large number of cases.
Nevertheless, we will avoid this option in this document because
we’re already buying into a certain amount of complexity here in
order to gain power. There’s no sense in throwing away any of that
hard-won performance on CGI overhead.
* **SCGI** — The [SCGI protocol][scgip] provides the simplicity of CGI
without its performance problems.
* **SSH** — This method exists primarily to avoid the need for HTTPS,
but we *want* HTTPS. (We’ll get to that in [another document][tls].)
There is probably a way to get nginx to proxy Fossil to HTTPS via
SSH, but it would be pointlessly complicated.
SCGI it is, then.
[scgip]: https://en.wikipedia.org/wiki/Simple_Common_Gateway_Interface
## <a name="deps"></a>Installing the Dependencies
The first step is to install some non-default packages we’ll need. SSH into
your server, then say:
$ sudo apt install fossil nginx
## <a name="scgi"></a>Running Fossil in SCGI Mode
I run my Fossil SCGI server instances with a variant of [the `fslsrv`
shell script](/file/tools/fslsrv) currently hosted in the Fossil source
code repository. You’ll want to download that and make a copy of it, so
you can customize it to your particular needs.
This script allows running multiple Fossil SCGI servers, one per
repository, each bound to a different high-numbered `localhost` port, so
that only nginx can see and proxy them out to the public. The
“`example`” repo is on TCP port localhost:12345, and the “`foo`” repo is
on localhost:12346.
As written, the `fslsrv` script expects repositories to be stored in the
calling user’s home directory under `~/museum`, because where else do
you keep Fossils?
That home directory also needs to have a directory to hold log files,
`~/log/fossil/*.log`. Fossil doesn’t put out much logging, but when it
does, it’s better to have it captured than to need to re-create the
problem after the fact.
The use of `--baseurl` in this script lets us have each Fossil
repository mounted in a different location in the URL scheme. Here, for
example, we’re saying that the “`example`” repository is hosted under
the `/code` URI on its domains, but that the “`foo`” repo is hosted at
the top level of its domain. You’ll want to do something like the
former for a Fossil repo that’s just one piece of a larger site, but the
latter for a repo that is basically the whole point of the site.
You might also want another script to automate the update, build, and
deployment steps for new Fossil versions:
#!/bin/sh
cd $HOME/src/fossil/trunk
fossil up
make -j11
killall fossil
sudo make install
fslsrv
The `killall fossil` step is needed only on OSes that refuse to let you
replace a running binary on disk.
As written, the `fslsrv` script assumes a Linux environment. It expects
`/bin/bash` to exist, and it depends on non-POSIX tools like `pgrep`.
It should not be difficult to port to systems like macOS or the BSDs.
## <a name="config"></a>Configuration
On Debian and Ubuntu systems the primary user-level configuration file
for nginx is `/etc/nginx/sites-enabled/default`. I recommend that this
file contain only a list of include statements, one for each site that
server hosts:
include local/example
include local/foo
Those files then each define one domain’s configuration. Here,
`/etc/nginx/local/example` contains the configuration for
`*.example.com` and `*.example.net`; and `local/foo` contains the
configuration for `*.foo.net`.
The configuration for our `foo.net` web site, stored in
`/etc/nginx/sites-enabled/local/foo` is:
server {
server_name .foo.net;
include local/generic;
access_log /var/log/nginx/foo.net-https-access.log;
error_log /var/log/nginx/foo.net-https-error.log;
# Bypass Fossil for the static Doxygen docs
location /doc/html {
root /var/www/foo.net;
location ~* \.(html|ico|css|js|gif|jpg|png)$ {
expires 7d;
add_header Vary Accept-Encoding;
access_log off;
}
}
# Redirect everything else to the Fossil instance
location / {
include scgi_params;
scgi_pass 127.0.0.1:12345;
scgi_param HTTPS "on";
scgi_param SCRIPT_NAME "";
}
}
As you can see, this is a simple extension of [the basic nginx service
configuration for SCGI][scgii], showing off a few ideas you might want to
try on your own site, such as static asset proxying.
The `local/generic` file referenced above helps us reduce unnecessary
repetition among the multiple sites this configuration hosts:
root /var/www/$host;
listen 80;
listen [::]:80;
charset utf-8;
There are some configuration directives that nginx refuses to substitute
variables into, citing performance considerations, so there is a limit
to how much repetition you can squeeze out this way. One such example is
the `access_log` and `error_log` directives, which follow an obvious
pattern from one host to the next. Sadly, you must tolerate some
repetition across `server { }` blocks when setting up multiple domains
on a single server.
The configuration for `example.com` and `example.net` is similar.
See [the nginx docs](http://nginx.org/en/docs/) for more ideas.
|
Added www/server/index.html.
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 |
<div class='fossil-doc' data-title="How To Configure A Fossil Server">
<style type="text/css" nonce="$NONCE">
p {
margin-left: 4em;
margin-right: 3em;
}
h2 {
margin-left: 1em;
}
h3 {
margin-left: 3em;
}
ol, ul {
margin-left: 3em;
}
a#all {
font-size: 90%;
margin-left: 1em;
}
div#tutpick.show {
max-height: 99em;
transition: max-height 1000ms ease-in;
}
div#tutpick {
max-height: 0;
overflow: hidden;
}
th.fep {
background-color: #e8e8e8;
min-width: 3em;
padding: 0.4em;
white-space: nowrap;
}
th.host {
background-color: #e8e8e8;
padding: 0.4em;
text-align: right;
}
td.doc {
text-align: center;
}
</style>
<h2>No Server Required</h2>
<p>Fossil does not require a central server, but <a
href="whyuseaserver.wiki">a server can be very useful</a>.</p>
<p>This article is a quick-reference guide for setting up your own
Fossil server, with links to more detailed instructions specific to
particular systems, should you want extra help.</p>
<h2 id="methods">Methods</h2>
<p>There are basically four ways to set up a Fossil server:</p>
<ol>
<li>Socket listener:
<a id="inetd" href="any/inetd.md">inetd</a>,
<a id="xinetd" href="any/xinetd.md">xinetd</a>,
<a id="stunnel" href="any/stunnel.md">stunnel</a>...
<li><a id="standalone" href="any/none.md">Stand-alone HTTP server</a>
<li><a id="scgi" href="any/scgi.md">SCGI</a>
<li><a id="cgi" href="any/cgi.md">CGI</a>
</ol>
<p>All of these methods can serve either a single repository or a
directory hierarchy containing many repositories with names ending in
"<tt>.fossil</tt>".</p>
<p>You are not restricted to using a single method. The same Fossil
repository can be served using two or more of the above techniques at
the same time. You can also migrate from one method to another to
accommodate changes in hosting providers or administrator
preferences.</p>
<h3>Socket Listener</h3>
<p>The idea behind the socket listener approach is that each incoming
HTTP request is relayed to a new instance of the <a
href="/help?cmd=http"><tt>fossil http</tt></a> command. That command
reads the HTTP request from its standard input, handles the request, and
writes a complete and correct HTTP reply on standard output which is
then returned to the client.</p>
<h3>Stand-alone HTTP Server</h3>
<p>A stand-alone server uses the <a href="/help?cmd=server"><tt>fossil
server</tt></a> command to run a process that listens for incoming HTTP
requests on a socket and then dispatches a copy of itself to deal with
each incoming request. A stand-alone server can talk directly with the
client, or the system can be configured with a reverse proxy in between
the client and Fossil.</p>
<h3>CGI and SCGI</h3>
<p>Fossil can also be run using CGI from ordinary web servers such as
Apache, <a href="windows/cgi.md">IIS</a>, <tt>lighttpd</tt>, or
<tt>althttpd</tt>. The Fossil server administrator places a <a
href="/help?cmd=cgi">short CGI script</a> in the web server's document
hierarchy, and when a client requests the appropriate URL, that script
runs Fossil to generate the responce. CGI is a good choice for merging
Fossil into an existing web site. The Fossil <a
href="../selfhost.wiki">self-hosting repositories</a> are implemented
with CGI underneath <tt>althttpd</tt>.</p>
<p>For web servers such as nginx that do not support CGI, Fossil
supports SCGI, a protocol that gives most of the simplicity of CGI with
the efficiency of the stand-alone server option. With nginx, you use the
<a href="/help/server"><tt>fossil server --scgi</tt></a> command.</p>
<h2 id="matrix">Setup Tutorials</h2>
<p>We've broken the configuration for each method out into a series of
sub-articles. Some of these are generic, while others depend on
particular operating systems or front-end software:</p>
<div id="tutpick"></div>
<!-- Define alternative to JS tutorial picker below. When updating this
table, update "matrix" in the JS code below to match! -->
<noscript id="tutmatrix">
<table style="margin-left: 6em;">
<tr>
<th class="host">⇩ OS / Method ⇨</th>
<th class="fep">none</th>
<th class="fep">inetd</th>
<th class="fep">stunnel</th>
<th class="fep">CGI</th>
<th class="fep">SCGI</th>
<th class="fep">althttpd</th>
<th class="fep">proxy</th>
<th class="fep">service</th>
</tr>
<tr>
<th class="host">Any</th>
<td class="doc"><a href="any/none.md">✅</a></td>
<td class="doc"><a href="any/inetd.md">✅</a></td>
<td class="doc"><a href="any/stunnel.md">✅</a></td>
<td class="doc"><a href="any/cgi.md">✅</a></td>
<td class="doc"><a href="any/scgi.md">✅</a></td>
<td class="doc"><a href="any/althttpd.md">✅</a></td>
<td class="doc">❌</td>
<td class="doc">❌</td>
</tr>
<tr>
<th class="host">Debian/Ubuntu</th>
<td class="doc"><a href="any/none.md">✅</a></td>
<td class="doc"><a href="any/inetd.md">✅</a></td>
<td class="doc"><a href="any/stunnel.md">✅</a></td>
<td class="doc"><a href="any/cgi.md">✅</a></td>
<td class="doc"><a href="any/scgi.md">✅</a></td>
<td class="doc"><a href="any/althttpd.md">✅</a></td>
<td class="doc"><a href="debian/nginx.md">✅</a></td>
<td class="doc">❌</td>
</tr>
<tr>
<th class="host">Windows</th>
<td class="doc">❌</td>
<td class="doc">❌</td>
<td class="doc"><a href="windows/stunnel.md">✅</a></td>
<td class="doc"><a href="windows/cgi.md">✅</a></td>
<td class="doc">❌</td>
<td class="doc">❌</td>
<td class="doc"><a href="windows/iis.md">✅</a></td>
<td class="doc"><a href="windows/service.md">✅</a></td>
</tr>
</table>
<p>Where there is a check mark in the "<b>Any</b>" row, the method for that is
generic enough that it works across OSes that Fossil is known to work
on. The check marks below that usually just link to this generic
documentation.</p>
<p>The method in the "<b>proxy</b>" column is for the platform's default
web server configured as a <a
href="https://en.wikipedia.org/wiki/Reverse_proxy">reverse proxy</a> for
Fossil's built-in HTTP server: <a href="debian/nginx.md">nginx</a>, <a
href="windows/iis.md">IIS</a>, Apache, etc.</p>
<p>There are several widely-deployed socket listener schemes besides the
<tt>inetd</tt>, <tt>xinetd</tt>, and <tt>stunnel</tt> schemes with
documents linked above: Apple’s <tt>launchd</tt>, Linux’s
<tt>systemd</tt>, Solaris’ SMF, etc. We would welcome <a
href="contribute.wiki">contributions</a> to cover these as well. We also
welcome contributions to fill gaps (<font size="-2">❌</font>) in the table
above. </p>
</noscript>
<h2 id="more">Further Details</h2>
<ul>
<li><a id="chroot" href="../chroot.md" >The Server Chroot Jail</a>
<li><a id="loadmgmt" href="../loadmgmt.md" >Managing Server Load</a>
<li><a id="tls" href="../ssl.wiki" >Securing a Repository with TLS</a>
<li><a id="ext" href="../serverext.wiki">CGI Server Extensions</a>
<li><a id="about" href="../aboutcgi.wiki" >How CGI Works In Fossil</a>
<li><a id="sync" href="../sync.wiki" >The Fossil Sync Protocol</a>
</ul>
</div>
<script type="text/javascript" nonce="$NONCE">
(function() {
// Define data structure analog to <table> above. Matrix elements
// can have one of these constant values or a string for a one-off
// custom value. Values outside the <table> above go at the end of
// the rows we define here.
const YES = 1; // host-specific doc provided
const IFA = 2; // inherit doc from "any"
const NO = 3; // method invalid or undocumented for this host OS
const methods = [
"none", "inetd", "stunnel", "CGI", "SCGI", "althttpd", "proxy", "service"
];
const matrix = {
"any OS": [ YES, YES, YES, YES, YES, YES, NO, NO ],
"Debian or Ubuntu": [ IFA, IFA, IFA, IFA, IFA, IFA, "nginx", NO ],
"Windows": [ NO, NO, YES, YES, NO, NO, "IIS", NO ],
}
const osNames = Object.keys(matrix).sort((e) => {
return e.toLowerCase()
}).map((longName, i) => {
var shortName = longName.toLowerCase().split(' ')[0];
return [ longName, shortName ];
});
const osNameMap = Object.fromEntries(osNames);
//console.log("OS name map: " + JSON.stringify(osNameMap));
// Build initial tutorial chooser HTML, and insert it into doc where
// the static HTML <table> matrix normally goes.
var html = '<p><b>I want to run Fossil on</b> <select id="os">';
for (var os of osNames) {
const longName = os[0];
const shortName = os[1];
html += '<option name="' + shortName + '">' + longName + '</option>';
}
html += '</select> <b>underneath</b> <select id="fep"></select>'
html += '<a id="all">SHOW ALL</a></p>';
const picker = document.querySelector('div#tutpick');
picker.innerHTML = html;
picker.classList.add('show');
// Slide noscript <table> in place of JS tutorial chooser on
// "SHOW ALL" click.
document.querySelector('a#all').addEventListener('click', () => {
picker.classList.remove('show');
picker.innerHTML = document.querySelector('#tutmatrix').innerHTML;
setTimeout(() => {
// Let doc update to set new height, so transition happens.
picker.classList.add('show');
}, 10);
});
// Attach event handlers to drop-downs. Have to wait until the page
// loads, else we'll get null back from querySelector(('select#foo')).
window.addEventListener('load', () => {
// Set up the FEP choice drop-down on initial page load and
// update it when the OS choice drop-down changes.
const osSel = document.querySelector('select#os');
const fepSel = document.querySelector('select#fep');
function osClickHandler() {
var osLong = osSel.value;
var osShort = osNameMap[osLong];
var html = '<option>---</option>';
matrix[osLong].forEach((choice, i) => {
var mu;
if (typeof(choice) === 'string') {
mu = choice;
choice = YES;
}
else {
mu = methods[i];
}
const ml = mu.toLowerCase();
if (choice != NO) {
if (choice == YES) {
html += '<option value="' + osShort + '/' + ml + '.md">';
}
else if (choice == IFA) {
html += '<option value="any/' + ml + '.md">';
}
html += mu + '</option>';
}
});
fepSel.innerHTML = html;
}
osSel.addEventListener('change', osClickHandler);
osClickHandler(); // load fepSel initial content
// Go to selected document when user changes FEP drop-down
fepSel.addEventListener('change', () => {
var doc = fepSel.value;
if (doc) location.href = doc;
// else it's the --- entry, either because we just reloaded the
// <option> set or because the user re-selected it.
});
});
})();
</script>
|
Added www/server/whyuseaserver.wiki.
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
<title>Benefits Of A Fossil Server</title>
<h2>No Server Required</h2>
Fossil does <em>not</em> require a central server.
Data sharing and synchronization can be entirely peer-to-peer.
Fossil uses
[https://en.wikipedia.org/wiki/Conflict-free_replicated_data_type|conflict-free replicated data types]
to ensure that (in the limit) all participating peers see the same content.
<h2>But, A Server Can Be Useful</h2>
Fossil does not require a server, but a server can be very useful.
Here are a few reasons to set up a Fossil server for your project:
1. <b>A server gives developers a common point of rendezvous for
syncing their work.</b><p>
It is possible for developers to synchronous peer-to-peer but
that requires the developers coordinate the sync, which in turn
requires that the developers both want to sync at the same moment.
A server aleviates this time dependency by allowing each developer
to sync whenever it is convenient (for example, automatically syncing
after each commit and before each update). Developers all stay
in sync with each other, without having to interrupt each other
constantly to set up a peer-to-peer sync.
2. <b>A server works as a project website for non-developers.</b><p>
Fossil does more than just version control. It also supports
trouble-tickets, and wiki, and a forum. It shows the status
of the project. And the embedded documentation feature provides
a great mechanism for providing only instructions.
3. <b>A server provides project leaders with up-to-date status.</b><p>
Project coordinators and BDFLs can click on a link or two at the
central Fossil server for a project, and quickly tell what is
going on. They can do this from anywhere, even from their phones,
without needing to actually sync to the device they are using.
4. <b>A server provides automatic off-site backups.</b><p>
A Fossil server is an automatic remote backup for all the work
going into a project. You can even set up multiple servers, at
multiple sites, with automatic synchronization between them, for
added redundancy. Such a set up means that no work is lost due
to a single machine failure.
|
Added www/server/windows/cgi-bin-perm.png.
cannot compute difference between binary files
Added www/server/windows/cgi-exec-perm.png.
cannot compute difference between binary files
Added www/server/windows/cgi-script-map.png.
cannot compute difference between binary files
Added www/server/windows/cgi.md.
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 |
# Serving via IIS + CGI
## This Is Not the Method You Are Looking For
Setting up CGI service under IIS is surprisingly complicated compared to
running Fossil as a CGI under most other operating systems. We recommend
that you use the simpler [reverse proxying method](./iis.md) instead
unless there is some compelling reason why that method cannot work for
you, such as its dependence on non-stock IIS extensions. (Keep in mind
that both extensions it requires are by Microsoft, not third parties!)
Once you’ve got this scheme working, it gives the same benefits as those
listed at the top of the linked-to document.
There is a small benefit you get from using CGI over reverse proxying on
other OSes, which is that the Fossil program only runs briefly in order
to serve each HTTP hit. Once the request is done, that Fossil instance
shuts back down, releasing all of its resources. You don’t need to keep
a background Fossil HTTP server running full-time to provide CGI-based
Fossil service.
You lose a lot of that benefit on Windows:
1. It only matters to start with on servers that are highly RAM
constrained. (Roughly ≤ 128 MiB.) Our configuration steps below
assume you’re using the Windows and IIS GUIs, which have RAM
requirements well in excess of this, making Fossil’s resource
requirements a drop in the bucket next to them. On the [Azure
B1s][b1s] virtual machine I used to prepare these instructions, the
Windows Server Manager GUI kept filling the VM’s 1 GiB of RAM
during feature installation and crashing. I had to upgrade the VM’s
RAM to 2 GiB just to get useful work done!
2. Process creation on Windows is [much more expensive][cp] than on the
other OSes Fossil runs on, so the benefits of firing up a Fossil
executable to process each HTTP request are partially swamped by the
overhead of doing so.
Therefore, unless you’re willing to replace all of the GUI configuration
steps below with command line equivalents, or shut the GUI down entirely
after configuring IIS, CGI is a much less compelling option on Windows.
**WARNING:** The following tutorial appears to fail with the current
(2019-08-17) version of Fossil, [apparently][fbug] due to an inability
of Fossil to detect that it’s being run in CGI mode.
[b1s]: https://azure.microsoft.com/en-us/blog/introducing-b-series-our-new-burstable-vm-size/
[cp]: https://stackoverflow.com/a/48244/142454
[fbug]: https://fossil-scm.org/forum/forumpost/de18dc32c0
## Setup
1. Install the Fossil executable to `c:\inetpub\wwwroot\bin` on the web
server. We can’t use an executable you might already have because IIS
runs under a separate user account, so we need to give that
executable special permissions, and that’s easiest to do under the
IIS tree:

2. In IIS Manager (a.k.a. `INETMGR`) drill down into the Sites folder
in the left-side pane and right-click your web site’s
configuration. (e.g. “Default Web Site”)
3. On that menu say “Add Virtual Directory.” Give it the alias “`cgi`”
and point it at a suitable directory, such as
“`c:\inetpub\wwwroot\cgi`”.
4. Double-click the “Handler Mappings” icon, then in the right-side
pane, click “Add Script Map...” Apply the following settings:

The Executable path must point to the path we set up in step 1, not
to some other `fossil.exe` you may have elsewhere on your system.
You will need to change the default “`*.dll`” filter in the Open
dialog to “`*.exe`” in order to see it when browsing via the “`...`”
button.
5. Create a file called `repo.fslcgi` within the CGI directory you
chose in step 3, with a single line like this:
repository: c:\Users\SOMEONE\museum\repo.fossil
Give the actual path to the repository, of course.
6. Up at the top level of IIS Manager, double-click the “ISAPI and CGI
Restrictions” icon, then click “Add...” in the right-side pane.
Give the script you just created permission to execute:

7. In the right-side pane, click “Restart” to apply this configuration,
then test it by visiting the newly-available URL in a browser:
http://localhost/cgi/repo.fslcgi
For more complicated setups such as “directory” mode, see [the generic
CGI instructions](../any/cgi.md).
*[Return to the top-level Fossil server article.](../../server.wiki)*
|
Added www/server/windows/iis.md.
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 |
# Serving via IIS
## Why Bother?
The first part of the scheme below sets Fossil up as an HTTP server, so
you might be wondering why you wouldn’t just modify that to make it
listen on all network interfaces on TCP port 80, so you can avoid the
need for IIS entirely. For simple use cases, you can indeed do without
IIS, but there are several use cases where adding it is helpful:
1. Proxying Fossil with IIS lets you [add TLS encryption][tls], which
[Fossil does not currently speak](../../ssl.wiki) in its server role.
2. The URL rewriting we do below allows Fossil to be part of a larger
site already being served with IIS.
3. You can have a mixed-mode site, with Fossil acting as a powerful
dynamic content management service and IIS as a fast static content
server. The pure-Fossil alternative requires that you check all of
your static content into Fossil as versioned or unversioned
artifacts.
This article shows how you can get any combination of those benefits by
using IIS as a reverse proxy for `fossil server`.
There are other ways to use IIS to serve Fossil, such as [via
CGI](./cgi.md).
## Background Fossil Service Setup
You will need to have the Fossil HTTP server running in the background,
serving some local repository, bound to localhost on a fixed
high-numbered TCP port. For the purposes of testing, simply start it by
hand in your command shell of choice:
fossil serve --port 9000 --localhost repo.fossil
That command assumes you’ve got `fossil.exe` in your `%PATH%` and you’re
in a directory holding `repo.fossil`. See [the platform-independent
instructions](../any/none.md) for further details.
For a more robust setup, we recommend that you [install Fossil as a
Windows service](./service.md), which will allow Fossil to start at
system boot, before anyone has logged in interactively.
## Reverse Proxy with URL Rewriting
The stock IIS setup doesn’t have reverse proxying features, but they’re
easily added through extensions. You will need to install the
[Application Request Routing][arr] and [URL Rewrite][ure] extensions. In
my testing here, URL Rewrite showed up immediately after installing it,
but I had to reboot the server to get ARR to show up. (Yay Windows.)
You can install these things through the direct links above, or you can
do it via the Web Platform Installer feature of IIS Manager (a.k.a.
`INETMGR`).
Now you can set these extensions up in IIS Manager:
1. Double-click the “Application Request Routing Cache” icon.
2. Right-click in the window that results, and select “Server Proxy
Settings...”
3. Check the “Enable Proxy” box in the dialog. Click the “Apply” text
in the right-side pane.
4. Return to the top server-level configuration area of IIS Manager and
double-click the “URL Rewrite” icon. Alternately, you might find
“URL Rewrite” in the right-side pane from within the ARR settings.
5. Right click in the window that results and click “Add Rule(s)...”
Tell it you want a “Blank rule” under “Inbound rules”.
6. In the dialog that results, create a new rule called “Fossil repo
proxy.” Set the “Pattern” to “`^(.*)$`” and “Rewrite URL” set to
“`http://localhost:9000/{R:1}`”. That tells it to take everything in
the path part of the URL and send it down to localhost:9000, where
`fossil server` is listening.
7. Click “Apply” in the right-side pane, then get back to the top level
configuration for the server and click “Restart” in that same pane.
At this point, if you go to `http://localhost/` in your browser, you
should see your Fossil repository’s web interface instead of the default
IIS web site, as before you did all of the above.
This is a very simple configuration. You can do more complicated and
interesting things with this, such as redirecting only `/code` URLs to
Fossil by setting the Pattern in step 6 to “`^/code(.*)$`”. IIS would
then directly serve all other URLs. You could also intermix ASP.NET
applications in the URL scheme in this way.
See the documentation on [URL Rewrite rules][urr] for more ideas.
[arr]: https://www.iis.net/downloads/microsoft/application-request-routing
[tls]: https://docs.microsoft.com/en-us/iis/manage/configuring-security/understanding-iis-url-authorization
[ure]: https://www.iis.net/downloads/microsoft/url-rewrite
[urr]: https://docs.microsoft.com/en-us/iis/extensions/url-rewrite-module/creating-rewrite-rules-for-the-url-rewrite-module
|
Added www/server/windows/index.md.
> > > > > | 1 2 3 4 5 | # Using Windows as a Fossil Server - [Fossil as a Service](service.md) - [Using stunnel with Fossil on Windows](stunnel.md) |
Added www/server/windows/service.md.
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 | # Fossil as a Windows Service If you need Fossil to start automatically on Windows, it is suggested to install Fossil as a Windows Service. ## Assumptions 1. You have Administrative access to a Windows 2012r2 or above server. 2. You have PowerShell 5.1 or above installed. ## Place Fossil on Server However you obtained your copy of Fossil, it is recommended that you follow Windows conventions and place it within `\Program Files (x86)\FossilSCM`. Since Fossil is a 32bit binary, this is the proper location for the executable. This way Fossil is in an expected location and you will have minimal issues with Windows interfering in your ability to run Fossil as a service. You will need Administrative rights to place fossil at the recommended location. You do NOT need to add this location to the path, though you may do so if you wish. ## Make Fossil a Windows Service Luckily the hard work to use Fossil as a Windows Service has been done by the Fossil team. We simply have to install it with the proper command line options. As of Fossil 2.9 the built in `fossil winsrv` command is failing, so an alternative service install using PowerShell is documented here. The below should all be entered as a single line in an Administrative PowerShell console. ```PowerShell New-Service -Name fossil -DisplayName fossil -BinaryPathName '"C:\Program Files (x86)\FossilSCM\fossil.exe" server --port 8080 --repolist "D:/Path/to/Repos"' -StartupType Automatic ``` Please note the use of forward slashes in the paths passed to Fossil. Windows will accept either back slashes or forward slashes in path names, but Fossil has a preference for forward slashes. The use of `--repolist` will make this a multiple repository server. If you want to serve only a single repository, then leave off the `--repolist` parameter and provide the full path to the proper repository file. Other options are listed in the [fossil server](/help?cmd=server) documentation. The service will be installed by default to use the Local Service account. Since Fossil only needs access to local files, this is fine and causes no issues. The service will not be running once installed. You will need to start it to proceed (the `-StartupType Automatic` parameter to `New-Service` will result in the service auto-starting on boot). This can be done by entering ```PowerShell Start-Service -Name fossil ``` in the PowerShell console. Congratulations, you now have a base http accessible Fossil server running on Windows. |
Added www/server/windows/stunnel.md.
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 |
# Using stunnel with Fossil on Windows
While there are many ways to configure Fossil as a server using various web
servers (Apache, IIS, nginx, etc.), this document will focus on setting up a
minimal Fossil server using only Fossil's native [server
capabilities](server.wiki#standalone) and [stunnel](https://www.stunnel.org/)
to provide a TLS proxy. It is recommended for public repositories to go to the
extra step of configuring stunnel to provide a proper HTTPS setup.
## Assumptions
1. You have Administrative access to a Windows 2012r2 or above server.
2. You have PowerShell 5.1 or above installed.
3. You have acquired a certificate either from a Public CA or an Internal CA.
These instructions were tested with Fossil 2.10 and stunnel 5.55. Other
versions may not function in a similar manner. There is a bug in Fossil 2.9 and
earlier that prevents these versions of Fossil from properly constructing https
URLs when used with stunnel as a proxy. Please make sure you are using Fossil
2.10 or later on Windows.
## Configure Fossil Service for https
Following most of [Fossil as a Windows Service](service.md), you will need
to change the command to install the Fossil Service to configure it properly for
use with stunnel as an https proxy. Run the following instead:
```PowerShell
New-Service -Name fossil-secure -DisplayName fossil-secure -BinaryPathName '"C:\Program Files (x86)\FossilSCM\fossil.exe"
server --localhost --port 9000 --https --repolist "D:/Path/to/Repos"' -StartupType Automatic
```
The use of `--localhost` means Fossil will only listen for traffic on the local
host on the designated port - 9000 in this case - and will not respond to
network traffic. Using `--https` will tell Fossil to generate HTTPS URLs rather
than HTTP ones.
`New-Service` does not automatically start a service on install, so you will
need to enter the following to avoid rebooting the server:
```PowerShell
Start-Service -Name fossil-secure
```
## Install stunnel 5.55
Download stunnel from the [downloads](https://www.stunnel.org/downloads.html)
page. Select the latest stunnel windows package (at the time of writing this is
`stunnel-5.55-win64-installer.exe`). Execute the installer and make sure you
install openSSL tools when you install stunnel. You will need this to convert
your certificate from PFX to PEM format.
Even though the installer says it is for win64, it installs stunnel by default
to `\Program Files (x86)\stunnel`.
## Get your certificate ready for Stunnel
Whether you use a Public Certificate Authority or Internal Certificate
Authority, the next step is exporting the certificate from Windows into a format
useable by Stunnel.
### Export Certificate from Windows
If your certificate is installed via Windows Certificate Management, you will
need to export the certificate into a usable format. You can do this either
using the Windows Certificate Management Console, or PowerShell.
#### Certificate Management Console
Start `mmc.exe` as an Administrator. Select 'File>Add/Remove Snapin', select
'Certificates' from the list, and click 'Add'. Select 'Computer Account',
'Next', 'Local Computer', and then 'Finish'. In the Console Root, expand
'Certificates', then 'Personal', and select 'Certificates'. In the middle pane
find and select your certificate. Right click the certificate and select
'All Tasks>Export'. You want to export as PFX the Private Key, include all
certificates in the certification path, and use a password only to secure the
file. Enter a path and file name to a working directory and complete the
export.
Continue with [Convert Certificate from PFX to PEM](#convert).
#### PowerShell
If you know the Friendly
Name of the Certificate this is relatively easy. Since you need to export
the private key as well, you must run the following from an Administrative
PowerShell console.
```PowerShell
$passwd = ConvertTo-SecureString -string "yourpassword" -Force -AsPlainText
Get-ChildItem Cert:\LocalMachine\My | Where{$_.FriendlyName -eq "FriendlyName"} |
Export-PfxCertificate -FilePath fossil-scm.pfx -Password $passwd
```
You will now have your certificate stored as a PFX file.
<a name="convert"></a>
### Convert Certificate from PFX to PEM
For this step you will need the openssl tools that were installed with stunnel.
```PowerShell
# Add stunnel\bin directory to path for this session.
$env:PATH += ";${env:ProgramFiles(x86)}\stunnel\bin"
# Export Private Key
openssl.exe pkcs12 -in fossil-scm.pfx -out fossil-scm.key -nocerts -nodes
# Export the Certificate
openssl.exe pkcs12 -in fossil-scm.pfx -out fossil-scm.pem -nokeys
```
Now move `fossil-scm.key` and `fossil-scm.pem` to your stunnel config directory
(by default this should be located at `\Program Files (x86)\stunne\config`).
## stunnel Configuration
Use the reverse proxy configuration given in the generic [Serving via
stunnel document](../any/stunnel.md#proxy). On Windows, the
`stunnel.conf` file is located at `\Program Files (x86)\stunnel\config`.
You will need to modify it to point at the PEM and key files generated
above.
After completing the above configuration restart the stunnel service in Windows
with the following:
```PowerShell
Restart-Service -Name stunnel
```
## Open up port 443 in the Windows Firewall
The following instructions are for the [Windows Advanced
Firewall](https://docs.microsoft.com/en-us/windows/security/threat-protection/windows-firewall/windows-firewall-with-advanced-security).
If you are using a different Firewall, please consult your Firewall
documentation for how to open port 443 for inbound traffic.
The following command should be entered all on one line.
```PowerShell
New-NetFirewallRule -DisplayName "Allow Fossil Inbound" -Description "Allow Fossil inbound on port 443 using Stunnel as TLS Proxy."
-Direction Inbound -Protocol TCP -LocalPort 443 -Action Allow -Program "C:\Program Files (x86)\Stunnel\bin\stunnel.exe"
```
You should now be able to access your new Fossil Server via HTTPS.
|
Changes to www/ssl.wiki.
|
| | | 1 2 3 4 5 6 7 8 | <title>Securing a Repository with TLS</title> <h2>Using TLS-Encrypted Communications with Fossil</h2> If you are storing sensitive information in a repository accessible over a network whose integrity you do not fully trust, you should use TLS to encrypt all communications with it. This is most true for repositories accessed over the Internet, especially if they will be accessed from |
| ︙ | ︙ | |||
204 205 206 207 208 209 210 | <h2 id="server">Fossil TLS Configuration: Server Side</h2> Fossil's built-in HTTP server feature does not currently have a built-in way to serve via HTTP over TLS, a.k.a. HTTPS, even when you've linked Fossil to OpenSSL. To serve a Fossil repository via HTTPS, you must put | | | | < < < < < < < < | < < < < < < < | < < | < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < | 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 | <h2 id="server">Fossil TLS Configuration: Server Side</h2> Fossil's built-in HTTP server feature does not currently have a built-in way to serve via HTTP over TLS, a.k.a. HTTPS, even when you've linked Fossil to OpenSSL. To serve a Fossil repository via HTTPS, you must put it behind some kind of HTTPS proxy. We have a number of documents elsewhere in this repository that cover your options for [./server.wiki | serving Fossil repositories]. A few of the most useful of these are: * <a id="stunnel" href="./server/any/stunnel.md">Serving via stunnel</a> * <a id="althttpd" href="./server/any/althttpd.md">Serving via stunnel + althttpd</a> * <a id="nginx" href="./server/any/scgi.md">Serving via SCGI (nginx)</a> <h2 id="enforcing">Enforcing TLS Access</h2> To use TLS encryption in cloning and syncing to a remote Fossil repository, be sure to use the <tt>https:</tt> URI scheme in <tt>clone</tt> and <tt>sync</tt> commands. If your server is configured |
| ︙ | ︙ |
Changes to www/tls-nginx.md.
1 2 3 4 5 6 7 | # Proxying Fossil via HTTPS with nginx One of the [many ways](./ssl.wiki) to provide TLS-encrypted HTTP access (a.k.a. HTTPS) to Fossil is to run it behind a web proxy that supports TLS. This document explains how to use the powerful [nginx web server](http://nginx.org/) to do that. | | < | < < < < < < < < < < < < < < < < < < < < < < < < < < < | < < < < < | < < < | < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < | < | < < < < < < | > | | | < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < | | | | < | < < | | < < < < < | > | < < > | > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 |
# Proxying Fossil via HTTPS with nginx
One of the [many ways](./ssl.wiki) to provide TLS-encrypted HTTP access
(a.k.a. HTTPS) to Fossil is to run it behind a web proxy that supports
TLS. This document explains how to use the powerful [nginx web
server](http://nginx.org/) to do that.
This document is an extension of the [Serving via nginx on Debian][nod]
document. Please read that first, then come back here to extend its
configuration with TLS.
[nod]: ./server/debian/nginx.md
## Install Certbot
The [nginx-on-Debian document][nod] had you install a few non-default
packages to the system, but there’s one more you need for this guide:
$ sudo apt install certbot
You can extend this guide to other operating systems by following the
instructions found via [the front Certbot web page][cb] instead, telling
it what OS and web stack you’re using. Chances are good that they’ve got
a good guide for you already.
# Configuring Let’s Encrypt, the Easy Way
If your web serving needs are simple, [Certbot][cb] can configure nginx
for you and keep its certificates up to date. Simply follow Certbot’s
[nginx on Ubuntu 18.04 LTS guide][cbnu]. We’d recommend one small
change: to use the version of Certbot in the Ubuntu package repository
rather than download it from the Certbot site.
You should be able to use the nginx configuration given in our [Serving
via nginx on Debian][nod] guide with little to no change. The main thing
to watch out for is that the TCP port number in the nginx configuration
needs to match the value you gave when starting Fossil. If you followed
that guide’s advice, it will be 9000. Another option is to use [the
`fslsrv` script](/file/tools/fslsrv), in which case the TCP port number
will be 12345 or higher.
# Configuring Let’s Encrypt, the Hard Way
If you’re finding that you can’t get certificates to be issued or
renewed using the Easy Way instructions, the problem is usually that
your nginx configuration is too complicated for Certbot’s `--nginx`
plugin to understand. It attempts to rewrite your nginx configuration
files on the fly to achieve the renewal, and if it doesn’t put its
directives in the right locations, the domain verification can fail.
Let’s Encrypt uses the [Automated Certificate Management
Environment][acme] protocol (ACME) to determine whether a given client
actually has control over the domain(s) for which it wants a certificate
minted. Let’s Encrypt will not blithely let you mint certificates for
`google.com` and `paypal.com` just because you ask for it!
Your author’s configuration, glossed [in the HTTP-only guide][nod],
is complicated enough that
the current version of Certbot (0.28 at the time of this writing) can’t
cope with it. That’s the primary motivation for me to write this guide:
I’m addressing the “me” years hence who needs to upgrade to Ubuntu 20.04
or 22.04 LTS and has forgotten all of this stuff. 😉
## Step 1: Shifting into Manual
|
| ︙ | ︙ | |||
214 215 216 217 218 219 220 | nginx plugins. You’re looking for two lines setting the “install” and “auth” plugins to “nginx”. You can comment them out or remove them entirely. ## Step 2: Configuring nginx | < < < < | < < | < < < < < < | 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 |
nginx plugins. You’re looking for two lines setting the “install” and
“auth” plugins to “nginx”. You can comment them out or remove them
entirely.
## Step 2: Configuring nginx
This is a straightforward extension to [the HTTP-only
configuration](./server/debian/nginx.md#config):
server {
server_name .foo.net;
include local/tls-common;
charset utf-8;
|
| ︙ | ︙ | |||
266 267 268 269 270 271 272 |
server_name .foo.net;
root /var/www/foo.net;
include local/http-certbot-only;
access_log /var/log/nginx/foo.net-http-access.log;
error_log /var/log/nginx/foo.net-http-error.log;
}
| > | | | 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 |
server_name .foo.net;
root /var/www/foo.net;
include local/http-certbot-only;
access_log /var/log/nginx/foo.net-http-access.log;
error_log /var/log/nginx/foo.net-http-error.log;
}
One big difference between this and the HTTP-only case is
that we need two `server { }` blocks: one for HTTPS service, and
one for HTTP-only service.
### HTTP over TLS (HTTPS) Service
The first `server { }` block includes this file, `local/tls-common`:
listen 443 ssl;
|
| ︙ | ︙ | |||
383 384 385 386 387 388 389 |
#rewrite ^(/.well-known/acme-challenge/.*) $1 break;
# Force everything else to HTTPS with a permanent redirect.
#return 301 https://$host$request_uri;
As written above, this configuration does nothing other than to tell
nginx that it’s allowed to serve content via HTTP on port 80 as well.
| < | < | < < < | < < < < | < < < < < < < < < < < < < < < < < | 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 |
#rewrite ^(/.well-known/acme-challenge/.*) $1 break;
# Force everything else to HTTPS with a permanent redirect.
#return 301 https://$host$request_uri;
As written above, this configuration does nothing other than to tell
nginx that it’s allowed to serve content via HTTP on port 80 as well.
We’ll uncomment the `rewrite` and `return` directives below, when we’re
ready to begin testing.
Notice that this configuration is very different from that in the
[HTTP-only nginx on Debian][nod] guide. Most of that guide’s nginx
directives moved up into the TLS `server { }` block, because we
eventually want this site to be as close to HTTPS-only as we can get it.
## Step 3: Dry Run
We want to first request a dry run, because Let’s Encrypt puts some
rather low limits on how often you’re allowed to request an actual
certificate. You want to be sure everything’s working before you do
|
| ︙ | ︙ | |||
539 540 541 542 543 544 545 | "Redirect to HTTPS on the Login page" setting to be enabled. Not only is it unnecessary with this HTTPS redirect at the front-end proxy level, it would actually [cause an infinite redirect loop if enabled](./ssl.wiki#rloop). | | | > | | | < < < < < < < < < < < | 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 |
"Redirect to HTTPS on the Login page" setting to be enabled. Not only
is it unnecessary with this HTTPS redirect at the front-end proxy level,
it would actually [cause an infinite redirect loop if
enabled](./ssl.wiki#rloop).
## Step 6: Re-Point Fossil at Your Repositories
As of Fossil 2.9, the permanent HTTP-to-HTTPS redirect we enabled above
causes Fossil to remember the new URL automatically the first time it’s
redirected to it. All you need to do to switch your syncs to HTTPS is:
$ cd ~/path/to/checkout
$ fossil sync
## Step 7: Renewing Automatically
Now that the configuration is solid, you can renew the LE cert with the
`certbot` command from above without the `--dry-run` flag plus a restart
of nginx:
|
| ︙ | ︙ | |||
586 587 588 589 590 591 592 | ----------- <a id=”evolution”></a> **Document Evolution** | | < < < < | < | < < < | 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 | ----------- <a id=”evolution”></a> **Document Evolution** Large parts of this article have been rewritten several times now due to shifting technology in the TLS and proxying spheres. There is no particularly good reason to expect that this sort of thing will not continue to happen, so we consider this to be a living document. If you do not have commit access on the `fossil-scm.org` repository to update this document as the world changes around it, you can discuss this document [on the forum][fd]. This document’s author keeps an eye on the forum and expects to keep this document updated with ideas that appear in that thread. [acme]: https://en.wikipedia.org/wiki/Automated_Certificate_Management_Environment [cb]: https://certbot.eff.org/ [cbnu]: https://certbot.eff.org/lets-encrypt/ubuntubionic-nginx [fd]: https://fossil-scm.org/forum/forumpost/ae6a4ee157 [hsts]: https://en.wikipedia.org/wiki/HTTP_Strict_Transport_Security [lja]: https://en.wikipedia.org/wiki/Logjam_(computer_security) [mitm]: https://en.wikipedia.org/wiki/Man-in-the-middle_attack [nest]: https://www.nginx.com/blog/http-strict-transport-security-hsts-and-nginx/ [ocsp]: https://en.wikipedia.org/wiki/OCSP_stapling [qslc]: https://github.com/ssllabs/research/wiki/SSL-and-TLS-Deployment-Best-Practices [qslt]: https://www.ssllabs.com/ssltest/ |