WebFactionSoftwareDocumentation_prodyut

79
WebFaction Software Documentation Release Swarma Limited - WebFaction is a service of Swarma Limited April 09, 2010

Transcript of WebFactionSoftwareDocumentation_prodyut

Page 1: WebFactionSoftwareDocumentation_prodyut

WebFaction Software DocumentationRelease

Swarma Limited - WebFaction is a service of SwarmaLimited

April 09, 2010

Page 2: WebFactionSoftwareDocumentation_prodyut
Page 3: WebFactionSoftwareDocumentation_prodyut

CONTENTS

1 General Topics 31.1 Accessing Logs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31.2 Monitoring Memory Usage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41.3 Setting File Permissions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61.4 Scheduling Tasks with Cron . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71.5 Troubleshooting . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8

2 Bazaar 112.1 Installing Bazaar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112.2 Publishing Bazaar Repositories with Loggerhead . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11

3 Custom Applications 153.1 Creating a Custom Application . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 153.2 Automatically Restarting a Custom Application . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15

4 Django 174.1 Getting Started Screencast . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 174.2 Getting Started with Django . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 174.3 Restarting a Django Application . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 214.4 Upgrading your Django Libraries . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 214.5 Using the Latest Django Trunk . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 224.6 Troubleshooting . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23

5 Drupal 255.1 Sending Email from Drupal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25

6 Git 276.1 Installing Git . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 276.2 Pushing to Git Repositories over SSH . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 276.3 Publishing Git Repositories to the Web with Gitweb . . . . . . . . . . . . . . . . . . . . . . . . . . 28

7 Joomla 317.1 Sending Email . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31

8 Memcached 338.1 Setting Up Memcached . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 338.2 Shutting Down Memcached . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33

9 Mercurial 359.1 Installing Mercurial . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35

i

Page 4: WebFactionSoftwareDocumentation_prodyut

9.2 Publishing Mercurial Repositories to the Web . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35

10 MongoDB 4110.1 Installing MongoDB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41

11 Perl 4311.1 Installing CPAN Modules . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43

12 PHP 4712.1 Sending Mail from a PHP Script . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47

13 Plone 4913.1 Configuring Plone to Send Email . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4913.2 Creating an Emergency Admin User . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4913.3 Installing a Python Package . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50

14 Python 5114.1 Installing Python Packages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5114.2 Troubleshooting . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53

15 Ruby on Rails 5715.1 Installing Ruby on Rails . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5715.2 Installing Gems . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5815.3 Deploying a Ruby on Rails Application . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5815.4 Using a Database with a Ruby on Rails Application . . . . . . . . . . . . . . . . . . . . . . . . . . 58

16 Redmine 6116.1 Installing Redmine . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6116.2 Configuring Redmine to Send Email . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62

17 Static Files, CGI Scripts, and PHP Pages 6517.1 Static-only . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6517.2 Static/CGI/PHP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6517.3 Troubleshooting . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69

18 Subversion 7118.1 Send Email Notifications with a Post-Commit Hook . . . . . . . . . . . . . . . . . . . . . . . . . . 7118.2 Reusing Usernames and Passwords Between Subversion and Trac . . . . . . . . . . . . . . . . . . . 72

19 WordPress 7319.1 Getting Started Screencast . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7319.2 Sending Email from WordPress . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73

20 Indices and tables 75

ii

Page 5: WebFactionSoftwareDocumentation_prodyut

WebFaction Software Documentation, Release

Contents:

CONTENTS 1

Page 6: WebFactionSoftwareDocumentation_prodyut

WebFaction Software Documentation, Release

2 CONTENTS

Page 7: WebFactionSoftwareDocumentation_prodyut

CHAPTER

ONE

GENERAL TOPICS

1.1 Accessing Logs

Most logs can be found in ~/logs/frontend and ~/logs/user.

Note: To prevent log files from becoming too large, logs are rotated daily at 3:00 a.m. server time. Eachexisting log is renamed by appending a number which indicates how many days old the log is. For example,error_website_name.log is named error_website_name.log.1 initially. Each subsequent day the logis incremented by one, until the log has aged seven days, upon which it is deleted.

1.1.1 Front-end Logs

~/logs/frontend stores logs associated with website entries and shared Apache. There are four types of logswhich appear in ~/logs/frontend:

• Website access logs – Logs of the filename form beginning ‘access_website_name.log’ record attemptsto access a website. Such logs record:

– originating IP address,

– date and time,

– HTTP method used,

– the specific URL accessed,

– and the user-agent which made the request.

• Website error logs – Logs of the filename form beginning ‘error_website_name.log’ record errorevents associated with websites. Such logs record a date and time and an error message.

• Shared Apache access logs – Logs of the filename form beginning ‘access_website_name_php.log’record access attempts for all shared Apache-based applications reached through website_name. This in-cludes all shared Apache-based applications, such as Trac, Subversion, and Static/CGI/PHP applications. Suchlogs record:

– originating IP address,

– date and time,

– HTTP method used,

– the specific URL accessed,

– and the user-agent which made the request.

3

Page 8: WebFactionSoftwareDocumentation_prodyut

WebFaction Software Documentation, Release

• Shared Apache error logs – Logs of the filename form beginning ‘error_website_name_php.log’record error events for all shared Apache-based applications reached through website_name. This includesall shared Apache-based applications, such as Trac, Subversion, and Static/CGI/PHP applications. Such logsrecord a date and time and an error message.

For example, suppose you have a Website entry with this configuration:

mysite/ --> htdocs (Static/CGI/PHP)/blog/ --> wp (WordPress)/testing/ --> fancyapp (Django)

mysite‘s access logs are stored in files beginning with access_mysite.log, while mysite‘s error logs arestored in files beginning with error_mysite.log. ‘access_mysite_php.log’ records htdocs and wp‘serrors but not fancyapp‘s errors. fancyapp‘s error logs are stored elsewhere; see User Logs for details.

1.1.2 User Logs

~/logs/user stores logs associated with many applications, including popular applications such as Django. Thereare two types of logs which appear in ~/logs/user:

• Access logs – Logs of the filename form ‘access_app_name_log’ record attempts to access the namedapplication. The format of such logs vary with the type of long-running server process associated with theapplication, but typically these logs record originating IP address, date and time, and other details.

• Error logs – Logs of the filename form ‘error_app_name_log’ record error events associated with thenamed application. Typically, these logs record error messages and their date and time.

Note: Some older installed applications may not store their logs in ~/logs/user. If you cannot find a particularapplication’s logs in ~/logs, look in the application’s directory (~/webapps/app_name). For example:

• Django: ~/webapps/app_name/apache2/logs

• Rails: ~/webapps/app_name/logs/

• Zope: ~/webapps/app_name/Zope/var, ~/webapps/app_name/zinstance/var/log

1.2 Monitoring Memory Usage

To see a list of processes and how much memory they’re using:

1. Open an SSH session to your account.

2. Enter ‘ps -u username -o rss,command’, where username is your WebFaction account name andpress Enter.

The first column is the resident set size, the amount of memory in use by the process. The second column is theprocess’s command along with any arguments used to start it.

Repeat these steps as needed for any additional SSH users you have created.

1.2.1 Example Memory Usage

For example, consider a user, johndoe, monitoring his memory usage.

4 Chapter 1. General Topics

Page 9: WebFactionSoftwareDocumentation_prodyut

WebFaction Software Documentation, Release

[johndoe@web100 ~]$ ps -u johndoe -o rss,commRSS COMMAND1640 PassengerNginxHelperServer /home/johndoe/webapps/rails/gems/gems/passenger-2.2.8 /home/johndoe/webapps/rails/bin/ruby 3 4 0 6 0 300 1 nobody 4294967295 4294967295 /tmp/passenger.45837676 Passenger spawn server544 nginx: master process /home/johndoe/webapps/rails/nginx/sbin/nginx -p /home/johndoe/webapps/rails/nginx/844 nginx: worker process896 ps -u johndoe -o rss,command3564 /home/johndoe/webapps/django/apache2/bin/httpd -f /home/johndoe/webapps/django/apache2/conf/httpd.conf -k start12504 /home/johndoe/webapps/django/apache2/bin/httpd -f /home/johndoe/webapps/django/apache2/conf/httpd.conf -k start2600 /home/johndoe/webapps/django/apache2/bin/httpd -f /home/johndoe/webapps/django/apache2/conf/httpd.conf -k start23740 /usr/local/apache2-mpm-peruser/bin/httpd -k start23132 /usr/local/apache2-mpm-peruser/bin/httpd -k start1588 sshd: johndoe@pts/11472 -bash

The first row displays the column headers:

RSS COMMAND

RSS stands for resident set size. RSS is the physical memory used by the process in kilobytes (kB). COMMAND isthe process’s command along with any arguments used to start it.

The next four rows show a Rails application running with Passenger and nginx:

1640 PassengerNginxHelperServer /home/johndoe/webapps/rails/gems/gems/passenger-2.2.8 /home/johndoe/webapps/rails/bin/ruby 3 4 0 6 0 300 1 nobody 4294967295 4294967295 /tmp/passenger.45837676 Passenger spawn server544 nginx: master process /home/johndoe/webapps/rails/nginx/sbin/nginx -p /home/johndoe/webapps/rails/nginx/844 nginx: worker process

The PassengerNginxHelperServer and Passenger processes are the passenger component of the applica-tion that handles, for example, executing Ruby code. The two nginx processes are the web server component of theapplication, which respond to the incoming HTTP requests. Altogether these processes are consuming 10,704KB orjust over 10 megabytes (MB).

The next row is the ps process itself:

896 ps -u johndoe -o rss,command

This is the command that’s checking how much memory is in use.

The next three rows represent a running Django application:

3564 /home/johndoe/webapps/django/apache2/bin/httpd -f /home/johndoe/webapps/django/apache2/conf/httpd.conf -k start12504 /home/johndoe/webapps/django/apache2/bin/httpd -f /home/johndoe/webapps/django/apache2/conf/httpd.conf -k start2600 /home/johndoe/webapps/django/apache2/bin/httpd -f /home/johndoe/webapps/django/apache2/conf/httpd.conf -k start

Although there are three processes, this is just one ordinary Django application. These are the Apache processes usedto respond to HTTP requests and to run Django itself. Together these processes are consuming 18,668KB or just over18MB of memory.

Finally, the last two lines show us johndoe’s connection to the server:

1588 sshd: johndoe@pts/11472 -bash

These processes are the SSH service and the Bash prompt, which allow johndoe to interact with the server from afar.They use relatively little memory, 3,060KB or just under 3MB.

1.2. Monitoring Memory Usage 5

Page 10: WebFactionSoftwareDocumentation_prodyut

WebFaction Software Documentation, Release

In total, johndoe is using less than 32MB of memory, which is well under the limit for his Shared 1 plan, so he’s notat risk of having his processes terminated and having to find ways to reduce his memory consumption.

If johndoe’s processes had exceeded his plan limits, he would first receive a warning. If his processes continued—byduration or by total memory consumption—to exceed the plan limits, some of his processes would be terminated andadditional notifications sent.

1.3 Setting File Permissions

We recommend that you use the getfacl and setfacl command line tools to manage file permissions. These tools allowyou to set file permissions with much greater security and granularity than chmod, chown, and chgrp.

getfacl and setfacl allow you to manage file ACLS (Access Control Lists). Using ACLs to manage permissions letsyou grant permissions to other users without granting those permissions to all other users, which is a critical securityconcern in a shared hosting environment.

The most common use case for granting permissions to another user is to grant permissions to the apache user oranother SSH/SFTP user created with the control panel.

Note: getfacl and setfacl Documentation

You can view complete documentation for getfacl or setfacl by entering man getfacl or man setfacl, respec-tively, during an interactive SSH session.

1.3.1 Reviewing Permissions

To review the permissions granted to a given file or directory, enter ‘getfacl path’ where path is the path fromthe current directory to the desired file or directory.

For example, getfacl ran in demo‘s home directory returns:

# file: .# owner: demo# group: demouser::rwxuser:apache:r-xuser:nginx:r-xgroup::--xmask::r-xother::---

If path is a directory, you can review permissions recursively by adding -R immediately after getfacl.

1.3.2 Removing Access to Others (Global Access)

To prohibit read, write, and execute access for all other users (users which are neither yourself or otherwise specifiedin the ACL) enter ‘setfacl -m o::---,default:o::--- path’ where path is the path to a file.

If path is a directory, you can set permissions recursively by adding -R immediately after setfacl.

1.3.3 Granting Access to Specific Users

To grant specific users read, write, and execute access, enter ‘setfacl -m u:username:permissionspath’ where

6 Chapter 1. General Topics

Page 11: WebFactionSoftwareDocumentation_prodyut

WebFaction Software Documentation, Release

• username is the username of the user to grant permissions,

• permissions is a combination r, w, and, x for read, write, and execute,

• and path is the path from the current directory to the desired file.

Additionally, if u is prepended with default: or d: and path is a directory, any new files created by that or anyother user within path will default to those permissions.

For example, suppose you would like to grant one of your other SSH accounts access to an application in a subdirectoryof your ~/webapps directory. To grant the other user account access:

1. Log in to an SSH session with your account name (the username you use to log in to the control panel).

2. Enter ‘setfacl -m u:secondary_username:--x $HOME’, where secondary_username is the otheruser account name, and press Enter. The command permits the other account to locate directories that it hasaccess to within your home directory.

