1) download http://tahoe-lafs.org/source/tahoe-lafs/releases/allmydata-tahoe-1.8.0.zip, unzip it in your unprivileged user home, and run: python setup.py build ( if you are behind a proxy: export http_proxy=http://proxy:port ) ( to build under opensolaris / solaris11express: http_proxy=http://proxy:port pkg install gcc-3 http_proxy=http://proxy:port pkg install python-twisted-26 http_proxy=http://proxy:port pkg install m2crypto http_proxy=http://proxy:port pkg install header-math http_proxy=http://proxy:port pkg install gmp then manually download https://tahoe-lafs.org/source/tahoe-lafs/deps/tahoe-lafs-dep-sdists/pycrypto-2.3.tar.gz and untar it in some dir modify the src/_fastmath.c file as this: ------------------------------------------------ $ diff src/_fastmath.c.orig src/_fastmath.c 34c34 < #include --- > #include ------------------------------------------------ then do: python setup.py build python setup.py install and return to the tahoe dir to build it! ) to check if all went well: bin/tahoe --version 2) create the introducer and run it (do this just on the 1st node): cd; mkdir .tahoe-introducer; cd .tahoe-introducer /home/user/allmydata-tahoe-1.8.0/bin/tahoe create-introducer . vi tahoe.cfg and set nickname = introducer /home/user/allmydata-tahoe-1.8.0/bin/tahoe start . 3) create the nodes and run them (do this on all the machines of the cluster): cd /home/user/allmydata-tahoe-1.8.0/bin/tahoe create-node vi .tahoe/tahoe.cfg and set nickname = tahoe-lafs01 e introducer.furl = the big string that you find in the file .tahoe-introducer/introducer.furl /home/user/allmydata-tahoe-1.8.0/bin/tahoe start 4) to remotely check the status of the tahoe storage grid, tunnelize the 3456 port that's locally available on a node and connect to it with a web browser: ssh -L 3456:127.0.0.1:3456 user@tahoe-lafs01 then on your computer open a web browser and point it at http://127.0.0.1:3456 and you should see the status page 5) I've tested a simple cluster cloning and configuring 10 small vbox openbsd vms, and using this script to control them: #!/bin/bash SERVERS="192.168.56.31 192.168.56.32 192.168.56.33 192.168.56.34 192.168.56.35 192.168.56.36 192.168.56.37 192.168.56.38 192.168.56.39 192.168.56.40" # SSH User name USR="sickness" # connect each host and execute the command for host in $SERVERS do ssh $USR@$host $1 done 6) to check the cluster: $ ./cssh.sh "uname -a; uptime" OpenBSD tahoe-lafs01.sick-net 4.7 GENERIC#1 i386 2:43AM up 11:32, 1 user, load averages: 0.11, 0.09, 0.08 OpenBSD tahoe-lafs02.sick-net 4.7 GENERIC#1 i386 2:42AM up 11:30, 0 users, load averages: 0.23, 0.11, 0.09 OpenBSD tahoe-lafs03.sick-net 4.7 GENERIC#1 i386 2:43AM up 11:31, 0 users, load averages: 0.09, 0.09, 0.08 OpenBSD tahoe-lafs04.sick-net 4.7 GENERIC#1 i386 2:43AM up 11:31, 0 users, load averages: 0.06, 0.08, 0.08 OpenBSD tahoe-lafs05.sick-net 4.7 GENERIC#1 i386 2:43AM up 11:32, 0 users, load averages: 0.14, 0.10, 0.08 OpenBSD tahoe-lafs06.sick-net 4.7 GENERIC#1 i386 2:44AM up 11:33, 0 users, load averages: 0.13, 0.09, 0.08 OpenBSD tahoe-lafs07.sick-net 4.7 GENERIC#1 i386 2:44AM up 11:33, 0 users, load averages: 0.13, 0.10, 0.08 OpenBSD tahoe-lafs08.sick-net 4.7 GENERIC#1 i386 2:45AM up 11:34, 0 users, load averages: 0.09, 0.09, 0.08 OpenBSD tahoe-lafs09.sick-net 4.7 GENERIC#1 i386 2:46AM up 11:34, 0 users, load averages: 0.09, 0.09, 0.08 OpenBSD tahoe-lafs10.sick-net 4.7 GENERIC#1 i386 2:47AM up 11:35, 0 users, load averages: 0.07, 0.08, 0.08 $ ./cssh.sh "allmydata-tahoe-1.8.0/bin/tahoe --version" allmydata-tahoe: 1.8.0, foolscap: 0.5.1, pycryptopp: 0.5.25, zfec: 1.4.7, Twisted: 10.1.0, Nevow: 0.10.0, zope.interface: 3.6.1, python: 2.6.3, platform: OpenBSD-4.7-i386-Pentium-R-_Dual-Core_CPU_E6300_@_2.80GHz_-GenuineIntel-_686-class-32bit-ELF, sqlite: 3.6.16.1, simplejson: 2.1.1, argparse: 1.1, pycrypto: 2.3, pyOpenSSL: 0.10, pyutil: 1.7.12, zbase32: 1.1.2, setuptools: 0.6c16dev2, pyasn1: 0.0.11a, pysqlite: 2.4.1 allmydata-tahoe: 1.8.0, foolscap: 0.5.1, pycryptopp: 0.5.25, zfec: 1.4.7, Twisted: 10.1.0, Nevow: 0.10.0, zope.interface: 3.6.1, python: 2.6.3, platform: OpenBSD-4.7-i386-Pentium-R-_Dual-Core_CPU_E6300_@_2.80GHz_-GenuineIntel-_686-class-32bit-ELF, sqlite: 3.6.16.1, simplejson: 2.1.1, argparse: 1.1, pycrypto: 2.3, pyOpenSSL: 0.10, pyutil: 1.7.12, zbase32: 1.1.2, setuptools: 0.6c16dev2, pyasn1: 0.0.11a, pysqlite: 2.4.1 allmydata-tahoe: 1.8.0, foolscap: 0.5.1, pycryptopp: 0.5.25, zfec: 1.4.7, Twisted: 10.1.0, Nevow: 0.10.0, zope.interface: 3.6.1, python: 2.6.3, platform: OpenBSD-4.7-i386-Pentium-R-_Dual-Core_CPU_E6300_@_2.80GHz_-GenuineIntel-_686-class-32bit-ELF, sqlite: 3.6.16.1, simplejson: 2.1.1, argparse: 1.1, pycrypto: 2.3, pyOpenSSL: 0.10, pyutil: 1.7.12, zbase32: 1.1.2, setuptools: 0.6c16dev2, pyasn1: 0.0.11a, pysqlite: 2.4.1 allmydata-tahoe: 1.8.0, foolscap: 0.5.1, pycryptopp: 0.5.25, zfec: 1.4.7, Twisted: 10.1.0, Nevow: 0.10.0, zope.interface: 3.6.1, python: 2.6.3, platform: OpenBSD-4.7-i386-Pentium-R-_Dual-Core_CPU_E6300_@_2.80GHz_-GenuineIntel-_686-class-32bit-ELF, sqlite: 3.6.16.1, simplejson: 2.1.1, argparse: 1.1, pycrypto: 2.3, pyOpenSSL: 0.10, pyutil: 1.7.12, zbase32: 1.1.2, setuptools: 0.6c16dev2, pyasn1: 0.0.11a, pysqlite: 2.4.1 allmydata-tahoe: 1.8.0, foolscap: 0.5.1, pycryptopp: 0.5.25, zfec: 1.4.7, Twisted: 10.1.0, Nevow: 0.10.0, zope.interface: 3.6.1, python: 2.6.3, platform: OpenBSD-4.7-i386-Pentium-R-_Dual-Core_CPU_E6300_@_2.80GHz_-GenuineIntel-_686-class-32bit-ELF, sqlite: 3.6.16.1, simplejson: 2.1.1, argparse: 1.1, pycrypto: 2.3, pyOpenSSL: 0.10, pyutil: 1.7.12, zbase32: 1.1.2, setuptools: 0.6c16dev2, pyasn1: 0.0.11a, pysqlite: 2.4.1 allmydata-tahoe: 1.8.0, foolscap: 0.5.1, pycryptopp: 0.5.25, zfec: 1.4.7, Twisted: 10.1.0, Nevow: 0.10.0, zope.interface: 3.6.1, python: 2.6.3, platform: OpenBSD-4.7-i386-Pentium-R-_Dual-Core_CPU_E6300_@_2.80GHz_-GenuineIntel-_686-class-32bit-ELF, sqlite: 3.6.16.1, simplejson: 2.1.1, argparse: 1.1, pycrypto: 2.3, pyOpenSSL: 0.10, pyutil: 1.7.12, zbase32: 1.1.2, setuptools: 0.6c16dev2, pyasn1: 0.0.11a, pysqlite: 2.4.1 allmydata-tahoe: 1.8.0, foolscap: 0.5.1, pycryptopp: 0.5.25, zfec: 1.4.7, Twisted: 10.1.0, Nevow: 0.10.0, zope.interface: 3.6.1, python: 2.6.3, platform: OpenBSD-4.7-i386-Pentium-R-_Dual-Core_CPU_E6300_@_2.80GHz_-GenuineIntel-_686-class-32bit-ELF, sqlite: 3.6.16.1, simplejson: 2.1.1, argparse: 1.1, pycrypto: 2.3, pyOpenSSL: 0.10, pyutil: 1.7.12, zbase32: 1.1.2, setuptools: 0.6c16dev2, pyasn1: 0.0.11a, pysqlite: 2.4.1 allmydata-tahoe: 1.8.0, foolscap: 0.5.1, pycryptopp: 0.5.25, zfec: 1.4.7, Twisted: 10.1.0, Nevow: 0.10.0, zope.interface: 3.6.1, python: 2.6.3, platform: OpenBSD-4.7-i386-Pentium-R-_Dual-Core_CPU_E6300_@_2.80GHz_-GenuineIntel-_686-class-32bit-ELF, sqlite: 3.6.16.1, simplejson: 2.1.1, argparse: 1.1, pycrypto: 2.3, pyOpenSSL: 0.10, pyutil: 1.7.12, zbase32: 1.1.2, setuptools: 0.6c16dev2, pyasn1: 0.0.11a, pysqlite: 2.4.1 allmydata-tahoe: 1.8.0, foolscap: 0.5.1, pycryptopp: 0.5.25, zfec: 1.4.7, Twisted: 10.1.0, Nevow: 0.10.0, zope.interface: 3.6.1, python: 2.6.3, platform: OpenBSD-4.7-i386-Pentium-R-_Dual-Core_CPU_E6300_@_2.80GHz_-GenuineIntel-_686-class-32bit-ELF, sqlite: 3.6.16.1, simplejson: 2.1.1, argparse: 1.1, pycrypto: 2.3, pyOpenSSL: 0.10, pyutil: 1.7.12, zbase32: 1.1.2, setuptools: 0.6c16dev2, pyasn1: 0.0.11a, pysqlite: 2.4.1 allmydata-tahoe: 1.8.0, foolscap: 0.5.1, pycryptopp: 0.5.25, zfec: 1.4.7, Twisted: 10.1.0, Nevow: 0.10.0, zope.interface: 3.6.1, python: 2.6.3, platform: OpenBSD-4.7-i386-Pentium-R-_Dual-Core_CPU_E6300_@_2.80GHz_-GenuineIntel-_686-class-32bit-ELF, sqlite: 3.6.16.1, simplejson: 2.1.1, argparse: 1.1, pycrypto: 2.3, pyOpenSSL: 0.10, pyutil: 1.7.12, zbase32: 1.1.2, setuptools: 0.6c16dev2, pyasn1: 0.0.11a, pysqlite: 2.4.1 7) to change a string in the config file and restart all the nodes: ./cssh.sh "perl -pi -e 's/\#shares.happy\ =\ 7/shares.happy\ =\ 10/g' .tahoe/tahoe.cfg" ./cssh.sh "allmydata-tahoe-1.8.0/bin/tahoe restart" 8) to disable the web service of a node, leave this option blank in tahoe.cfg: web.port = 9) to change the ports because you're behind a firewall: The value is a comma-separated string of host:port location hints, like this: 123.45.67.89:8098,tahoe.example.com:8098,127.0.0.1:8098 A few examples: Emulate default behavior, assuming your host has IP address 123.45.67.89 and the kernel-allocated port number was 8098: tub.port = 8098 tub.location = 123.45.67.89:8098,127.0.0.1:8098 Use a DNS name so you can change the IP address more easily: tub.port = 8098 tub.location = tahoe.example.com:8098 Run a node behind a firewall (which has an external IP address) that has been configured to forward port 7912 to our internal node's port 8098: tub.port = 8098 tub.location = external-firewall.example.com:7912 same is for introducer.port 10) autocheck/repair example from http://tahoe-lafs.org/pipermail/tahoe-dev/2009-October/003012.html : This is a script I wrote I call "tahoe-repair-all": ------------------------------------------------------------------------ #!/bin/sh for item in `tahoe list-aliases | cut -f 1 -d :`; do echo '*** '"$item" tahoe deep-check --repair --add-lease $item: | perl -pe 's/^/\t/' echo done ------------------------------------------------------------------------ This is my crontab entry for it: ------------------------------------------------------------------------ 30 6 * * * . ~/.bashrc; tahoe-repair-all ------------------------------------------------------------------------ This is the email it sent me this morning: ------------------------------------------------------------------------ From: kpreid at 216-171-189-244.northland.net Subject: Cron . ~/.bashrc; tahoe-repair-all Date: October 17, 2009 6:30:06 EDT To: kpreid at 216-171-189-244.northland.net *** family done: 1 objects checked pre-repair: 1 healthy, 0 unhealthy 0 repairs attempted, 0 successful, 0 failed post-repair: 1 healthy, 0 unhealthy *** publish done: 5 objects checked pre-repair: 5 healthy, 0 unhealthy 0 repairs attempted, 0 successful, 0 failed post-repair: 5 healthy, 0 unhealthy *** tahoe-illustration done: 5 objects checked pre-repair: 5 healthy, 0 unhealthy 0 repairs attempted, 0 successful, 0 failed post-repair: 5 healthy, 0 unhealthy ------------------------------------------------------------------------ 11) to recursively check all the files and subdirs inside a directory: allmydata-tahoe-1.8.0/bin/tahoe deep-check --repair --add-lease test: 12) to have a directory alias in your client/node add a line like this: fun: URI:DIR2:ovjy4yhylqlfoqg2vcze36dhde:4d4f47qko2xm5g7osgo2yyidi5m4muyo2vjjy53q4vjju2u55mfa to the NODEDIR/private/aliases file 13) Windows client (to make a windows introducer and/or storage node do the same but modify the cfg file accordingly): A. Download and install Python 2.6.6 from http://www.python.org/ftp/python/2.6.6/python-2.6.6.msi (or for 64-bit Windows, http://www.python.org/ftp/python/2.6.6/python-2.6.6.amd64.msi ). B. Download and install latest pywin32 for the installed python version from here: http://sourceforge.net/projects/pywin32/files/pywin32/ C. Download the latest Tahoe-LAFS release from http://tahoe-lafs.org/source/tahoe-lafs/releases/. Unpack it in a convenient place, such as C:\tahoe-lafs. D. Open a command prompt and cd to the top of the Tahoe-LAFS tree (e.g. cd \tahoe-lafs). E. If needed "export http_proxy=http://proxyip:proxyport" and then "echo %http_proxy%" F. Run "C:\Python26\python setup.py build". Wait a bit until it stops working. Note that you need a working network connection because it will download various dependencies. Ignore any warnings. G. Run "C:\tahoe-lafs\bin\tahoe create-client C:\tahoelafsclient". Choose an appropriate base directory. H. Run "notepad C:\tahoelafsclient\tahoe.cfg" to edit your config file. After "introducer.furl = ", paste in the FURL of the introducer for the grid you want to connect to. See TestGrid to get the FURL of the introducer for the testgrid. Also set a nickname. I. Run "C:\tahoe-lafs\bin\tahoe start C:\tahoelafsclient". Your node will start running and connect to the grid. The Windows firewall may ask whether or not to allow Python to make network connections. Say yes. To check if it's running open a browser and go to http://127.0.0.1:3456 . J. TO RUN AS A WINDOWS SERVICE: Create C:\tahoelafsclient\tahoelafsclient.bat with inside just this line: "C:\Python26\python.exe" "c:\tahoe-lafs\bin\tahoe.pyscript" start C:\tahoelafsclient K. For win2k/xp: copy inetsrv.exe and srvany.exe from the win2k resourcekit in C:\tahoelafsclient L. Run: C:\tahoelafsclient\instsrv.exe tahoelafsclient C:\tahoelafsclient\srvany.exe M. Go to services.msc and make sure tahoelafsclient is listed as a service. Also make sure the Startup Type is Automatic. N. run regedt32 and go to the HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\tahoelafs entry add new key called "Parameters" with inside a REG_SZ (string) called "Application" with value "C:\tahoelafsclient\tahoelafsclient.bat" inside "Parameters" add another REG_SZ (string) called "AppDir" with value "C:\tahoelafsclient" test starting e stopping from services.msc P.S.: I still have to figure out how to stop the service properly =) P.P.S: to uninstall the service run: C:\tahoelafsclient\instsrv.exe tahoelafsclient REMOVE 14) general reference to install in win32 as a service: Running a Python script as a Windows service This is a message I posted to comp.lang.py regarding ways to run a regular Python script as a Windows service. I will assume you want to turn a script called myscript.py into a service. 1. Install Win2K Resource Kit (or copy the 2 binaries instsrv.exe and srvany.exe). 2. Run instsrv to install srvany.exe as a service with the name myscript: C:\Program Files\Resource Kit\instsrv myscript "C:\Program Files\Resource Kit\srvany.exe" 3. Go to Computer Management->Services and make sure myscript is listed as a service. Also make sure the Startup Type is Automatic. 4. Create a myscript.bat file with the following contents in e.g. C:\pyscripts: C:\Python23\python C:\pyscripts\myscript.py (replace Python23 with your Python version) 5. Create new registry entries for the new service. run regedt32 and go to the HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\myscript entry add new key (Edit->Add Key) called Parameters add new entry for Parameters key (Edit->Add Value) to set the Application name Name should be Application Type should be REG_SZ Value should be path to myscript.bat, i.e. C:\pyscripts\myscript.bat add new entry for Parameters key (Edit->Add Value) to set the working directory Name should be AppDir Type should be REG_SZ Value should be path to pyscripts directory, i.e. C:\pyscripts 6. Test starting and stopping the myscript service in Computer Management->Services. (took from http://agiletesting.blogspot.com/2005/09/running-python-script-as-windows.html) 15) to enable the cutoff date GC configure your storage server like this: expire.enabled = true expire.mode = cutoff-date expire.cutoff_date = 2011-11-03 in this way all the shares which were not renewed before that date will be deleted