@@ -10,14 +10,14 @@
10 10 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
</blockquote>
11 11 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
12 12 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
<h2>But, A Server Can Be Useful</h2>
13 13 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
14 14 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
<blockquote>
15 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Fossil does not require a a server,
15 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Fossil does not require a server,
16 16 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
but a server does make collaboration easier.
17 17 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
A Fossil server also works well as a complete website for a project.
18 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- For example, the complete [https://www.fossil-scm.org/] website, including the
18 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ For example, the [https://www.fossil-scm.org/] website, including the
19 19 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
page you are now reading,
20 20 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
is just a Fossil server displaying the content of the
21 21 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
self-hosting repository for Fossil.
22 22 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
23 23 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
This article is a guide for setting up your own Fossil server.
@@ -26,288 +26,198 @@
26 26 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
information on the underlying CGI technology.
27 27 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
See "[./sync.wiki|The Fossil Sync Protocol]" for information on the
28 28 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
wire protocol used for client/server communication.
29 29 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
</blockquote>
30 30 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
31 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- <h2>Overview</h2>
31 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ <h2>Methods</h2>
32 32 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
33 33 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
<blockquote>
34 34 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
There are basically four ways to set up a Fossil server:
35 35 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
36 36 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
<ol>
37 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- <li>A stand-alone server
38 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- <li>Using inetd, xinetd, or stunnel
39 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- <li>CGI
40 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- <li>SCGI (a.k.a. SimpleCGI)
41 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- </ol>
42 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
43 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Each of these can serve either a single repository, or a directory hierarchy
44 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- containing many repositories with names ending in ".fossil".
45 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- </blockquote>
46 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
47 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
48 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- <h2 id="standalone">Standalone server</h2>
49 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
50 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- <blockquote>
51 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- The easiest way to set up a Fossil server is to use either the
52 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- [/help/server|server] or the [/help/ui|ui] commands:
53 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
54 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- <ul>
55 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- <li><b>fossil server</b> <i>REPOSITORY</i>
56 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- <li><b>fossil ui</b> <i>REPOSITORY</i>
57 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- </ul>
58 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
59 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- The <i>REPOSITORY</i> argument is either the name of the repository file, or
60 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- a directory containing many repositories named <tt>*.fossil</tt>.
61 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Both of these commands start a Fossil server, usually on TCP port 8080, though
62 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- a higher numbered port might also be used if 8080 is already occupied. You can
63 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- access these using URLs of the form <b>http://localhost:8080/</b>, or if
64 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- <i>REPOSITORY</i> is a directory, URLs of the form
65 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- <b>http://localhost:8080/</b><i>repo</i><b>/</b> where <i>repo</i> is the base
66 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- name of the repository file without the ".fossil" suffix.
67 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
68 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- There are several key differences between "ui" and "server":
69 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
70 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- <ul>
71 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- <li>"ui" always binds the server to the loopback IP address
72 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- (127.0.0.1) so that it cannot serve to other machines.
73 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- <li>anyone who visits this URL is treated as the all-powerful Setup
74 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- user, which is why the first difference exists.
75 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- <li>"ui" launches a local web browser pointed at this URL.
76 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- </ul>
77 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
78 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- You can omit the <i>REPOSITORY</i> argument if you run one of the above
79 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- commands from within a Fossil checkout directory to serve that
80 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- repository:
81 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
82 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- <blockquote><pre>
83 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- $ fossil ui # or...
84 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- $ fossil serve
85 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- </pre></blockquote>
86 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
87 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Note that you can abbreviate Fossil sub-commands, as long as they are
88 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- unambiguous. "<tt>server</tt>" can currently be as short as
89 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- "<tt>ser</tt>".
90 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
91 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- As a more complicated example, you can serve a directory containing
92 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- multiple <tt>*.fossil</tt> files like so:
93 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
94 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- <blockquote><pre>
95 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- $ fossil server --port 9000 --repolist /path/to/repo/dir
96 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- </pre></blockquote>
97 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
98 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- There is an [/file/tools/fslsrv | example script] in the Fossil
99 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- distribution that wraps <tt>fossil server</tt> to produce more
100 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- complicated effects. Feel free to take it, study it, and modify it to
101 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- suit your local needs.
102 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
103 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- See the [/help/server|online documentation] for more information on the
104 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- options and arguments you can give to these commands.
105 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- </blockquote>
106 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
107 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
108 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- <h2 id="inetd">Fossil as an inetd/xinetd service</h2>
109 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
110 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- <blockquote>
111 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
112 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- A Fossil server can be launched on-demand by inetd or xinetd using
113 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- the [/help/http|fossil http] command. To launch Fossil from inetd, modify
114 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- your inetd configuration file (typically "/etc/inetd.conf") to contain a
115 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- line something like this:
116 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
117 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- <blockquote>
118 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- <pre>
119 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- 80 stream tcp nowait.1000 root /usr/bin/fossil /usr/bin/fossil http /home/fossil/repo.fossil
120 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- </pre>
121 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- </blockquote>
122 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
123 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- In this example, you are telling "inetd" that when an incoming connection
124 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- appears on TCP port "80", that it should launch the binary "/usr/bin/fossil"
125 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- program with the arguments shown.
126 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Obviously you will
127 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- need to modify the pathnames for your particular setup.
128 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- The final argument is either the name of the fossil repository to be served,
129 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- or a directory containing multiple repositories.
130 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
131 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
132 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- If you use a non-standard TCP port on
133 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- systems where the port-specification must be a symbolic name and cannot be
134 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- numeric, add the desired name and port to /etc/services. For example, if
135 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- you want your Fossil server running on TCP port 12345 instead of 80, you
136 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- will need to add:
137 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
138 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- <blockquote>
139 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- <pre>
140 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- fossil 12345/tcp #fossil server
141 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- </pre>
142 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- </blockquote>
143 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
144 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- and use the symbolic name ('fossil' in this example) instead of the numeral ('12345')
145 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- in inetd.conf. For details, see the relevant section in your system's documentation, e.g.
146 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- the [https://www.freebsd.org/doc/en/books/handbook/network-inetd.html|FreeBSD Handbook] in
147 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- case you use FreeBSD.
148 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
149 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- If your system is running xinetd, then the configuration is likely to be
150 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- in the file "/etc/xinetd.conf" or in a subfile of "/etc/xinetd.d".
151 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- An xinetd configuration file will appear like this:
152 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
153 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- <blockquote>
154 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- <pre>
155 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- service http
156 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- {
157 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- port = 80
158 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- socket_type = stream
159 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- wait = no
160 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- user = root
161 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- server = /usr/bin/fossil
162 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- server_args = http /home/fossil/repos/
163 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
164 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- </pre>
165 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- </blockquote>
166 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
167 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- The xinetd example above has Fossil configured to serve multiple
168 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- repositories, contained under the "/home/fossil/repos/" directory.
169 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
170 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- In both cases notice that Fossil was launched as root. This is not required,
171 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- but if it is done, then Fossil will automatically put itself into a chroot
172 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- jail for the user who owns the fossil repository before reading any information
173 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- off of the wire.
174 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
175 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Inetd or xinetd must be enabled, and must be (re)started whenever their configuration
176 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- changes - consult your system's documentation for details.
177 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
178 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Using inetd or xinetd is a more complex setup
179 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- than the "standalone" server, but it has the
180 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- advantage of only using system resources when an actual connection is
181 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- attempted. If no-one ever connects to that port, a Fossil server will
182 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- not (automatically) run. It has the disadvantage of requiring "root" access
183 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- and therefore may not normally be available to lower-priced "shared" servers
184 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- on the Internet.
185 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
186 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- The configuration for <tt>stunnel</tt> is similar, but it is covered in
187 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- [./ssl.wiki#stunnel|a separate document].
188 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- </blockquote>
189 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
190 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- <h2 id="cgi">Fossil as CGI</h2>
191 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
192 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- <blockquote>
193 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
194 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- A Fossil server can also be run from an ordinary web server as a CGI program.
195 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- This feature allows Fossil to be seamlessly integrated into a larger website.
196 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- CGI is how the [./selfhost.wiki | self-hosting fossil repositories] are
197 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- implemented.
198 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
199 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- To run Fossil as CGI, create a CGI script (here called "repo") in the CGI directory
200 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- of your web server and having content like this:
201 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
202 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- <blockquote><pre>
203 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #!/usr/bin/fossil
204 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- repository: /home/fossil/repo.fossil
205 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- </pre></blockquote>
206 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
207 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- As always, adjust your paths appropriately.
208 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- It may be necessary to set permissions properly, or to modify an ".htaccess"
209 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- file or make other server-specific changes. Consult the documentation
210 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- for your particular web server. In particular, the following permissions are
211 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- <em>normally</em> required (but, again, may be different for a particular
212 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- configuration):
213 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
214 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- <ul>
215 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- <li>The Fossil binary (/usr/bin/fossil in the example above)
216 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- must be readable/executable, and ALL directories leading up to it
217 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- must be readable by the process which executes the CGI.</li>
218 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- <li>ALL directories leading to the CGI script must also be readable and the CGI
219 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- script itself must be executable for the user under which it will run (which often differs
220 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- from the one running the web server - consult your site's documentation or administrator).</li>
221 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- <li>The repository file AND the directory containing it must be writable by the same account
222 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- which executes the Fossil binary (again, this might differ from the WWW user). The directory
223 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- needs to be writable so that SQLite can write its journal files.</li>
224 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- <li>Fossil must be able to create temporary files, the default directory
225 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- for which depends on the OS. When the CGI process is operating within
226 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- a chroot, ensure that this directory exists and is readable/writeable
227 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- by the user who executes the Fossil binary.</li>
228 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- </ul>
229 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
230 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Once the script is set up correctly, and assuming your server is also set
231 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- correctly, you should be able to access your repository with a URL like:
232 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- <b>http://mydomain.org/cgi-bin/repo</b> (assuming the "repo" script is
233 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- accessible under "cgi-bin", which would be a typical deployment on Apache
234 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- for instance).
235 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
236 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- To serve multiple repositories from a directory using CGI, use the "directory:"
237 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- tag in the CGI script rather than "repository:". You might also want to add
238 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- a "notfound:" tag to tell where to redirect if the particular repository requested
239 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- by the URL is not found:
240 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
241 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- <blockquote><pre>
242 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #!/usr/bin/fossil
243 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- directory: /home/fossil/repos
244 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- notfound: http://url-to-go-to-if-repo-not-found/
245 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- </pre></blockquote>
246 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
247 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Once deployed, a URL like: <b>http://mydomain.org/cgi-bin/repo/XYZ</b>
248 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- will serve up the repository "/home/fossil/repos/XYZ.fossil" (if it exists).
249 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
250 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Additional options available to the CGI script are
251 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- [./cgi.wiki|documented separately].
252 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
253 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Note that Fossil itself can be launched as CGI, as described here. But
254 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Fossil can also launch [./serverext.wiki|sub-CGIs to implement server extensions].
255 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Do not confuse these two concepts. Note also that the
256 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- [./serverext.wiki|sub-CGI mechanism] works regardless of how the main
257 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Fossil server is launched.
258 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
259 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- <h2 id="scgi">Fossil as SCGI</h2>
260 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- <blockquote>
261 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
262 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- The [/help/server|fossil server] command, described above as a way of
263 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- starting a stand-alone web server, can also be used for SCGI. Simply add
264 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- the --scgi command-line option and the stand-alone server will interpret
265 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- and respond to the SimpleCGI or SCGI protocol rather than raw HTTP. This can
266 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- be used in combination with a web server (such as [http://nginx.org|Nginx])
267 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- that does not support CGI. A typical Nginx configuration to support SCGI
268 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- with Fossil would look something like this:
269 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
270 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- <blockquote><pre>
271 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- location /demo_project/ {
272 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- include scgi_params;
273 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- scgi_pass localhost:9000;
274 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- scgi_param SCRIPT_NAME "/demo_project";
275 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- scgi_param HTTPS "on";
276 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
277 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- </pre></blockquote>
278 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
279 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Note that Fossil requires the SCRIPT_NAME variable
280 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- in order to function properly, but Nginx does not provide this
281 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- variable by default,
282 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- so it is necessary to provide the SCRIPT_NAME parameter in the configuration.
283 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Failure to do this will cause Fossil to return an error.
284 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
285 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- All of the features of the stand-alone server mode described above,
286 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- such as the ability to serve a directory full of Fossil repositories
287 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- rather than just a single repository, work the same way in SCGI mode.
288 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
289 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- For security, it is probably a good idea to add the --localhost option
290 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- to the [/help/server|fossil server] command to prevent Fossil from accepting
291 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- off-site connections. One might also want to specify the listening TCP port
292 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- number, rather than letting Fossil choose one for itself, just to avoid
293 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ambiguity. A typical command to start a Fossil SCGI server
294 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- would be something like this:
295 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
296 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- <blockquote><pre>
297 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- fossil server $REPOSITORY --scgi --localhost --port 9000
298 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- </pre></blockquote>
299 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- </blockquote>
37 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ <li>Socket activation: inetd, xinetd, stunnel...
38 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ <li>Stand-alone HTTP server
39 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ <li>SCGI
40 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ <li>CGI
41 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ </ol>
42 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
43 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ The HTTP and SCGI options also allow for various sorts of reverse
44 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ proxying: Apache, nginx, HAProxy, stunnel (proxy mode), IIS...
45 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
46 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Regardless of the method you choose, all can serve either a single repository
47 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ or a directory hierarchy containing many repositories with names ending in ".fossil".
48 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
49 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ We've broken the configuration for each method out into a series of
50 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sub-articles, some of which are OS-specific:
51 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ </blockquote>
52 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
53 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ <table style="margin-left: 6em;">
54 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ <tr>
55 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ <th> </th>
56 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ <th colspan="10" style="background-color: #efefef">Fossil Front-End Program</th>
57 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ </tr>
58 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
59 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ <tr>
60 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ <th style="background-color: #e8e8e8; padding: 6px; text-align: right">Host OS</th>
61 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ <th>none</th>
62 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ <th>inetd</th>
63 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ <th>xinetd</th>
64 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ <th>stunnel</th>
65 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ <th>CGI</th>
66 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ <th>SCGI</th>
67 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ <th>nginx</th>
68 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ <th>Apache</th>
69 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ <th>IIS</th>
70 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ <th>OS service</th>
71 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ </tr>
72 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
73 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ <tr>
74 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ <th style="background-color: #e8e8e8; padding: 6px; text-align: right">Any</th>
75 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ <td style="text-align: center"><a href="./server/any/none.md">✅</a></td>
76 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ <td style="text-align: center"><a href="./server/any/inetd.md">✅</a></td>
77 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ <td style="text-align: center"><a href="./server/any/xinetd.md">✅</a></td>
78 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ <td style="text-align: center"><a href="./ssl.wiki#stunnel">✅</a></td>
79 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ <td style="text-align: center"><a href="./server/any/cgi.md">✅</a></td>
80 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ <td style="text-align: center"><a href="./server/any/scgi.md">✅</a></td>
81 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ <td style="text-align: center">❌</td>
82 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ <td style="text-align: center">❌</td>
83 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ <td style="text-align: center">❌</td>
84 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ <td style="text-align: center">❌</td>
85 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ </tr>
86 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
87 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ <tr>
88 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ <th style="background-color: #e8e8e8; padding: 6px; text-align: right">Debian/Ubuntu</th>
89 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ <td style="text-align: center"><a href="./server/any/none.md">✅</a></td>
90 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ <td style="text-align: center"><a href="./server/any/inetd.md">✅</a></td>
91 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ <td style="text-align: center"><a href="./server/any/xinetd.md">✅</a></td>
92 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ <td style="text-align: center"><a href="./ssl.wiki#stunnel">✅</a></td>
93 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ <td style="text-align: center"><a href="./server/any/cgi.md">✅</a></td>
94 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ <td style="text-align: center"><a href="./server/any/scgi.md">✅</a></td>
95 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ <td style="text-align: center"><a href="./server/debian/nginx.md">✅</a></td>
96 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ <td style="text-align: center">❌</td>
97 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ <td style="text-align: center">❌</td>
98 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ <td style="text-align: center">❌</td>
99 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ </tr>
100 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
101 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ <tr>
102 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ <th style="background-color: #e8e8e8; padding: 6px; text-align: right">Windows</th>
103 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ <td style="text-align: center">❌</td>
104 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ <td style="text-align: center">❌</td>
105 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ <td style="text-align: center">❌</td>
106 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ <td style="text-align: center"><a href="./server/windows/stunnel.md">✅</a></td>
107 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ <td style="text-align: center">❌</td>
108 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ <td style="text-align: center">❌</td>
109 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ <td style="text-align: center">❌</td>
110 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ <td style="text-align: center">❌</td>
111 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ <td style="text-align: center">❌</td>
112 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ <td style="text-align: center"><a href="./server/windows/service.md">✅</a></td>
113 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ </tr>
114 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ </table>
115 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
116 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ <blockquote>
117 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Where there is a check mark in the "Any" row, the method for that is
118 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ generic enough that it works across OSes that Fossil is known to work
119 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ on. The check marks below that usually just link to this generic
120 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ documentation.
121 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
122 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ There are several widely-deployed socket activation schemes besides the
123 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ <tt>inetd</tt>, <tt>xinetd</tt>, and <tt>stunnel</tt> schemes with
124 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ documents linked above: Apple’s <tt>launchd</tt>, Linux’s
125 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ <tt>systemd</tt>, Solaris’ SMF, etc. We would welcome [./contribute.wiki
126 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ | contributions] to cover these as well. We also welcome contributions
127 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ to fill gaps (❌) in the table above.
128 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ </blockquote>
129 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
130 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
131 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ <h2 id="standalone">Standalone HTTP server</h2>
132 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
133 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ <blockquote>
134 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ This is the easiest way to set up a Fossil server. It's covered in
135 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ [./server/any/none.md | a separate article].
136 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ </blockquote>
137 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
138 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
139 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ <h2 id="inetd">Serving via inetd</h2>
140 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
141 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ <blockquote>
142 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ See [./server/any/inetd.md | this article].
143 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ </blockquote>
144 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
145 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
146 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ <h2 id="cgi">Serving via CGI</h2>
147 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
148 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ <blockquote>
149 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ See [./server/any/cgi.md | this article].
150 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ </blockquote>
151 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
152 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
153 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ <h2 id="scgi">Serving via SCGI</h2>
154 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
155 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ <blockquote>
156 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ See [./server/any/scgi.md | this article].
157 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ </blockquote>
158 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
159 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
160 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ <h2 id="ext">CGI Server Extensions</h2>
161 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
162 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ <blockquote>
163 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ In addition to serving Fossil repositories via CGI, Fossil can
164 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ itself [./serverext.wiki | launch other programs via CGI] to
165 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ implement server extensions. Do not confuse these two concepts. This
166 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ extension mechanism works regardless of the method above you choose
167 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ to serve your Fossil repository.
168 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ </blockquote>
169 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
300 170 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
301 171 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
<h2 id="tls">Securing a repository with TLS</h2>
302 172 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
303 173 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
<blockquote>
304 174 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Fossil's built-in HTTP server (e.g. "fossil server") does not support
305 175 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
TLS, but there are multiple ways to protect your Fossil server with
306 176 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
TLS. All of this is covered in a separate document, <a
307 177 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
href="./ssl.wiki">Using TLS-Encrypted Communications with Fossil</a>.
308 178 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
</blockquote>
179 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
180 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
181 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ <h2 id="chroot">The Fossil Chroot Jail</h2>
182 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
183 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ <blockquote>
184 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ If you run Fossil as root in any mode that serves data on the
185 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ network, and you're running it on Unix or a compatible OS, Fossil
186 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ will drop itself into a [https://en.wikipedia.org/wiki/Chroot |
187 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ chroot jail] shortly after starting up. It will drop its root
188 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ privileges once it's done everything that requires root access; most
189 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ commonly, you run Fossil as root to allow it to bind to TCP port 80
190 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for HTTP service, since normal users are restricted to ports 1024
191 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ and up on OSes where this behavior occurs.
192 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
193 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Fossil uses the owner of the Fossil repository file as its new user
194 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ID when dropping root privileges.
195 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
196 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ When this happens, Fossil needs to have all of its dependencies
197 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ inside the chroot jail. There are several things you typically need
198 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ in order to make things work properly:
199 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
200 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ <ul>
201 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ <li>the repository file(s)
202 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
203 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ <li><tt>/dev/null</tt> — create it with <tt>mknod(8)</tt>
204 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ inside the jail directory
205 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
206 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ <li><tt>/dev/urandom</tt> — ditto
207 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
208 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ <li>any shared libraries your <tt>fossil</tt> binary is linked
209 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ to, such as <tt>/lib/libssl.so</tt>; consider building Fossil as a
210 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static binary to avoid this
211 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ </ul>
212 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ </blockquote>
213 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
214 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ <blockquote>
215 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Fossil does all of this in order to protect the host OS. There is
216 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ no way to bypass it, on purpose.
217 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ </blockquote>
218 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
309 219 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
310 220 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
<h2 id="loadmgmt">Managing Server Load</h2>
311 221 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
312 222 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
<blockquote>
313 223 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
A Fossil server is very efficient and normally presents a very light
314 224 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
315 225 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
A DDED www/server/any/cgi.md
316 226 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
A DDED www/server/any/inetd.md
317 227 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
A DDED www/server/any/none.md
318 228 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
A DDED www/server/any/scgi.md
319 229 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
A DDED www/server/any/xinetd.md