3. Enter ‘setfacl -R -m u:secondary_username:--- $HOME/webapps/*’ and press Enter.This command disallows the other account to access the applications in your ~/webapps directory.

Note: The above command only affects applications that are currently installed. If you create new applica-tions, you will need to run that command again, or secure the application individually with ‘setfacl -R -mu:secondary_username:--- $HOME/webapps/name_of_new_app’.

4. Enter ‘setfacl -R -m u:secondary_username:rwx $HOME/webapps/application’, whereapplication is the name of the application to which the other user is to have access, and press Enter. Thiscommand grants the other user read, write, and execute access to all files and directories within the application.

5. Enter ‘setfacl -R -m d:u:secondary_username:rwx $HOME/webapps/application’ andpress Enter. This command makes all new files in the application directory and its subdirectories have thesame permissions by default.

6. Enter ‘chmod g+s $HOME/webapps/application’ and press Enter. This command makes new filesin the directory owned by the main account’s group.

Now the secondary user can read, write, and execute files within the web app’s directory. The secondaryuser can add a convenient symlink to the directory in the secondary user’s home directory; enter ‘ln -s/home/primary_username/webapps/application ~/application’, where primary_username is thename of the account used to log in to the control panel, and press Enter.

1.4 Scheduling Tasks with Cron

You can use Cron to automatically run commands and scripts at specific times.

To review the contents of your crontab:

1. Open an SSH session.

2. Enter crontab -l and press Enter.

To edit your crontab:

1. Open an SSH session.

2. Enter crontab -e and press Enter. Your crontab will open in your default text editor (as specified by theEDITOR environment variable).

3. Make any desired changes to your cron schedule.

Note: WebFaction web servers are not configured to send mail; the MAILTO cron directive will not work. Ifyou want to store the output from a cron job, redirect it to a log file.

1.4. Scheduling Tasks with Cron 7

Page 12: WebFactionSoftwareDocumentation_prodyut

WebFaction Software Documentation, Release

For example, this cron job would record cron is running every 20 minutes to ~/cron.log:

*/20 * * * * echo "cron is running" > $HOME/cron.log 2>&1

Alternatively, you could create a script to send an email.

See Also:

Cron Help Guide from Linux Help

4. Save and close the file.

1.5 Troubleshooting

Unfortunately, things don’t always work as planned. Here you will find troubleshooting hints for general errors andproblems sometimes seen among WebFaction users.

See Also:

WebFaction Blog: Debugging tips for your CGI scripts

1.5.1 Error: Site not configured

The error Site not configured has four common causes and solutions:

• Cause: You recently created a new website record in the control panel.

Solution: Wait up to five minutes for your website record to be fully configured.

• Cause: You created a new domain entry in the control panel, but did not create a corresponding site websiterecord.

Solution: Create a site record which references your newly created domain entry.

• Cause: You accessed a website with the wrong protocol—in other words, a protocol other than the one config-ured in the website entry. For example, you accessed a website configured for HTTPS via HTTP or vice-versa.

Resolution: Reenter the URL with the HTTP or HTTPS as the protocol or modify the website record to use theintended protocol.

See Also:

WebFaction User Guide > Secure Sites (HTTPS)

• Cause: You attempted to access the site by the website’s IP address.

Resolution: Accessing websites by IP addresses is not supported. Please use the URL with the domain nameselected in the control panel, typically one you supply or of the form ‘username.webfactional.com’.

1.5.2 Errors: 503 Service Temporarily Unavailable and 502 Bad Gateway

If an application’s process is down, the front-end web server will report either a 503 Service Temporarily Unavailable(on Apache servers web1 through web56) or 502 Bad Gateway error (on nginx servers web57 and up). Some reasonsyour process may be down include:

• the application took too long to respond to the front-end web server;

• a bug in the application code caused the application to crash;

8 Chapter 1. General Topics

Page 13: WebFactionSoftwareDocumentation_prodyut

WebFaction Software Documentation, Release

• the application consumed too much memory and it was terminated (in which case you will also receive an emailnotification);

• or the server was rebooted and your application has not yet restarted.

In most cases these errors can be fixed immediately by manually restarting the process for that application. For moreinformation on restarting your application, please see the documentation for your application type.

1.5. Troubleshooting 9

Page 14: WebFactionSoftwareDocumentation_prodyut

WebFaction Software Documentation, Release

10 Chapter 1. General Topics

Page 15: WebFactionSoftwareDocumentation_prodyut

CHAPTER

TWO

BAZAAR

Bazaar is an open source distributed version control system.

See Also:

Mercurial

2.1 Installing Bazaar

To install Bazaar:

1. Open an SSH session to your account.

2. Install Bazaar. Enter easy_install bzr and press Enter.

Note: You can specify which Python version to use to install Bazaar by entering ‘easy_install-X.Ybzr’ where X.Y is a Python version number. For example, to use Python 2.5, enter easy_install-2.5bzr.

3. Configure the default name and email address to appear by default in commits made from your Bazaar installa-tion. Enter ‘bzr whoami "name <email_address>"’.

You can now use the command line tool bzr to work with Bazaar repositories. Enter bzr help and press Enterfor a list of commands. To learn more about using Bazaar, see Bazaar in five minutes and the Bazaar User Guide.

2.2 Publishing Bazaar Repositories with Loggerhead

You can create an application to serve the Loggerhead server on the web.

2.2.1 Create an Application for Loggerhead

The first step in publishing Bazaar repositories on the web is to create a Custom app.

1. Log in to the WebFaction control panel.

2. Click > Domains / websites→ Applications. The Apps list appears.

3. Click the Add new ( ) button. The Add page appears.

4. Enter a name for the application in the Name field.

5. From the App type menu, click to select Custom app (listening on port).

11

Page 16: WebFactionSoftwareDocumentation_prodyut

WebFaction Software Documentation, Release

6. Click the Create button. The app will be created and the View page appears.

7. Make a note of the number provided by the Port field. This number is needed later in the setup process.

2.2.2 Create a Website Entry for Loggerhead

Next, create a website entry to direct requests from a domain name to your Custom app.

1. Log in to the WebFaction control panel.

2. Click > Domains / websites→ Websites. The Sites page appears.

3. Click the Add new button ( ). The Add page appears.

4. Enter a name for the website entry in the Name field.

5. Click to select a domain from the Subdomains field.

6. Click the Add new button ( ). An additional row in the Site apps table appears.

7. Click to select your Custom app from the App menu.

8. Enter a URL path in the URL path field.

9. Click the Create button. The View page appears.

2.2.3 Create a Place to Store Bazaar Repositories

Next, a directory needs to be created where the repositories themselves will be stored. Typically, this will be a directoryoutside of the Static/CGI/PHP application’s directory.

1. Open an SSH session to your account.

2. Create the repository directory. Enter ‘mkdir ~/directory_name’ and press Enter. For example, entermkdir ~/bzr and press Enter.

2.2.4 Install Loggerhead’s Dependencies

Next, install Loggerhead’s dependencies. Loggerhead requires SimpleTAL, simplejson, and Paste.

1. Install the latest version of SimpleTAL for Python 2. You can find a link to the latest ver-sion from Download SimpleTAL for Python 2. For example, enter ‘easy_install-2.5http://www.owlfish.com/software/simpleTAL/downloads/SimpleTAL-4.2.tar.gz’and press Enter.

2. Install simplejson. Enter easy_install-2.5 simplejson and press Enter.

3. Install Paste. Enter easy_install-2.5 Paste and press Enter.

2.2.5 Download and Setup Loggerhead

The next step is to download Loggerhead and configure it to use the right version of Python.

1. Open an SSH session into your account.

2. Switch to the Custom app directory. Enter ‘cd ~/webapps/custom_app_name’.

12 Chapter 2. Bazaar

Page 17: WebFactionSoftwareDocumentation_prodyut

WebFaction Software Documentation, Release

3. Download the latest version of Loggerhead. You can find a link to the lat-est version from the Loggerhead download page. For example, enter ‘wgethttp://launchpad.net/loggerhead/1.17/1.17/+download/loggerhead-1.17.tar.gz’and press Enter. An archive is created in the current directory.

4. Decompress the Loggerhead archive. Enter ‘tar -xvf loggerhead-version_number.tar.gz’ andpress Enter. A directory called loggerhead is created.

5. Switch to the loggerhead directory. Enter cd loggerhead and press Enter.

6. Open serve-branches in a text editor.

7. Edit the first line of the file from this:

#!/usr/bin/env python

to this:

#!/usr/bin/env python2.5

8. Save and close the file

2.2.6 Create a Cron Job to Automatically Start Loggerhead

1. Open an SSH session into your account.

2. Edit your crontab. Enter crontab -e and press Enter. Your crontab file will open in your text editor.

3. Add this line to your crontab:

10,30,50 * * * * /home/<username>/webapps/<custom_app_name>/loggerhead/serve-branches --port=<number> <bzr_directory> &> /home/<username>/webapps/<custom_app_name>/loggerhead.log

where

• <username> is your username,

• <custom_app_name> is the name of your Custom app,

• <number> is the port number assigned to your Custom app,

• and <bzr_directory> is the full path to the directory you created to store repositories (e.g./home/username/bzr).

4. Save and close the file.

Now, every twenty minutes your Loggerhead installation will be automatically restarted. Once the Loggerhead processstarts, you can access your repositories on the web at the domain and path you specified previously.

2.2. Publishing Bazaar Repositories with Loggerhead 13

Page 18: WebFactionSoftwareDocumentation_prodyut

WebFaction Software Documentation, Release

14 Chapter 2. Bazaar

Page 19: WebFactionSoftwareDocumentation_prodyut

CHAPTER

THREE

CUSTOM APPLICATIONS

If there is software you want to run which does not have a provided one-click installer but can respond to HTTPrequests by listening to a specific port, you can use a Custom app (listening on port) application.

3.1 Creating a Custom Application

A Custom app (listening on port) application assigns a specific port number and creates a subdirectory in ~/webappsfor your use. To create a custom application:

1. Log in to the control panel.

2. Click Domains / websites→ Applications. The Apps list appears.

3. Click the Add new ( ) button. The Add page appears.

4. In the Name field, enter a name for the application.

5. In the App type menu, click to select Custom app (listening on port).

6. Click the Create button. The View page appears with a confirmation message. The Port field will indicate theport number assigned to your application.

Now, you can create a website entry which points to your custom application. Requests to that application’s URL willbe proxied by your server to the port number provided. Your application can then listen and respond to requests onthat port.

3.2 Automatically Restarting a Custom Application

On occasion, your custom application may stop running. There are a number of potential causes for this, such as:

• a bug in your application has caused it to crash,

• your application consumed too much memory and was terminated,

• the server was restarted.

Since you probably won’t be watching the application constantly, it’s advisable to set up a cron job which will auto-matically restart your application if it is no longer running.

While some applications may gracefully restart by simply running the same command used to launch the program inthe first place, others may have unexpected or unpleasant side-effects, such as starting numerous copies of the sameprogram, quickly consuming your memory allotment. For such applications, we recommend wrapping your commandin a script which verifies the application is not already running beforehand.

15

Page 20: WebFactionSoftwareDocumentation_prodyut

WebFaction Software Documentation, Release

16 Chapter 3. Custom Applications

Page 21: WebFactionSoftwareDocumentation_prodyut

CHAPTER

FOUR

DJANGO

Django is an open source Python web development framework. It enables Python developers to build web applicationswith a minimum of time, effort, and code. You can learn more about Django and see the official documentation at theDjango website.

4.1 Getting Started Screencast

WebFaction has prepared a screencast which will help you get up and running with Django quickly. You can watch iton YouTube.

You can also download the zip file containing the paste app demonstrated in the video.

4.1.1 Screencast Resources

In the screencast, we mentioned some useful resources. Here’s a handy list of hyperlinks from the screencast:

• [0:25] Django

• [1:08] Pastebin

• [8:43] Dive Into Python

• [8:46] Django Documentation

• [8:53] Webfaction Django Forums

4.2 Getting Started with Django

It’s easy to setup a Django application. In the following sections, you will learn how to create a Django application,create the database, setup applications to serve static media, configure Django, and make sure everything is workingsmoothly.

4.2.1 Create the Django Application

First, create a Django application.

Note: If you requested a Django application during sign up, you’ll find an application called django alreadyinstalled for you. If you see django in ~/webapps or on the Apps page (login required), you can skip this portionof Getting Started with Django.

17

Page 22: WebFactionSoftwareDocumentation_prodyut

WebFaction Software Documentation, Release

1. Log in to the control panel.

2. Click Domains / websites→ Applications. The Apps page appears.

3. Click the Add new ( ) button. The Add page appears.

4. Enter a name for the application in the Name field.

5. Click to select Django (1.1)/mod_wsgi (2.5)/Python (2.5) from the App type menu.

6. Click the Create button. Your application is created and the confirmation page displayed.

4.2.2 Serving Static Media

To reduce memory consumption and improve responsiveness, create a static application to serve static media directlyby the server (instead of the Django process).

1. Click the Add new button. The Add page appears.

2. Enter a name for the application in the Name field.

3. Click to select Static only (no .htaccess) from the App type menu.

4. Click the Create button. Your application is created and the confirmation page displayed.

4.2.3 Serving Admin Media

The admin site media is static media and you should avoid serving it with Django; instead, you should let the server-wide nginx or Apache process take care of serving admin media. This will increase responsiveness and reduce memoryconsumption.

To serve the admin site media with the nginx or Apache process on the server, create a symbolic link application toserve the media:

1. Click the Add new button. The Add page appears.

2. Enter a name for the application in the Name field.

3. Click to select Symbolic link from the App type menu.

4. Enter the path to the Django admin site media in the Extra info field. Typically, the path ishome_directory/webapps/django_application/lib/python2.5/django/contrib/admin/media.

5. Click the Create button. The confirmation page is displayed.

Note: Do you already have a Django project up and running and just want to change how the admin site media isserved? Complete the directions above, then:

1. Click Domains / websites→ Websites.

2. Click the Edit button for the website entry which hosts your Django application. The Edit page appears.

3. Click the Add new ( ) button. An additional row appears in the Site apps table.

4. Click to select your symbolic link application from the App menu.

5. Enter your existing static media URL path and /admin in the URL path field. For example, if the existingstatic media path is /media, then the new URL path entry would be /media/admin.

6. Click the Update button.

The admin site media will now be served by the web server instead of the Django process.

18 Chapter 4. Django

Page 23: WebFactionSoftwareDocumentation_prodyut

WebFaction Software Documentation, Release

4.2.4 Creating the Database

Next, create a database.

1. Click Databases > Create new database. The Add page appears.

2. Click to select PostgreSql from the Type menu.

3. Enter a name for the database.

Note: The database name must either be your control panel username or begin with your username and anunderscore.

4. Click the Create button. The confirmation page appears.

5. Make a note of the database password provided; it is required to configure Django to connect to the database.

4.2.5 Creating a Website Entry

The next step is to configure the WebFaction control panel to proxy requests to the Django application, static mediaapplication, and admin media symbolic link application.

1. Click Domains / websites→ Websites. The Sites page appears.

2. Click the Add new ( ) button. The Add page appears.

3. Enter a name for the website entry in the Name field.

4. Click to select the domains to associate with the website record in the Subdomains list.

5. Click the Add new ( ) button. A row is added to the Site apps table.

6. Click to select the Django application from the App menu.

7. Enter / in the URL path field.

8. Click the Add new ( ) button. A row is added to the Site apps table.

9. Click to select the static media application from the App menu.

10. Enter /media in the URL path field.

11. Click the Add new ( ) button. A row is added to the Site apps table.

12. Click to select the admin media symbolic link application from the App menu.

13. Enter /media/admin in the URL path field.

14. Click the Create button.

4.2.6 Configuring Your Django Installation

Now, configure the Django application to use your new media applications, send email, and connect to your database.

Note: Do you have your own project ready to go or would rather start a project with a different name?

To substitute myproject by creating a new project or uploading your own:

1. Open an SSH session.

2. Enter ‘cd ~/webapps/django_application’ and press Enter.

4.2. Getting Started with Django 19

Page 24: WebFactionSoftwareDocumentation_prodyut

WebFaction Software Documentation, Release

3. Enter rm -rf ./myproject and press Enter.

4. If applicable, upload your project directory to ~/webapps/django_application.

Otherwise, enter ‘./lib/python2.5/django/bin/django-admin.py startprojectproject_name’.

5. Open ~/webapps/django_application/myproject.wsgi in a text editor.

6. Change os.environ[’DJANGO_SETTINGS_MODULE’] = ’myproject.settings’ to‘os.environ[’DJANGO_SETTINGS_MODULE’] = ’project_name.settings’’.

7. Save your changes and close the file.

8. Enter ‘mv myproject.wsgi project_name.wsgi’ and press Enter.

9. Open ~/webapps/django_application/apache2/conf/httpd.conf in a text editor.

10. Change ‘WSGIScriptAlias / /home/username/webapps/django_application/myproject.wsgi’to ‘WSGIScriptAlias / /home/username/webapps/django_application/project_name.wsgi’.

11. Save your changes and close the file.

Be sure to update your Django settings to use your new database and media applications.

Connecting Django to a Database

1. Open an SSH session.

2. Open home_directory/webapps/django_application/myproject/settings.pywith a texteditor.

3. Add a tuple to ADMINS containing your name and your email address.

4. Set DATABASE_ENGINE to postgresql_psycopg2.

5. Set DATABASE_NAME and DATABASE_USER to the name you specified in Creating the Database.

6. Set DATABASE_PASSWORD to the database password provided by the control panel.

Configuring Django to Find Static Media and Admin Media

While continuing to edit home_directory/webapps/django_application/myproject/settings.py:

1. Set MEDIA_ROOT to ’home_directory/webapps/static_media_application/’.

2. Set MEDIA_URL to ‘’http://domain/media/’’.

3. Set ADMIN_MEDIA_PREFIX to ‘’http://domain/media/admin/’’.

Configuring Django to Send Email Messages

While continuing to edit home_directory/webapps/django_application/myproject/settings.py:

1. At the end of the file, add EMAIL_HOST = ’smtp.webfaction.com’.

2. At the end of the file, add ‘EMAIL_HOST_USER = ’mailbox_username’’.

3. At the end of the file, add ‘EMAIL_HOST_PASSWORD = ’mailbox_password’’.

4. At the end of the file, add ‘DEFAULT_FROM_EMAIL = ’valid_email_address’’.

5. At the end of the file, add ‘SERVER_EMAIL = ’valid_email_address’’.

20 Chapter 4. Django

Page 25: WebFactionSoftwareDocumentation_prodyut

WebFaction Software Documentation, Release

Note: The email addresses entered for SERVER_EMAIL and DEFAULT_FROM_EMAIL must be set up in the controlpanel.

Enabling the Django Admin Site

While continuing to edit home_directory/webapps/django_application/myproject/settings.py:

1. Add ’django.contrib.admin’ to INSTALLED_APPS.

2. Save and close the file.

3. Open home_directory/webapps/django_application/myproject/urls.py with a text edi-tor.

4. Uncomment from django.contrib import admin, admin.autodiscover(),(r’^admin/doc/’, include(’django.contrib.admindocs.urls’)), and (r’^admin/’,include(admin.site.urls)),.

5. Save and close the file.

4.2.7 Synchronizing the Database and Restarting Apache

The final stage of the process is to synchronize the database with manage.py and restart Apache.

1. Change to the project directory (typically found at ‘home_directory/webapps/django_application/myproject’).

2. Run ‘python2.5 manage.py syncdb’. The database will be updated. You may be prompted to create asuperuser; if so, create one now.

3. Change to Apache’s bin directory, found at ‘home_directory/webapps/django_application/apache2/bin’.

4. Run ./restart.

You can now open ‘http://domain/admin’ and admire your admin site.

4.3 Restarting a Django Application

You can restart your Django application’s Apache server at any time. To restart the Apache instance and Django:

1. Open an SSH session.

2. Switch to the Django application’s directory. Enter ‘cd ~/webapps/django_app’ where django_app isthe name of the Django application as it appears in the control panel, and press Enter.

3. Run the restart script. Enter ./apache2/bin/restart and press Enter. Your Django application restartsover a few seconds.

Note: Alternatively, you may manually start and stop the Apache instance. To stop the server, enter./apache2/bin/stop and press Enter. To start the server, enter ./apache2/bin/start and pressEnter.

4.4 Upgrading your Django Libraries

To upgrade the Django libraries used by your Django application:

1. Open a SSH session to your account.

4.3. Restarting a Django Application 21

Page 26: WebFactionSoftwareDocumentation_prodyut

WebFaction Software Documentation, Release

2. Go to your Django application directory. Enter ‘cd ~/webapps/app_name’ where app_name is the nameof the Django app that you are upgrading.

3. Download the Django source package. Enter ‘wget http://www.djangoproject.com/download/version_number/tarball/’where version_number is the version number of the latest Django release (see the Django download page forthe latest version and relase notes) and press Enter. An archive file is created in the current directory.

4. Decompress the archive. Enter ‘tar -xvf Django-version_number.tar.gz’ and press Enter. Adirectory containing the contents of the archive is created.

5. Rename your old Django libraries to move them out of the way. Enter ‘mv lib/python2.5/djangolib/python2.5/django.old’ and press Enter.

6. Copy the new libraries into your Python library directory. Enter ‘cp -RDjango-version_number/django lib/python2.5/’ and press Enter.

7. Make any necessary adjustments to your project code as directed by the release notes for the version of Djangoto which you are upgrading.

8. Restart Apache. Enter ‘apache2/bin/restart’ and press Enter.

9. Delete the Django source archive and directory. Enter ‘rm -rf Django-version_number*’ and pressEnter.

10. Delete your old Django libraries. Enter ‘rm -rf lib/python2.5/django.old’ and press Enter.

Note: This will not change the Django version number shown in our control panel. The control panel only recordsthe original version.

4.5 Using the Latest Django Trunk

The WebFaction control panel includes installers for the latest trunk versions of Django, in both mod_python andWSGI configurations. These installers use a nightly export of the trunk from the official Django subversion repository.These installers allow you to run a recent version of Django quickly and easily.

That said, the installers provide exports of the Django trunk, not Subversion working copies of a Django checkout. Toreplace installed Django libraries with a Subversion checkout:

1. Open an SSH session to your account.

2. Switch to the Python library directory for your Django application. Enter ‘cd~/webapps/django_application/lib/python2.X’, where django_application is the name ofthe application and X is the minor version number of Python used in this application, and press Enter.

Note: For Django applications created prior to 1 May 2008, the Django source code is found in‘~/lib/python2.X’. Instead, enter ‘cd ~/lib/python2.X’, where X is the minor version number ofPython used for this application, and press Enter.

3. Remove the existing Django directory. Enter rm -rf ./django and press Enter.

4. Checkout the Django trunk. Enter svn checkout http://code.djangoproject.com/svn/django/trunk/django/and press Enter. Subversion downloads the latest trunk to ./django.

5. Stop the Apache server. Enter ‘~/webapps/django_application/apache2/bin/stop’ and pressEnter.

6. Restart the Apache server. Enter ‘~/webapps/django_application/apache2/bin/start’ andpress Enter.

Now you can use svn update and other Subversion commands with your Django installation.

22 Chapter 4. Django

Page 27: WebFactionSoftwareDocumentation_prodyut

WebFaction Software Documentation, Release

4.6 Troubleshooting

4.6.1 Fixing ImportError: No module named django.module.submoduleExceptions

Python will raise an ImportError exception whenever it cannot find a particular package or module in an importstatement. This is typically caused by the named module not appearing in Python’s PYTHONPATH environmentvariable.

For example, this error sometimes happens while attempting to run manage.py.

To correct the problem, the offending module needs to be added to the PYTHONPATH environment variable. Inthe case of Django module errors, you will need to add ~/webapps/django_app_name/lib/python2.5 toPYTHONPATH. To learn more about making changes to PYTHONPATH, see Fixing ImportError Exceptions.

4.6.2 Fixing Internal Server Errors

Django will return an HTTP status code of 500, an Internal Server Error, when Django encounters runtime errors in aview, such as a syntax error or a view failing to return an object that Django expects.

Closely related to errors in view logic is that Django itself will raise the TemplateDoesNotExist exception when anerror is encountered in a view, the DEBUG setting is set to False and a 500.html template is not available.

The following two sections will help your resolve errors in your views and fix Django’s TemplateDoesNotExist excep-tion for Internal Server Errors.

Fixing View Errors

When you encounter an Internal Server Error in your Django application, your foremost concern should be to fix yourapplication so that it does not return an HTTP status code of 500. The best web applications respond to problemsgracefully, without dumping an ugly error on the user.

The first step in fixing a view error is to identify the cause of the problem. A stack trace of the error will automaticallybe written to your Django application’s error log.

If the stack trace doesn’t provide you with the information you need to solve the problem, you can set DEBUG to Truein your settings.py file. When DEBUG is True, a stack trace and detailed configuration information is output tothe browser when the error occurs. However, be sure to set DEBUG to False when you are finished debugging: thedebug output contains sensitive information (like file paths and configuration options) and SQL queries are retained inmemory, vastly increasing your application’s memory consumption.

Finally, once you’ve found the source of the error in your view, be sure to update your Django application’s suite oftests to keep the error from creeping back into your code.

See Also:

Django Documentation > The 500 (server error) view, Django Debug Toolbar

Fixing TemplateDoesNotExist for Internal Server Errors

Many Django installations raise an additional exception, TemplateDoesNotExist, when an error is encountered. Typi-cally this happens when an error occurs while processing a view, no 500.html template is found, and the DEBUGsetting is set to False.

The default error page (provided by Apache) contains this text:

4.6. Troubleshooting 23

Page 28: WebFactionSoftwareDocumentation_prodyut

WebFaction Software Documentation, Release

Internal Server Error

The server encountered an internal error or misconfiguration and was unable to complete your request.

Please contact the server administrator, [no address given] and inform them of the time the error occurred, and anything you might have done that may have caused the error.

While the error is not described in detail on the page, the error log for the application will look something like this:

[Fri Nov 13 14:04:35 2009] [error] [client 127.0.0.1] mod_wsgi (pid=11586): Exception occurred processing WSGI script ’/home/username/webapps/django/myproject.wsgi’.[Fri Nov 13 14:04:35 2009] [error] [client 127.0.0.1] Traceback (most recent call last):[Fri Nov 13 14:04:35 2009] [error] [client 127.0.0.1] File "/home/username/webapps/django/lib/python2.5/django/core/handlers/wsgi.py", line 241, in __call__[Fri Nov 13 14:04:35 2009] [error] [client 127.0.0.1] response = self.get_response(request)[Fri Nov 13 14:04:35 2009] [error] [client 127.0.0.1] File "/home/username/webapps/django/lib/python2.5/django/core/handlers/base.py", line 122, in get_response[Fri Nov 13 14:04:35 2009] [error] [client 127.0.0.1] return self.handle_uncaught_exception(request, resolver, sys.exc_info())[Fri Nov 13 14:04:35 2009] [error] [client 127.0.0.1] File "/home/username/webapps/django/lib/python2.5/django/core/handlers/base.py", line 166, in handle_uncaught_exception[Fri Nov 13 14:04:35 2009] [error] [client 127.0.0.1] return callback(request, **param_dict)[Fri Nov 13 14:04:35 2009] [error] [client 127.0.0.1] File "/home/username/webapps/django/lib/python2.5/django/views/defaults.py", line 23, in server_error[Fri Nov 13 14:04:35 2009] [error] [client 127.0.0.1] t = loader.get_template(template_name) # You need to create a 500.html template.[Fri Nov 13 14:04:35 2009] [error] [client 127.0.0.1] File "/home/username/webapps/django/lib/python2.5/django/template/loader.py", line 81, in get_template[Fri Nov 13 14:04:35 2009] [error] [client 127.0.0.1] source, origin = find_template_source(template_name)[Fri Nov 13 14:04:35 2009] [error] [client 127.0.0.1] File "/home/username/webapps/django/lib/python2.5/django/template/loader.py", line 74, in find_template_source[Fri Nov 13 14:04:35 2009] [error] [client 127.0.0.1] raise TemplateDoesNotExist, name[Fri Nov 13 14:04:35 2009] [error] [client 127.0.0.1] TemplateDoesNotExist: 500.html

To resolve this problem, create a new template named 500.html in your templates directory. To see what directoriesare currently configured as template directories:

1. Open an SSH session.

2. Enter ‘cd ~/webapps/django_application/myproject’, where django_application is the name ofyour Django application as it appears in the control panel and press Enter.

3. Enter ‘python -c "import settings; print settings.TEMPLATE_DIRS"’ and pressEnter.

Then, in one of the template directories, create a new file named 500.html. The file can be as simple as this sample500.html:

<html><head>

<title>Server Error</title></head><body>

<h1>Sorry!</h1><p>Sorry, the server has encountered an error.</p>

</body></html>

though it’s recommended that you add contact information to your server error page, so your users can reach you inthe event of a problem.

24 Chapter 4. Django

Page 29: WebFactionSoftwareDocumentation_prodyut

CHAPTER

FIVE

DRUPAL

Drupal is an open source content management system which can be used to build blogs, portals, and other web sites.WebFaction provides a control panel installer to make it quick and easy to setup a Drupal site on our servers.

5.1 Sending Email from Drupal

When Drupal is installed with the WebFaction control panel, the SMTP module is automatically included in the finalinstallation. The SMTP module allows Drupal to use an external SMTP server, such as smtp.webfaction.com.

To configure the SMTP module:

1. Log in to your Drupal web site.

2. In the admin menu, click Administer . The Administer page appears.

3. In the admin menu, click Site configuration. The Site configuration page appears.

4. In the admin menu, click Site information. The Site information page appears.

5. In the E-mail address field, enter an email address which has been created in the WebFaction control panel.

6. Click the Save configuration button. The page reloads with a confirmation message prepended to the top of thepage.

7. In the admin menu, click Site building . The Site building page appears.

8. Click Modules. The Modules page appears.

9. In the Mail section, click to select SMTP Authentication Support.

10. Click the Save configuration button. The page reloads with a confirmation message prepended to the top of thepage.

11. In the admin menu, click Site configuration. The Site configuration pages appears.

12. Click SMTP Authentication Support. The SMTP Authentication Support page appears.

13. Click to select On.

14. In the SMTP server field, enter smtp.webfaction.com.

15. In the SMTP port field, enter 465.

16. Click to select Use SSL from the Use encrypted protocol menu.

17. Enter the WebFaction mailbox name in the Username field.

18. Enter the WebFaction mailbox password in the Password field.

25

Page 30: WebFactionSoftwareDocumentation_prodyut

WebFaction Software Documentation, Release

19. Enter an email address which has been created in the WebFaction control panel in the E-mail from addressfield.

20. Click the Save configuration button. The page will will reload with a confirmation message prepended to thetop of the page.

Now, all future notification email messages and other email sent using PHP’s mail() function will be sent using theSMTP module.

26 Chapter 5. Drupal

Page 31: WebFactionSoftwareDocumentation_prodyut

CHAPTER

SIX

GIT

Git is an open source distributed version control tool.

See Also:

Bazaar, Mercurial

6.1 Installing Git

To install Git to your home directory:

1. Open an SSH session to your account.

2. Download the Git source package. Enter ‘wget http://kernel.org/pub/software/scm/git/git-version_number.tar.bz2’where version_number is the version number of the latest Git release (see Git’s homepage for the latest versionand release notes) and press Enter. An archive file is created in the current directory.

3. Decompress the archive. Enter ‘tar --extract --bzip2 --filegit-version_number.tar.bz2’ and press Enter. A directory containing the contents of thearchive is created.

4. Switch to the archive directory. Enter ‘cd git-version_number’ and press Enter.

5. Compile Git. Enter make and press Enter.

Note: This step make take several minutes to complete.

6. Install Git. Enter make install and press Enter. git and a few other related tools will be installed to~/bin.

7. Switch to your home directory. Enter cd and press Enter.

8. Remove the installation directory. Enter ‘rm -r git-version_number’.

9. Remove the installation archive. Enter ‘rm git-version_number.tar.bz2’.

You can now use the command line tool git to work with Git repositories. Enter git help and press Enter for a listof commands. You can also enter ‘git help command’ to see detailed documentation for a particular command.

To learn more about using Git, check out the official documentation list and the Git Community Book.

6.2 Pushing to Git Repositories over SSH

If Git is installed in your home directory, you can push to repositories stored there.

27

Page 32: WebFactionSoftwareDocumentation_prodyut

WebFaction Software Documentation, Release

First, you must add Git to your .bashrc file’s PATH:

1. Open an SSH session to your account.

2. Open ~/.bashrc in a text editor.

3. Add export PATH=${PATH}:~/bin to the end of the file.

4. Save and close the file.

To push a repository stored in your home directory:

1. Switch to the path of your local Git repository. For example, at the command prompt, enter ‘cdpath_to_local’, where path_to_local is the path to the local repository, and press Enter.

2. Enter ‘git push ssh://[email protected]/~/path_to_remotemaster’, where username is your WebFaction username and path_to_remote is the path to the remoterepository relative to your home directory, and press Enter.

Note: If you would like to push a branch other than the master branch, replace master with the name of thebranch you would like to push.

3. When prompted, enter your password and press Enter.

Your changes will then be transmitted and applied to the remote repository.

6.3 Publishing Git Repositories to the Web with Gitweb

You can create an application to serve gitweb.cgi, which makes it possible to browse and clone repositories overHTTP.

Note: These directions assume you already have Git installed. If you have not yet installed Git, please see InstallingGit.

6.3.1 Create an Application to Serve gitweb.cgi

The first step in publishing Git repositories on the web is to create an application to serve the CGI script.

1. Log in to the WebFaction control panel.

2. Click > Domains / websites→ Applications. The Apps list appears.

3. Click the Add new ( ) button. The Add page appears.

4. Enter a name for the application in the Name field.

5. From the App type menu, click to select Static/CGI/PHP.

6. Click the Create button. The app will be created and the View page appears.

6.3.2 Create a Place to Store Git Repositories

Next, a directory needs to be created where the repositories themselves will be stored. Typically, this will be a directoryoutside of the Static/CGI/PHP application’s directory.

1. Open an SSH session to your account.

2. Create the repository directory. Enter ‘mkdir ~/directory_name’ and press Enter. For example, entermkdir ~/git and press Enter.

28 Chapter 6. Git

Page 33: WebFactionSoftwareDocumentation_prodyut

WebFaction Software Documentation, Release

6.3.3 Download and Install gitweb.cgi

Now, download the Git sources, build the CGI script, and copy it to the correct location.

1. Open an SSH session to your account.

2. Change to the Static/CGI/PHP application’s directory. Enter ‘cd~/webapps/static_cgi_php_app_name/’ and press Enter.

3. Remove the existing index.html. Enter rm index.html and press Enter.

4. Download the Git source package. Enter ‘wget http://kernel.org/pub/software/scm/git/git-version_number.tar.bz2’where version_number is the version number of the latest Git release (see Git’s homepage for the latest versionand release notes) and press Enter. An archive file is created in the current directory.

5. Decompress the archive. Enter ‘tar -xvf git-version_number.tar.bz2’ and press Enter. Adirectory containing the contents of the archive is created.

6. Switch to the archive directory. Enter ‘cd git-version_number’ and press Enter.

7. Build gitweb.cgi. Enter ‘make GITWEB_PROJECTROOT="path_to_repositories"bindir=path_to_git gitweb/gitweb.cgi’ where path_to_repositories is the directory cre-ated to store your repositories (for example, /home/username/git) and path_to_git is the directory whereyou installed the Git executables (typically, ~/bin). The script will be compiled in the gitweb subdirectory.

8. Copy the CGI script and supporting files to the Static/CGI/PHP directory. Enter ‘cp ./gitweb/git-*./gitweb/gitweb.css ./gitweb/gitweb.cgi ~/webapps/application_name’ and pressEnter.

9. Return to the parent directory. Enter cd .. and press Enter.

10. Remove the installation directory. Enter ‘rm -r git-version_number’.

11. Remove the installation archive. Enter ‘rm git-version_number.tar.bz2’.

6.3.4 Configure Apache to Use gitweb.cgi

The next step is to instruct apache to use gitweb.cgi to respond to requests made to the Static/CGI/PHP application.

1. Open an SSH session to your account.

2. Change to the Static/CGI/PHP application’s directory. Enter ‘cd~/webapps/static_cgi_php_app_name/’ and press Enter.

3. Open a new file named .htaccess.

4. Edit the file so that it looks like the following:

DirectoryIndex gitweb.cgiRewriteEngine onRewriteRule ^[a-zA-Z0-9_\-]+\.git/?(\?.*)?$ gitweb.cgi%{REQUEST_URI} [L,PT]

See Also:

To password protect the Gitweb site, you can modify the .htaccess file as described in Password Protectinga Directory with a Static/CGI/PHP App. It may be convenient to make these changes now, while the file isalready open.

5. Save and close the file.

6.3. Publishing Git Repositories to the Web with Gitweb 29

Page 34: WebFactionSoftwareDocumentation_prodyut

WebFaction Software Documentation, Release

6.3.5 Create a Website Entry for the Git Repositories

Finally, it’s time to create a website entry so that requests can be proxied from a URL to gitweb.cgi‘s application.

1. Log in to the WebFaction control panel.

2. Click > Domains / websites→ Websites. The Sites page appears.

3. Click the Add new button ( ). The Add page appears.

4. Enter a name for the website entry in the Name field.

5. Click to select a domain from the Subdomains field.

6. Click the Add new button ( ). An additional row in the Site apps table appears.

7. Click to select your Static/CGI/PHP application from the App menu.

8. Enter a URL path in the URL path field.

9. Click the Create button. The View page appears.

You can now visit the domain and path specified in the website entry to see your Git repositories. The listing isprobably empty now, however; create new repositories with ‘git init repository_name’ in your repositorydirectory to populate the list.

30 Chapter 6. Git

Page 35: WebFactionSoftwareDocumentation_prodyut

CHAPTER

SEVEN

JOOMLA

Joomla is an open source, PHP-based content management system.

7.1 Sending Email

To configure Joomla to send mail using WebFaction’s SMTP server:

1. Log in to the Joomla Administrator Back-end with an Administrator or Super Administrator account.

2. Click Site→ Global Configuration. The Global Configuration page appears on the Site tab.

3. Click the Server tab. The Global Configuration page appears on the Server tab.

4. From the Mailer menu in the Mail Settings group, click to select SMTP Server.

5. In the Mail from field, enter an email address registered in the WebFaction control panel.

6. In the From Name field, enter the name you would like to have displayed to recipients of mail sent from Joomla.

7. Next to SMTP Authentication, click to select Yes.

8. From the SMTP Security menu, click to select SSL.

9. In the SMTP Port field, enter 465.

10. In the SMTP Username field, enter a mailbox name.

11. In the SMTP Password field, enter the mailbox password.

12. In the SMTP Host field, enter smtp.webfaction.com.

13. Click the Save button.

31

Page 36: WebFactionSoftwareDocumentation_prodyut

WebFaction Software Documentation, Release

32 Chapter 7. Joomla

Page 37: WebFactionSoftwareDocumentation_prodyut

CHAPTER

EIGHT

MEMCACHED

Memcached is an open source caching system.

8.1 Setting Up Memcached

Memcached is installed server-wide on all of our machines. To start Memcached:

1. Open an SSH session.

2. Enter ‘memcached -d -m memory -s ~/memcached.sock’ where memory is the maximum numberof megabytes of memory you want Memcached to use, and press Enter.

Once your Memcached instance is up and running, you can access it by the path of the socket file(~/memcached.sock) with the software or library which uses memcached.

8.2 Shutting Down Memcached

To stop your Memcached process:

1. Open an SSH session.

2. Find the PID of your Memcached process. Enter ‘ps -u username -o pid,command | grepmemcached’ and press Enter. A list of processes containing memcached will appear.

3. Find the PID of your Memcached process in the list. The PID is the number in the first column.

4. Enter ‘kill PID’ and press Enter.

33

Page 38: WebFactionSoftwareDocumentation_prodyut

WebFaction Software Documentation, Release

34 Chapter 8. Memcached

Page 39: WebFactionSoftwareDocumentation_prodyut

CHAPTER

NINE

MERCURIAL

Mercurial, commonly referred to as Hg (the symbol for the element Mercury), is an open source distributed versioncontrol system.

See Also:

Bazaar, Git

9.1 Installing Mercurial

It’s easy to install Mercurial. To install Mercurial:

1. Open an SSH session to your account.

2. Enter easy_install Mercurial and press Enter.

Note: You can specify which Python version to use to install Mercurial by entering ‘easy_install-X.YMercurial’ where X.Y is a Python version number. For example, to use Python 2.5, entereasy_install-2.5 Mercurial.

3. Open ~/.hgrc in a text editor.

4. Add the following lines to ~/.hgrc:

[ui]username = name <your_email_address>

subtituting name and your_email_address with the name and email address you would like to have appear bydefault in commits made from your Mercurial installation.

5. Save and close the file.

You can now use the command line tool hg to work with Mercurial repositories. Enter hg help and press Enterfor a complete list of commands. To learn more about using Mercurial, check out the official Quick Start guide andthe Mercurial book.

9.2 Publishing Mercurial Repositories to the Web

You can create an application to serve hgwebdir.cgi (also known as HgWeb), which makes it easy to view repos-itories with a web browser, as well as push and pull changes over HTTPS.

Note: These directions assume you already have Mercurial installed. If you have not already installed Mercurial,please see Installing Mercurial.

35

Page 40: WebFactionSoftwareDocumentation_prodyut

WebFaction Software Documentation, Release

9.2.1 Create an Application to Serve hgwebdir.cgi

The first step in serving Mercurial repositories is to create an application to serve the CGI script.

1. Log in to the WebFaction control panel.

2. Click > Domains / websites→ Applications. The Apps list appears.

3. Click the Add new ( ) button. The Add page appears.

4. Enter a name for your application in the Name field.

5. From the App type menu, click to select Static/CGI/PHP.

6. Click the Create button. The app will be created and the View page appears.

9.2.2 Create a Place to Store Mercurial Repositories

Next, a directory needs to be created where the repositories themselves will be stored. Typically, this will be a directoryoutside of the Static/CGI/PHP application’s directory.

1. Open an SSH session to your account.

2. Create the repository directory. Enter ‘mkdir ~/directory_name’ and press Enter. For example, entermkdir ~/hg and press Enter.

9.2.3 Download and Install hgwebdir.cgi

Now, download the Mercurial sources, which contain a CGI script which will make repositories available on the Web.

1. Open an SSH session to your account.

2. Change to the Static/CGI/PHP application’s directory. Enter ‘cd~/webapps/static_cgi_php_app_name/’ and press Enter.

3. Remove the existing index.html. Enter rm index.html and press Enter.

4. Download the Mercurial sources. Enter wget http://selenic.com/repo/hg-stable/archive/tip.tar.bz2and press Enter. An archive named tip.tar.bz2 is created in the current directory.

5. Decompress the archive. Enter ‘tar -xvf tip.tar.bz2’ and press Enter. A new directory namedMercurial-stable-branch--hexadecimal_number is created in the current directory containingthe contents of the archive.

6. Copy Mercurial-stable-branch--hexadecimal_number/hgwebdir.cgi to the current direc-tory. Enter ‘cp Mercurial-stable-branch--hexadecimal_number/hgwebdir.cgi .’ andpress Enter.

7. Remove the archive directory. Enter ‘rm -r Mercurial-stable-branch--hexadecimal_number’and press Enter.

8. Remove the archive. Enter ‘rm Mercurial-stable-branch--hexadecimal_number.tar.bz2’and press Enter.

9.2.4 Configure hgwebdir.cgi

Now, configure hgwebdir.cgi so it knows where to look for your Mercurial installation and repositories.

1. Open an SSH session to your account.

36 Chapter 9. Mercurial

Page 41: WebFactionSoftwareDocumentation_prodyut

WebFaction Software Documentation, Release

2. Change to the Static/CGI/PHP application’s directory. Enter ‘cd~/webapps/static_cgi_php_app_name/’ and press Enter.

3. Make hgwebdir.cgi executable. Enter chmod u+x hgwebdir.cgi and press Enter.

4. Open hgwebdir.cgi in a text editor.

5. If you installed Mercurial with a Python or easy_install version other than the default, edit this line:

#!/usr/bin/env python

by replacing python with ‘pythonX.Y’, where X and Y are the major and minor version numbers of Python,respectively.

6. Uncomment these lines:

#import sys#sys.path.insert(0, "/path/to/python/lib")

and replace "/path/to/python/lib" with the path to the directory where you installed Mercurial. If youused the default easy_install, this directory will be /home/username/lib/python2.4.

7. Save and close the file.

8. Open a new file named hgweb.config.

9. Edit the file so that it looks like the following:

[paths]/ = /path/to/repositories/**

where /path/to/repositories is the path to your Mercurial repositories (for example, ‘/home/username/hg’).

Note: The asterisks (*) are required for hgwebdir.cgi to find your repositories; they permit hgwebdir.cgito find Mercurial repositories which are in a subdirectory of the path specified.

10. Save and close the file.

9.2.5 Configure Apache to Use hgwebdir.cgi

The next step in publishing your Mercurial repositories is to instruct Apache to use hgwebdir.cgi to respond torequests.

1. Open an SSH session to your account.

2. Change to the Static/CGI/PHP application’s directory. Enter ‘cd~/webapps/static_cgi_php_app_name/’ and press Enter.

3. Open a new file named .htaccess.

4. Edit the file so that it looks like the following:

Options +ExecCGIRewriteEngine On# / for root directory; specify a complete path from / for othersRewriteBase /RewriteRule ^$ hgwebdir.cgi [L]RewriteCond %{REQUEST_FILENAME} !-fRewriteCond %{REQUEST_FILENAME} !-dRewriteRule (.*) hgwebdir.cgi/$1 [QSA,L]

9.2. Publishing Mercurial Repositories to the Web 37

Page 42: WebFactionSoftwareDocumentation_prodyut

WebFaction Software Documentation, Release

Note: If you will not be hosting your repositories from the root URL path, replace RewriteBase /with ‘RewriteBase /path/to/directory’. For example, if you were to host your repositories athttp://www.example.tld/hg you would substitute RewriteBase / with RewriteBase /hg.

5. Save and close the file.

9.2.6 Create a Website Entry for the Mercurial Repositories

Finally, it’s time to create a website entry so that requests can be proxied from a URL to hgwebdir.cgi‘s applica-tion.

1. Log in to the WebFaction control panel.

2. Click > Domains / websites→ Websites. The Sites page appears.

3. Click the Add new button ( ). The Add page appears.

4. Enter a name for the website entry in the Name field.

5. Click to select Https.

6. Click to select a domain from the Subdomains field.

7. Click the Add new button ( ). An additional row in the Site apps table appears.

8. Click to select your Static/CGI/PHP application from the App menu.

9. Enter a URL path in the URL path field. If you did not change the contents of .htaccess from the versionsuggested in Configure Apache to Use hgwebdir.cgi, enter /.

10. Click the Create button. The View page appears.

You can now visit the domain and path specified in the website entry to see your Mercurial repositories. The listingis probably empty now, however; create new repositories with hg init in your repository directory to populate thelist.

9.2.7 Secure and Push to Repositories Served by hgwebdir.cgi

Now that you have a working repository browser, you can enable pushing to those repositories over HTTPS forauthenticated users.

1. Open an SSH session to your account.

2. Change to the Static/CGI/PHP application’s directory. Enter ‘cd~/webapps/static_cgi_php_app_name/’ and press Enter.

3. Open .htaccess in a text editor.

4. Add the following lines to the bottom of .htaccess to permit pushes only by authenticated users:

AuthType BasicAuthName MyHgWebDirAuthUserFile /home/<username>/webapps/<static_cgi_php_app>/.htpasswd<Limit POST PUT>

Require valid-user</Limit>

<Files ~ "^\.ht">Order allow,deny

38 Chapter 9. Mercurial

Page 43: WebFactionSoftwareDocumentation_prodyut

WebFaction Software Documentation, Release

Deny from all</Files>

where <username> is your username and <static_cgi_php_app> is the name of theStatic/CGI/PHP application.

Note: Alternatively, you can use the following lines to prohibit all access except for authenticated users:

AuthType BasicAuthName MyHgWebDirAuthUserFile /home/<username>/webapps/<static_cgi_php_app>/.htpasswdRequire valid-user

<Files ~ "^\.ht">Order allow,denyDeny from all

</Files>

1. Save and close the file.

2. Now, create an initial username and password that can push to the repositories. Enter ‘htpasswd -c.htpasswd username’ and press Enter. A prompt appears for a password.

3. Enter the password for the new user and press Enter. A prompt to confirm the password appears.

4. Enter the password again and press Enter.

5. Open hgweb.config in a text editor.

6. Add the following lines to the file:

[web]allow_push = *

Note: Alternatively, you can replace * with a comma separated list of users authorized to push. Or, formore finely grained control, you can add these lines on a repository-by-repository basis in the repositories’.hg/hgrc file.

7. Save and close the file.

You can now push to the repositories as an authenticated user.

9.2. Publishing Mercurial Repositories to the Web 39

Page 44: WebFactionSoftwareDocumentation_prodyut

WebFaction Software Documentation, Release

40 Chapter 9. Mercurial

Page 45: WebFactionSoftwareDocumentation_prodyut

CHAPTER

TEN

MONGODB

MongoDB is an open source document-oriented database.

Warning: WebFaction servers only support the 32 bit version of MongoDB, which is limited to storing approx-imately 2.5GB of data. For more information on this limitation, please see the MongoDB blog article “32 bitlimitations.”

10.1 Installing MongoDB

1. Log in to the control panel.

2. Click Domains / websites→ Applications. The Apps list appears.

3. Click the Add button ( ). The Add page appears.

4. Enter a name for your MongoDB application in the Name field.

5. Click to select Custom app (listening on port) in the App type menu.

6. Click the Create button. The View page appears with a confirmation message.

7. Make a note of the number in the Port field. This will be needed later.

8. Open an SSH session to your account.

9. Switch to the directory for your MongoDB application. Enter ‘cd ~/webapps/application’ where ap-plication is the name of your MongoDB application, and press Enter.

10. Download the MongoDB Linux 32-bit package. Enter wget http://downloads.mongodb.org/linux/mongodb-linux-i686-1.2.2.tgzand press Enter. mongodb-linux-i686-1.2.2.tgz will be created in the current directory.

Note: If you prefer, you can use past and development versions of MongoDB instead. Please see the MongoDBdownloads page for details.

11. Extract the files from the archive. Enter tar -xf mongodb-src-r1.2.2.tar.gz and press Enter. Anew directory will be created in the current directory which contains the MongoDB files.

12. Create a database data directory. Enter mkdir data and press Enter.

You may now start your MongoDB database. To run the database itself, enter/home/{username}/webapps/mongodb/mongodb-linux-i686-1.2.2/bin/mongod --dbpath/home/{username}/webapps/mongodb/data/ --port {number} where username is your usernameand number is the port number provided by the control panel.

See Also:

41

Page 46: WebFactionSoftwareDocumentation_prodyut

WebFaction Software Documentation, Release

To learn more about using MongoDB, please see the official MongoDB tutorial. To learn more about using yourpreferred programming language with MongoDB, please see the MongoDB drivers documentation.

42 Chapter 10. MongoDB

Page 47: WebFactionSoftwareDocumentation_prodyut

CHAPTER

ELEVEN

PERL

The Perl interpreter is installed on all WebFaction machines. The currently installed version is 5.8.8. You can run thePerl interpreter by executing perl or perl5.8.8.

11.1 Installing CPAN Modules

CPAN is the Comprehensive Perl Archive Network, a mirrored archive of Perl modules. You can use the cpan tool toeasily download and install Perl modules from CPAN.

To use cpan and access CPAN, you must first configure the command line tool. To configure cpan:

1. Log into your SSH account.

2. Enter the following commands, pressing Enter after each line:

mkdir -p ~/lib/perl5echo ’export PERL5LIB=${PERL5LIB}:~/lib/perl5:~/lib/perl5/lib:~/lib/perl5/lib/i386-linux-thread-multi/’ >> ~/.bashrcsource ~/.bashrc

3. Enter perl -MCPAN -e shell and press Enter. The following prompt will appear:

CPAN is the world-wide archive of perl resources. It consists of about100 sites that all replicate the same contents all around the globe.Many countries have at least one CPAN site already. The resourcesfound on CPAN are easily accessible with the CPAN.pm module. If youwant to use CPAN.pm, you have to configure it properly.

If you do not want to enter a dialog now, you can answer ’no’ to thisquestion and I’ll try to autoconfigure. (Note: you can revisit thisdialog anytime later by typing ’o conf init’ at the cpan prompt.)

Are you ready for manual configuration? [yes]

4. Repeatedly press Enter to continue, accepting each default setting through the following prompts:

• Are you ready for manual configuration? [yes]

• ‘CPAN build and cache directory? [/home/username/.cpan]’

• Cache size for build directory (in MB)? [10]

• Perform cache scanning (atstart or never)? [atstart]

• Cache metadata (yes/no)? [yes]

43

Page 48: WebFactionSoftwareDocumentation_prodyut

WebFaction Software Documentation, Release

• Your terminal expects ISO-8859-1 (yes/no)? [yes]

• ‘File to save your history? [/home/username/.cpan/histfile]’

• Number of lines to save? [100]

• Policy on building prerequisites (follow, ask or ignore)? [ask]

• Where is your gzip program? [/bin/gzip]

• Where is your tar program? [/bin/tar]

• Where is your unzip program? [/usr/bin/unzip]

• Where is your make program? [/usr/bin/make]

• Where is your links program? [/usr/bin/links]

• Where is your wget program? [/usr/bin/wget]

• Where is your ncftpget program? []

• Where is your ncftp program? []

• Where is your ftp program? [/usr/kerberos/bin/ftp]

• Where is your gpg program? [/usr/bin/gpg]

• What is your favorite pager program? [/usr/bin/less]

• What is your favorite shell? [/bin/bash]

5. Accept any additional defaults until you encounter the following prompt:

Every Makefile.PL is run by perl in a separate process. Likewise werun ’make’ and ’make install’ in processes. If you have anyparameters (e.g. PREFIX, LIB, UNINST or the like) you want to passto the calls, please specify them here.

If you don’t understand this question, just press ENTER.

Parameters for the ’perl Makefile.PL’ command?Typical frequently used settings:

PREFIX=~/perl non-root users (please see manual for more hints)

Your choice: []

6. Enter ~/lib/perl5 LIB=~/lib/perl5/lib INSTALLMAN1DIR=~/lib/perl5/man1INSTALLMAN3DIR=~/lib/perl5/man3 and press Enter.

7. Continue to press Enter until you encounter the following prompt:

Now we need to know where your favorite CPAN sites are located. Pusha few sites onto the array (just in case the first on the array won’twork). If you are mirroring CPAN to your local workstation, specify afile: URL.

First, pick a nearby continent and country (you can pick several ofeach, separated by spaces, or none if you just want to keep yourexisting selections). Then, you will be presented with a list of URLsof CPAN mirrors in the countries you selected, along with previouslyselected URLs. Select some of those URLs, or just keep the old list.Finally, you will be prompted for any extra URLs -- file:, ftp:, or

44 Chapter 11. Perl

Page 49: WebFactionSoftwareDocumentation_prodyut

WebFaction Software Documentation, Release

http: -- that host a CPAN mirror.

(1) Africa(2) Asia(3) Australasia(4) Central America(5) Europe(6) North America(7) Oceania(8) South AmericaSelect your continent (or several nearby continents) []

8. Since WebFaction’s servers are located in the United States, enter 6 and press Enter. The following promptappears:

Sorry! since you don’t have any existing picks, you must make ageographic selection.

(1) Bahamas(2) Canada(3) Mexico(4) United StatesSelect your country (or several nearby countries) []

9. Enter 4 and press Enter. Another prompt, listing available CPAN mirrors appears.

10. Enter 1 2 3 4 5 6 7 8 9 10 and press Enter.

11. Press Enter to quit the configuration process. The cpan> prompt appears.

12. Press Ctrl + D to exit.

You can now install CPAN modules. To install a module with cpan, enter ‘cpan install module_name’. Forexample, cpan install Locale::gettext.

11.1. Installing CPAN Modules 45

Page 50: WebFactionSoftwareDocumentation_prodyut

WebFaction Software Documentation, Release

46 Chapter 11. Perl

Page 51: WebFactionSoftwareDocumentation_prodyut

CHAPTER

TWELVE

PHP

The PHP interpreter is installed on all WebFaction machines. The currently installed PHP interpreter is 5.2.6 and itcan be run by executing php.

12.1 Sending Mail from a PHP Script

WebFaction runs web servers separate from mail servers. As a result, our web servers are not equipped with sendmail,upon which PHP’s built-in mail() function relies.

To send mail from a PHP script, the script must connect to and send mail from an SMTP server. There are severalpackages available which simplify this method of sending mail:

• Swift Mailer

• PEAR’s Mail package

• Zend Framework’s Zend_Mail

For example, this PHP script uses the PEAR Mail package to send an email:

<?phprequire_once "Mail.php";

$from_addr = "Me <[email protected]>";$to = "Team <[email protected]>";$subject = "Hello!";$body = "Dear Team, here is my message text.";

$headers = array ("From" => $from_addr,"To" => $to,"Subject" => $subject);

$smtp = Mail::factory("smtp", array (’host’ => "smtp.webfaction.com",’auth’ => true,’username’ => "my_mailbox_name",’password’ => "password1"));

$mail = $smtp->send($to, $headers, $body);?>

For this script to work, the values for from_addr, my_mailbox_name, and password1 would be changed to an addressregistered in the control panel, a valid WebFaction mailbox name, and a valid mailbox password, respectively.

See Also:

47

Page 52: WebFactionSoftwareDocumentation_prodyut

WebFaction Software Documentation, Release

A WebFaction user’s replacement to PHP’s mail() function

48 Chapter 12. PHP

Page 53: WebFactionSoftwareDocumentation_prodyut

CHAPTER

THIRTEEN

PLONE

Plone is an open source content management system built on top of Zope. Zope is an open source web applicationserver.

13.1 Configuring Plone to Send Email

To configure Plone to send email:

1. Log in to your Plone site as an admin user.

2. Click Site Setup. The Site Setup page appears with the Plone Configuration list.

3. Click Mail. The Mail settings page appears.

4. In the SMTP server field, enter smtp.webfaction.com.

5. In the ESMTP username field, enter a mailbox name as it appears in the WebFaction control panel.

6. In the ESMTP password field, enter the mailbox password.

7. In the Site ‘From’ name field, enter the name you would like to have appear on emails sent by Plone.

8. In the Site ‘From’ address field, enter an email address as it appears in the WebFaction control panel.

9. Click Save. A confirmation message will appear at the top of the page.

Plone will now be able to send email for password resets, notifications, and other uses.

13.2 Creating an Emergency Admin User

If you have lost or forgotten the admin password for the Zope Management Interface (ZMI), you can create an emer-gency user with zpasswd.py. To create an emergency admin user:

1. Open an SSH session to your account.

2. Switch to the directory where zpasswd.py is located. Enter ‘cd~/webapps/plone_app/zinstance/parts/zope2/utilities/’ where plone_app is thename of the application as it appears in the control panel, and press Enter.

3. Enter ‘./zpasswd.py -u username access’ where username is the name of the new emergency ac-count, and press Enter.

4. When the password prompt appears, enter a password for the emergency account and press Enter.

5. When the verify password prompt appears, reenter the password for the emergency account and press Enter.

49

Page 54: WebFactionSoftwareDocumentation_prodyut

WebFaction Software Documentation, Release

6. Move the access file to the ~/webapps/plone_app/zinstance/parts/instance directory. Entermv access ../../instance and press Enter.

7. Switch to the ~/webapps/plone_app/zinstance/parts/instance/bin directory. Enter cd../../instance/bin and press Enter.

8. Restart Zope using zopectl. Enter ./zopectl restart and press Enter.

You can now access the ZMI using the username and password created.

13.3 Installing a Python Package

Many Plone packages are distributed as Python eggs through the Python Package Index. To install such packages intoa Plone application:

1. Open an SSH session.

2. Switch to the Plone application’s zinstance directory. Enter ‘cd~/webapps/plone_application/zinstance’, where plone_application is the name of the Ploneapplication as it appears in the control panel, and press Enter.

3. Open buildout.cfg.

4. In this portion of the file:

# Add additional eggs hereeggs =

enter the name of the package to be installed as it appears on the Python Package Index on a new line beneatheggs =, indenting four spaces.

For example, suppose new.package were to be installed. buildout.cfg would be edited to contain:

# Add additional eggs hereeggs =

new.package

5. Save and close the file.

6. Complete the installation with the buildout script. Enter ./bin/buildout and press Enter. The package(or packages) will be downloaded and installed.

See Also:

Plone Developer Manual article Installing a third party product

50 Chapter 13. Plone

Page 55: WebFactionSoftwareDocumentation_prodyut

CHAPTER

FOURTEEN

PYTHON

The Python interpreter is installed on all WebFaction machines. For your convenience, several different Python ver-sions are available. All of our machines have the following versions installed:

• Python 2.4

• Python 2.5

• Python 2.6

• Python 3.0

• Python 3.1

Some machines also have Python 2.3 installed. For a listing of Python installations on your machine, enter ls/usr/local/bin/ | grep python in an SSH session. To identify the default Python version, enter python--version.

To specify a Python version, use pythonX.Y where X is the major version number and Y is the minor version number.For example, to use Python 2.6, enter python2.6.

Additionally, ~/lib/pythonX.Y is automatically added to your PYTHONPATH for each version of Python youuse. You can see the contents of your PYTHONPATH by entering ‘pythonX.Y -c "import sys; printsys.path"’.

14.1 Installing Python Packages

Python packages and modules are typically distributed

• automatically with easy_install,

• as a Python Egg,

• as an archive containing a setup.py file,

• or as a collection of source (.py) files.

You can install Python packages and modules distributed in each of these ways in your WebFaction account.

14.1.1 Installing Packages with easy_install

Many common Python packages can be automatically installed with easy_install. easy_install will look up informa-tion about the module from the Python Package Index (also known as the “Cheeseshop”), download, and install themodule automatically.

51

Page 56: WebFactionSoftwareDocumentation_prodyut

WebFaction Software Documentation, Release

To use easy_install, enter easy_install module_name.

To specify a different Python version, substitute easy_install with easy_install-X.Y, where X is the major versionnumber and Y is the minor version number. For example, to use Python 2.5, enter easy_install-2.5.

To specify a specific web application which makes use of the Python interpreter, enter‘easy_install-X.Y --install-dir=$HOME/webapps/app_name/lib/pythonX.Y--script-dir=$HOME/webapps/app_name/bin module_name’.

14.1.2 Installing Eggs

Some packages are distributed as Python Eggs. These are single files which contain an entire Python package andtypically have the .egg file extension. Eggs are installed using easy_install.

To install an egg, enter easy_install path_to_egg.

To specify a different Python version, substitute easy_install with easy_install-X.Y, where X is the major versionnumber and Y is the minor version number. For example, to use Python 2.5, enter easy_install-2.5.

To specify a specific web application which makes use of the Python interpreter, enter‘easy_install-X.Y --install-dir=$HOME/webapps/app_name/lib/pythonX.Y--script-dir=$HOME/webapps/app_name/bin path_to_egg’.

14.1.3 Installing Packages with setup.py

Many packages are distributed with a setup.py file created with the help of setuptools.

To install a package with setup.py:

1. Create a symbolic link from ~/lib/python to a specific Python version. Enter ln -s~/lib/pythonX.Y ~/lib/python where X is the major version number and Y is the minor versionnumber.

2. In the same directory as setup.py, enter pythonX.Y setup.py install --home=$HOME.

3. Remove the symbolic link. Enter rm ~/lib/python.

To install a package with setup.py to a specific web application whichmakes use of the Python interpreter, enter ‘pythonX.Y setup.py install--install-lib=$HOME/webapps/app_name/lib/pythonX.Y/ --install-scripts=$HOME/webapps/app_name/bin/’.

Note: To install a package with setup.py and the --install-lib and --install-scripts options, the--install-lib directory must also be in PYTHONPATH.

14.1.4 Installing Packages Manually

If you have some Python source files, such as a version control checkout, you can install those files manually to~/lib/pythonX.Y where X is the major version number and Y is the minor version number of a Python installa-tion. Just copy to or symbolically link files in the desired directory.

Alternatively, you can install packages directly to a web application which makes use of the Python interpreter byinstalling to ~/webapps/app_name/lib/pythonX.Y.

52 Chapter 14. Python

Page 57: WebFactionSoftwareDocumentation_prodyut

WebFaction Software Documentation, Release

14.2 Troubleshooting

14.2.1 Fixing ImportError Exceptions

Python will raise an ImportError exception whenever it cannot find a particular package or module as requestedby an import statement. This is caused by the named module not appearing in any of the module search pathdirectories. The Python search path, represented in Python as the list sys.path, is constructed from Python defaults,the PYTHONPATH environment variable, and direct manipulations to sys.path.

To see the contents of sys.path:

1. Run Python interactively. Enter ‘pythonX.Y’ and press Enter.

2. At the prompt, enter import sys and press Enter.

3. At the prompt, enter print sys.path and press Enter. The contents of sys.path will be displayed onscreen.

By default, Python searches in this order:

1. the directory where Python is executed;

2. if applicable, the ~/webapps/app_name/lib/pythonX.Y; directory where app_name is the name of anapplication and X and Y are the Python major and minor version numbers, respectively.

3. the ~/lib/pythonX.Y directory;

4. directories specified by PYTHONPATH;

5. the Standard Library;

6. built-in components of Python.

There are several possible fixes for this problem:

• add the path of the module to PYTHONPATH in your ~/.bash_profile file,

• add the path to the module to PYTHONPATH from the command line before executing the Python programwhich raises the exception,

• add the path to the module to sys.path before the import statement which raises the exception within theoffending program,

• add the path to the module to httpd.conf for applications using mod_python,

• add the path to the module to myproject.wsgi for applications using WSGI,

• or, install offending packages directly to a path where Python will find it.

See Also:

For more information on how Python loads modules, please see The Python Tutorial » 6. Modules.

Adding to PYTHONPATH from the ~/.bash_profile File

Adding an entry to the end of the PYTHONPATH environment variable is an easy and persistent way to avoidImportError exceptions. Unfortunately, this approach can cause complications while debugging Python programs,since the change to the PYTHONPATH environment variable happens silently, before you enter any commands at all.This is especially apparent when using two or more versions of the same module.

To add the path to a Python module to the PYTHONPATH environment variable from the ~/.bash_profile file:

1. Open ~/.bash_profile with a text editor.

14.2. Troubleshooting 53

Page 58: WebFactionSoftwareDocumentation_prodyut

WebFaction Software Documentation, Release

2. Add ‘export PYTHONPATH="path_to_module:$PYTHONPATH"’ to the end of the file.

3. Save and close the file.

Log out and log in for the changes to take effect.

Note: Changes to ~/.bash_profile only change sys.path for Python programs executed from a shell session.This approach would not resolve ImportError exceptions associated with web applications and other programs runwith the help of cron.

Adding to PYTHONPATH from the Command Line

You can add to the PYTHONPATH environment variable with each run of a Python program. This method is notpersistent, which makes it easy to switch between versions of a particular module. Unfortunately, it requires that youinclude the PYTHONPATH changes on each run of the program. You can also use this method in conjunction with the.bash_profile method.

To add the path to a Python module to the PYTHONPATH environment variable from the command line, run theprogram like this:

‘PYTHONPATH=path_to_module:$PYTHONPATH python program_name’

Adding to sys.path within a Python Program

You can add to Python’s module search path programmatically, within Python. It requires that you make changes toeach Python program for which you want to change the module search path.

To add to sys.path within Python, add the following statements before the import statement which raises theImportError exception:

import syssys.path.insert(0, "path_to_module")

Adding to sys.path from httpd.conf

For web applications running on mod_python, the Python module search path can be amended in the httpd.conffile found in /home/username/webapps/appname/apache2/conf/. Typically, a httpd.conf containsa line similar to this:

PythonPath "[’/home/username/webapps/djangoapp’, ’/home/username/webapps/djangoapp/lib/python2.5’] + sys.path"

You can add additional paths by inserting paths as new items in the list following the PythonPath directive. Pathsadded to that list will be included in Python’s search for modules.

Adding to sys.path from myproject.wsgi

For WSGI-based applications, sys.path can be modified in the myproject.wsgi file found in/home/username/webapps/appname/. Typically, a myproject.wsgi contains a line similar to this:

sys.path = [’/home/username/webapps/djangoapp/myproject’, ’/home/username/webapps/djangoapp/lib/python2.5’] + sys.path

You can add additional paths by inserting paths as new items in the list. Paths added to that list will be included inPython’s search for modules.

54 Chapter 14. Python

Page 59: WebFactionSoftwareDocumentation_prodyut

WebFaction Software Documentation, Release

Moving or Installing Packages Directly to a Path in sys.path

Finally, for any application which makes use of the Python interpreter, you can also install or copy modules andpackages directly to a directory which is included in Python’s search path.

For example, you could install additional modules to the ~/webapps/app_name/lib/pythonX.Y directory,which are included in the search path for the application by default.

For more information about installing Python packages and modules, see Installing Python Packages.

14.2. Troubleshooting 55

Page 60: WebFactionSoftwareDocumentation_prodyut

WebFaction Software Documentation, Release

56 Chapter 14. Python

Page 61: WebFactionSoftwareDocumentation_prodyut

CHAPTER

FIFTEEN

RUBY ON RAILS

Ruby on Rails, also known as Rails or RoR, is an open source Ruby web development framework. It enables developersto quickly design, develop, and deploy web applications. You can learn more about Ruby on Rails at the Rails website.

Tip: Add bin to PATH

While working with a Ruby on Rails application, you may find it easier to add the application’s bin directory tothe PATH environment variable and set the GEM_HOME environment variable while working with that applicationinstead of specifying complete paths to ~/webapps/ruby_app/bin and ~/webapps/ruby_app/gems.

To set the environment variables:

1. Switch to the directory of the Ruby application. Enter ~/webapps/{ruby_app} where ruby_app is thename of the application as it appears in the WebFaction control panel.

2. Enter export PATH=$PWD/bin:$PATH and press Enter.

3. Enter export GEM_HOME=$PWD/gems and press Enter.

Now, programs like gem and rake will work as expected for that application.

To revert the changes to PATH and GEM_HOME (to work with a different Ruby on Rails application, for example),just log out and log back in again.

15.1 Installing Ruby on Rails

WebFaction’s Ruby on Rails installer creates an nginx instance running Passenger and Ruby Enterprise Edition. Toinstall a Rails application:

1. Log in to the WebFaction control panel.

2. Click Domains / websites→ Applications. The list of currently installed applications appears.

3. Click the Add new ( ) button. The Add page appears.

4. Enter a name for the application in the Name field.

5. In the App type menu, click to select Rails 2.3.5 (nginx 0.7.64/Passenger 2.2.8/Ruby Enterprise Edition1.8.7).

6. Click the Create button. The application is created and the application’s View page appears with a confirmationmessage.

57

Page 62: WebFactionSoftwareDocumentation_prodyut

WebFaction Software Documentation, Release

15.2 Installing Gems

To install a Ruby Gem in your Rails application:

1. Open an SSH session to your account.

2. Enter ‘cd ~/webapps/rails_app’, where rails_app is the name of your Ruby on Rails application, andpress Enter.

3. Enter ‘export GEM_HOME=$PWD/gems’ and press Enter.

4. Enter ‘export PATH=$PWD/bin:$PATH’ and press Enter.

5. Enter ‘gem install gem_name’, where gem_name is the name of the Ruby Gem you want to install, andpress Enter.

Note: If you do not want to install the Rdoc or RI documentation, use this version of the command: ‘geminstall --no-rdoc --no-ri gem_name’.

The gem and any of its specified dependencies will be downloaded and installed automatically.

15.3 Deploying a Ruby on Rails Application

To start using your own application with a Passenger-based Rails application:

1. Upload your application to your Rails application directory. For example, if you have an application, myapp,upload it to ~/webapps/rails_app/myapp where rails_app is the name of your Rails application as itappears in the WebFaction control panel.

2. Open an SSH session to your account.

3. Switch to the Rails application directory. Enter ‘cd ~/webapps/rails_app’ where rails_app is the nameof your Rails application, and press Enter.

4. Open ./nginx/conf/nginx.conf in a text editor.

5. Replace hello_world in the line containing ‘root /home/username/webapps/rails_app/hello_world/public’with the name of your Rails app’s directory. In the earlier example, the line would contain ‘root/home/username/webapps/rails_app/myapp/public’.

Note: You may now delete the provided hello_world directory.

6. Reboot your Rails application. Enter ./bin/restart and press Enter.

15.4 Using a Database with a Ruby on Rails Application

It’s easy to configure a MySQL or PostgreSQL for use with a Ruby on Rails application.

1. Create a database. (a) Use the WebFaction control panel to create a MySQL or PostgreSQL database.

See Also:

For step-by-step directions, see Create a New Database with the Control Panel.

(b) Make a note of the database name and password.

2. Install the Ruby database adapter gem. (a) Open an SSH session.

58 Chapter 15. Ruby on Rails

Page 63: WebFactionSoftwareDocumentation_prodyut

WebFaction Software Documentation, Release

(b) Switch to the directory of Ruby on Rails application. Enter ‘cd ~/webapps/application’,where application is the name of the application as it appears in the WebFaction control panel, andpress Enter.

(c) Set the PATH environment variable for the Rails application. Enter exportPATH=$PWD/bin:$PATH and press Enter.

(d) Set the GEM_HOME environment variable for the Rails application. Enter exportGEM_HOME=$PWD/gems and press Enter.

(e) Install the database adapter gem. For MySQL, enter gem install mysql and press Enter. ForPostgreSQL, enter gem install postgres.

3. Configure the Ruby on Rails project to use the MySQL database. (a) Switch to the directory of the Rubyon Rails project. Enter ‘cd project’, where project is the name of the project (for example,hello_world), and press Enter.

(b) Open config/database.yml in a text editor.

(c) Edit the production section:

production:adapter: sqlite3database: db/production.sqlite3pool: 5timeout: 5000

to this:

production:adapter: adapter_typedatabase: database_namehost: localhostusername: database_namepassword: database_password

such that

• adapter_type is either mysql for MySQL databases or postgresql for PostgreSQL databases,

• database_name is the name of the database as it appears in the WebFaction control panel,

• database_name is set to the name of the database as it appears in the WebFaction control paneland,

• database_password is the database password.

The Rails application is now configured and ready to use the specified database.

15.4. Using a Database with a Ruby on Rails Application 59

Page 64: WebFactionSoftwareDocumentation_prodyut

WebFaction Software Documentation, Release

60 Chapter 15. Ruby on Rails

Page 65: WebFactionSoftwareDocumentation_prodyut

CHAPTER

SIXTEEN

REDMINE

Redmine is an open source project management application.

16.1 Installing Redmine

To install Redmine:

1. Create a Redmine application. (a) Log in to the WebFaction control panel.

(b) Click Domains / websites→ Applications. The Apps list appears.

(c) Click the Add new ( ) button. The Add page appears.

(d) In the Name field, enter a name for the Redmine application.

(e) In the App type menu, click to select Passenger 2.2.8 (ngingx 0.7.64/Ruby Enterprise Edition1.8.7).

(f) Click the Create button. The View page appears with a confirmation message.

2. Create a website entry for the Redmine application. You may wish to add it to an existing website entry or createa new entry.

See Also:

Create a Website with the Control Panel

3. Create a database for Redmine. (a) Click Databases→ Create new database.

(b) In the Name field, enter a name for the database. The database name must be the account name orprefixed by the account name and an underscore.

(c) Click the Create button. The View page appears with a confirmation message.

(d) The confirmation message contains the database password. Make a note of the password; it will beneeded later.

4. Install the MySQL gem. (a) Open an SSH session.

(b) Switch to the Redmine application directory. Enter ‘cd ~/webapps/redmine_application’where redmine_application is the name of the Redmine application as it appears in the control panel,and press Enter.

(c) Enter export GEM_HOME=$PWD/gems and press Enter.

(d) Enter export PATH=$PWD/bin:$PATH and press Enter.

(e) Enter gem install mysql and press Enter.

61

Page 66: WebFactionSoftwareDocumentation_prodyut

WebFaction Software Documentation, Release

5. Download and install Redmine. (a) Download the Redmine archive. Enter wgethttp://rubyforge.org/frs/download.php/69449/redmine-0.9.3.tar.gzand press Enter. The Redmine archive will be downloaded to the current directory.

Note: Other versions of Redmine can be found at Redmine’s RubyForge page.

(b) Extract the Redmine archive. Enter tar -xf redmine-0.9.3.tar.gz and press Enter. Thefiles in the archive are extracted to the redmine-0.9.3 directory.

6. Configure Redmine. (a) Switch to the Redmine directory. Enter cd redmine-0.9.3 and press Enter.

(b) Create a copy of the example database configuration file. Enter cpconfig/database.yml.example config/database.yml and press Enter.

(c) Open config/database.yml in a text editor.

(d) In the production section of config/database.yml, edit database: redmine such that redmineis replaced with the name of the Redmine database as it appears in the control panel.

(e) In the production section of config/database.yml, edit username: root such that root is re-placed with the the name of the Redmine database as it appears in the control panel.

(f) In the production section of config/database.yml, append the database password to the linecontaining password:.

(g) Save and close the file.

(h) Enter RAILS_ENV=production rake config/initializers/session_store.rband press Enter.

(i) Enter RAILS_ENV=production rake db:migrate and press Enter.

(j) Enter RAILS_ENV=production rake redmine:load_default_data and press Enter.

(k) A prompt appears to select a language. Press Enter for English; otherwise, enter the two-charactercode for the language you prefer.

(l) Return to the parent directory. Enter cd .. and press Enter.

(m) Open nginx/conf/nginx.conf in a text editor.

(n) Replace hello_world with redmine-0.9.3.

(o) Save and close the file.

7. Restart the Passenger application. Enter ./bin/restart and press Enter.

The Redmine application may now be reached at the URL specified by the website entry created earlier in the process.You can login into the Redmine site with the username admin and the password admin. It is recommended that youchange this password as soon as possible.

16.2 Configuring Redmine to Send Email

To configure Redmine to send email:

1. Open an SSH session.

2. Switch to the Redmine application directory. Enter ‘cd ~/webapps/redmine_application’ whereredmine_application is the name of the Redmine application as it appears in the control panel, and press Enter.

3. Switch to the directory where the Redmine software itself is located (for example, redmine-0.9.3). Enter‘cd directory’ and press Enter.

62 Chapter 16. Redmine

Page 67: WebFactionSoftwareDocumentation_prodyut

WebFaction Software Documentation, Release

4. Create a copy of the email configuration file. Enter cp config/email.yml.exampleconfig/email.yml and press Enter.

5. Open config/email.yml in a text editor.

6. In the production section of the file (you may need to scroll past a very long comment block), make the followingchanges:

• replace address: smtp.example.net with address: smtp.webfaction.com,

• replace domain: example.net with ‘domain: email_domain’, where email_domain is the domainof the email address you will be sending from,

• replace user_name: “[email protected]” with ‘user_name: mailbox’ where mailbox is thename of a mailbox as it appears in the WebFaction control panel,

• replace password: “redmine” with ‘password: pass’, where pass is the password for the mailbox.

7. Save and close the file.

8. Restart the Passenger application. Enter ~/webapps/{application}/bin/restart where applicationis the name of the Redmine application as it appears in the control panel and press Enter.

16.2. Configuring Redmine to Send Email 63

Page 68: WebFactionSoftwareDocumentation_prodyut

WebFaction Software Documentation, Release

64 Chapter 16. Redmine

Page 69: WebFactionSoftwareDocumentation_prodyut

CHAPTER

SEVENTEEN

STATIC FILES, CGI SCRIPTS, AND PHPPAGES

Static applications host data which are served by the common Apache or nginx processes on the web server. Theseapplications are ideal for hosting style sheets, images, and other media.

17.1 Static-only

Static-only apps serve static files with the server’s nginx process. A Static-only app is exclusively static; PHP files, forexample, will not be interpreted in a Static-only app. We suggest Static-only apps when you need to serve static media(and only static media) fast with low memory consumption.

17.1.1 Serving Static Media

Even if most of your site is served dynamically by Django, Rails, TurboGears, or Zope (just to name a few), you willstill have many static elements, such as style sheets, images, and videos. If these elements are served by your dynamicprocess, they will consume unnecessary additional memory and time to serve. You can save memory and time byserving static files with a Static-only application.

To serve static media with a Static-only application:

1. With the control panel, create a Static-only application.

2. With the control panel, modify or create a website entry which maps an unused path from your domain name(e.g. ‘www.mydomain.com/media’) to your new Static-only application.

3. Wait up to two minutes for propagation of the new path and domain combination to complete.

4. Copy static media files to ~/webapps/static-only.

Now media served from the ‘/static/’ path of your website will be served by an nginx or Apache process, sparingyour dynamic application from serving those requests.

17.2 Static/CGI/PHP

Static/CGI/PHP apps, in addition to their role in serving static media, add the capacity to serve PHP pages, which areprocessed by the PHP interpreter on the server. Static/CGI/PHP apps should only be used when you need to make useof .htaccess files or PHP pages.

65

Page 70: WebFactionSoftwareDocumentation_prodyut

WebFaction Software Documentation, Release

17.2.1 Hiding Configuration Files

By default, files such as .htaccess and .htpasswd are exposed to the web. If you want to hide these files, addthese lines to your .htaccess file:

<Files ~ "^\.ht">Order allow,denyDeny from all

</Files>

17.2.2 Password Protecting a Directory with a Static/CGI/PHP App

You can password protect the contents of a Static/CGI/PHP application (or a subdirectory) by using a .htaccess file.

To enable password protection:

1. With the control panel, create a Static/CGI/PHP app or identify an existing Static/CGI/PHP app you would liketo use.

2. If necessary, create or modify a website entry which maps the Static/CGI/PHP app to a particular URL.

3. Open an SSH session into your account.

4. Switch to the ~/webapps/static_cgi_php_app/ directory.

5. Create a file named .htaccess with the following contents:

AuthUserFile /home/<your_username>/webapps/<webapp_name>/.htpasswdAuthName EnterPasswordAuthType Basicrequire valid-user

# Hide files starting with a dot (.htaccess and .htpasswd in particular)<Files .*>order allow,denydeny from all</Files>

6. Save and close the file.

7. To create the first user with access to the directory, enter ‘htpasswd -c .htpasswd username’ andpress Enter. A New password prompt appears.

8. Enter the password for the new user and press Enter. A Re-type new password prompt appears.

9. Re-enter the password for the new user and press Enter.

10. To create additional users with access to the directory, enter ‘htpasswd .htpasswd username’ and pressEnter, then follow the password prompts for the new user.

Note: If you would like to password protect a subdirectory, rather than the entire application, simply move.htaccess to the subdirectory.

Now, when you access the URL associated with the app’s protected directory, your browser will prompt you for ausername and password.

66 Chapter 17. Static Files, CGI Scripts, and PHP Pages

Page 71: WebFactionSoftwareDocumentation_prodyut

WebFaction Software Documentation, Release

17.2.3 Redirect a Domain with a Static/CGI/PHP App

You can use a Static/CGI/PHP app to redirect one domain to another by using Apache’s URL rewriting feature. Forexample, you can use a Static/CGI/PHP app to automatically redirect requests arriving at myolddomain.com towww.mynewdomain.com.

To redirect from origin_domain to destination_domain:

1. With the control panel, create a Static/CGI/PHP app.

2. With the control panel, create a website entry which maps the root of the domain to be redirected (e.g.‘http://origin_domain/’) to the Static/CGI/PHP app.

3. Open an SSH session.

4. Switch to the ~/webapps/static_app/ directory.

5. Create a file named .htaccess in the current directory.

6. Edit the file so that it contains the following:

Options +FollowSymLinksRewriteEngine onRewriteCond %{HTTP_HOST} ^origin_domain$ [NC]RewriteRule ^(.*)$ http://destination_domain/$1 [R=301,L]

Thus, the file to redirect myolddomain.com to www.mynewdomain.com would look like this:

Options +FollowSymLinksRewriteEngine onRewriteCond %{HTTP_HOST} ^myolddomain.com$ [NC]RewriteRule ^(.*)$ http://www.mynewdomain.com/$1 [R=301,L]

7. Save the file.

Now, all subsequent requests to a URL at origin_domain will be rewritten to corresponding URLs at destina-tion_domain.

17.2.4 Setting an Upload Limit

You can configure the maximum size of a file which may be uploaded by a PHP script. The configuration details varydepending on which server your PHP script is running.

web120 or Greater or dweb62 or Greater

On servers web120 or greater or dweb62 or greater, you can impose an upload limit with a php.ini file. To createor modify the file:

1. Oepn an SSH session.

2. Switch to your Static/CGI/PHP application directory. Enter cd ~/webapps/{application} where ap-plication is the name of your application, and press Enter.

3. Open php.ini in a text editor. If it does not already exist, create it.

4. Add these lines to the end of the file:

upload_max_filesize = XMpost_max_size = XM

17.2. Static/CGI/PHP 67

Page 72: WebFactionSoftwareDocumentation_prodyut

WebFaction Software Documentation, Release

where X is the maximum number of megabytes you want to allow to be uploaded.

5. Save and close the file.

Other Servers

On servers web119 or less or dweb61 or less, you can impose an upload limit with an .htaccess directive. To addthe directive:

1. Open an SSH session.

2. Switch to your Static/CGI/PHP application directory. Enter ‘cd ~/webapps/application’ where appli-cation is the name of your application, and press Enter.

3. Open .htaccess in a text editor. If it does not already exist, create it.

4. Edit the file to contain these lines:

<IfModule php5_module>php_value upload_max_filesize XMphp_value post_max_size XM

</IfModule>

where X is the maximum number of megabytes you want to allow to be allowed to be uploaded.

5. Save and close the file.

17.2.5 Setting PHP’s DOCUMENT_ROOT

If the DOCUMENT_ROOT needs to be set to a different value, the value may be changed with an .htaccess orphp.ini file, depending on which server is in use.

web120 or Greater or dweb62 or Greater

To set DOCUMENT_ROOT on web120 or greater and dweb62 or greater:

1. Open an SSH session.

2. Switch to your Static/CGI/PHP application directory. Enter ‘cd ~/webapps/application’ where appli-cation is the name of the application, and press Enter.

3. Open a new file, set_document_root.php, in a text editor.

4. Insert these lines:

<?php$_SERVER[’DOCUMENT_ROOT’] = ’/home/username/webapps/example_application’;

?>

where the string following the equal sign is the new value.

5. Save and close the file.

6. Open a new (or existing) php.ini file in the same directory.

7. Add a new line containing ‘auto_prepend_file = "/home/username/webapps/application/set_document_root.php"’.

8. Save and close the file.

68 Chapter 17. Static Files, CGI Scripts, and PHP Pages

Page 73: WebFactionSoftwareDocumentation_prodyut

WebFaction Software Documentation, Release

Other Servers

To set DOCUMENT_ROOT on all other servers:

1. Open an SSH session.

2. Switch to your Static/CGI/PHP application directory. Enter ‘cd ~/webapps/application’ where appli-cation is the name of the application, and press Enter.

3. Open a new file, set_document_root.php, in a text editor.

4. Insert these lines:

<?php$_SERVER[’DOCUMENT_ROOT’] = ’/home/username/webapps/example_application’;

?>

where the string following the equal sign is the new value.

5. Save and close the file.

6. Open a new (or existing) .htaccess file in the same directory.

7. Add these lines:

<IfModule php5_module>php_value auto_prepend_file "/home/username/webapps/my_app/set_document_root.php"

</IfModule>

8. Save and close the file.

17.3 Troubleshooting

17.3.1 Uploaded Files Owned by Apache

In some cases, files uploaded through PHP or WebDAV can become owned by the apache user and group. When filesare owned by apache, they cannot be modified in an SSH session or with SFTP.

To prevent this from happening, the setgid flag must be set on the directory where the files are being saved. Thiswill cause files saved in the directory to be owned by the same group as the directory itself—in other words, youruser—instead of apache‘s group.

To set the setgid flag for a directory:

1. Open an SSH session to your account.

2. Enter ‘chmod g+s directory’ where directory is the path to the directory where files are owned by apache,and press Enter.

17.3. Troubleshooting 69

Page 74: WebFactionSoftwareDocumentation_prodyut

WebFaction Software Documentation, Release

70 Chapter 17. Static Files, CGI Scripts, and PHP Pages

Page 75: WebFactionSoftwareDocumentation_prodyut

CHAPTER

EIGHTEEN

SUBVERSION

Subversion is a version control system. Like other version control systems, Subversion (also known as “svn”) allowsyou to track changes to files over time, to make it easier to combine multiple authors’ changes to files and to maintaina record of “known goood” revisions.

18.1 Send Email Notifications with a Post-Commit Hook

You can use Subversion’s post-commit hook to execute a script after a complete commit has taken place. In thisexample, you can send a notification email after each commit to your Subversion repository.

To create a post-commit hook to send an email notification:

1. Create the following script as a file named post-commit in the ~/webapps/svn_app/hooks directorysuch that

• from_addr is the address from which the notifications will be sent (this address must be created in thecontrol panel);

• dest_addrN are the destination addresses for the notification email;

• mailbox_name is the name of the WebFaction mailbox which will be used to send the email;

• mailbox_password is the password for the WebFaction mailbox which will be used to send the email.

#!/usr/local/bin/python2.5

# Settingsmail_server = ’smtp.webfaction.com’from_email = ’from_addr’to_email = [’dest_addr1’, ’dest_addr2’]mailbox_name = ’mailbox_name’mailbox_password = ’mailbox_password’

import osimport smtplibimport sys

server = smtplib.SMTP(mail_server)server.login(mailbox_name, mailbox_password)

repository, revision = sys.argv[1:]

# Get the diff from svnlookcmd = "svnlook diff %(repository)s -r %(revision)s" % locals()

71

Page 76: WebFactionSoftwareDocumentation_prodyut

WebFaction Software Documentation, Release

diff = os.popen(cmd).read()

msg = ("To: %(to_email)s\r\n""From: %(from_email)s\r\n""Subject: Subversion post-commit: r%(revision)s\r\n""Content-type: text/plain\r\n""\r\n""Repository: %(repository)s\r\n""Revision: %(revision)s\r\n""Diff:\r\n""%(diff)s\r\n")

msg = msg % locals()

server.sendmail(from_email, to_email, msg)server.quit()

2. Open an SSH session.

3. Switch to the ~/webapps/svn_app/hooks directory.

4. Enter chmod ogu+x post-commit and press Enter.

Now, every time a new change is committed to the repository, an email will be sent with a diff of the changes committedto the list of recipients.

18.2 Reusing Usernames and Passwords Between Subversion andTrac

Subversion and Trac use ~/webapps/application/.htpasswd, where application is the name of the applica-tion, to store usernames and passwords for authorized users. To use the same usernames and passwords between thetwo applications, create a symlink from one .htpasswd file to the other:

1. Open an SSH session to your account.

2. Delete one of the application’s (here called the secondary application) .htpasswd files. Enter ‘rm~/webapps/secondary_application/.htpasswd’ and press Enter.

3. Create a symlink from the primary application‘s .htpasswd file to the secondary applica-tion‘s .htpasswd location. Enter ‘ln -s ~/webapps/primary_application/.htpasswd~/webapps/secondary_applicaiton/.htpasswd’.

72 Chapter 18. Subversion

Page 77: WebFactionSoftwareDocumentation_prodyut

CHAPTER

NINETEEN

WORDPRESS

WordPress is a blog publishing application.

19.1 Getting Started Screencast

WebFaction has prepared a screencast to get you up and running with WordPress quickly.

You can watch it on YouTube.

19.1.1 Screencast Resources

In the screencast, we mentioned some useful resources. Here’s a handy list of hyperlinks from the screencast:

• [0:28] WordPress homepage

• [4:13] Pastebin

• [4:13] WebFaction User Guide > Databases

• [6:38] WordPress > Extend

• [6:43] Webfaction Forum

19.2 Sending Email from WordPress

You can send email messages from WordPress by using the Configure SMTP plugin. To use the Configure SMTPplugin:

Note: WebFaction includes the SMTP plugin by default with installations of WordPress create after October 2009. Ifyou’re using an older installation of WordPres, follow these steps to install the Configure SMTP plugin:

1. Open the WordPress site Log In page (for example, http://mydomain.com/wp-login.php) and log inwith the administrator account. The Dashboard page appears.

2. Click Plugins→ Add New.

3. Enter smtp in the Search field.

4. Click the Search Plugins button.

5. Find the Configure SMTP plugin in the list that appears.

6. Click the Install link at the end of the row. A dialog with additional information appears.

73

Page 78: WebFactionSoftwareDocumentation_prodyut

WebFaction Software Documentation, Release

7. Click Install Now.

1. Open the WordPress site Log In page (for example, http://mydomain.com/wp-login.php) and log inwith the administrator account. The Dashboard page appears.

2. Click Plugins.

3. Beneath Configure SMTP, click Activate.

4. Click Settings→ SMTP. The Configure SMTP Settings page appears.

5. In the SMTP host field, enter smtp.webfaction.com.

6. Enter 465 in the SMTP port field.

7. In the Secure connection prefix menu, click to select ssl.

8. Click to select Use SMTPAuth.

9. In the SMTP username field, enter your WebFaction mailbox name.

10. In the SMTP password field, enter your WebFaction mailbox password.

11. In the Sender name field, enter a display name for email messages sent by WordPress.

12. Click Save Changes.

WordPress will now be able to send email messages for notifications and other uses.

74 Chapter 19. WordPress

Page 79: WebFactionSoftwareDocumentation_prodyut

CHAPTER

TWENTY

INDICES AND TABLES

• Index

• Search Page

75