<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.mediagoblin.org/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Spaetz</id>
	<title>GNU MediaGoblin Wiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.mediagoblin.org/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Spaetz"/>
	<link rel="alternate" type="text/html" href="https://wiki.mediagoblin.org/Special:Contributions/Spaetz"/>
	<updated>2026-05-25T16:50:01Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.39.17</generator>
	<entry>
		<id>https://wiki.mediagoblin.org/index.php?title=GSOC_2013&amp;diff=1220</id>
		<title>GSOC 2013</title>
		<link rel="alternate" type="text/html" href="https://wiki.mediagoblin.org/index.php?title=GSOC_2013&amp;diff=1220"/>
		<updated>2013-04-04T10:17:41Z</updated>

		<summary type="html">&lt;p&gt;Spaetz: /* Document / presentation system */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;We are participating in [http://www.google-melange.com/gsoc/homepage/google/gsoc2013 GSOC 2013] (if we&#039;re accepted, that is!)&lt;br /&gt;
&lt;br /&gt;
To both students and mentors, please read up on the [http://www.google-melange.com/document/show/gsoc_program/google/gsoc2013/help_page GSOC 2013 help page]!&lt;br /&gt;
&lt;br /&gt;
= How do I apply as a student? =&lt;br /&gt;
&lt;br /&gt;
Well, we need to be accepted as a mentoring org first :)&lt;br /&gt;
&lt;br /&gt;
But then:&lt;br /&gt;
* Submit your application (details coming soon)&lt;br /&gt;
* [http://mediagoblin.org/pages/join.html Join us] on IRC and on our mailing lists.&lt;br /&gt;
* Set up a development environment via our [[HackingHowto]]&lt;br /&gt;
&lt;br /&gt;
It&#039;s important that you communicate... most MediaGoblin communication happens on IRC, so you should [http://webchat.freenode.net/?channels=mediagoblin join us there] and discuss (#mediagoblin on irc.freenode.net)!&lt;br /&gt;
&lt;br /&gt;
= Possible projects =&lt;br /&gt;
&lt;br /&gt;
Here are a list of projects that students may wish to apply for for GSOC 2013:&lt;br /&gt;
&lt;br /&gt;
== Blogging system ==&lt;br /&gt;
&lt;br /&gt;
We&#039;ve had an increasing number of people ask if MediaGoblin would be a useful blogging system.  The answer is that at present, it isn&#039;t: even though we support an ascii art media type, media types aren&#039;t really the right way to handle blogging since they don&#039;t really fit with the &amp;quot;gallery&amp;quot; style of editing things in MediaGoblin.&lt;br /&gt;
&lt;br /&gt;
But people are interested in something that&#039;s more along the lines of Tumblr: a blogging platform with good media embedding integration.  In many ways, MediaGoblin is perfect for this!&lt;br /&gt;
&lt;br /&gt;
Some thoughts:&lt;br /&gt;
&lt;br /&gt;
* Blogs might go at /u/foo-user/b/ and individual blogposts at /u/foo-user/b/blogpost-slug/&lt;br /&gt;
* Blogging should be a plugin&lt;br /&gt;
* HTML with something like TinyMCE integration would be good.  HTML would need to be cleaned on the backend.&lt;br /&gt;
* Maybe other types would be allowed (markdown, restructured text) though I&#039;m not sure how much more complex that makes cleaning HTML output.&lt;br /&gt;
* What about commenting?  Would we need a seaparate comments table?&lt;br /&gt;
&lt;br /&gt;
Possible Mentor: spaetz&lt;br /&gt;
&lt;br /&gt;
== Document / presentation system ==&lt;br /&gt;
&lt;br /&gt;
There&#039;s some work toward a [http://issues.mediagoblin.org/ticket/391 document type] in MediaGoblin, but to get a *really nice* document type, it might take some work.&lt;br /&gt;
&lt;br /&gt;
* Conversion from various documents to PDF via libreoffice on the backend&lt;br /&gt;
* On-page reading with pdf.js&lt;br /&gt;
* Preservation of original file, with ability to download&lt;br /&gt;
* Other things???&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Possible mentors:&#039;&#039;&#039; Spaetz, Nathan Yergler, Aeva NTSC&lt;br /&gt;
&lt;br /&gt;
== Pluggable user authentication &amp;amp; implementations ==&lt;br /&gt;
&lt;br /&gt;
We&#039;d like a pluggable user authentication module.  Some people want to use things like LDAP.  Some people would also like BrowserID integration.&lt;br /&gt;
&lt;br /&gt;
With our new work toward pluginification it would be good to see the structure for user authentication to be interface&#039;ified.  It would also be good to have implementation for several types of logins such as BrowserID, LDAP, and central authentication system stuff.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Possible mentors:&#039;&#039;&#039; Nathan Yergler, Joar Wandborg&lt;br /&gt;
&lt;br /&gt;
== Administrative interface / moderation tools ==&lt;br /&gt;
&lt;br /&gt;
At present there isn&#039;t much as in terms of tooling to deal with things as an administrator.  Several things would be greatly of help to admins at present:&lt;br /&gt;
&lt;br /&gt;
* Views to search for users and take actions upon them&lt;br /&gt;
* Tools to deal with handling problematic content/users&lt;br /&gt;
* More generalized panel for looking at things being processed&lt;br /&gt;
* ???&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Possible mentors:&#039;&#039;&#039; --[[User:Copiesofcopies|Copiesofcopies]] ([[User talk:Copiesofcopies|talk]]) 15:02, 1 April 2013 (EDT), Joar Wandborg&lt;br /&gt;
&lt;br /&gt;
== Processing panel improvements ==&lt;br /&gt;
&lt;br /&gt;
While media is being uploaded, there&#039;s not very good and clear indications of this, though we have some basics.&lt;br /&gt;
&lt;br /&gt;
* Show the number of entries that are currently in processing in the dropdown user panel at the top of mediagoblin instances&lt;br /&gt;
* In media entries that are currently in progress, give clearer information about amount of work left?  (Note, showing percentages might be hard)&lt;br /&gt;
* Nicer looking demonstrations of what failed.&lt;br /&gt;
&lt;br /&gt;
Note: this one might require a lot of graphic design and discussion; anyone interested in it would have to work closely with people on IRC before submitting a real proposal.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Possible mentors:&#039;&#039;&#039; --[[User:Copiesofcopies|Copiesofcopies]] ([[User talk:Copiesofcopies|talk]]) 15:03, 1 April 2013 (EDT), Joar Wandborg&lt;br /&gt;
&lt;br /&gt;
== Pluginifying media types ==&lt;br /&gt;
&lt;br /&gt;
Media types currently have their own way of being configured separately.  It would be good to be able to make them into bona-fide plugins (if anything with some special case metadata).  This will also allow media types to define things like special-case views, etc.&lt;br /&gt;
&lt;br /&gt;
Possible mentors: --[[User:Copiesofcopies|Copiesofcopies]] ([[User talk:Copiesofcopies|talk]]) 15:02, 1 April 2013 (EDT), Joar Wandborg&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Possible mentors:&#039;&#039;&#039; Joar Wandborg&lt;br /&gt;
&lt;br /&gt;
== User upload account limits ==&lt;br /&gt;
&lt;br /&gt;
It would be great to have the ability to set limits on the amount of stuff people can upload.  This would involve both hooks to track the space of media as it&#039;s saved (maybe this should be fairly core?) as well as the ability to refuse an upload because a limit has been already hit.  Tools to change limits would also be good, especially via an administrative interface and ./bin/gmg&lt;br /&gt;
&lt;br /&gt;
--[[User:Joar|Joar]] ([[User talk:Joar|talk]]) 07:41, 30 March 2013 (EDT) &amp;lt;code&amp;gt;mediagoblin.storage.StorageInterface&amp;lt;/code&amp;gt; should probably implement a &amp;lt;code&amp;gt;get_size&amp;lt;/code&amp;gt; method or similar.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Possible mentors:&#039;&#039;&#039; Joar Wandborg&lt;br /&gt;
&lt;br /&gt;
== Search interface ==&lt;br /&gt;
&lt;br /&gt;
We don&#039;t have any sort of search for media whatsoever at present.  Obviously people want this!&lt;br /&gt;
&lt;br /&gt;
There&#039;s been some discussion of a search interface that would be federated, but for the scope of this, we don&#039;t need to worry about that.  It would be enough to investigate a search engine that would allow for searching across the subjects/titles/descriptions of media.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Possible mentors:&#039;&#039;&#039; Nathan Yergler, Aeva NTSC&lt;br /&gt;
&lt;br /&gt;
== Media type reprocessing framework ==&lt;br /&gt;
&lt;br /&gt;
This one is tricky!  Basically, allowing media to go back into processing... ie, resizing an image to a new size, re-transcoding video, etc.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Possible mentors:&#039;&#039;&#039; Joar Wandborg&lt;/div&gt;</summary>
		<author><name>Spaetz</name></author>
	</entry>
	<entry>
		<id>https://wiki.mediagoblin.org/index.php?title=GSOC_2013&amp;diff=1219</id>
		<title>GSOC 2013</title>
		<link rel="alternate" type="text/html" href="https://wiki.mediagoblin.org/index.php?title=GSOC_2013&amp;diff=1219"/>
		<updated>2013-04-04T10:17:17Z</updated>

		<summary type="html">&lt;p&gt;Spaetz: /* Blogging system */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;We are participating in [http://www.google-melange.com/gsoc/homepage/google/gsoc2013 GSOC 2013] (if we&#039;re accepted, that is!)&lt;br /&gt;
&lt;br /&gt;
To both students and mentors, please read up on the [http://www.google-melange.com/document/show/gsoc_program/google/gsoc2013/help_page GSOC 2013 help page]!&lt;br /&gt;
&lt;br /&gt;
= How do I apply as a student? =&lt;br /&gt;
&lt;br /&gt;
Well, we need to be accepted as a mentoring org first :)&lt;br /&gt;
&lt;br /&gt;
But then:&lt;br /&gt;
* Submit your application (details coming soon)&lt;br /&gt;
* [http://mediagoblin.org/pages/join.html Join us] on IRC and on our mailing lists.&lt;br /&gt;
* Set up a development environment via our [[HackingHowto]]&lt;br /&gt;
&lt;br /&gt;
It&#039;s important that you communicate... most MediaGoblin communication happens on IRC, so you should [http://webchat.freenode.net/?channels=mediagoblin join us there] and discuss (#mediagoblin on irc.freenode.net)!&lt;br /&gt;
&lt;br /&gt;
= Possible projects =&lt;br /&gt;
&lt;br /&gt;
Here are a list of projects that students may wish to apply for for GSOC 2013:&lt;br /&gt;
&lt;br /&gt;
== Blogging system ==&lt;br /&gt;
&lt;br /&gt;
We&#039;ve had an increasing number of people ask if MediaGoblin would be a useful blogging system.  The answer is that at present, it isn&#039;t: even though we support an ascii art media type, media types aren&#039;t really the right way to handle blogging since they don&#039;t really fit with the &amp;quot;gallery&amp;quot; style of editing things in MediaGoblin.&lt;br /&gt;
&lt;br /&gt;
But people are interested in something that&#039;s more along the lines of Tumblr: a blogging platform with good media embedding integration.  In many ways, MediaGoblin is perfect for this!&lt;br /&gt;
&lt;br /&gt;
Some thoughts:&lt;br /&gt;
&lt;br /&gt;
* Blogs might go at /u/foo-user/b/ and individual blogposts at /u/foo-user/b/blogpost-slug/&lt;br /&gt;
* Blogging should be a plugin&lt;br /&gt;
* HTML with something like TinyMCE integration would be good.  HTML would need to be cleaned on the backend.&lt;br /&gt;
* Maybe other types would be allowed (markdown, restructured text) though I&#039;m not sure how much more complex that makes cleaning HTML output.&lt;br /&gt;
* What about commenting?  Would we need a seaparate comments table?&lt;br /&gt;
&lt;br /&gt;
Possible Mentor: spaetz&lt;br /&gt;
&lt;br /&gt;
== Document / presentation system ==&lt;br /&gt;
&lt;br /&gt;
There&#039;s some work toward a [http://issues.mediagoblin.org/ticket/391 document type] in MediaGoblin, but to get a *really nice* document type, it might take some work.&lt;br /&gt;
&lt;br /&gt;
* Conversion from various documents to PDF via libreoffice on the backend&lt;br /&gt;
* On-page reading with pdf.js&lt;br /&gt;
* Preservation of original file, with ability to download&lt;br /&gt;
* Other things???&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Possible mentors:&#039;&#039;&#039; Nathan Yergler, Aeva NTSC&lt;br /&gt;
&lt;br /&gt;
== Pluggable user authentication &amp;amp; implementations ==&lt;br /&gt;
&lt;br /&gt;
We&#039;d like a pluggable user authentication module.  Some people want to use things like LDAP.  Some people would also like BrowserID integration.&lt;br /&gt;
&lt;br /&gt;
With our new work toward pluginification it would be good to see the structure for user authentication to be interface&#039;ified.  It would also be good to have implementation for several types of logins such as BrowserID, LDAP, and central authentication system stuff.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Possible mentors:&#039;&#039;&#039; Nathan Yergler, Joar Wandborg&lt;br /&gt;
&lt;br /&gt;
== Administrative interface / moderation tools ==&lt;br /&gt;
&lt;br /&gt;
At present there isn&#039;t much as in terms of tooling to deal with things as an administrator.  Several things would be greatly of help to admins at present:&lt;br /&gt;
&lt;br /&gt;
* Views to search for users and take actions upon them&lt;br /&gt;
* Tools to deal with handling problematic content/users&lt;br /&gt;
* More generalized panel for looking at things being processed&lt;br /&gt;
* ???&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Possible mentors:&#039;&#039;&#039; --[[User:Copiesofcopies|Copiesofcopies]] ([[User talk:Copiesofcopies|talk]]) 15:02, 1 April 2013 (EDT), Joar Wandborg&lt;br /&gt;
&lt;br /&gt;
== Processing panel improvements ==&lt;br /&gt;
&lt;br /&gt;
While media is being uploaded, there&#039;s not very good and clear indications of this, though we have some basics.&lt;br /&gt;
&lt;br /&gt;
* Show the number of entries that are currently in processing in the dropdown user panel at the top of mediagoblin instances&lt;br /&gt;
* In media entries that are currently in progress, give clearer information about amount of work left?  (Note, showing percentages might be hard)&lt;br /&gt;
* Nicer looking demonstrations of what failed.&lt;br /&gt;
&lt;br /&gt;
Note: this one might require a lot of graphic design and discussion; anyone interested in it would have to work closely with people on IRC before submitting a real proposal.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Possible mentors:&#039;&#039;&#039; --[[User:Copiesofcopies|Copiesofcopies]] ([[User talk:Copiesofcopies|talk]]) 15:03, 1 April 2013 (EDT), Joar Wandborg&lt;br /&gt;
&lt;br /&gt;
== Pluginifying media types ==&lt;br /&gt;
&lt;br /&gt;
Media types currently have their own way of being configured separately.  It would be good to be able to make them into bona-fide plugins (if anything with some special case metadata).  This will also allow media types to define things like special-case views, etc.&lt;br /&gt;
&lt;br /&gt;
Possible mentors: --[[User:Copiesofcopies|Copiesofcopies]] ([[User talk:Copiesofcopies|talk]]) 15:02, 1 April 2013 (EDT), Joar Wandborg&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Possible mentors:&#039;&#039;&#039; Joar Wandborg&lt;br /&gt;
&lt;br /&gt;
== User upload account limits ==&lt;br /&gt;
&lt;br /&gt;
It would be great to have the ability to set limits on the amount of stuff people can upload.  This would involve both hooks to track the space of media as it&#039;s saved (maybe this should be fairly core?) as well as the ability to refuse an upload because a limit has been already hit.  Tools to change limits would also be good, especially via an administrative interface and ./bin/gmg&lt;br /&gt;
&lt;br /&gt;
--[[User:Joar|Joar]] ([[User talk:Joar|talk]]) 07:41, 30 March 2013 (EDT) &amp;lt;code&amp;gt;mediagoblin.storage.StorageInterface&amp;lt;/code&amp;gt; should probably implement a &amp;lt;code&amp;gt;get_size&amp;lt;/code&amp;gt; method or similar.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Possible mentors:&#039;&#039;&#039; Joar Wandborg&lt;br /&gt;
&lt;br /&gt;
== Search interface ==&lt;br /&gt;
&lt;br /&gt;
We don&#039;t have any sort of search for media whatsoever at present.  Obviously people want this!&lt;br /&gt;
&lt;br /&gt;
There&#039;s been some discussion of a search interface that would be federated, but for the scope of this, we don&#039;t need to worry about that.  It would be enough to investigate a search engine that would allow for searching across the subjects/titles/descriptions of media.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Possible mentors:&#039;&#039;&#039; Nathan Yergler, Aeva NTSC&lt;br /&gt;
&lt;br /&gt;
== Media type reprocessing framework ==&lt;br /&gt;
&lt;br /&gt;
This one is tricky!  Basically, allowing media to go back into processing... ie, resizing an image to a new size, re-transcoding video, etc.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Possible mentors:&#039;&#039;&#039; Joar Wandborg&lt;/div&gt;</summary>
		<author><name>Spaetz</name></author>
	</entry>
	<entry>
		<id>https://wiki.mediagoblin.org/index.php?title=Translations&amp;diff=1018</id>
		<title>Translations</title>
		<link rel="alternate" type="text/html" href="https://wiki.mediagoblin.org/index.php?title=Translations&amp;diff=1018"/>
		<updated>2012-12-05T08:27:13Z</updated>

		<summary type="html">&lt;p&gt;Spaetz: /* For translators */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= For translators =&lt;br /&gt;
&lt;br /&gt;
It is very easy to add or complete the translation of MediaGoblin! We use the web interface provided by Transifex.net to do the translations. You can see the current status of the translations per language [https://www.transifex.net/projects/p/mediagoblin/resource/mediagoblin/ here].&lt;br /&gt;
&lt;br /&gt;
To start translating, just:&lt;br /&gt;
&lt;br /&gt;
# click on your language in [https://www.transifex.net/projects/p/mediagoblin/resource/mediagoblin/ that list] then&lt;br /&gt;
# click on &amp;quot;Translate now&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
By default, Transifex only shows you strings that currently have no translation. There is a checkbox to enable the display of already translated strings, in case you want to improve any of them.&lt;br /&gt;
There are no translation teams, so you can just edit the strings (but try to be nice and consistent with the current translation). If you are a regular contributor to the translations, you might want to add some notes to the [[#Notes for some language teams|per-language section on this page]] to coordinate consistent translations.&lt;br /&gt;
&lt;br /&gt;
Note: please don&#039;t translate the words &amp;quot;MediaGoblin&amp;quot; or &amp;quot;GNU&amp;quot; into your native language.  Those words should be retained as-is for branding reasons. :)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Notes for some language teams ==&lt;br /&gt;
=== German ===&lt;br /&gt;
&lt;br /&gt;
Interessante Hinweise zur Übersetzung finden sich bei Gnome:&lt;br /&gt;
* http://live.gnome.org/de/UebersetzungsRichtlinien&lt;br /&gt;
&lt;br /&gt;
In Abweichung von diesen Richtlinien wird momentan &amp;quot;Du&amp;quot; für die Anrede benutzt. &amp;quot;Du&amp;quot; und &amp;quot;Deine&amp;quot; werden groß geschrieben. Benutze die folgenden Begriffe um konsistent zu bleiben:&lt;br /&gt;
&lt;br /&gt;
 Benutzerkonto/Nutzerkonto, E-Mail, E-Mail-Adresse, Aktivierungsmail, Konto &amp;quot;aktivieren&amp;quot; (verify email), Album (collection), Kurztitel (slug)&lt;br /&gt;
&lt;br /&gt;
=== Spanish ===&lt;br /&gt;
&lt;br /&gt;
Se está adoptando la siguiente convención para la traducción al español. Si crees que alguna traducción se puede mejorar, sugiérela en la página de discusión de este artículo.&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
!Inglés&lt;br /&gt;
!Español&lt;br /&gt;
!Comentarios&lt;br /&gt;
|-&lt;br /&gt;
|you&lt;br /&gt;
|tú&lt;br /&gt;
|(segunda persona del singular, expresión informal)&lt;br /&gt;
|-&lt;br /&gt;
|media&lt;br /&gt;
|contenido&lt;br /&gt;
|-&lt;br /&gt;
|slug&lt;br /&gt;
|ficha&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Fixing translations from transifex==&lt;br /&gt;
&lt;br /&gt;
= For developers =&lt;br /&gt;
== Marking strings for translation ==&lt;br /&gt;
=== In Jinja2 ===&lt;br /&gt;
&lt;br /&gt;
See: http://jinja.pocoo.org/docs/templates/#i18n&lt;br /&gt;
&lt;br /&gt;
Mostly like Django template i18n support, if you have any experience with that.&lt;br /&gt;
&lt;br /&gt;
=== In python code ===&lt;br /&gt;
&lt;br /&gt;
Usually, like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
from mediagoblin.util import pass_to_ugettext as _&lt;br /&gt;
&lt;br /&gt;
def some_func(something):&lt;br /&gt;
    return _(u&#039;This string would tooootally be translatable now.&#039;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Except, in form modules we don&#039;t actually want to translate things because for various reasons that doesn&#039;t work, so we do the translation call template-side.  So write the module to use the fake ugettext passthrough (which doesn&#039;t do any translation but still wraps things in _() so that Babel will know to extract these strings):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
from mediagoblin.util import fake_ugettext_passthrough as _&lt;br /&gt;
&lt;br /&gt;
class FunkyMonkeyForm(wtforms.Form):&lt;br /&gt;
    funky = wtforms.TextAreaField(&lt;br /&gt;
            _(&#039;Funkiness description&#039;))&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Extracting translations ==&lt;br /&gt;
&lt;br /&gt;
If you run buildout it should create a script called &#039;pybabel&#039;.  Use it to extract translations like so:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
./bin/pybabel extract -F babel.ini -o mediagoblin/i18n/en/LC_MESSAGES/mediagoblin.po .&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Compiling translations ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
./bin/pybabel compile -D mediagoblin -d mediagoblin/i18n/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Pulling translations from Transifex ==&lt;br /&gt;
&lt;br /&gt;
Unfortunately until the next release of transifex-client which has been patched to have proper entry points, you have to run transifex-client from a virtualenv or from site-packages.  But assuming that&#039;s done, pulling translations is easy:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
tx pull -a&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Pushing new translations to Transifex ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
tx push -s&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Troubleshooting =&lt;br /&gt;
&lt;br /&gt;
Got an error on Transifex like:&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Translation must start with a newline (\n)&amp;quot;?&lt;br /&gt;
&lt;br /&gt;
The problem here is when we have something like:&lt;br /&gt;
&lt;br /&gt;
        {% trans register_url=request.urlgen(&#039;mediagoblin.auth.register&#039;) %}&lt;br /&gt;
          &amp;lt;a class=&amp;quot;header_submit_highlight&amp;quot; href=&amp;quot;{{ register_url }}&amp;quot;&amp;gt;Create a free account&amp;lt;/a&amp;gt;&lt;br /&gt;
          or&lt;br /&gt;
          &amp;lt;a class=&amp;quot;header_submit&amp;quot; href=&amp;quot;http://wiki.mediagoblin.org/HackingHowto&amp;quot;&amp;gt;Set up MediaGoblin on your own server&amp;lt;/a&amp;gt;&lt;br /&gt;
        {% endtrans %}&lt;br /&gt;
&lt;br /&gt;
instead of:&lt;br /&gt;
&lt;br /&gt;
        {% trans register_url=request.urlgen(&#039;mediagoblin.auth.register&#039;) -%}&lt;br /&gt;
          &amp;lt;a class=&amp;quot;header_submit_highlight&amp;quot; href=&amp;quot;{{ register_url }}&amp;quot;&amp;gt;Create a free account&amp;lt;/a&amp;gt;&lt;br /&gt;
          or&lt;br /&gt;
          &amp;lt;a class=&amp;quot;header_submit&amp;quot; href=&amp;quot;http://wiki.mediagoblin.org/HackingHowto&amp;quot;&amp;gt;Set up MediaGoblin on your own server&amp;lt;/a&amp;gt;&lt;br /&gt;
        {%- endtrans %}&lt;br /&gt;
&lt;br /&gt;
The distinction might not be obvious... look for the %} versus -%} and {% versus {%- on the first and last lines.  The thing about this is this tells Jinja2 to strip the whitespace.  Without that, Transifex sees that there&#039;s a &amp;quot;\n&amp;quot; on the first line of the original but not on the future translation, and gets upset.&lt;br /&gt;
&lt;br /&gt;
If this happens the template should be updated to strip whitespace and translations should be pushed to transifex.&lt;/div&gt;</summary>
		<author><name>Spaetz</name></author>
	</entry>
	<entry>
		<id>https://wiki.mediagoblin.org/index.php?title=Main_Page&amp;diff=1017</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://wiki.mediagoblin.org/index.php?title=Main_Page&amp;diff=1017"/>
		<updated>2012-12-05T08:19:27Z</updated>

		<summary type="html">&lt;p&gt;Spaetz: /* Translate MediaGoblin */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Want to Join the MediaGoblin Community? =&lt;br /&gt;
&lt;br /&gt;
We’re really glad that you want to join the MediaGoblin community!&lt;br /&gt;
&lt;br /&gt;
There are a variety of ways to help and support MediaGoblin and to join the team.  If you want to code, great, if not, even better!  MediaGoblin interested contributors in many different roles: users, system administrators, technical writers, testers, evangelists, UI/UX and graphics designers, cheerleaders, and dreamers.&lt;br /&gt;
&lt;br /&gt;
This wiki covers a variety of ways that you can get involved with MediaGoblin as well as instructions on how to get started.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Hang out with the MediaGoblin folk ==&lt;br /&gt;
&lt;br /&gt;
MediaGoblin has a mailing list and an IRC channel where we hang out.  See [http://mediagoblin.org/pages/join.html our join page] for links.&lt;br /&gt;
&lt;br /&gt;
Please drop by and say “Hi!”  And, if you’re looking for something to do, just ask---there’s always work to be done.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Take Part in the Monthly Meetings ==&lt;br /&gt;
&lt;br /&gt;
Each month is a [[Meeting]]. You can take part and help decide on the future of MediaGoblin. Or just be around and see what&#039;s happening live!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== File Bugs / Triage Bugs ==&lt;br /&gt;
&lt;br /&gt;
Issue reports are critical for all projects.  Identified bugs give developers a basis for beginning work, and providing an idea of what features and issues are most important to users and the overall usability of the software.  If you identify errors, flaws, unexpected behaviors, or deficits that impede use, file a bug.&lt;br /&gt;
&lt;br /&gt;
* [[File Bugs]] -- notes on filing new bugs/issues/feature requests&lt;br /&gt;
* [[Feature Ideas]] -- notes on possible features&lt;br /&gt;
* [[Triage Bugs]] -- notes on triaging&lt;br /&gt;
* [[BugTriageDay]] -- every other Thursday is bug triage day where anyone can help out triaging bugs&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Write Code / Fix Code ==&lt;br /&gt;
&lt;br /&gt;
If you are a coder and you would like to write code, the repository is hosted on gitorious. Clone or fork the repository and start poking around. Become familiar with this manual for an overview of how the software works and is used. Consider the contributor wiki for more information about the project, our preferred methods, and guides for developing MediaGoblin. We even have tips on becoming a coder and we’re willing to help!&lt;br /&gt;
&lt;br /&gt;
* [[HackingHowto|Hacking]] - notes on making and sending in code contributions&lt;br /&gt;
** [[BeginnersCorner|Beginner&#039;s Corner]] - resources for those who are new to Python or Git.&lt;br /&gt;
** &#039;&#039;Started from an older version of the Hacking Howto?  We switched from buildout-&amp;gt;virtualenv, so look at [[Moving from buildout to virtualenv]] for information on how to move over.&#039;&#039;&lt;br /&gt;
* [[Git workflow]] - How to go about submitting patches via git.&lt;br /&gt;
* [[Templating]] - How our templating structure is set up&lt;br /&gt;
* [[Code overview]] - Overview of the structure of the codebase&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Send Encouragement / Spread the Word ==&lt;br /&gt;
&lt;br /&gt;
Sometimes, a nice word, simple encouragement, and interest in the work we’re doing is enough to inspire a tizzy of productive work.  Just a bit more interest and encouragement can even make the difference between a complete feature and limited functionality; between a completed milestone and lost momentum.&lt;br /&gt;
&lt;br /&gt;
Similarly, MediaGoblin, and the movement for free network services, is always in need of encouragement.  Use free network services, understand the principals behind the movement, be able to articulate the benefits of free network services and the problems with psudo-free applications that don’t respect the users’ freedom.&lt;br /&gt;
&lt;br /&gt;
Write a blog post, post a status update, drop by the listserv or join #mediagoblin on freenode.net and let us know.  See [http://mediagoblin.org/join/ our join page] for links.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Write Documentation / Edit Documentation ==&lt;br /&gt;
&lt;br /&gt;
* [[Documentation quick start]] - How to contribute to the documentation effort.&lt;br /&gt;
* [[ManualStandards]] - covers the standards for writing the user manual (forthcoming.) &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Test MediaGoblin ==&lt;br /&gt;
&lt;br /&gt;
Do you have access to the web? Do you like sharing your opinions? If so, we need your help to test MediaGoblin! Testers play around with the current test instance, note what operating system and browser they use (notes on multiple set-ups are also helpful) and take some notes. That&#039;s it! It&#039;s a very important task that doesn&#039;t require any special knowledge and you&#039;re done in under an hour. Ready to help?  &lt;br /&gt;
&lt;br /&gt;
* [[User Experience]] - user experience testing.  Includes link to an instance you can try!&lt;br /&gt;
* [[UnitTests|Unit Tests]] - all about the unit tests&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Translate MediaGoblin ==&lt;br /&gt;
&lt;br /&gt;
If you know English and another language and feel comfortable translating elements of the interface or even the documentation, we’d love to have help translating the software and resources.&lt;br /&gt;
Translating MediaGoblin is very easy with a web interface, so there is no programming knowledge required at all.&lt;br /&gt;
&lt;br /&gt;
* [[Translations]] - How to translate stuff or update the translations&lt;br /&gt;
&lt;br /&gt;
== Become a User ==&lt;br /&gt;
&lt;br /&gt;
Coming soon!&lt;br /&gt;
&lt;br /&gt;
We’re building MediaGoblin for us and for you but really you’re one of us and I am you and we are we and MediaGoblin is the walrus.&lt;br /&gt;
&lt;br /&gt;
We&#039;re planning to launch our own public instance of MediaGoblin in the near future--probably in the September/October 2011 time frame.  When we do, sign up for an account, use the service and relish in the thought that this service comes with a heaping side of Freedom and you can salt and pepper it to your liking.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Help Others ==&lt;br /&gt;
&lt;br /&gt;
Have you spent time with MediaGoblin?  If so, your experience and wisdom are invaluable and you’re the best person we can think of to help other users with their questions.&lt;br /&gt;
&lt;br /&gt;
Hang out on the IRC channel and help answer new peoples&#039; questions.  See [http://mediagoblin.org/join/ our join page] for links.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Run your own MediaGoblin Instance ==&lt;br /&gt;
&lt;br /&gt;
Are there things about our instance you want to change?  Are there things about other instances you wish were different?  Want to test upcoming changes?  Want to create patches to implement things you need?  That’s great—you can run your own instance!&lt;br /&gt;
&lt;br /&gt;
* [[Configure_MediaGoblin|Configuration]] - Learn about MediaGoblin configuration files and file options.&lt;br /&gt;
* [[Deployment]] - General deployment advice&lt;br /&gt;
* [[Scaling Down]] - Minimizing MediaGoblin&#039;s resource requirements&lt;br /&gt;
* [[Virtual Machine Hosting]] - Deploy your own publicly available MediaGoblin server using [http://aws.amazon.com/free/?utm_source=adwords&amp;amp;utm_medium=cpc&amp;amp;utm_campaign=CPC_Google_AWS_ec2&amp;amp;utm_content=TextV01_PP_V01_EC2&amp;amp;trk=CPC_Google_AWS_ec2 Amazon&#039;s free EC2 tier].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Create a Theme ==&lt;br /&gt;
&lt;br /&gt;
Coming soon!&lt;br /&gt;
&lt;br /&gt;
MedaGoblin development is premised on the idea that the entire interface for the platform be completely theme-able.  If you have a design or theming background, consider developing themes for MediaGoblin.  New themes help test the theming system, provide attractive and appealing interfaces for prospective users.  If you want to start a new theme but don’t know where to start, touch base with the development community on the list or in the IRC channel for more information.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Technical project documentation =&lt;br /&gt;
&lt;br /&gt;
* [[DesignDecisions]] - covers design decisions (FIXME - this needs to be split up)&lt;br /&gt;
* [[Storage]] - How MediaGoblin&#039;s internal storage system works.&lt;br /&gt;
* [[Processing]] - What happens after you submit your image/video/etc?  Processing!  More about that.&lt;br /&gt;
* [https://gitorious.org/mediagoblin/mediagoblin/blobs/master/extlib/README External Library Policy] - covers use of external libraries&lt;br /&gt;
* [[User:Cwebber/braindumps]] - Chris Webber&#039;s braindumps (you can help refactoring these into real sections of the site!)&lt;br /&gt;
* [[Multiple media support]] - Design plan for multiple media support&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Inner workings of the secret sanctum =&lt;br /&gt;
&lt;br /&gt;
* [[IRCBot]] - covers our irc bot&lt;br /&gt;
* [[ReleaseProcess|Release Process]] - covers the release process&lt;br /&gt;
* [[Update the website]] - Learn how to update mediagoblin.org!&lt;/div&gt;</summary>
		<author><name>Spaetz</name></author>
	</entry>
	<entry>
		<id>https://wiki.mediagoblin.org/index.php?title=Translations&amp;diff=1016</id>
		<title>Translations</title>
		<link rel="alternate" type="text/html" href="https://wiki.mediagoblin.org/index.php?title=Translations&amp;diff=1016"/>
		<updated>2012-12-05T08:15:35Z</updated>

		<summary type="html">&lt;p&gt;Spaetz: /* German */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= For translators =&lt;br /&gt;
&lt;br /&gt;
You can translate our tools at Transifex:&lt;br /&gt;
&lt;br /&gt;
https://www.transifex.net/projects/p/mediagoblin/resource/mediagoblin/&lt;br /&gt;
&lt;br /&gt;
To translate, click on your language on the list, and then click on &amp;quot;Translate now&amp;quot;. By default, Transifex only shows you strings that currently have no translation. There is a checkbox to enable display of the translated strings, in case you can fix any of them.&lt;br /&gt;
&lt;br /&gt;
We are currently using no translation teams, so you can just edit the strings (but try to be nice and consistent with the current translation).&lt;br /&gt;
&lt;br /&gt;
Note: please don&#039;t translate the words &amp;quot;MediaGoblin&amp;quot; or &amp;quot;GNU&amp;quot; into your native language.  Those words should be retained as-is for branding reasons. :)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Notes for some language teams ==&lt;br /&gt;
=== German ===&lt;br /&gt;
&lt;br /&gt;
Interessante Hinweise zur Übersetzung finden sich bei Gnome:&lt;br /&gt;
* http://live.gnome.org/de/UebersetzungsRichtlinien&lt;br /&gt;
&lt;br /&gt;
In Abweichung von diesen Richtlinien wird momentan &amp;quot;Du&amp;quot; für die Anrede benutzt. &amp;quot;Du&amp;quot; und &amp;quot;Deine&amp;quot; werden groß geschrieben. Benutze die folgenden Begriffe um konsistent zu bleiben:&lt;br /&gt;
&lt;br /&gt;
 Benutzerkonto/Nutzerkonto, E-Mail, E-Mail-Adresse, Aktivierungsmail, Konto &amp;quot;aktivieren&amp;quot; (verify email), Album (collection), Kurztitel (slug)&lt;br /&gt;
&lt;br /&gt;
=== Spanish ===&lt;br /&gt;
&lt;br /&gt;
Se está adoptando la siguiente convención para la traducción al español. Si crees que alguna traducción se puede mejorar, sugiérela en la página de discusión de este artículo.&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
!Inglés&lt;br /&gt;
!Español&lt;br /&gt;
!Comentarios&lt;br /&gt;
|-&lt;br /&gt;
|you&lt;br /&gt;
|tú&lt;br /&gt;
|(segunda persona del singular, expresión informal)&lt;br /&gt;
|-&lt;br /&gt;
|media&lt;br /&gt;
|contenido&lt;br /&gt;
|-&lt;br /&gt;
|slug&lt;br /&gt;
|ficha&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Fixing translations from transifex==&lt;br /&gt;
&lt;br /&gt;
= For developers =&lt;br /&gt;
== Marking strings for translation ==&lt;br /&gt;
=== In Jinja2 ===&lt;br /&gt;
&lt;br /&gt;
See: http://jinja.pocoo.org/docs/templates/#i18n&lt;br /&gt;
&lt;br /&gt;
Mostly like Django template i18n support, if you have any experience with that.&lt;br /&gt;
&lt;br /&gt;
=== In python code ===&lt;br /&gt;
&lt;br /&gt;
Usually, like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
from mediagoblin.util import pass_to_ugettext as _&lt;br /&gt;
&lt;br /&gt;
def some_func(something):&lt;br /&gt;
    return _(u&#039;This string would tooootally be translatable now.&#039;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Except, in form modules we don&#039;t actually want to translate things because for various reasons that doesn&#039;t work, so we do the translation call template-side.  So write the module to use the fake ugettext passthrough (which doesn&#039;t do any translation but still wraps things in _() so that Babel will know to extract these strings):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
from mediagoblin.util import fake_ugettext_passthrough as _&lt;br /&gt;
&lt;br /&gt;
class FunkyMonkeyForm(wtforms.Form):&lt;br /&gt;
    funky = wtforms.TextAreaField(&lt;br /&gt;
            _(&#039;Funkiness description&#039;))&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Extracting translations ==&lt;br /&gt;
&lt;br /&gt;
If you run buildout it should create a script called &#039;pybabel&#039;.  Use it to extract translations like so:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
./bin/pybabel extract -F babel.ini -o mediagoblin/i18n/en/LC_MESSAGES/mediagoblin.po .&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Compiling translations ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
./bin/pybabel compile -D mediagoblin -d mediagoblin/i18n/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Pulling translations from Transifex ==&lt;br /&gt;
&lt;br /&gt;
Unfortunately until the next release of transifex-client which has been patched to have proper entry points, you have to run transifex-client from a virtualenv or from site-packages.  But assuming that&#039;s done, pulling translations is easy:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
tx pull -a&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Pushing new translations to Transifex ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
tx push -s&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Troubleshooting =&lt;br /&gt;
&lt;br /&gt;
Got an error on Transifex like:&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Translation must start with a newline (\n)&amp;quot;?&lt;br /&gt;
&lt;br /&gt;
The problem here is when we have something like:&lt;br /&gt;
&lt;br /&gt;
        {% trans register_url=request.urlgen(&#039;mediagoblin.auth.register&#039;) %}&lt;br /&gt;
          &amp;lt;a class=&amp;quot;header_submit_highlight&amp;quot; href=&amp;quot;{{ register_url }}&amp;quot;&amp;gt;Create a free account&amp;lt;/a&amp;gt;&lt;br /&gt;
          or&lt;br /&gt;
          &amp;lt;a class=&amp;quot;header_submit&amp;quot; href=&amp;quot;http://wiki.mediagoblin.org/HackingHowto&amp;quot;&amp;gt;Set up MediaGoblin on your own server&amp;lt;/a&amp;gt;&lt;br /&gt;
        {% endtrans %}&lt;br /&gt;
&lt;br /&gt;
instead of:&lt;br /&gt;
&lt;br /&gt;
        {% trans register_url=request.urlgen(&#039;mediagoblin.auth.register&#039;) -%}&lt;br /&gt;
          &amp;lt;a class=&amp;quot;header_submit_highlight&amp;quot; href=&amp;quot;{{ register_url }}&amp;quot;&amp;gt;Create a free account&amp;lt;/a&amp;gt;&lt;br /&gt;
          or&lt;br /&gt;
          &amp;lt;a class=&amp;quot;header_submit&amp;quot; href=&amp;quot;http://wiki.mediagoblin.org/HackingHowto&amp;quot;&amp;gt;Set up MediaGoblin on your own server&amp;lt;/a&amp;gt;&lt;br /&gt;
        {%- endtrans %}&lt;br /&gt;
&lt;br /&gt;
The distinction might not be obvious... look for the %} versus -%} and {% versus {%- on the first and last lines.  The thing about this is this tells Jinja2 to strip the whitespace.  Without that, Transifex sees that there&#039;s a &amp;quot;\n&amp;quot; on the first line of the original but not on the future translation, and gets upset.&lt;br /&gt;
&lt;br /&gt;
If this happens the template should be updated to strip whitespace and translations should be pushed to transifex.&lt;/div&gt;</summary>
		<author><name>Spaetz</name></author>
	</entry>
	<entry>
		<id>https://wiki.mediagoblin.org/index.php?title=Translations&amp;diff=1015</id>
		<title>Translations</title>
		<link rel="alternate" type="text/html" href="https://wiki.mediagoblin.org/index.php?title=Translations&amp;diff=1015"/>
		<updated>2012-12-05T08:13:45Z</updated>

		<summary type="html">&lt;p&gt;Spaetz: /* German */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= For translators =&lt;br /&gt;
&lt;br /&gt;
You can translate our tools at Transifex:&lt;br /&gt;
&lt;br /&gt;
https://www.transifex.net/projects/p/mediagoblin/resource/mediagoblin/&lt;br /&gt;
&lt;br /&gt;
To translate, click on your language on the list, and then click on &amp;quot;Translate now&amp;quot;. By default, Transifex only shows you strings that currently have no translation. There is a checkbox to enable display of the translated strings, in case you can fix any of them.&lt;br /&gt;
&lt;br /&gt;
We are currently using no translation teams, so you can just edit the strings (but try to be nice and consistent with the current translation).&lt;br /&gt;
&lt;br /&gt;
Note: please don&#039;t translate the words &amp;quot;MediaGoblin&amp;quot; or &amp;quot;GNU&amp;quot; into your native language.  Those words should be retained as-is for branding reasons. :)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Notes for some language teams ==&lt;br /&gt;
=== German ===&lt;br /&gt;
&lt;br /&gt;
Interessante Hinweise zur Übersetzung finden sich bei Gnome:&lt;br /&gt;
* http://live.gnome.org/de/UebersetzungsRichtlinien&lt;br /&gt;
&lt;br /&gt;
In Abweichung von diesen Richtlinien wird momentan &amp;quot;Du&amp;quot; für die Anrede benutzt. &amp;quot;Du&amp;quot; und &amp;quot;Deine&amp;quot; werden groß geschrieben. Benutze die folgenden Begriffe um konsistent zu bleiben:&lt;br /&gt;
&lt;br /&gt;
 Benutzerkonto/Nutzerkonto, E-Mail, E-Mail Adresse, Aktivierungsmail, Konto &amp;quot;aktivieren&amp;quot; (verify email), Album (collection), Kurztitel (slug)&lt;br /&gt;
&lt;br /&gt;
=== Spanish ===&lt;br /&gt;
&lt;br /&gt;
Se está adoptando la siguiente convención para la traducción al español. Si crees que alguna traducción se puede mejorar, sugiérela en la página de discusión de este artículo.&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
!Inglés&lt;br /&gt;
!Español&lt;br /&gt;
!Comentarios&lt;br /&gt;
|-&lt;br /&gt;
|you&lt;br /&gt;
|tú&lt;br /&gt;
|(segunda persona del singular, expresión informal)&lt;br /&gt;
|-&lt;br /&gt;
|media&lt;br /&gt;
|contenido&lt;br /&gt;
|-&lt;br /&gt;
|slug&lt;br /&gt;
|ficha&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Fixing translations from transifex==&lt;br /&gt;
&lt;br /&gt;
= For developers =&lt;br /&gt;
== Marking strings for translation ==&lt;br /&gt;
=== In Jinja2 ===&lt;br /&gt;
&lt;br /&gt;
See: http://jinja.pocoo.org/docs/templates/#i18n&lt;br /&gt;
&lt;br /&gt;
Mostly like Django template i18n support, if you have any experience with that.&lt;br /&gt;
&lt;br /&gt;
=== In python code ===&lt;br /&gt;
&lt;br /&gt;
Usually, like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
from mediagoblin.util import pass_to_ugettext as _&lt;br /&gt;
&lt;br /&gt;
def some_func(something):&lt;br /&gt;
    return _(u&#039;This string would tooootally be translatable now.&#039;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Except, in form modules we don&#039;t actually want to translate things because for various reasons that doesn&#039;t work, so we do the translation call template-side.  So write the module to use the fake ugettext passthrough (which doesn&#039;t do any translation but still wraps things in _() so that Babel will know to extract these strings):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
from mediagoblin.util import fake_ugettext_passthrough as _&lt;br /&gt;
&lt;br /&gt;
class FunkyMonkeyForm(wtforms.Form):&lt;br /&gt;
    funky = wtforms.TextAreaField(&lt;br /&gt;
            _(&#039;Funkiness description&#039;))&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Extracting translations ==&lt;br /&gt;
&lt;br /&gt;
If you run buildout it should create a script called &#039;pybabel&#039;.  Use it to extract translations like so:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
./bin/pybabel extract -F babel.ini -o mediagoblin/i18n/en/LC_MESSAGES/mediagoblin.po .&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Compiling translations ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
./bin/pybabel compile -D mediagoblin -d mediagoblin/i18n/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Pulling translations from Transifex ==&lt;br /&gt;
&lt;br /&gt;
Unfortunately until the next release of transifex-client which has been patched to have proper entry points, you have to run transifex-client from a virtualenv or from site-packages.  But assuming that&#039;s done, pulling translations is easy:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
tx pull -a&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Pushing new translations to Transifex ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
tx push -s&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Troubleshooting =&lt;br /&gt;
&lt;br /&gt;
Got an error on Transifex like:&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Translation must start with a newline (\n)&amp;quot;?&lt;br /&gt;
&lt;br /&gt;
The problem here is when we have something like:&lt;br /&gt;
&lt;br /&gt;
        {% trans register_url=request.urlgen(&#039;mediagoblin.auth.register&#039;) %}&lt;br /&gt;
          &amp;lt;a class=&amp;quot;header_submit_highlight&amp;quot; href=&amp;quot;{{ register_url }}&amp;quot;&amp;gt;Create a free account&amp;lt;/a&amp;gt;&lt;br /&gt;
          or&lt;br /&gt;
          &amp;lt;a class=&amp;quot;header_submit&amp;quot; href=&amp;quot;http://wiki.mediagoblin.org/HackingHowto&amp;quot;&amp;gt;Set up MediaGoblin on your own server&amp;lt;/a&amp;gt;&lt;br /&gt;
        {% endtrans %}&lt;br /&gt;
&lt;br /&gt;
instead of:&lt;br /&gt;
&lt;br /&gt;
        {% trans register_url=request.urlgen(&#039;mediagoblin.auth.register&#039;) -%}&lt;br /&gt;
          &amp;lt;a class=&amp;quot;header_submit_highlight&amp;quot; href=&amp;quot;{{ register_url }}&amp;quot;&amp;gt;Create a free account&amp;lt;/a&amp;gt;&lt;br /&gt;
          or&lt;br /&gt;
          &amp;lt;a class=&amp;quot;header_submit&amp;quot; href=&amp;quot;http://wiki.mediagoblin.org/HackingHowto&amp;quot;&amp;gt;Set up MediaGoblin on your own server&amp;lt;/a&amp;gt;&lt;br /&gt;
        {%- endtrans %}&lt;br /&gt;
&lt;br /&gt;
The distinction might not be obvious... look for the %} versus -%} and {% versus {%- on the first and last lines.  The thing about this is this tells Jinja2 to strip the whitespace.  Without that, Transifex sees that there&#039;s a &amp;quot;\n&amp;quot; on the first line of the original but not on the future translation, and gets upset.&lt;br /&gt;
&lt;br /&gt;
If this happens the template should be updated to strip whitespace and translations should be pushed to transifex.&lt;/div&gt;</summary>
		<author><name>Spaetz</name></author>
	</entry>
	<entry>
		<id>https://wiki.mediagoblin.org/index.php?title=Deployment&amp;diff=1012</id>
		<title>Deployment</title>
		<link rel="alternate" type="text/html" href="https://wiki.mediagoblin.org/index.php?title=Deployment&amp;diff=1012"/>
		<updated>2012-11-28T11:55:34Z</updated>

		<summary type="html">&lt;p&gt;Spaetz: /* Troubleshooting */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page could use a lot of work.  For now, a few smaller deployment tips!&lt;br /&gt;
&lt;br /&gt;
See also: http://docs.mediagoblin.org/deploying.html (some of which may belong here)&lt;br /&gt;
&lt;br /&gt;
= FCGI script =&lt;br /&gt;
&lt;br /&gt;
This works great with the apache config example below :)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;#!/path/to/mediagoblin/bin/python&lt;br /&gt;
&lt;br /&gt;
# Written in 2011 by Christopher Allan Webber&lt;br /&gt;
#&lt;br /&gt;
# To the extent possible under law, the author(s) have dedicated all&lt;br /&gt;
# copyright and related and neighboring rights to this software to the&lt;br /&gt;
# public domain worldwide. This software is distributed without any&lt;br /&gt;
# warranty.&lt;br /&gt;
# &lt;br /&gt;
# You should have received a copy of the CC0 Public Domain Dedication along&lt;br /&gt;
# with this software. If not, see&lt;br /&gt;
# &amp;lt;http://creativecommons.org/publicdomain/zero/1.0/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
from paste.deploy import loadapp&lt;br /&gt;
from flup.server.fcgi import WSGIServer&lt;br /&gt;
&lt;br /&gt;
CONFIG_PATH = &#039;/path/to/mediagoblin/paste.ini&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def launch_fcgi():&lt;br /&gt;
    ccengine_wsgi_app = loadapp(&#039;config:&#039; + CONFIG_PATH)&lt;br /&gt;
    WSGIServer(ccengine_wsgi_app).run()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == &#039;__main__&#039;:&lt;br /&gt;
    launch_fcgi()&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Apache 2 Config with fcgid =&lt;br /&gt;
&lt;br /&gt;
Note that the libapache2-mod-fcgi in Debian is in the nonfree section, and MediaGoblin users will want to avoid that. Instead, libapache2-mod-fcgid can be used, but requires a slightly different configuration.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;VirtualHost *:80&amp;gt;&lt;br /&gt;
ServerName media.example.com&lt;br /&gt;
ServerAlias www.media.example.com&lt;br /&gt;
&lt;br /&gt;
DocumentRoot /path/to/mediagoblin&lt;br /&gt;
&lt;br /&gt;
Alias /mgoblin_static/ /path/to/mediagoblin/mediagoblin/static/&lt;br /&gt;
Alias /mgoblin_media/ /path/to/mediagoblin/user_dev/media/public/&lt;br /&gt;
&lt;br /&gt;
# Rewrite all URLs to fcgi, except for static and media urls&lt;br /&gt;
RewriteEngine On&lt;br /&gt;
RewriteRule ^(mgoblin_static|mgoblin_media)($|/) - [L]&lt;br /&gt;
RewriteCond %{REQUEST_FILENAME} !-f&lt;br /&gt;
RewriteRule ^/(.*)$ /mg.fcgi/$1 [QSA,L]&lt;br /&gt;
&lt;br /&gt;
# Allow access to static and media directories&lt;br /&gt;
&amp;lt;Directory /mgoblin_static&amp;gt;&lt;br /&gt;
  Order allow,deny&lt;br /&gt;
  Allow from all&lt;br /&gt;
&amp;lt;/Directory&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;Directory /mgoblin_media&amp;gt;&lt;br /&gt;
  Order allow,deny&lt;br /&gt;
  Allow from all&lt;br /&gt;
&amp;lt;/Directory&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;Directory /path/to/mediagoblin/&amp;gt;&lt;br /&gt;
        SetHandler fcgid-script&lt;br /&gt;
        Options +ExecCGI&lt;br /&gt;
        FcgidWrapper /path/to/mediagoblin/mg.fcgi&lt;br /&gt;
        order allow,deny&lt;br /&gt;
        allow from all&lt;br /&gt;
&amp;lt;/Directory&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Apache Config Example =&lt;br /&gt;
This configuration example uses mod_fastcgi.&lt;br /&gt;
&lt;br /&gt;
To install and enable mod_fastcgi on a Debian/Ubuntu based system:&lt;br /&gt;
&amp;lt;pre&amp;gt;# apt-get install libapache2-mod-suexec libapache2-mod-fastcgi&lt;br /&gt;
# a2enmod suexec&lt;br /&gt;
# a2enmod fastcgi&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sample configuration:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;VirtualHost *:80&amp;gt;&lt;br /&gt;
ServerName mediagoblin.yourdomain.tld&lt;br /&gt;
ServerAdmin webmaster@yourdoimain.tld&lt;br /&gt;
DocumentRoot /var/www/&lt;br /&gt;
# Custom log files&lt;br /&gt;
CustomLog /var/log/apache2/mediagobling_access.log combined&lt;br /&gt;
ErrorLog /var/log/apache2/mediagoblin_error.log&lt;br /&gt;
&lt;br /&gt;
# Serve static and media files via alias&lt;br /&gt;
Alias /mgoblin_static/ /path/to/mediagoblin/mediagoblin/static/&lt;br /&gt;
Alias /mgoblin_media/ /path/to/mediagoblin/user_dev/media/public/&lt;br /&gt;
&lt;br /&gt;
# Rewrite all URLs to fcgi, except for static and media urls&lt;br /&gt;
RewriteEngine On&lt;br /&gt;
RewriteRule ^(mgoblin_static|mgoblin_media)($|/) - [L]&lt;br /&gt;
RewriteCond %{REQUEST_FILENAME} !-f&lt;br /&gt;
RewriteRule ^/(.*)$ /mg.fcgi/$1 [QSA,L]&lt;br /&gt;
&lt;br /&gt;
# Allow access to static and media directories&lt;br /&gt;
&amp;lt;Directory /path/to/mediagoblin/mediagoblin/static&amp;gt;&lt;br /&gt;
  Order allow,deny&lt;br /&gt;
  Allow from all&lt;br /&gt;
&amp;lt;/Directory&amp;gt;&lt;br /&gt;
&amp;lt;Directory /path/to/mediagoblin/mediagoblin/user_dev/media/public&amp;gt;&lt;br /&gt;
  Order allow,deny&lt;br /&gt;
  Allow from all&lt;br /&gt;
&amp;lt;/Directory&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# Connect to fcgi server&lt;br /&gt;
FastCGIExternalServer /var/www/mg.fcgi -host 127.0.0.1:26543&lt;br /&gt;
&amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Then, you need to make sure mediagoblin is running in fcgi mode:&lt;br /&gt;
&amp;lt;pre&amp;gt;cd /path/to/mediagoblin&lt;br /&gt;
./lazyserver.sh --server-name=fcgi fcgi_host=127.0.0.1 fcgi_port=26543&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note: there may be several ways to improve this configuration&lt;br /&gt;
&lt;br /&gt;
= Juju =&lt;br /&gt;
&lt;br /&gt;
There is a juju [https://juju.ubuntu.com/Charms charm] available for deploying mediagoblin into EC2 or on your local box.  [https://juju.ubuntu.com/ juju] is available in Ubuntu 11.10 and later, though it is recommended that you pull it from [https://launchpad.net/~juju/+archive/pkgs| the juju PPA], which includes backported packages going back to Ubuntu 11.10. To use the juju charm, install juju and configure either the [https://juju.ubuntu.com/docs/provider-configuration-local.html local provider] or one of the cloud API providers, currently the [https://juju.ubuntu.com/docs/provider-configuration-ec2.html EC2 provider] is the best supported and works not only with Amazon Web Services but also OpenStack clouds. There is also a newer native OpenStack API provider which is known to support HP Cloud.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# if you have not bootstrapped&lt;br /&gt;
juju bootstrap&lt;br /&gt;
mkdir ~/charms&lt;br /&gt;
bzr init-repo ~/charms/precise&lt;br /&gt;
bzr branch lp:~clint-fewbar/charms/precise/mediagoblin/trunk ~/charms/precise/mediagoblin&lt;br /&gt;
juju deploy --repository ~/charms local:mediagoblin&lt;br /&gt;
juju expose mediagoblin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Currently the charm is volatile, deploying from trunk, and deploys a single-server version of MediaGoblin only. It will eventually relate to the existing juju charms for other supported data stores to allow one to scale out their MediaGoblin instance.&lt;br /&gt;
&lt;br /&gt;
= ArchLinux init scripts =&lt;br /&gt;
&lt;br /&gt;
[http://whird.jpope.org/2012/04/14/mediagoblin-archlinux-rcd-scripts Jeremy Pope has written a nice blogpost] on how to add init scripts to deploy MediaGoblin with both the python paste http server and the celery deployments separated.&lt;br /&gt;
&lt;br /&gt;
If you want a simpler setup and don&#039;t want to deploy celery separately, consider either turning CELERY_ALWAYS_EAGER to true in the paste init script described above, or check out [http://chimo.chromic.org/2012/03/01/mediagoblin-init-script-on-archlinux/ Chimo&#039;s guide].&lt;br /&gt;
&lt;br /&gt;
= Running on Dreamhost.com =&lt;br /&gt;
&lt;br /&gt;
===Set up your python virtualenv===&lt;br /&gt;
&lt;br /&gt;
dreamhost.com servers come with python 2.4 and 2.5 installed which is too old for mediagoblin. This means you need to compile and install a newer python (don&#039;t worry this is really not difficult on dreamhost servers). In order to be able to install python packages for a local user without touching system files, we need to setup a python &#039;&#039;virtualenv&#039;&#039;. Fortunately, this is not too tricky either. If your server has python 2.6 or 2.7 installed already, you can skip the [[#Install a local python|python installation stuff]] and you&#039;ll only need to [[#Setup virtualenv to install local python packages|install virtualenv]].&lt;br /&gt;
&lt;br /&gt;
====Install a local python====&lt;br /&gt;
# Download the latest python: http://python.org/ftp/python/XXX/Python-XXX.tar.bz2&lt;br /&gt;
# Unpack with &amp;lt;pre&amp;gt;tar xvjf Python-XXX.tar.bz2&amp;lt;/pre&amp;gt;&lt;br /&gt;
# &#039;&#039;cd&#039;&#039; into the directory and compile and install python locally:&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&amp;lt;pre&amp;gt;./configure --prefix=$HOME/local&lt;br /&gt;
make&lt;br /&gt;
make install&amp;lt;/pre&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
:This will install python (I used 2.7.3) into /home/&amp;lt;USERNAME&amp;gt;/local/bin/python. You might get warnings about some modules not being able to compile. :It was tcl/tk and bzip2 mainly, but things still worked out overall.&lt;br /&gt;
:&lt;br /&gt;
:You should now be able to invoke &amp;lt;tt&amp;gt;~/local/bin/python&amp;lt;/tt&amp;gt; and fall into a shell of your new python (exit with ctrl-d). Congrats, you have now a new python 2.7 that you can use. However, you will need to be able to install additional packages as a user and this is what virtualenv allows.&lt;br /&gt;
&lt;br /&gt;
====Setup virtualenv to install local python packages====&lt;br /&gt;
# Download the latest virtualenv: http://pypi.python.org/packages/source/v/virtualenv/XXX&lt;br /&gt;
# Install the virtualenv: &amp;lt;blockquote&amp;gt;&amp;lt;pre&amp;gt;~/local/bin/python ~/virtualenv-1.8/virtualenv.py  $HOME/local/virtenv&amp;lt;/pre&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
:: You will now have: ~/local/virtenv/bin/python&lt;br /&gt;
# In  ~/.bash_profile add: &amp;lt;blockquote&amp;gt;&amp;lt;pre&amp;gt;PATH=~/local/virtenv/bin:~/local/bin:${PATH}&amp;lt;/pre&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
:: so that your local python will be preferred.&lt;br /&gt;
:: Log out, log in again and test python&amp;quot; to see which version will be invoked. It should be the new python. Check &amp;quot;which easy_install&amp;quot; to see if the one in local/virtenv would be executed.&lt;br /&gt;
::  &lt;br /&gt;
:: You have now 1) a local &#039;&#039;python&#039;&#039; installation that you can use, and 2) &#039;&#039;easy_install&#039;&#039; will also work with your local user installation. From now on you can e.g. locally install the nose testing framework (&#039;&#039;easy_install nose&#039;&#039;) and use it (&#039;&#039;python -c &amp;quot;import nose&amp;quot;&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
===Install mediagoblin as a site package===&lt;br /&gt;
&lt;br /&gt;
# Check out mediagoblin from git to e.g. ~/mediagoblin&lt;br /&gt;
# Install MediaGoblin and all dependencies for MediaGoblin with easy_install.&lt;br /&gt;
:* In the mediagoblin directory issue:&lt;br /&gt;
:&amp;lt;blockquote&amp;gt;&amp;lt;pre&amp;gt;python setup.py&amp;lt;/pre&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
:* You will also need to: easy_install lxml&lt;br /&gt;
:* Python-image was trickier to install: &amp;lt;pre&amp;gt;easy_install --find-links http://www.pythonware.com/products/pil/ Imaging&amp;lt;/pre&amp;gt;&lt;br /&gt;
::Test by leaving the mediagoblin directory and see if you can import it: &amp;lt;pre&amp;gt;python -c &amp;quot;import mediagoblin&amp;quot;&amp;lt;/pre&amp;gt; looking for error messages.&lt;br /&gt;
&lt;br /&gt;
===Set up an WSGI environment on Dreamhost===&lt;br /&gt;
&lt;br /&gt;
# Enable the mod_passenger setting for ruby/python in the domains web panel&lt;br /&gt;
# &#039;&#039;cd&#039;&#039; into the domain directory (e.g. ~/media.sspaeth.de for me)&lt;br /&gt;
# Copy mediagoblin.ini and paste.ini from the ~/mediagoblin directory here&lt;br /&gt;
# Create passenger_wsgi.py in your domain directory (e.g. ~/media.sspaeth.de for me):&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&amp;lt;pre&amp;gt;import sys, os&lt;br /&gt;
INTERP = &amp;quot;/home/&amp;lt;username&amp;gt;/local/virtenv/bin/python&amp;quot;&lt;br /&gt;
#INTERP is present twice so that the new python interpreter knows the actual executable path&lt;br /&gt;
if sys.executable != INTERP: os.execl(INTERP, INTERP, *sys.argv)&lt;br /&gt;
&lt;br /&gt;
from paste.deploy import loadapp&lt;br /&gt;
application = loadapp(&#039;config:/home/mediagoblin/media.sspaeth.de/paste.ini&#039;)&lt;br /&gt;
&lt;br /&gt;
#If in case of errors, all you get are mysterious error 500, you can set debug=true in paste.ini to see stack traces&lt;br /&gt;
# Otherwise, add this:&lt;br /&gt;
#from paste.exceptions.errormiddleware import ErrorMiddleware&lt;br /&gt;
#application = ErrorMiddleware(application, debug=True)&amp;lt;/pre&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
# Set up the database by issueing: &amp;lt;pre&amp;gt;gmg dbupdate&amp;lt;/pre&amp;gt;&lt;br /&gt;
# (optional but recommended) Serve the static files directly from the webserver.&lt;br /&gt;
:In paste.ini in this section: [composite:routing] comment out the static files:&lt;br /&gt;
   #/mgoblin_static/ = mediagoblin_static&lt;br /&gt;
   #/theme_static/ = theme_static&lt;br /&gt;
:and symlink the mediagobin/mediagoblin/static directoy to public/mgoblin_static&lt;br /&gt;
:           and mediagoblin/mediagoblin/themes to public/theme_static&lt;br /&gt;
:&lt;br /&gt;
:so it is displayed directly. This step might be different depending on your web server configuration. There is no reason that static&lt;br /&gt;
:files need to go through all the python indirection when they can be served directly by nginx/apache/...&lt;br /&gt;
:&lt;br /&gt;
:In case you want to delete your git checkout after the installation (you don&#039;t need it, since you installed the mediagoblin package to ~/local/virtenv/lib/python2.7/mediagoblin... you should do the symlinking from there.&lt;br /&gt;
===Open Issues===&lt;br /&gt;
Please fill in the blanks if you find them out:&lt;br /&gt;
* How to enable logging to a file or standard html logs? Console output just disappears.&lt;br /&gt;
* How to set up things not using sqlite. What&#039;s wrong with mySQL?&lt;br /&gt;
&lt;br /&gt;
===Troubleshooting===&lt;br /&gt;
* First of all: invoke &amp;lt;pre&amp;gt;python passenger_wsgi.py&amp;lt;/pre&amp;gt; directly from the shell. This will tell you if there are import errors etc. If this command exits without any output on the console, you have already achieved a lot.&lt;br /&gt;
* In &#039;&#039;paste.ini&#039;&#039; set debug=true. This will show you python backtraces directly in the web page&lt;br /&gt;
* You will need to configure an smtp user/passwd/server in mediagoblin.ini, so you actually get the account creation token mailed out. Hint, the relevant settings are: &amp;lt;blockquote&amp;gt;&amp;lt;pre&amp;gt;email_debug_mode = false&lt;br /&gt;
email_sender_address = postmaster@sspaeth.de&lt;br /&gt;
email_smtp_host = SMTP.DOMAIN.TLD&lt;br /&gt;
email_smtp_user = USERNAME&lt;br /&gt;
email_smtp_pass = WEIRDPASSWORD&amp;lt;/pre&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
* In case you can upload media, but it does not appear. You don&#039;t have the celery server running. Add &amp;lt;pre&amp;gt;CELERY_ALWAYS_EAGER = true&amp;lt;/pre&amp;gt; to the &#039;&#039;[celery]&#039;&#039; section in mediagoblin.ini&lt;/div&gt;</summary>
		<author><name>Spaetz</name></author>
	</entry>
	<entry>
		<id>https://wiki.mediagoblin.org/index.php?title=Deployment&amp;diff=1011</id>
		<title>Deployment</title>
		<link rel="alternate" type="text/html" href="https://wiki.mediagoblin.org/index.php?title=Deployment&amp;diff=1011"/>
		<updated>2012-11-28T11:51:21Z</updated>

		<summary type="html">&lt;p&gt;Spaetz: move dreamhost section to correct level&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page could use a lot of work.  For now, a few smaller deployment tips!&lt;br /&gt;
&lt;br /&gt;
See also: http://docs.mediagoblin.org/deploying.html (some of which may belong here)&lt;br /&gt;
&lt;br /&gt;
= FCGI script =&lt;br /&gt;
&lt;br /&gt;
This works great with the apache config example below :)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;#!/path/to/mediagoblin/bin/python&lt;br /&gt;
&lt;br /&gt;
# Written in 2011 by Christopher Allan Webber&lt;br /&gt;
#&lt;br /&gt;
# To the extent possible under law, the author(s) have dedicated all&lt;br /&gt;
# copyright and related and neighboring rights to this software to the&lt;br /&gt;
# public domain worldwide. This software is distributed without any&lt;br /&gt;
# warranty.&lt;br /&gt;
# &lt;br /&gt;
# You should have received a copy of the CC0 Public Domain Dedication along&lt;br /&gt;
# with this software. If not, see&lt;br /&gt;
# &amp;lt;http://creativecommons.org/publicdomain/zero/1.0/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
from paste.deploy import loadapp&lt;br /&gt;
from flup.server.fcgi import WSGIServer&lt;br /&gt;
&lt;br /&gt;
CONFIG_PATH = &#039;/path/to/mediagoblin/paste.ini&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def launch_fcgi():&lt;br /&gt;
    ccengine_wsgi_app = loadapp(&#039;config:&#039; + CONFIG_PATH)&lt;br /&gt;
    WSGIServer(ccengine_wsgi_app).run()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == &#039;__main__&#039;:&lt;br /&gt;
    launch_fcgi()&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Apache 2 Config with fcgid =&lt;br /&gt;
&lt;br /&gt;
Note that the libapache2-mod-fcgi in Debian is in the nonfree section, and MediaGoblin users will want to avoid that. Instead, libapache2-mod-fcgid can be used, but requires a slightly different configuration.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;VirtualHost *:80&amp;gt;&lt;br /&gt;
ServerName media.example.com&lt;br /&gt;
ServerAlias www.media.example.com&lt;br /&gt;
&lt;br /&gt;
DocumentRoot /path/to/mediagoblin&lt;br /&gt;
&lt;br /&gt;
Alias /mgoblin_static/ /path/to/mediagoblin/mediagoblin/static/&lt;br /&gt;
Alias /mgoblin_media/ /path/to/mediagoblin/user_dev/media/public/&lt;br /&gt;
&lt;br /&gt;
# Rewrite all URLs to fcgi, except for static and media urls&lt;br /&gt;
RewriteEngine On&lt;br /&gt;
RewriteRule ^(mgoblin_static|mgoblin_media)($|/) - [L]&lt;br /&gt;
RewriteCond %{REQUEST_FILENAME} !-f&lt;br /&gt;
RewriteRule ^/(.*)$ /mg.fcgi/$1 [QSA,L]&lt;br /&gt;
&lt;br /&gt;
# Allow access to static and media directories&lt;br /&gt;
&amp;lt;Directory /mgoblin_static&amp;gt;&lt;br /&gt;
  Order allow,deny&lt;br /&gt;
  Allow from all&lt;br /&gt;
&amp;lt;/Directory&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;Directory /mgoblin_media&amp;gt;&lt;br /&gt;
  Order allow,deny&lt;br /&gt;
  Allow from all&lt;br /&gt;
&amp;lt;/Directory&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;Directory /path/to/mediagoblin/&amp;gt;&lt;br /&gt;
        SetHandler fcgid-script&lt;br /&gt;
        Options +ExecCGI&lt;br /&gt;
        FcgidWrapper /path/to/mediagoblin/mg.fcgi&lt;br /&gt;
        order allow,deny&lt;br /&gt;
        allow from all&lt;br /&gt;
&amp;lt;/Directory&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Apache Config Example =&lt;br /&gt;
This configuration example uses mod_fastcgi.&lt;br /&gt;
&lt;br /&gt;
To install and enable mod_fastcgi on a Debian/Ubuntu based system:&lt;br /&gt;
&amp;lt;pre&amp;gt;# apt-get install libapache2-mod-suexec libapache2-mod-fastcgi&lt;br /&gt;
# a2enmod suexec&lt;br /&gt;
# a2enmod fastcgi&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sample configuration:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;VirtualHost *:80&amp;gt;&lt;br /&gt;
ServerName mediagoblin.yourdomain.tld&lt;br /&gt;
ServerAdmin webmaster@yourdoimain.tld&lt;br /&gt;
DocumentRoot /var/www/&lt;br /&gt;
# Custom log files&lt;br /&gt;
CustomLog /var/log/apache2/mediagobling_access.log combined&lt;br /&gt;
ErrorLog /var/log/apache2/mediagoblin_error.log&lt;br /&gt;
&lt;br /&gt;
# Serve static and media files via alias&lt;br /&gt;
Alias /mgoblin_static/ /path/to/mediagoblin/mediagoblin/static/&lt;br /&gt;
Alias /mgoblin_media/ /path/to/mediagoblin/user_dev/media/public/&lt;br /&gt;
&lt;br /&gt;
# Rewrite all URLs to fcgi, except for static and media urls&lt;br /&gt;
RewriteEngine On&lt;br /&gt;
RewriteRule ^(mgoblin_static|mgoblin_media)($|/) - [L]&lt;br /&gt;
RewriteCond %{REQUEST_FILENAME} !-f&lt;br /&gt;
RewriteRule ^/(.*)$ /mg.fcgi/$1 [QSA,L]&lt;br /&gt;
&lt;br /&gt;
# Allow access to static and media directories&lt;br /&gt;
&amp;lt;Directory /path/to/mediagoblin/mediagoblin/static&amp;gt;&lt;br /&gt;
  Order allow,deny&lt;br /&gt;
  Allow from all&lt;br /&gt;
&amp;lt;/Directory&amp;gt;&lt;br /&gt;
&amp;lt;Directory /path/to/mediagoblin/mediagoblin/user_dev/media/public&amp;gt;&lt;br /&gt;
  Order allow,deny&lt;br /&gt;
  Allow from all&lt;br /&gt;
&amp;lt;/Directory&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# Connect to fcgi server&lt;br /&gt;
FastCGIExternalServer /var/www/mg.fcgi -host 127.0.0.1:26543&lt;br /&gt;
&amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Then, you need to make sure mediagoblin is running in fcgi mode:&lt;br /&gt;
&amp;lt;pre&amp;gt;cd /path/to/mediagoblin&lt;br /&gt;
./lazyserver.sh --server-name=fcgi fcgi_host=127.0.0.1 fcgi_port=26543&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note: there may be several ways to improve this configuration&lt;br /&gt;
&lt;br /&gt;
= Juju =&lt;br /&gt;
&lt;br /&gt;
There is a juju [https://juju.ubuntu.com/Charms charm] available for deploying mediagoblin into EC2 or on your local box.  [https://juju.ubuntu.com/ juju] is available in Ubuntu 11.10 and later, though it is recommended that you pull it from [https://launchpad.net/~juju/+archive/pkgs| the juju PPA], which includes backported packages going back to Ubuntu 11.10. To use the juju charm, install juju and configure either the [https://juju.ubuntu.com/docs/provider-configuration-local.html local provider] or one of the cloud API providers, currently the [https://juju.ubuntu.com/docs/provider-configuration-ec2.html EC2 provider] is the best supported and works not only with Amazon Web Services but also OpenStack clouds. There is also a newer native OpenStack API provider which is known to support HP Cloud.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# if you have not bootstrapped&lt;br /&gt;
juju bootstrap&lt;br /&gt;
mkdir ~/charms&lt;br /&gt;
bzr init-repo ~/charms/precise&lt;br /&gt;
bzr branch lp:~clint-fewbar/charms/precise/mediagoblin/trunk ~/charms/precise/mediagoblin&lt;br /&gt;
juju deploy --repository ~/charms local:mediagoblin&lt;br /&gt;
juju expose mediagoblin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Currently the charm is volatile, deploying from trunk, and deploys a single-server version of MediaGoblin only. It will eventually relate to the existing juju charms for other supported data stores to allow one to scale out their MediaGoblin instance.&lt;br /&gt;
&lt;br /&gt;
= ArchLinux init scripts =&lt;br /&gt;
&lt;br /&gt;
[http://whird.jpope.org/2012/04/14/mediagoblin-archlinux-rcd-scripts Jeremy Pope has written a nice blogpost] on how to add init scripts to deploy MediaGoblin with both the python paste http server and the celery deployments separated.&lt;br /&gt;
&lt;br /&gt;
If you want a simpler setup and don&#039;t want to deploy celery separately, consider either turning CELERY_ALWAYS_EAGER to true in the paste init script described above, or check out [http://chimo.chromic.org/2012/03/01/mediagoblin-init-script-on-archlinux/ Chimo&#039;s guide].&lt;br /&gt;
&lt;br /&gt;
= Running on Dreamhost.com =&lt;br /&gt;
&lt;br /&gt;
===Set up your python virtualenv===&lt;br /&gt;
&lt;br /&gt;
dreamhost.com servers come with python 2.4 and 2.5 installed which is too old for mediagoblin. This means you need to compile and install a newer python (don&#039;t worry this is really not difficult on dreamhost servers). In order to be able to install python packages for a local user without touching system files, we need to setup a python &#039;&#039;virtualenv&#039;&#039;. Fortunately, this is not too tricky either. If your server has python 2.6 or 2.7 installed already, you can skip the [[#Install a local python|python installation stuff]] and you&#039;ll only need to [[#Setup virtualenv to install local python packages|install virtualenv]].&lt;br /&gt;
&lt;br /&gt;
====Install a local python====&lt;br /&gt;
# Download the latest python: http://python.org/ftp/python/XXX/Python-XXX.tar.bz2&lt;br /&gt;
# Unpack with &amp;lt;pre&amp;gt;tar xvjf Python-XXX.tar.bz2&amp;lt;/pre&amp;gt;&lt;br /&gt;
# &#039;&#039;cd&#039;&#039; into the directory and compile and install python locally:&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&amp;lt;pre&amp;gt;./configure --prefix=$HOME/local&lt;br /&gt;
make&lt;br /&gt;
make install&amp;lt;/pre&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
:This will install python (I used 2.7.3) into /home/&amp;lt;USERNAME&amp;gt;/local/bin/python. You might get warnings about some modules not being able to compile. :It was tcl/tk and bzip2 mainly, but things still worked out overall.&lt;br /&gt;
:&lt;br /&gt;
:You should now be able to invoke &amp;lt;tt&amp;gt;~/local/bin/python&amp;lt;/tt&amp;gt; and fall into a shell of your new python (exit with ctrl-d). Congrats, you have now a new python 2.7 that you can use. However, you will need to be able to install additional packages as a user and this is what virtualenv allows.&lt;br /&gt;
&lt;br /&gt;
====Setup virtualenv to install local python packages====&lt;br /&gt;
# Download the latest virtualenv: http://pypi.python.org/packages/source/v/virtualenv/XXX&lt;br /&gt;
# Install the virtualenv: &amp;lt;blockquote&amp;gt;&amp;lt;pre&amp;gt;~/local/bin/python ~/virtualenv-1.8/virtualenv.py  $HOME/local/virtenv&amp;lt;/pre&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
:: You will now have: ~/local/virtenv/bin/python&lt;br /&gt;
# In  ~/.bash_profile add: &amp;lt;blockquote&amp;gt;&amp;lt;pre&amp;gt;PATH=~/local/virtenv/bin:~/local/bin:${PATH}&amp;lt;/pre&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
:: so that your local python will be preferred.&lt;br /&gt;
:: Log out, log in again and test python&amp;quot; to see which version will be invoked. It should be the new python. Check &amp;quot;which easy_install&amp;quot; to see if the one in local/virtenv would be executed.&lt;br /&gt;
::  &lt;br /&gt;
:: You have now 1) a local &#039;&#039;python&#039;&#039; installation that you can use, and 2) &#039;&#039;easy_install&#039;&#039; will also work with your local user installation. From now on you can e.g. locally install the nose testing framework (&#039;&#039;easy_install nose&#039;&#039;) and use it (&#039;&#039;python -c &amp;quot;import nose&amp;quot;&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
===Install mediagoblin as a site package===&lt;br /&gt;
&lt;br /&gt;
# Check out mediagoblin from git to e.g. ~/mediagoblin&lt;br /&gt;
# Install MediaGoblin and all dependencies for MediaGoblin with easy_install.&lt;br /&gt;
:* In the mediagoblin directory issue:&lt;br /&gt;
:&amp;lt;blockquote&amp;gt;&amp;lt;pre&amp;gt;python setup.py&amp;lt;/pre&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
:* You will also need to: easy_install lxml&lt;br /&gt;
:* Python-image was trickier to install: &amp;lt;pre&amp;gt;easy_install --find-links http://www.pythonware.com/products/pil/ Imaging&amp;lt;/pre&amp;gt;&lt;br /&gt;
::Test by leaving the mediagoblin directory and see if you can import it: &amp;lt;pre&amp;gt;python -c &amp;quot;import mediagoblin&amp;quot;&amp;lt;/pre&amp;gt; looking for error messages.&lt;br /&gt;
&lt;br /&gt;
===Set up an WSGI environment on Dreamhost===&lt;br /&gt;
&lt;br /&gt;
# Enable the mod_passenger setting for ruby/python in the domains web panel&lt;br /&gt;
# &#039;&#039;cd&#039;&#039; into the domain directory (e.g. ~/media.sspaeth.de for me)&lt;br /&gt;
# Copy mediagoblin.ini and paste.ini from the ~/mediagoblin directory here&lt;br /&gt;
# Create passenger_wsgi.py in your domain directory (e.g. ~/media.sspaeth.de for me):&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&amp;lt;pre&amp;gt;import sys, os&lt;br /&gt;
INTERP = &amp;quot;/home/&amp;lt;username&amp;gt;/local/virtenv/bin/python&amp;quot;&lt;br /&gt;
#INTERP is present twice so that the new python interpreter knows the actual executable path&lt;br /&gt;
if sys.executable != INTERP: os.execl(INTERP, INTERP, *sys.argv)&lt;br /&gt;
&lt;br /&gt;
from paste.deploy import loadapp&lt;br /&gt;
application = loadapp(&#039;config:/home/mediagoblin/media.sspaeth.de/paste.ini&#039;)&lt;br /&gt;
&lt;br /&gt;
#If in case of errors, all you get are mysterious error 500, you can set debug=true in paste.ini to see stack traces&lt;br /&gt;
# Otherwise, add this:&lt;br /&gt;
#from paste.exceptions.errormiddleware import ErrorMiddleware&lt;br /&gt;
#application = ErrorMiddleware(application, debug=True)&amp;lt;/pre&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
# Set up the database by issueing: &amp;lt;pre&amp;gt;gmg dbupdate&amp;lt;/pre&amp;gt;&lt;br /&gt;
# (optional but recommended) Serve the static files directly from the webserver.&lt;br /&gt;
:In paste.ini in this section: [composite:routing] comment out the static files:&lt;br /&gt;
   #/mgoblin_static/ = mediagoblin_static&lt;br /&gt;
   #/theme_static/ = theme_static&lt;br /&gt;
:and symlink the mediagobin/mediagoblin/static directoy to public/mgoblin_static&lt;br /&gt;
:           and mediagoblin/mediagoblin/themes to public/theme_static&lt;br /&gt;
:&lt;br /&gt;
:so it is displayed directly. This step might be different depending on your web server configuration. There is no reason that static&lt;br /&gt;
:files need to go through all the python indirection when they can be served directly by nginx/apache/...&lt;br /&gt;
:&lt;br /&gt;
:In case you want to delete your git checkout after the installation (you don&#039;t need it, since you installed the mediagoblin package to ~/local/virtenv/lib/python2.7/mediagoblin... you should do the symlinking from there.&lt;br /&gt;
===Open Issues===&lt;br /&gt;
Please fill in the blanks if you find them out:&lt;br /&gt;
* How to enable logging to a file or standard html logs? Console output just disappears.&lt;br /&gt;
* How to set up things not using sqlite. What&#039;s wrong with mySQL?&lt;br /&gt;
&lt;br /&gt;
===Troubleshooting===&lt;br /&gt;
* First of all: invoke &amp;lt;pre&amp;gt;python passenger_wsgi.py&amp;lt;/pre&amp;gt; directly from the shell. This will tell you if there are import errors etc. If this command exits without any output on the console, you have already achieved a lot.&lt;br /&gt;
* In &#039;&#039;paste.ini&#039;&#039; set debug=true. This will show you python backtraces directly in the web page&lt;br /&gt;
* You will need to setup an smtp user/passwd/server, so you actually get the account creation token mailed out.&lt;/div&gt;</summary>
		<author><name>Spaetz</name></author>
	</entry>
	<entry>
		<id>https://wiki.mediagoblin.org/index.php?title=Deployment&amp;diff=1010</id>
		<title>Deployment</title>
		<link rel="alternate" type="text/html" href="https://wiki.mediagoblin.org/index.php?title=Deployment&amp;diff=1010"/>
		<updated>2012-11-28T11:44:00Z</updated>

		<summary type="html">&lt;p&gt;Spaetz: /* Set up an WSGI environment on Dreamhost */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page could use a lot of work.  For now, a few smaller deployment tips!&lt;br /&gt;
&lt;br /&gt;
See also: http://docs.mediagoblin.org/deploying.html (some of which may belong here)&lt;br /&gt;
&lt;br /&gt;
= FCGI script =&lt;br /&gt;
&lt;br /&gt;
This works great with the apache config example below :)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;#!/path/to/mediagoblin/bin/python&lt;br /&gt;
&lt;br /&gt;
# Written in 2011 by Christopher Allan Webber&lt;br /&gt;
#&lt;br /&gt;
# To the extent possible under law, the author(s) have dedicated all&lt;br /&gt;
# copyright and related and neighboring rights to this software to the&lt;br /&gt;
# public domain worldwide. This software is distributed without any&lt;br /&gt;
# warranty.&lt;br /&gt;
# &lt;br /&gt;
# You should have received a copy of the CC0 Public Domain Dedication along&lt;br /&gt;
# with this software. If not, see&lt;br /&gt;
# &amp;lt;http://creativecommons.org/publicdomain/zero/1.0/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
from paste.deploy import loadapp&lt;br /&gt;
from flup.server.fcgi import WSGIServer&lt;br /&gt;
&lt;br /&gt;
CONFIG_PATH = &#039;/path/to/mediagoblin/paste.ini&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def launch_fcgi():&lt;br /&gt;
    ccengine_wsgi_app = loadapp(&#039;config:&#039; + CONFIG_PATH)&lt;br /&gt;
    WSGIServer(ccengine_wsgi_app).run()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == &#039;__main__&#039;:&lt;br /&gt;
    launch_fcgi()&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Apache 2 Config with fcgid =&lt;br /&gt;
&lt;br /&gt;
Note that the libapache2-mod-fcgi in Debian is in the nonfree section, and MediaGoblin users will want to avoid that. Instead, libapache2-mod-fcgid can be used, but requires a slightly different configuration.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;VirtualHost *:80&amp;gt;&lt;br /&gt;
ServerName media.example.com&lt;br /&gt;
ServerAlias www.media.example.com&lt;br /&gt;
&lt;br /&gt;
DocumentRoot /path/to/mediagoblin&lt;br /&gt;
&lt;br /&gt;
Alias /mgoblin_static/ /path/to/mediagoblin/mediagoblin/static/&lt;br /&gt;
Alias /mgoblin_media/ /path/to/mediagoblin/user_dev/media/public/&lt;br /&gt;
&lt;br /&gt;
# Rewrite all URLs to fcgi, except for static and media urls&lt;br /&gt;
RewriteEngine On&lt;br /&gt;
RewriteRule ^(mgoblin_static|mgoblin_media)($|/) - [L]&lt;br /&gt;
RewriteCond %{REQUEST_FILENAME} !-f&lt;br /&gt;
RewriteRule ^/(.*)$ /mg.fcgi/$1 [QSA,L]&lt;br /&gt;
&lt;br /&gt;
# Allow access to static and media directories&lt;br /&gt;
&amp;lt;Directory /mgoblin_static&amp;gt;&lt;br /&gt;
  Order allow,deny&lt;br /&gt;
  Allow from all&lt;br /&gt;
&amp;lt;/Directory&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;Directory /mgoblin_media&amp;gt;&lt;br /&gt;
  Order allow,deny&lt;br /&gt;
  Allow from all&lt;br /&gt;
&amp;lt;/Directory&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;Directory /path/to/mediagoblin/&amp;gt;&lt;br /&gt;
        SetHandler fcgid-script&lt;br /&gt;
        Options +ExecCGI&lt;br /&gt;
        FcgidWrapper /path/to/mediagoblin/mg.fcgi&lt;br /&gt;
        order allow,deny&lt;br /&gt;
        allow from all&lt;br /&gt;
&amp;lt;/Directory&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Apache Config Example =&lt;br /&gt;
This configuration example uses mod_fastcgi.&lt;br /&gt;
&lt;br /&gt;
To install and enable mod_fastcgi on a Debian/Ubuntu based system:&lt;br /&gt;
&amp;lt;pre&amp;gt;# apt-get install libapache2-mod-suexec libapache2-mod-fastcgi&lt;br /&gt;
# a2enmod suexec&lt;br /&gt;
# a2enmod fastcgi&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sample configuration:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;VirtualHost *:80&amp;gt;&lt;br /&gt;
ServerName mediagoblin.yourdomain.tld&lt;br /&gt;
ServerAdmin webmaster@yourdoimain.tld&lt;br /&gt;
DocumentRoot /var/www/&lt;br /&gt;
# Custom log files&lt;br /&gt;
CustomLog /var/log/apache2/mediagobling_access.log combined&lt;br /&gt;
ErrorLog /var/log/apache2/mediagoblin_error.log&lt;br /&gt;
&lt;br /&gt;
# Serve static and media files via alias&lt;br /&gt;
Alias /mgoblin_static/ /path/to/mediagoblin/mediagoblin/static/&lt;br /&gt;
Alias /mgoblin_media/ /path/to/mediagoblin/user_dev/media/public/&lt;br /&gt;
&lt;br /&gt;
# Rewrite all URLs to fcgi, except for static and media urls&lt;br /&gt;
RewriteEngine On&lt;br /&gt;
RewriteRule ^(mgoblin_static|mgoblin_media)($|/) - [L]&lt;br /&gt;
RewriteCond %{REQUEST_FILENAME} !-f&lt;br /&gt;
RewriteRule ^/(.*)$ /mg.fcgi/$1 [QSA,L]&lt;br /&gt;
&lt;br /&gt;
# Allow access to static and media directories&lt;br /&gt;
&amp;lt;Directory /path/to/mediagoblin/mediagoblin/static&amp;gt;&lt;br /&gt;
  Order allow,deny&lt;br /&gt;
  Allow from all&lt;br /&gt;
&amp;lt;/Directory&amp;gt;&lt;br /&gt;
&amp;lt;Directory /path/to/mediagoblin/mediagoblin/user_dev/media/public&amp;gt;&lt;br /&gt;
  Order allow,deny&lt;br /&gt;
  Allow from all&lt;br /&gt;
&amp;lt;/Directory&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# Connect to fcgi server&lt;br /&gt;
FastCGIExternalServer /var/www/mg.fcgi -host 127.0.0.1:26543&lt;br /&gt;
&amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Then, you need to make sure mediagoblin is running in fcgi mode:&lt;br /&gt;
&amp;lt;pre&amp;gt;cd /path/to/mediagoblin&lt;br /&gt;
./lazyserver.sh --server-name=fcgi fcgi_host=127.0.0.1 fcgi_port=26543&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note: there may be several ways to improve this configuration&lt;br /&gt;
&lt;br /&gt;
= Juju =&lt;br /&gt;
&lt;br /&gt;
There is a juju [https://juju.ubuntu.com/Charms charm] available for deploying mediagoblin into EC2 or on your local box.  [https://juju.ubuntu.com/ juju] is available in Ubuntu 11.10 and later, though it is recommended that you pull it from [https://launchpad.net/~juju/+archive/pkgs| the juju PPA], which includes backported packages going back to Ubuntu 11.10. To use the juju charm, install juju and configure either the [https://juju.ubuntu.com/docs/provider-configuration-local.html local provider] or one of the cloud API providers, currently the [https://juju.ubuntu.com/docs/provider-configuration-ec2.html EC2 provider] is the best supported and works not only with Amazon Web Services but also OpenStack clouds. There is also a newer native OpenStack API provider which is known to support HP Cloud.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# if you have not bootstrapped&lt;br /&gt;
juju bootstrap&lt;br /&gt;
mkdir ~/charms&lt;br /&gt;
bzr init-repo ~/charms/precise&lt;br /&gt;
bzr branch lp:~clint-fewbar/charms/precise/mediagoblin/trunk ~/charms/precise/mediagoblin&lt;br /&gt;
juju deploy --repository ~/charms local:mediagoblin&lt;br /&gt;
juju expose mediagoblin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Currently the charm is volatile, deploying from trunk, and deploys a single-server version of MediaGoblin only. It will eventually relate to the existing juju charms for other supported data stores to allow one to scale out their MediaGoblin instance.&lt;br /&gt;
&lt;br /&gt;
= ArchLinux init scripts =&lt;br /&gt;
&lt;br /&gt;
[http://whird.jpope.org/2012/04/14/mediagoblin-archlinux-rcd-scripts Jeremy Pope has written a nice blogpost] on how to add init scripts to deploy MediaGoblin with both the python paste http server and the celery deployments separated.&lt;br /&gt;
&lt;br /&gt;
If you want a simpler setup and don&#039;t want to deploy celery separately, consider either turning CELERY_ALWAYS_EAGER to true in the paste init script described above, or check out [http://chimo.chromic.org/2012/03/01/mediagoblin-init-script-on-archlinux/ Chimo&#039;s guide].&lt;br /&gt;
&lt;br /&gt;
== Running on Dreamhost.com ==&lt;br /&gt;
&lt;br /&gt;
===Set up your python virtualenv===&lt;br /&gt;
&lt;br /&gt;
dreamhost.com servers come with python 2.4 and 2.5 installed which is too old for mediagoblin. This means you need to compile and install a newer python (don&#039;t worry this is really not difficult on dreamhost servers). In order to be able to install python packages for a local user without touching system files, we need to setup a python &#039;&#039;virtualenv&#039;&#039;. Fortunately, this is not too tricky either. If your server has python 2.6 or 2.7 installed already, you can skip the [[#Install a local python|python installation stuff]] and you&#039;ll only need to [[#Setup virtualenv to install local python packages|install virtualenv]].&lt;br /&gt;
&lt;br /&gt;
====Install a local python====&lt;br /&gt;
# Download the latest python: http://python.org/ftp/python/XXX/Python-XXX.tar.bz2&lt;br /&gt;
# Unpack with &amp;lt;pre&amp;gt;tar xvjf Python-XXX.tar.bz2&amp;lt;/pre&amp;gt;&lt;br /&gt;
# &#039;&#039;cd&#039;&#039; into the directory and compile and install python locally:&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&amp;lt;pre&amp;gt;./configure --prefix=$HOME/local&lt;br /&gt;
make&lt;br /&gt;
make install&amp;lt;/pre&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
:This will install python (I used 2.7.3) into /home/&amp;lt;USERNAME&amp;gt;/local/bin/python. You might get warnings about some modules not being able to compile. :It was tcl/tk and bzip2 mainly, but things still worked out overall.&lt;br /&gt;
:&lt;br /&gt;
:You should now be able to invoke &amp;lt;tt&amp;gt;~/local/bin/python&amp;lt;/tt&amp;gt; and fall into a shell of your new python (exit with ctrl-d). Congrats, you have now a new python 2.7 that you can use. However, you will need to be able to install additional packages as a user and this is what virtualenv allows.&lt;br /&gt;
&lt;br /&gt;
====Setup virtualenv to install local python packages====&lt;br /&gt;
# Download the latest virtualenv: http://pypi.python.org/packages/source/v/virtualenv/XXX&lt;br /&gt;
# Install the virtualenv: &amp;lt;blockquote&amp;gt;&amp;lt;pre&amp;gt;~/local/bin/python ~/virtualenv-1.8/virtualenv.py  $HOME/local/virtenv&amp;lt;/pre&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
:: You will now have: ~/local/virtenv/bin/python&lt;br /&gt;
# In  ~/.bash_profile add: &amp;lt;blockquote&amp;gt;&amp;lt;pre&amp;gt;PATH=~/local/virtenv/bin:~/local/bin:${PATH}&amp;lt;/pre&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
:: so that your local python will be preferred.&lt;br /&gt;
:: Log out, log in again and test python&amp;quot; to see which version will be invoked. It should be the new python. Check &amp;quot;which easy_install&amp;quot; to see if the one in local/virtenv would be executed.&lt;br /&gt;
::  &lt;br /&gt;
:: You have now 1) a local &#039;&#039;python&#039;&#039; installation that you can use, and 2) &#039;&#039;easy_install&#039;&#039; will also work with your local user installation. From now on you can e.g. locally install the nose testing framework (&#039;&#039;easy_install nose&#039;&#039;) and use it (&#039;&#039;python -c &amp;quot;import nose&amp;quot;&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
===Install mediagoblin as a site package===&lt;br /&gt;
&lt;br /&gt;
# Check out mediagoblin from git to e.g. ~/mediagoblin&lt;br /&gt;
# Install MediaGoblin and all dependencies for MediaGoblin with easy_install.&lt;br /&gt;
:* In the mediagoblin directory issue:&lt;br /&gt;
:&amp;lt;blockquote&amp;gt;&amp;lt;pre&amp;gt;python setup.py&amp;lt;/pre&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
:* You will also need to: easy_install lxml&lt;br /&gt;
:* Python-image was trickier to install: &amp;lt;pre&amp;gt;easy_install --find-links http://www.pythonware.com/products/pil/ Imaging&amp;lt;/pre&amp;gt;&lt;br /&gt;
::Test by leaving the mediagoblin directory and see if you can import it: &amp;lt;pre&amp;gt;python -c &amp;quot;import mediagoblin&amp;quot;&amp;lt;/pre&amp;gt; looking for error messages.&lt;br /&gt;
&lt;br /&gt;
===Set up an WSGI environment on Dreamhost===&lt;br /&gt;
&lt;br /&gt;
# Enable the mod_passenger setting for ruby/python in the domains web panel&lt;br /&gt;
# &#039;&#039;cd&#039;&#039; into the domain directory (e.g. ~/media.sspaeth.de for me)&lt;br /&gt;
# Copy mediagoblin.ini and paste.ini from the ~/mediagoblin directory here&lt;br /&gt;
# Create passenger_wsgi.py in your domain directory (e.g. ~/media.sspaeth.de for me):&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&amp;lt;pre&amp;gt;import sys, os&lt;br /&gt;
INTERP = &amp;quot;/home/&amp;lt;username&amp;gt;/local/virtenv/bin/python&amp;quot;&lt;br /&gt;
#INTERP is present twice so that the new python interpreter knows the actual executable path&lt;br /&gt;
if sys.executable != INTERP: os.execl(INTERP, INTERP, *sys.argv)&lt;br /&gt;
&lt;br /&gt;
from paste.deploy import loadapp&lt;br /&gt;
application = loadapp(&#039;config:/home/mediagoblin/media.sspaeth.de/paste.ini&#039;)&lt;br /&gt;
&lt;br /&gt;
#If in case of errors, all you get are mysterious error 500, you can set debug=true in paste.ini to see stack traces&lt;br /&gt;
# Otherwise, add this:&lt;br /&gt;
#from paste.exceptions.errormiddleware import ErrorMiddleware&lt;br /&gt;
#application = ErrorMiddleware(application, debug=True)&amp;lt;/pre&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
# Set up the database by issueing: &amp;lt;pre&amp;gt;gmg dbupdate&amp;lt;/pre&amp;gt;&lt;br /&gt;
# (optional but recommended) Serve the static files directly from the webserver.&lt;br /&gt;
:In paste.ini in this section: [composite:routing] comment out the static files:&lt;br /&gt;
   #/mgoblin_static/ = mediagoblin_static&lt;br /&gt;
   #/theme_static/ = theme_static&lt;br /&gt;
:and symlink the mediagobin/mediagoblin/static directoy to public/mgoblin_static&lt;br /&gt;
:           and mediagoblin/mediagoblin/themes to public/theme_static&lt;br /&gt;
:&lt;br /&gt;
:so it is displayed directly. This step might be different depending on your web server configuration. There is no reason that static&lt;br /&gt;
:files need to go through all the python indirection when they can be served directly by nginx/apache/...&lt;br /&gt;
:&lt;br /&gt;
:In case you want to delete your git checkout after the installation (you don&#039;t need it, since you installed the mediagoblin package to ~/local/virtenv/lib/python2.7/mediagoblin... you should do the symlinking from there.&lt;br /&gt;
===Open Issues===&lt;br /&gt;
Please fill in the blanks if you find them out:&lt;br /&gt;
* How to enable logging to a file or standard html logs? Console output just disappears.&lt;br /&gt;
* How to set up things not using sqlite. What&#039;s wrong with mySQL?&lt;br /&gt;
&lt;br /&gt;
===Troubleshooting===&lt;br /&gt;
* First of all: invoke &amp;lt;pre&amp;gt;python passenger_wsgi.py&amp;lt;/pre&amp;gt; directly from the shell. This will tell you if there are import errors etc. If this command exits without any output on the console, you have already achieved a lot.&lt;br /&gt;
* In &#039;&#039;paste.ini&#039;&#039; set debug=true. This will show you python backtraces directly in the web page&lt;br /&gt;
* You will need to setup an smtp user/passwd/server, so you actually get the account creation token mailed out.&lt;/div&gt;</summary>
		<author><name>Spaetz</name></author>
	</entry>
	<entry>
		<id>https://wiki.mediagoblin.org/index.php?title=Deployment&amp;diff=1009</id>
		<title>Deployment</title>
		<link rel="alternate" type="text/html" href="https://wiki.mediagoblin.org/index.php?title=Deployment&amp;diff=1009"/>
		<updated>2012-11-28T11:38:34Z</updated>

		<summary type="html">&lt;p&gt;Spaetz: /* Install mediagoblin as a site package */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page could use a lot of work.  For now, a few smaller deployment tips!&lt;br /&gt;
&lt;br /&gt;
See also: http://docs.mediagoblin.org/deploying.html (some of which may belong here)&lt;br /&gt;
&lt;br /&gt;
= FCGI script =&lt;br /&gt;
&lt;br /&gt;
This works great with the apache config example below :)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;#!/path/to/mediagoblin/bin/python&lt;br /&gt;
&lt;br /&gt;
# Written in 2011 by Christopher Allan Webber&lt;br /&gt;
#&lt;br /&gt;
# To the extent possible under law, the author(s) have dedicated all&lt;br /&gt;
# copyright and related and neighboring rights to this software to the&lt;br /&gt;
# public domain worldwide. This software is distributed without any&lt;br /&gt;
# warranty.&lt;br /&gt;
# &lt;br /&gt;
# You should have received a copy of the CC0 Public Domain Dedication along&lt;br /&gt;
# with this software. If not, see&lt;br /&gt;
# &amp;lt;http://creativecommons.org/publicdomain/zero/1.0/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
from paste.deploy import loadapp&lt;br /&gt;
from flup.server.fcgi import WSGIServer&lt;br /&gt;
&lt;br /&gt;
CONFIG_PATH = &#039;/path/to/mediagoblin/paste.ini&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def launch_fcgi():&lt;br /&gt;
    ccengine_wsgi_app = loadapp(&#039;config:&#039; + CONFIG_PATH)&lt;br /&gt;
    WSGIServer(ccengine_wsgi_app).run()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == &#039;__main__&#039;:&lt;br /&gt;
    launch_fcgi()&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Apache 2 Config with fcgid =&lt;br /&gt;
&lt;br /&gt;
Note that the libapache2-mod-fcgi in Debian is in the nonfree section, and MediaGoblin users will want to avoid that. Instead, libapache2-mod-fcgid can be used, but requires a slightly different configuration.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;VirtualHost *:80&amp;gt;&lt;br /&gt;
ServerName media.example.com&lt;br /&gt;
ServerAlias www.media.example.com&lt;br /&gt;
&lt;br /&gt;
DocumentRoot /path/to/mediagoblin&lt;br /&gt;
&lt;br /&gt;
Alias /mgoblin_static/ /path/to/mediagoblin/mediagoblin/static/&lt;br /&gt;
Alias /mgoblin_media/ /path/to/mediagoblin/user_dev/media/public/&lt;br /&gt;
&lt;br /&gt;
# Rewrite all URLs to fcgi, except for static and media urls&lt;br /&gt;
RewriteEngine On&lt;br /&gt;
RewriteRule ^(mgoblin_static|mgoblin_media)($|/) - [L]&lt;br /&gt;
RewriteCond %{REQUEST_FILENAME} !-f&lt;br /&gt;
RewriteRule ^/(.*)$ /mg.fcgi/$1 [QSA,L]&lt;br /&gt;
&lt;br /&gt;
# Allow access to static and media directories&lt;br /&gt;
&amp;lt;Directory /mgoblin_static&amp;gt;&lt;br /&gt;
  Order allow,deny&lt;br /&gt;
  Allow from all&lt;br /&gt;
&amp;lt;/Directory&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;Directory /mgoblin_media&amp;gt;&lt;br /&gt;
  Order allow,deny&lt;br /&gt;
  Allow from all&lt;br /&gt;
&amp;lt;/Directory&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;Directory /path/to/mediagoblin/&amp;gt;&lt;br /&gt;
        SetHandler fcgid-script&lt;br /&gt;
        Options +ExecCGI&lt;br /&gt;
        FcgidWrapper /path/to/mediagoblin/mg.fcgi&lt;br /&gt;
        order allow,deny&lt;br /&gt;
        allow from all&lt;br /&gt;
&amp;lt;/Directory&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Apache Config Example =&lt;br /&gt;
This configuration example uses mod_fastcgi.&lt;br /&gt;
&lt;br /&gt;
To install and enable mod_fastcgi on a Debian/Ubuntu based system:&lt;br /&gt;
&amp;lt;pre&amp;gt;# apt-get install libapache2-mod-suexec libapache2-mod-fastcgi&lt;br /&gt;
# a2enmod suexec&lt;br /&gt;
# a2enmod fastcgi&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sample configuration:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;VirtualHost *:80&amp;gt;&lt;br /&gt;
ServerName mediagoblin.yourdomain.tld&lt;br /&gt;
ServerAdmin webmaster@yourdoimain.tld&lt;br /&gt;
DocumentRoot /var/www/&lt;br /&gt;
# Custom log files&lt;br /&gt;
CustomLog /var/log/apache2/mediagobling_access.log combined&lt;br /&gt;
ErrorLog /var/log/apache2/mediagoblin_error.log&lt;br /&gt;
&lt;br /&gt;
# Serve static and media files via alias&lt;br /&gt;
Alias /mgoblin_static/ /path/to/mediagoblin/mediagoblin/static/&lt;br /&gt;
Alias /mgoblin_media/ /path/to/mediagoblin/user_dev/media/public/&lt;br /&gt;
&lt;br /&gt;
# Rewrite all URLs to fcgi, except for static and media urls&lt;br /&gt;
RewriteEngine On&lt;br /&gt;
RewriteRule ^(mgoblin_static|mgoblin_media)($|/) - [L]&lt;br /&gt;
RewriteCond %{REQUEST_FILENAME} !-f&lt;br /&gt;
RewriteRule ^/(.*)$ /mg.fcgi/$1 [QSA,L]&lt;br /&gt;
&lt;br /&gt;
# Allow access to static and media directories&lt;br /&gt;
&amp;lt;Directory /path/to/mediagoblin/mediagoblin/static&amp;gt;&lt;br /&gt;
  Order allow,deny&lt;br /&gt;
  Allow from all&lt;br /&gt;
&amp;lt;/Directory&amp;gt;&lt;br /&gt;
&amp;lt;Directory /path/to/mediagoblin/mediagoblin/user_dev/media/public&amp;gt;&lt;br /&gt;
  Order allow,deny&lt;br /&gt;
  Allow from all&lt;br /&gt;
&amp;lt;/Directory&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# Connect to fcgi server&lt;br /&gt;
FastCGIExternalServer /var/www/mg.fcgi -host 127.0.0.1:26543&lt;br /&gt;
&amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Then, you need to make sure mediagoblin is running in fcgi mode:&lt;br /&gt;
&amp;lt;pre&amp;gt;cd /path/to/mediagoblin&lt;br /&gt;
./lazyserver.sh --server-name=fcgi fcgi_host=127.0.0.1 fcgi_port=26543&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note: there may be several ways to improve this configuration&lt;br /&gt;
&lt;br /&gt;
= Juju =&lt;br /&gt;
&lt;br /&gt;
There is a juju [https://juju.ubuntu.com/Charms charm] available for deploying mediagoblin into EC2 or on your local box.  [https://juju.ubuntu.com/ juju] is available in Ubuntu 11.10 and later, though it is recommended that you pull it from [https://launchpad.net/~juju/+archive/pkgs| the juju PPA], which includes backported packages going back to Ubuntu 11.10. To use the juju charm, install juju and configure either the [https://juju.ubuntu.com/docs/provider-configuration-local.html local provider] or one of the cloud API providers, currently the [https://juju.ubuntu.com/docs/provider-configuration-ec2.html EC2 provider] is the best supported and works not only with Amazon Web Services but also OpenStack clouds. There is also a newer native OpenStack API provider which is known to support HP Cloud.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# if you have not bootstrapped&lt;br /&gt;
juju bootstrap&lt;br /&gt;
mkdir ~/charms&lt;br /&gt;
bzr init-repo ~/charms/precise&lt;br /&gt;
bzr branch lp:~clint-fewbar/charms/precise/mediagoblin/trunk ~/charms/precise/mediagoblin&lt;br /&gt;
juju deploy --repository ~/charms local:mediagoblin&lt;br /&gt;
juju expose mediagoblin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Currently the charm is volatile, deploying from trunk, and deploys a single-server version of MediaGoblin only. It will eventually relate to the existing juju charms for other supported data stores to allow one to scale out their MediaGoblin instance.&lt;br /&gt;
&lt;br /&gt;
= ArchLinux init scripts =&lt;br /&gt;
&lt;br /&gt;
[http://whird.jpope.org/2012/04/14/mediagoblin-archlinux-rcd-scripts Jeremy Pope has written a nice blogpost] on how to add init scripts to deploy MediaGoblin with both the python paste http server and the celery deployments separated.&lt;br /&gt;
&lt;br /&gt;
If you want a simpler setup and don&#039;t want to deploy celery separately, consider either turning CELERY_ALWAYS_EAGER to true in the paste init script described above, or check out [http://chimo.chromic.org/2012/03/01/mediagoblin-init-script-on-archlinux/ Chimo&#039;s guide].&lt;br /&gt;
&lt;br /&gt;
== Running on Dreamhost.com ==&lt;br /&gt;
&lt;br /&gt;
===Set up your python virtualenv===&lt;br /&gt;
&lt;br /&gt;
dreamhost.com servers come with python 2.4 and 2.5 installed which is too old for mediagoblin. This means you need to compile and install a newer python (don&#039;t worry this is really not difficult on dreamhost servers). In order to be able to install python packages for a local user without touching system files, we need to setup a python &#039;&#039;virtualenv&#039;&#039;. Fortunately, this is not too tricky either. If your server has python 2.6 or 2.7 installed already, you can skip the [[#Install a local python|python installation stuff]] and you&#039;ll only need to [[#Setup virtualenv to install local python packages|install virtualenv]].&lt;br /&gt;
&lt;br /&gt;
====Install a local python====&lt;br /&gt;
# Download the latest python: http://python.org/ftp/python/XXX/Python-XXX.tar.bz2&lt;br /&gt;
# Unpack with &amp;lt;pre&amp;gt;tar xvjf Python-XXX.tar.bz2&amp;lt;/pre&amp;gt;&lt;br /&gt;
# &#039;&#039;cd&#039;&#039; into the directory and compile and install python locally:&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&amp;lt;pre&amp;gt;./configure --prefix=$HOME/local&lt;br /&gt;
make&lt;br /&gt;
make install&amp;lt;/pre&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
:This will install python (I used 2.7.3) into /home/&amp;lt;USERNAME&amp;gt;/local/bin/python. You might get warnings about some modules not being able to compile. :It was tcl/tk and bzip2 mainly, but things still worked out overall.&lt;br /&gt;
:&lt;br /&gt;
:You should now be able to invoke &amp;lt;tt&amp;gt;~/local/bin/python&amp;lt;/tt&amp;gt; and fall into a shell of your new python (exit with ctrl-d). Congrats, you have now a new python 2.7 that you can use. However, you will need to be able to install additional packages as a user and this is what virtualenv allows.&lt;br /&gt;
&lt;br /&gt;
====Setup virtualenv to install local python packages====&lt;br /&gt;
# Download the latest virtualenv: http://pypi.python.org/packages/source/v/virtualenv/XXX&lt;br /&gt;
# Install the virtualenv: &amp;lt;blockquote&amp;gt;&amp;lt;pre&amp;gt;~/local/bin/python ~/virtualenv-1.8/virtualenv.py  $HOME/local/virtenv&amp;lt;/pre&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
:: You will now have: ~/local/virtenv/bin/python&lt;br /&gt;
# In  ~/.bash_profile add: &amp;lt;blockquote&amp;gt;&amp;lt;pre&amp;gt;PATH=~/local/virtenv/bin:~/local/bin:${PATH}&amp;lt;/pre&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
:: so that your local python will be preferred.&lt;br /&gt;
:: Log out, log in again and test python&amp;quot; to see which version will be invoked. It should be the new python. Check &amp;quot;which easy_install&amp;quot; to see if the one in local/virtenv would be executed.&lt;br /&gt;
::  &lt;br /&gt;
:: You have now 1) a local &#039;&#039;python&#039;&#039; installation that you can use, and 2) &#039;&#039;easy_install&#039;&#039; will also work with your local user installation. From now on you can e.g. locally install the nose testing framework (&#039;&#039;easy_install nose&#039;&#039;) and use it (&#039;&#039;python -c &amp;quot;import nose&amp;quot;&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
===Install mediagoblin as a site package===&lt;br /&gt;
&lt;br /&gt;
# Check out mediagoblin from git to e.g. ~/mediagoblin&lt;br /&gt;
# Install MediaGoblin and all dependencies for MediaGoblin with easy_install.&lt;br /&gt;
:* In the mediagoblin directory issue:&lt;br /&gt;
:&amp;lt;blockquote&amp;gt;&amp;lt;pre&amp;gt;python setup.py&amp;lt;/pre&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
:* You will also need to: easy_install lxml&lt;br /&gt;
:* Python-image was trickier to install: &amp;lt;pre&amp;gt;easy_install --find-links http://www.pythonware.com/products/pil/ Imaging&amp;lt;/pre&amp;gt;&lt;br /&gt;
::Test by leaving the mediagoblin directory and see if you can import it: &amp;lt;pre&amp;gt;python -c &amp;quot;import mediagoblin&amp;quot;&amp;lt;/pre&amp;gt; looking for error messages.&lt;br /&gt;
&lt;br /&gt;
===Set up an WSGI environment on Dreamhost===&lt;br /&gt;
&lt;br /&gt;
# Enable the mod_passenger setting for ruby/python in the domains web panel&lt;br /&gt;
# &#039;&#039;cd&#039;&#039; into the domain directory (e.g. ~/media.sspaeth.de for me)&lt;br /&gt;
# Copy mediagoblin.ini and paste.ini from the ~/mediagoblin directory here&lt;br /&gt;
# Create passenger_wsgi.py in your domain directory (e.g. ~/media.sspaeth.de for me):&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&amp;lt;pre&amp;gt;import sys, os&lt;br /&gt;
INTERP = &amp;quot;/home/&amp;lt;username&amp;gt;/local/virtenv/bin/python&amp;quot;&lt;br /&gt;
#INTERP is present twice so that the new python interpreter knows the actual executable path&lt;br /&gt;
if sys.executable != INTERP: os.execl(INTERP, INTERP, *sys.argv)&lt;br /&gt;
&lt;br /&gt;
from paste.deploy import loadapp&lt;br /&gt;
application = loadapp(&#039;config:/home/mediagoblin/media.sspaeth.de/paste.ini&#039;)&lt;br /&gt;
&lt;br /&gt;
#If in case of errors, all you get are mysterious error 500, you can set debug=true in paste.ini to see stack traces&lt;br /&gt;
# Otherwise, add this:&lt;br /&gt;
#from paste.exceptions.errormiddleware import ErrorMiddleware&lt;br /&gt;
#application = ErrorMiddleware(application, debug=True)&amp;lt;/pre&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
# Set up the database by issueing: &amp;lt;pre&amp;gt;gmg dbupdate&amp;lt;/pre&amp;gt;&lt;br /&gt;
# (optional but recommended) Serve the static files directly from the webserver.&lt;br /&gt;
:In paste.ini in this section: [composite:routing] comment out the static files:&lt;br /&gt;
   #/mgoblin_static/ = mediagoblin_static&lt;br /&gt;
   #/theme_static/ = theme_static&lt;br /&gt;
:and symlink the mediagobin/mediagoblin/static directoy to public/mgoblin_static&lt;br /&gt;
:           and mediagoblin/mediagoblin/themes to public/theme_static&lt;br /&gt;
:&lt;br /&gt;
:so it is displayed directly. This step might be different depending on your web server configuration. There is no reason that static&lt;br /&gt;
:files need to go through all the python indirection when they can be served directly by nginx/apache/...&lt;br /&gt;
:&lt;br /&gt;
:In case you want to delete your git checkout after the installation (you don&#039;t need it, since you installed the mediagoblin package to ~/local/virtenv/lib/python2.7/mediagoblin... you should do the symlinking from there.&lt;/div&gt;</summary>
		<author><name>Spaetz</name></author>
	</entry>
	<entry>
		<id>https://wiki.mediagoblin.org/index.php?title=Deployment&amp;diff=1008</id>
		<title>Deployment</title>
		<link rel="alternate" type="text/html" href="https://wiki.mediagoblin.org/index.php?title=Deployment&amp;diff=1008"/>
		<updated>2012-11-28T11:36:18Z</updated>

		<summary type="html">&lt;p&gt;Spaetz: /* Setup virtualenv to install local python packages */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page could use a lot of work.  For now, a few smaller deployment tips!&lt;br /&gt;
&lt;br /&gt;
See also: http://docs.mediagoblin.org/deploying.html (some of which may belong here)&lt;br /&gt;
&lt;br /&gt;
= FCGI script =&lt;br /&gt;
&lt;br /&gt;
This works great with the apache config example below :)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;#!/path/to/mediagoblin/bin/python&lt;br /&gt;
&lt;br /&gt;
# Written in 2011 by Christopher Allan Webber&lt;br /&gt;
#&lt;br /&gt;
# To the extent possible under law, the author(s) have dedicated all&lt;br /&gt;
# copyright and related and neighboring rights to this software to the&lt;br /&gt;
# public domain worldwide. This software is distributed without any&lt;br /&gt;
# warranty.&lt;br /&gt;
# &lt;br /&gt;
# You should have received a copy of the CC0 Public Domain Dedication along&lt;br /&gt;
# with this software. If not, see&lt;br /&gt;
# &amp;lt;http://creativecommons.org/publicdomain/zero/1.0/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
from paste.deploy import loadapp&lt;br /&gt;
from flup.server.fcgi import WSGIServer&lt;br /&gt;
&lt;br /&gt;
CONFIG_PATH = &#039;/path/to/mediagoblin/paste.ini&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def launch_fcgi():&lt;br /&gt;
    ccengine_wsgi_app = loadapp(&#039;config:&#039; + CONFIG_PATH)&lt;br /&gt;
    WSGIServer(ccengine_wsgi_app).run()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == &#039;__main__&#039;:&lt;br /&gt;
    launch_fcgi()&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Apache 2 Config with fcgid =&lt;br /&gt;
&lt;br /&gt;
Note that the libapache2-mod-fcgi in Debian is in the nonfree section, and MediaGoblin users will want to avoid that. Instead, libapache2-mod-fcgid can be used, but requires a slightly different configuration.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;VirtualHost *:80&amp;gt;&lt;br /&gt;
ServerName media.example.com&lt;br /&gt;
ServerAlias www.media.example.com&lt;br /&gt;
&lt;br /&gt;
DocumentRoot /path/to/mediagoblin&lt;br /&gt;
&lt;br /&gt;
Alias /mgoblin_static/ /path/to/mediagoblin/mediagoblin/static/&lt;br /&gt;
Alias /mgoblin_media/ /path/to/mediagoblin/user_dev/media/public/&lt;br /&gt;
&lt;br /&gt;
# Rewrite all URLs to fcgi, except for static and media urls&lt;br /&gt;
RewriteEngine On&lt;br /&gt;
RewriteRule ^(mgoblin_static|mgoblin_media)($|/) - [L]&lt;br /&gt;
RewriteCond %{REQUEST_FILENAME} !-f&lt;br /&gt;
RewriteRule ^/(.*)$ /mg.fcgi/$1 [QSA,L]&lt;br /&gt;
&lt;br /&gt;
# Allow access to static and media directories&lt;br /&gt;
&amp;lt;Directory /mgoblin_static&amp;gt;&lt;br /&gt;
  Order allow,deny&lt;br /&gt;
  Allow from all&lt;br /&gt;
&amp;lt;/Directory&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;Directory /mgoblin_media&amp;gt;&lt;br /&gt;
  Order allow,deny&lt;br /&gt;
  Allow from all&lt;br /&gt;
&amp;lt;/Directory&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;Directory /path/to/mediagoblin/&amp;gt;&lt;br /&gt;
        SetHandler fcgid-script&lt;br /&gt;
        Options +ExecCGI&lt;br /&gt;
        FcgidWrapper /path/to/mediagoblin/mg.fcgi&lt;br /&gt;
        order allow,deny&lt;br /&gt;
        allow from all&lt;br /&gt;
&amp;lt;/Directory&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Apache Config Example =&lt;br /&gt;
This configuration example uses mod_fastcgi.&lt;br /&gt;
&lt;br /&gt;
To install and enable mod_fastcgi on a Debian/Ubuntu based system:&lt;br /&gt;
&amp;lt;pre&amp;gt;# apt-get install libapache2-mod-suexec libapache2-mod-fastcgi&lt;br /&gt;
# a2enmod suexec&lt;br /&gt;
# a2enmod fastcgi&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sample configuration:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;VirtualHost *:80&amp;gt;&lt;br /&gt;
ServerName mediagoblin.yourdomain.tld&lt;br /&gt;
ServerAdmin webmaster@yourdoimain.tld&lt;br /&gt;
DocumentRoot /var/www/&lt;br /&gt;
# Custom log files&lt;br /&gt;
CustomLog /var/log/apache2/mediagobling_access.log combined&lt;br /&gt;
ErrorLog /var/log/apache2/mediagoblin_error.log&lt;br /&gt;
&lt;br /&gt;
# Serve static and media files via alias&lt;br /&gt;
Alias /mgoblin_static/ /path/to/mediagoblin/mediagoblin/static/&lt;br /&gt;
Alias /mgoblin_media/ /path/to/mediagoblin/user_dev/media/public/&lt;br /&gt;
&lt;br /&gt;
# Rewrite all URLs to fcgi, except for static and media urls&lt;br /&gt;
RewriteEngine On&lt;br /&gt;
RewriteRule ^(mgoblin_static|mgoblin_media)($|/) - [L]&lt;br /&gt;
RewriteCond %{REQUEST_FILENAME} !-f&lt;br /&gt;
RewriteRule ^/(.*)$ /mg.fcgi/$1 [QSA,L]&lt;br /&gt;
&lt;br /&gt;
# Allow access to static and media directories&lt;br /&gt;
&amp;lt;Directory /path/to/mediagoblin/mediagoblin/static&amp;gt;&lt;br /&gt;
  Order allow,deny&lt;br /&gt;
  Allow from all&lt;br /&gt;
&amp;lt;/Directory&amp;gt;&lt;br /&gt;
&amp;lt;Directory /path/to/mediagoblin/mediagoblin/user_dev/media/public&amp;gt;&lt;br /&gt;
  Order allow,deny&lt;br /&gt;
  Allow from all&lt;br /&gt;
&amp;lt;/Directory&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# Connect to fcgi server&lt;br /&gt;
FastCGIExternalServer /var/www/mg.fcgi -host 127.0.0.1:26543&lt;br /&gt;
&amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Then, you need to make sure mediagoblin is running in fcgi mode:&lt;br /&gt;
&amp;lt;pre&amp;gt;cd /path/to/mediagoblin&lt;br /&gt;
./lazyserver.sh --server-name=fcgi fcgi_host=127.0.0.1 fcgi_port=26543&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note: there may be several ways to improve this configuration&lt;br /&gt;
&lt;br /&gt;
= Juju =&lt;br /&gt;
&lt;br /&gt;
There is a juju [https://juju.ubuntu.com/Charms charm] available for deploying mediagoblin into EC2 or on your local box.  [https://juju.ubuntu.com/ juju] is available in Ubuntu 11.10 and later, though it is recommended that you pull it from [https://launchpad.net/~juju/+archive/pkgs| the juju PPA], which includes backported packages going back to Ubuntu 11.10. To use the juju charm, install juju and configure either the [https://juju.ubuntu.com/docs/provider-configuration-local.html local provider] or one of the cloud API providers, currently the [https://juju.ubuntu.com/docs/provider-configuration-ec2.html EC2 provider] is the best supported and works not only with Amazon Web Services but also OpenStack clouds. There is also a newer native OpenStack API provider which is known to support HP Cloud.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# if you have not bootstrapped&lt;br /&gt;
juju bootstrap&lt;br /&gt;
mkdir ~/charms&lt;br /&gt;
bzr init-repo ~/charms/precise&lt;br /&gt;
bzr branch lp:~clint-fewbar/charms/precise/mediagoblin/trunk ~/charms/precise/mediagoblin&lt;br /&gt;
juju deploy --repository ~/charms local:mediagoblin&lt;br /&gt;
juju expose mediagoblin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Currently the charm is volatile, deploying from trunk, and deploys a single-server version of MediaGoblin only. It will eventually relate to the existing juju charms for other supported data stores to allow one to scale out their MediaGoblin instance.&lt;br /&gt;
&lt;br /&gt;
= ArchLinux init scripts =&lt;br /&gt;
&lt;br /&gt;
[http://whird.jpope.org/2012/04/14/mediagoblin-archlinux-rcd-scripts Jeremy Pope has written a nice blogpost] on how to add init scripts to deploy MediaGoblin with both the python paste http server and the celery deployments separated.&lt;br /&gt;
&lt;br /&gt;
If you want a simpler setup and don&#039;t want to deploy celery separately, consider either turning CELERY_ALWAYS_EAGER to true in the paste init script described above, or check out [http://chimo.chromic.org/2012/03/01/mediagoblin-init-script-on-archlinux/ Chimo&#039;s guide].&lt;br /&gt;
&lt;br /&gt;
== Running on Dreamhost.com ==&lt;br /&gt;
&lt;br /&gt;
===Set up your python virtualenv===&lt;br /&gt;
&lt;br /&gt;
dreamhost.com servers come with python 2.4 and 2.5 installed which is too old for mediagoblin. This means you need to compile and install a newer python (don&#039;t worry this is really not difficult on dreamhost servers). In order to be able to install python packages for a local user without touching system files, we need to setup a python &#039;&#039;virtualenv&#039;&#039;. Fortunately, this is not too tricky either. If your server has python 2.6 or 2.7 installed already, you can skip the [[#Install a local python|python installation stuff]] and you&#039;ll only need to [[#Setup virtualenv to install local python packages|install virtualenv]].&lt;br /&gt;
&lt;br /&gt;
====Install a local python====&lt;br /&gt;
# Download the latest python: http://python.org/ftp/python/XXX/Python-XXX.tar.bz2&lt;br /&gt;
# Unpack with &amp;lt;pre&amp;gt;tar xvjf Python-XXX.tar.bz2&amp;lt;/pre&amp;gt;&lt;br /&gt;
# &#039;&#039;cd&#039;&#039; into the directory and compile and install python locally:&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&amp;lt;pre&amp;gt;./configure --prefix=$HOME/local&lt;br /&gt;
make&lt;br /&gt;
make install&amp;lt;/pre&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
:This will install python (I used 2.7.3) into /home/&amp;lt;USERNAME&amp;gt;/local/bin/python. You might get warnings about some modules not being able to compile. :It was tcl/tk and bzip2 mainly, but things still worked out overall.&lt;br /&gt;
:&lt;br /&gt;
:You should now be able to invoke &amp;lt;tt&amp;gt;~/local/bin/python&amp;lt;/tt&amp;gt; and fall into a shell of your new python (exit with ctrl-d). Congrats, you have now a new python 2.7 that you can use. However, you will need to be able to install additional packages as a user and this is what virtualenv allows.&lt;br /&gt;
&lt;br /&gt;
====Setup virtualenv to install local python packages====&lt;br /&gt;
# Download the latest virtualenv: http://pypi.python.org/packages/source/v/virtualenv/XXX&lt;br /&gt;
# Install the virtualenv: &amp;lt;blockquote&amp;gt;&amp;lt;pre&amp;gt;~/local/bin/python ~/virtualenv-1.8/virtualenv.py  $HOME/local/virtenv&amp;lt;/pre&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
:: You will now have: ~/local/virtenv/bin/python&lt;br /&gt;
# In  ~/.bash_profile add: &amp;lt;blockquote&amp;gt;&amp;lt;pre&amp;gt;PATH=~/local/virtenv/bin:~/local/bin:${PATH}&amp;lt;/pre&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
:: so that your local python will be preferred.&lt;br /&gt;
:: Log out, log in again and test python&amp;quot; to see which version will be invoked. It should be the new python. Check &amp;quot;which easy_install&amp;quot; to see if the one in local/virtenv would be executed.&lt;br /&gt;
::  &lt;br /&gt;
:: You have now 1) a local &#039;&#039;python&#039;&#039; installation that you can use, and 2) &#039;&#039;easy_install&#039;&#039; will also work with your local user installation. From now on you can e.g. locally install the nose testing framework (&#039;&#039;easy_install nose&#039;&#039;) and use it (&#039;&#039;python -c &amp;quot;import nose&amp;quot;&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
===Install mediagoblin as a site package===&lt;br /&gt;
&lt;br /&gt;
# Check out mediagoblin from git to e.g. ~/mediagoblin&lt;br /&gt;
# Install MediaGoblin and all dependencies for MediaGoblin with easy_install.&lt;br /&gt;
:* In the mediagoblin directory issue:&lt;br /&gt;
:&amp;lt;blockquote&amp;gt;&amp;lt;pre&amp;gt;python setup.py&amp;lt;/pre&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
:* You will also need to: easy_install lxml&lt;br /&gt;
:* Python-image was trickier to install:&lt;br /&gt;
:&amp;lt;blockquote&amp;gt;&amp;lt;pre&amp;gt;easy_install --find-links http://www.pythonware.com/products/pil/ Imaging&amp;lt;/pre&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
:test by leaving the mediagoblin directory and see if you can import it:&lt;br /&gt;
:&amp;lt;blockquote&amp;gt;&amp;lt;pre&amp;gt;python&amp;lt;ENTER&amp;gt;import mediagoblin&amp;lt;CTRL-D&amp;gt;&amp;lt;/pre&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
:looking for errors.&lt;br /&gt;
&lt;br /&gt;
===Set up an WSGI environment on Dreamhost===&lt;br /&gt;
&lt;br /&gt;
# Enable the mod_passenger setting for ruby/python in the domains web panel&lt;br /&gt;
# &#039;&#039;cd&#039;&#039; into the domain directory (e.g. ~/media.sspaeth.de for me)&lt;br /&gt;
# Copy mediagoblin.ini and paste.ini from the ~/mediagoblin directory here&lt;br /&gt;
# Create passenger_wsgi.py in your domain directory (e.g. ~/media.sspaeth.de for me):&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&amp;lt;pre&amp;gt;import sys, os&lt;br /&gt;
INTERP = &amp;quot;/home/&amp;lt;username&amp;gt;/local/virtenv/bin/python&amp;quot;&lt;br /&gt;
#INTERP is present twice so that the new python interpreter knows the actual executable path&lt;br /&gt;
if sys.executable != INTERP: os.execl(INTERP, INTERP, *sys.argv)&lt;br /&gt;
&lt;br /&gt;
from paste.deploy import loadapp&lt;br /&gt;
application = loadapp(&#039;config:/home/mediagoblin/media.sspaeth.de/paste.ini&#039;)&lt;br /&gt;
&lt;br /&gt;
#If in case of errors, all you get are mysterious error 500, you can set debug=true in paste.ini to see stack traces&lt;br /&gt;
# Otherwise, add this:&lt;br /&gt;
#from paste.exceptions.errormiddleware import ErrorMiddleware&lt;br /&gt;
#application = ErrorMiddleware(application, debug=True)&amp;lt;/pre&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
# Set up the database by issueing: &amp;lt;pre&amp;gt;gmg dbupdate&amp;lt;/pre&amp;gt;&lt;br /&gt;
# (optional but recommended) Serve the static files directly from the webserver.&lt;br /&gt;
:In paste.ini in this section: [composite:routing] comment out the static files:&lt;br /&gt;
   #/mgoblin_static/ = mediagoblin_static&lt;br /&gt;
   #/theme_static/ = theme_static&lt;br /&gt;
:and symlink the mediagobin/mediagoblin/static directoy to public/mgoblin_static&lt;br /&gt;
:           and mediagoblin/mediagoblin/themes to public/theme_static&lt;br /&gt;
:&lt;br /&gt;
:so it is displayed directly. This step might be different depending on your web server configuration. There is no reason that static&lt;br /&gt;
:files need to go through all the python indirection when they can be served directly by nginx/apache/...&lt;br /&gt;
:&lt;br /&gt;
:In case you want to delete your git checkout after the installation (you don&#039;t need it, since you installed the mediagoblin package to ~/local/virtenv/lib/python2.7/mediagoblin... you should do the symlinking from there.&lt;/div&gt;</summary>
		<author><name>Spaetz</name></author>
	</entry>
	<entry>
		<id>https://wiki.mediagoblin.org/index.php?title=Deployment&amp;diff=1007</id>
		<title>Deployment</title>
		<link rel="alternate" type="text/html" href="https://wiki.mediagoblin.org/index.php?title=Deployment&amp;diff=1007"/>
		<updated>2012-11-28T11:31:22Z</updated>

		<summary type="html">&lt;p&gt;Spaetz: /* Set up your python virtualenv */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page could use a lot of work.  For now, a few smaller deployment tips!&lt;br /&gt;
&lt;br /&gt;
See also: http://docs.mediagoblin.org/deploying.html (some of which may belong here)&lt;br /&gt;
&lt;br /&gt;
= FCGI script =&lt;br /&gt;
&lt;br /&gt;
This works great with the apache config example below :)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;#!/path/to/mediagoblin/bin/python&lt;br /&gt;
&lt;br /&gt;
# Written in 2011 by Christopher Allan Webber&lt;br /&gt;
#&lt;br /&gt;
# To the extent possible under law, the author(s) have dedicated all&lt;br /&gt;
# copyright and related and neighboring rights to this software to the&lt;br /&gt;
# public domain worldwide. This software is distributed without any&lt;br /&gt;
# warranty.&lt;br /&gt;
# &lt;br /&gt;
# You should have received a copy of the CC0 Public Domain Dedication along&lt;br /&gt;
# with this software. If not, see&lt;br /&gt;
# &amp;lt;http://creativecommons.org/publicdomain/zero/1.0/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
from paste.deploy import loadapp&lt;br /&gt;
from flup.server.fcgi import WSGIServer&lt;br /&gt;
&lt;br /&gt;
CONFIG_PATH = &#039;/path/to/mediagoblin/paste.ini&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def launch_fcgi():&lt;br /&gt;
    ccengine_wsgi_app = loadapp(&#039;config:&#039; + CONFIG_PATH)&lt;br /&gt;
    WSGIServer(ccengine_wsgi_app).run()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == &#039;__main__&#039;:&lt;br /&gt;
    launch_fcgi()&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Apache 2 Config with fcgid =&lt;br /&gt;
&lt;br /&gt;
Note that the libapache2-mod-fcgi in Debian is in the nonfree section, and MediaGoblin users will want to avoid that. Instead, libapache2-mod-fcgid can be used, but requires a slightly different configuration.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;VirtualHost *:80&amp;gt;&lt;br /&gt;
ServerName media.example.com&lt;br /&gt;
ServerAlias www.media.example.com&lt;br /&gt;
&lt;br /&gt;
DocumentRoot /path/to/mediagoblin&lt;br /&gt;
&lt;br /&gt;
Alias /mgoblin_static/ /path/to/mediagoblin/mediagoblin/static/&lt;br /&gt;
Alias /mgoblin_media/ /path/to/mediagoblin/user_dev/media/public/&lt;br /&gt;
&lt;br /&gt;
# Rewrite all URLs to fcgi, except for static and media urls&lt;br /&gt;
RewriteEngine On&lt;br /&gt;
RewriteRule ^(mgoblin_static|mgoblin_media)($|/) - [L]&lt;br /&gt;
RewriteCond %{REQUEST_FILENAME} !-f&lt;br /&gt;
RewriteRule ^/(.*)$ /mg.fcgi/$1 [QSA,L]&lt;br /&gt;
&lt;br /&gt;
# Allow access to static and media directories&lt;br /&gt;
&amp;lt;Directory /mgoblin_static&amp;gt;&lt;br /&gt;
  Order allow,deny&lt;br /&gt;
  Allow from all&lt;br /&gt;
&amp;lt;/Directory&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;Directory /mgoblin_media&amp;gt;&lt;br /&gt;
  Order allow,deny&lt;br /&gt;
  Allow from all&lt;br /&gt;
&amp;lt;/Directory&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;Directory /path/to/mediagoblin/&amp;gt;&lt;br /&gt;
        SetHandler fcgid-script&lt;br /&gt;
        Options +ExecCGI&lt;br /&gt;
        FcgidWrapper /path/to/mediagoblin/mg.fcgi&lt;br /&gt;
        order allow,deny&lt;br /&gt;
        allow from all&lt;br /&gt;
&amp;lt;/Directory&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Apache Config Example =&lt;br /&gt;
This configuration example uses mod_fastcgi.&lt;br /&gt;
&lt;br /&gt;
To install and enable mod_fastcgi on a Debian/Ubuntu based system:&lt;br /&gt;
&amp;lt;pre&amp;gt;# apt-get install libapache2-mod-suexec libapache2-mod-fastcgi&lt;br /&gt;
# a2enmod suexec&lt;br /&gt;
# a2enmod fastcgi&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sample configuration:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;VirtualHost *:80&amp;gt;&lt;br /&gt;
ServerName mediagoblin.yourdomain.tld&lt;br /&gt;
ServerAdmin webmaster@yourdoimain.tld&lt;br /&gt;
DocumentRoot /var/www/&lt;br /&gt;
# Custom log files&lt;br /&gt;
CustomLog /var/log/apache2/mediagobling_access.log combined&lt;br /&gt;
ErrorLog /var/log/apache2/mediagoblin_error.log&lt;br /&gt;
&lt;br /&gt;
# Serve static and media files via alias&lt;br /&gt;
Alias /mgoblin_static/ /path/to/mediagoblin/mediagoblin/static/&lt;br /&gt;
Alias /mgoblin_media/ /path/to/mediagoblin/user_dev/media/public/&lt;br /&gt;
&lt;br /&gt;
# Rewrite all URLs to fcgi, except for static and media urls&lt;br /&gt;
RewriteEngine On&lt;br /&gt;
RewriteRule ^(mgoblin_static|mgoblin_media)($|/) - [L]&lt;br /&gt;
RewriteCond %{REQUEST_FILENAME} !-f&lt;br /&gt;
RewriteRule ^/(.*)$ /mg.fcgi/$1 [QSA,L]&lt;br /&gt;
&lt;br /&gt;
# Allow access to static and media directories&lt;br /&gt;
&amp;lt;Directory /path/to/mediagoblin/mediagoblin/static&amp;gt;&lt;br /&gt;
  Order allow,deny&lt;br /&gt;
  Allow from all&lt;br /&gt;
&amp;lt;/Directory&amp;gt;&lt;br /&gt;
&amp;lt;Directory /path/to/mediagoblin/mediagoblin/user_dev/media/public&amp;gt;&lt;br /&gt;
  Order allow,deny&lt;br /&gt;
  Allow from all&lt;br /&gt;
&amp;lt;/Directory&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# Connect to fcgi server&lt;br /&gt;
FastCGIExternalServer /var/www/mg.fcgi -host 127.0.0.1:26543&lt;br /&gt;
&amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Then, you need to make sure mediagoblin is running in fcgi mode:&lt;br /&gt;
&amp;lt;pre&amp;gt;cd /path/to/mediagoblin&lt;br /&gt;
./lazyserver.sh --server-name=fcgi fcgi_host=127.0.0.1 fcgi_port=26543&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note: there may be several ways to improve this configuration&lt;br /&gt;
&lt;br /&gt;
= Juju =&lt;br /&gt;
&lt;br /&gt;
There is a juju [https://juju.ubuntu.com/Charms charm] available for deploying mediagoblin into EC2 or on your local box.  [https://juju.ubuntu.com/ juju] is available in Ubuntu 11.10 and later, though it is recommended that you pull it from [https://launchpad.net/~juju/+archive/pkgs| the juju PPA], which includes backported packages going back to Ubuntu 11.10. To use the juju charm, install juju and configure either the [https://juju.ubuntu.com/docs/provider-configuration-local.html local provider] or one of the cloud API providers, currently the [https://juju.ubuntu.com/docs/provider-configuration-ec2.html EC2 provider] is the best supported and works not only with Amazon Web Services but also OpenStack clouds. There is also a newer native OpenStack API provider which is known to support HP Cloud.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# if you have not bootstrapped&lt;br /&gt;
juju bootstrap&lt;br /&gt;
mkdir ~/charms&lt;br /&gt;
bzr init-repo ~/charms/precise&lt;br /&gt;
bzr branch lp:~clint-fewbar/charms/precise/mediagoblin/trunk ~/charms/precise/mediagoblin&lt;br /&gt;
juju deploy --repository ~/charms local:mediagoblin&lt;br /&gt;
juju expose mediagoblin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Currently the charm is volatile, deploying from trunk, and deploys a single-server version of MediaGoblin only. It will eventually relate to the existing juju charms for other supported data stores to allow one to scale out their MediaGoblin instance.&lt;br /&gt;
&lt;br /&gt;
= ArchLinux init scripts =&lt;br /&gt;
&lt;br /&gt;
[http://whird.jpope.org/2012/04/14/mediagoblin-archlinux-rcd-scripts Jeremy Pope has written a nice blogpost] on how to add init scripts to deploy MediaGoblin with both the python paste http server and the celery deployments separated.&lt;br /&gt;
&lt;br /&gt;
If you want a simpler setup and don&#039;t want to deploy celery separately, consider either turning CELERY_ALWAYS_EAGER to true in the paste init script described above, or check out [http://chimo.chromic.org/2012/03/01/mediagoblin-init-script-on-archlinux/ Chimo&#039;s guide].&lt;br /&gt;
&lt;br /&gt;
== Running on Dreamhost.com ==&lt;br /&gt;
&lt;br /&gt;
===Set up your python virtualenv===&lt;br /&gt;
&lt;br /&gt;
dreamhost.com servers come with python 2.4 and 2.5 installed which is too old for mediagoblin. This means you need to compile and install a newer python (don&#039;t worry this is really not difficult on dreamhost servers). In order to be able to install python packages for a local user without touching system files, we need to setup a python &#039;&#039;virtualenv&#039;&#039;. Fortunately, this is not too tricky either. If your server has python 2.6 or 2.7 installed already, you can skip the [[#Install a local python|python installation stuff]] and you&#039;ll only need to [[#Setup virtualenv to install local python packages|install virtualenv]].&lt;br /&gt;
&lt;br /&gt;
====Install a local python====&lt;br /&gt;
# Download the latest python: http://python.org/ftp/python/XXX/Python-XXX.tar.bz2&lt;br /&gt;
# Unpack with &amp;lt;pre&amp;gt;tar xvjf Python-XXX.tar.bz2&amp;lt;/pre&amp;gt;&lt;br /&gt;
# &#039;&#039;cd&#039;&#039; into the directory and compile and install python locally:&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&amp;lt;pre&amp;gt;./configure --prefix=$HOME/local&lt;br /&gt;
make&lt;br /&gt;
make install&amp;lt;/pre&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
:This will install python (I used 2.7.3) into /home/&amp;lt;USERNAME&amp;gt;/local/bin/python. You might get warnings about some modules not being able to compile. :It was tcl/tk and bzip2 mainly, but things still worked out overall.&lt;br /&gt;
:&lt;br /&gt;
:You should now be able to invoke &amp;lt;tt&amp;gt;~/local/bin/python&amp;lt;/tt&amp;gt; and fall into a shell of your new python (exit with ctrl-d). Congrats, you have now a new python 2.7 that you can use. However, you will need to be able to install additional packages as a user and this is what virtualenv allows.&lt;br /&gt;
&lt;br /&gt;
====Setup virtualenv to install local python packages====&lt;br /&gt;
# Download the latest virtualenv: http://pypi.python.org/packages/source/v/virtualenv/XXX&lt;br /&gt;
# Install the virtualenv:&lt;br /&gt;
:&amp;lt;blockquote&amp;gt;&amp;lt;pre&amp;gt;~/local/bin/python ~/virtualenv-1.8/virtualenv.py  $HOME/local/virtenv&amp;lt;/pre&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
:You will now have: ~/local/virtenv/bin/python&lt;br /&gt;
# In  ~/.bash_profile add:&lt;br /&gt;
:&amp;lt;blockquote&amp;gt;&amp;lt;pre&amp;gt;PATH=~/local/virtenv/bin:~/local/bin:${PATH}&amp;lt;/pre&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
:so that your local python will be preferred.&lt;br /&gt;
:Log out, log in again and test python&amp;quot; to see which version will be invoked. It should be the new python. Check &amp;quot;which easy_install&amp;quot; to see if the one in local/virtenv would be executed.&lt;br /&gt;
:You have now a local python installation that you can use, and easy_install will also work with your local user installation.&lt;br /&gt;
&lt;br /&gt;
===Install mediagoblin as a site package===&lt;br /&gt;
&lt;br /&gt;
# Check out mediagoblin from git to e.g. ~/mediagoblin&lt;br /&gt;
# Install MediaGoblin and all dependencies for MediaGoblin with easy_install.&lt;br /&gt;
:* In the mediagoblin directory issue:&lt;br /&gt;
:&amp;lt;blockquote&amp;gt;&amp;lt;pre&amp;gt;python setup.py&amp;lt;/pre&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
:* You will also need to: easy_install lxml&lt;br /&gt;
:* Python-image was trickier to install:&lt;br /&gt;
:&amp;lt;blockquote&amp;gt;&amp;lt;pre&amp;gt;easy_install --find-links http://www.pythonware.com/products/pil/ Imaging&amp;lt;/pre&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
:test by leaving the mediagoblin directory and see if you can import it:&lt;br /&gt;
:&amp;lt;blockquote&amp;gt;&amp;lt;pre&amp;gt;python&amp;lt;ENTER&amp;gt;import mediagoblin&amp;lt;CTRL-D&amp;gt;&amp;lt;/pre&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
:looking for errors.&lt;br /&gt;
&lt;br /&gt;
===Set up an WSGI environment on Dreamhost===&lt;br /&gt;
&lt;br /&gt;
# Enable the mod_passenger setting for ruby/python in the domains web panel&lt;br /&gt;
# &#039;&#039;cd&#039;&#039; into the domain directory (e.g. ~/media.sspaeth.de for me)&lt;br /&gt;
# Copy mediagoblin.ini and paste.ini from the ~/mediagoblin directory here&lt;br /&gt;
# Create passenger_wsgi.py in your domain directory (e.g. ~/media.sspaeth.de for me):&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&amp;lt;pre&amp;gt;import sys, os&lt;br /&gt;
INTERP = &amp;quot;/home/&amp;lt;username&amp;gt;/local/virtenv/bin/python&amp;quot;&lt;br /&gt;
#INTERP is present twice so that the new python interpreter knows the actual executable path&lt;br /&gt;
if sys.executable != INTERP: os.execl(INTERP, INTERP, *sys.argv)&lt;br /&gt;
&lt;br /&gt;
from paste.deploy import loadapp&lt;br /&gt;
application = loadapp(&#039;config:/home/mediagoblin/media.sspaeth.de/paste.ini&#039;)&lt;br /&gt;
&lt;br /&gt;
#If in case of errors, all you get are mysterious error 500, you can set debug=true in paste.ini to see stack traces&lt;br /&gt;
# Otherwise, add this:&lt;br /&gt;
#from paste.exceptions.errormiddleware import ErrorMiddleware&lt;br /&gt;
#application = ErrorMiddleware(application, debug=True)&amp;lt;/pre&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
# Set up the database by issueing: &amp;lt;pre&amp;gt;gmg dbupdate&amp;lt;/pre&amp;gt;&lt;br /&gt;
# (optional but recommended) Serve the static files directly from the webserver.&lt;br /&gt;
:In paste.ini in this section: [composite:routing] comment out the static files:&lt;br /&gt;
   #/mgoblin_static/ = mediagoblin_static&lt;br /&gt;
   #/theme_static/ = theme_static&lt;br /&gt;
:and symlink the mediagobin/mediagoblin/static directoy to public/mgoblin_static&lt;br /&gt;
:           and mediagoblin/mediagoblin/themes to public/theme_static&lt;br /&gt;
:&lt;br /&gt;
:so it is displayed directly. This step might be different depending on your web server configuration. There is no reason that static&lt;br /&gt;
:files need to go through all the python indirection when they can be served directly by nginx/apache/...&lt;br /&gt;
:&lt;br /&gt;
:In case you want to delete your git checkout after the installation (you don&#039;t need it, since you installed the mediagoblin package to ~/local/virtenv/lib/python2.7/mediagoblin... you should do the symlinking from there.&lt;/div&gt;</summary>
		<author><name>Spaetz</name></author>
	</entry>
	<entry>
		<id>https://wiki.mediagoblin.org/index.php?title=Deployment&amp;diff=1006</id>
		<title>Deployment</title>
		<link rel="alternate" type="text/html" href="https://wiki.mediagoblin.org/index.php?title=Deployment&amp;diff=1006"/>
		<updated>2012-11-28T11:30:35Z</updated>

		<summary type="html">&lt;p&gt;Spaetz: /* Set up your python virtualenv */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page could use a lot of work.  For now, a few smaller deployment tips!&lt;br /&gt;
&lt;br /&gt;
See also: http://docs.mediagoblin.org/deploying.html (some of which may belong here)&lt;br /&gt;
&lt;br /&gt;
= FCGI script =&lt;br /&gt;
&lt;br /&gt;
This works great with the apache config example below :)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;#!/path/to/mediagoblin/bin/python&lt;br /&gt;
&lt;br /&gt;
# Written in 2011 by Christopher Allan Webber&lt;br /&gt;
#&lt;br /&gt;
# To the extent possible under law, the author(s) have dedicated all&lt;br /&gt;
# copyright and related and neighboring rights to this software to the&lt;br /&gt;
# public domain worldwide. This software is distributed without any&lt;br /&gt;
# warranty.&lt;br /&gt;
# &lt;br /&gt;
# You should have received a copy of the CC0 Public Domain Dedication along&lt;br /&gt;
# with this software. If not, see&lt;br /&gt;
# &amp;lt;http://creativecommons.org/publicdomain/zero/1.0/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
from paste.deploy import loadapp&lt;br /&gt;
from flup.server.fcgi import WSGIServer&lt;br /&gt;
&lt;br /&gt;
CONFIG_PATH = &#039;/path/to/mediagoblin/paste.ini&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def launch_fcgi():&lt;br /&gt;
    ccengine_wsgi_app = loadapp(&#039;config:&#039; + CONFIG_PATH)&lt;br /&gt;
    WSGIServer(ccengine_wsgi_app).run()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == &#039;__main__&#039;:&lt;br /&gt;
    launch_fcgi()&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Apache 2 Config with fcgid =&lt;br /&gt;
&lt;br /&gt;
Note that the libapache2-mod-fcgi in Debian is in the nonfree section, and MediaGoblin users will want to avoid that. Instead, libapache2-mod-fcgid can be used, but requires a slightly different configuration.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;VirtualHost *:80&amp;gt;&lt;br /&gt;
ServerName media.example.com&lt;br /&gt;
ServerAlias www.media.example.com&lt;br /&gt;
&lt;br /&gt;
DocumentRoot /path/to/mediagoblin&lt;br /&gt;
&lt;br /&gt;
Alias /mgoblin_static/ /path/to/mediagoblin/mediagoblin/static/&lt;br /&gt;
Alias /mgoblin_media/ /path/to/mediagoblin/user_dev/media/public/&lt;br /&gt;
&lt;br /&gt;
# Rewrite all URLs to fcgi, except for static and media urls&lt;br /&gt;
RewriteEngine On&lt;br /&gt;
RewriteRule ^(mgoblin_static|mgoblin_media)($|/) - [L]&lt;br /&gt;
RewriteCond %{REQUEST_FILENAME} !-f&lt;br /&gt;
RewriteRule ^/(.*)$ /mg.fcgi/$1 [QSA,L]&lt;br /&gt;
&lt;br /&gt;
# Allow access to static and media directories&lt;br /&gt;
&amp;lt;Directory /mgoblin_static&amp;gt;&lt;br /&gt;
  Order allow,deny&lt;br /&gt;
  Allow from all&lt;br /&gt;
&amp;lt;/Directory&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;Directory /mgoblin_media&amp;gt;&lt;br /&gt;
  Order allow,deny&lt;br /&gt;
  Allow from all&lt;br /&gt;
&amp;lt;/Directory&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;Directory /path/to/mediagoblin/&amp;gt;&lt;br /&gt;
        SetHandler fcgid-script&lt;br /&gt;
        Options +ExecCGI&lt;br /&gt;
        FcgidWrapper /path/to/mediagoblin/mg.fcgi&lt;br /&gt;
        order allow,deny&lt;br /&gt;
        allow from all&lt;br /&gt;
&amp;lt;/Directory&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Apache Config Example =&lt;br /&gt;
This configuration example uses mod_fastcgi.&lt;br /&gt;
&lt;br /&gt;
To install and enable mod_fastcgi on a Debian/Ubuntu based system:&lt;br /&gt;
&amp;lt;pre&amp;gt;# apt-get install libapache2-mod-suexec libapache2-mod-fastcgi&lt;br /&gt;
# a2enmod suexec&lt;br /&gt;
# a2enmod fastcgi&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sample configuration:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;VirtualHost *:80&amp;gt;&lt;br /&gt;
ServerName mediagoblin.yourdomain.tld&lt;br /&gt;
ServerAdmin webmaster@yourdoimain.tld&lt;br /&gt;
DocumentRoot /var/www/&lt;br /&gt;
# Custom log files&lt;br /&gt;
CustomLog /var/log/apache2/mediagobling_access.log combined&lt;br /&gt;
ErrorLog /var/log/apache2/mediagoblin_error.log&lt;br /&gt;
&lt;br /&gt;
# Serve static and media files via alias&lt;br /&gt;
Alias /mgoblin_static/ /path/to/mediagoblin/mediagoblin/static/&lt;br /&gt;
Alias /mgoblin_media/ /path/to/mediagoblin/user_dev/media/public/&lt;br /&gt;
&lt;br /&gt;
# Rewrite all URLs to fcgi, except for static and media urls&lt;br /&gt;
RewriteEngine On&lt;br /&gt;
RewriteRule ^(mgoblin_static|mgoblin_media)($|/) - [L]&lt;br /&gt;
RewriteCond %{REQUEST_FILENAME} !-f&lt;br /&gt;
RewriteRule ^/(.*)$ /mg.fcgi/$1 [QSA,L]&lt;br /&gt;
&lt;br /&gt;
# Allow access to static and media directories&lt;br /&gt;
&amp;lt;Directory /path/to/mediagoblin/mediagoblin/static&amp;gt;&lt;br /&gt;
  Order allow,deny&lt;br /&gt;
  Allow from all&lt;br /&gt;
&amp;lt;/Directory&amp;gt;&lt;br /&gt;
&amp;lt;Directory /path/to/mediagoblin/mediagoblin/user_dev/media/public&amp;gt;&lt;br /&gt;
  Order allow,deny&lt;br /&gt;
  Allow from all&lt;br /&gt;
&amp;lt;/Directory&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# Connect to fcgi server&lt;br /&gt;
FastCGIExternalServer /var/www/mg.fcgi -host 127.0.0.1:26543&lt;br /&gt;
&amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Then, you need to make sure mediagoblin is running in fcgi mode:&lt;br /&gt;
&amp;lt;pre&amp;gt;cd /path/to/mediagoblin&lt;br /&gt;
./lazyserver.sh --server-name=fcgi fcgi_host=127.0.0.1 fcgi_port=26543&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note: there may be several ways to improve this configuration&lt;br /&gt;
&lt;br /&gt;
= Juju =&lt;br /&gt;
&lt;br /&gt;
There is a juju [https://juju.ubuntu.com/Charms charm] available for deploying mediagoblin into EC2 or on your local box.  [https://juju.ubuntu.com/ juju] is available in Ubuntu 11.10 and later, though it is recommended that you pull it from [https://launchpad.net/~juju/+archive/pkgs| the juju PPA], which includes backported packages going back to Ubuntu 11.10. To use the juju charm, install juju and configure either the [https://juju.ubuntu.com/docs/provider-configuration-local.html local provider] or one of the cloud API providers, currently the [https://juju.ubuntu.com/docs/provider-configuration-ec2.html EC2 provider] is the best supported and works not only with Amazon Web Services but also OpenStack clouds. There is also a newer native OpenStack API provider which is known to support HP Cloud.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# if you have not bootstrapped&lt;br /&gt;
juju bootstrap&lt;br /&gt;
mkdir ~/charms&lt;br /&gt;
bzr init-repo ~/charms/precise&lt;br /&gt;
bzr branch lp:~clint-fewbar/charms/precise/mediagoblin/trunk ~/charms/precise/mediagoblin&lt;br /&gt;
juju deploy --repository ~/charms local:mediagoblin&lt;br /&gt;
juju expose mediagoblin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Currently the charm is volatile, deploying from trunk, and deploys a single-server version of MediaGoblin only. It will eventually relate to the existing juju charms for other supported data stores to allow one to scale out their MediaGoblin instance.&lt;br /&gt;
&lt;br /&gt;
= ArchLinux init scripts =&lt;br /&gt;
&lt;br /&gt;
[http://whird.jpope.org/2012/04/14/mediagoblin-archlinux-rcd-scripts Jeremy Pope has written a nice blogpost] on how to add init scripts to deploy MediaGoblin with both the python paste http server and the celery deployments separated.&lt;br /&gt;
&lt;br /&gt;
If you want a simpler setup and don&#039;t want to deploy celery separately, consider either turning CELERY_ALWAYS_EAGER to true in the paste init script described above, or check out [http://chimo.chromic.org/2012/03/01/mediagoblin-init-script-on-archlinux/ Chimo&#039;s guide].&lt;br /&gt;
&lt;br /&gt;
== Running on Dreamhost.com ==&lt;br /&gt;
&lt;br /&gt;
===Set up your python virtualenv===&lt;br /&gt;
&lt;br /&gt;
dreamhost.com servers come with python 2.4 and 2.5 installed which is too old for mediagoblin. This means you need to compile and install a newer python (don&#039;t worry this is really not difficult on dreamhost servers). In order to be able to install python packages for a local user without touching system files, we need to setup a python &#039;&#039;virtualenv&#039;&#039;. Fortunately, this is not too tricky either. If your server has python 2.6 or 2.7 installed already, you can skip the [[Install a local python|#python installation stuff]] and you&#039;ll only need to [[Setup virtualenv to install local python packages|#install virtualenv]].&lt;br /&gt;
&lt;br /&gt;
====Install a local python====&lt;br /&gt;
# Download the latest python: http://python.org/ftp/python/XXX/Python-XXX.tar.bz2&lt;br /&gt;
# Unpack with &amp;lt;pre&amp;gt;tar xvjf Python-XXX.tar.bz2&amp;lt;/pre&amp;gt;&lt;br /&gt;
# &#039;&#039;cd&#039;&#039; into the directory and compile and install python locally:&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&amp;lt;pre&amp;gt;./configure --prefix=$HOME/local&lt;br /&gt;
make&lt;br /&gt;
make install&amp;lt;/pre&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
:This will install python (I used 2.7.3) into /home/&amp;lt;USERNAME&amp;gt;/local/bin/python. You might get warnings about some modules not being able to compile. :It was tcl/tk and bzip2 mainly, but things still worked out overall.&lt;br /&gt;
:&lt;br /&gt;
:You should now be able to invoke &amp;lt;tt&amp;gt;~/local/bin/python&amp;lt;/tt&amp;gt; and fall into a shell of your new python (exit with ctrl-d). Congrats, you have now a new python 2.7 that you can use. However, you will need to be able to install additional packages as a user and this is what virtualenv allows.&lt;br /&gt;
&lt;br /&gt;
====Setup virtualenv to install local python packages====&lt;br /&gt;
# Download the latest virtualenv: http://pypi.python.org/packages/source/v/virtualenv/XXX&lt;br /&gt;
# Install the virtualenv:&lt;br /&gt;
:&amp;lt;blockquote&amp;gt;&amp;lt;pre&amp;gt;~/local/bin/python ~/virtualenv-1.8/virtualenv.py  $HOME/local/virtenv&amp;lt;/pre&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
:You will now have: ~/local/virtenv/bin/python&lt;br /&gt;
# In  ~/.bash_profile add:&lt;br /&gt;
:&amp;lt;blockquote&amp;gt;&amp;lt;pre&amp;gt;PATH=~/local/virtenv/bin:~/local/bin:${PATH}&amp;lt;/pre&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
:so that your local python will be preferred.&lt;br /&gt;
:Log out, log in again and test python&amp;quot; to see which version will be invoked. It should be the new python. Check &amp;quot;which easy_install&amp;quot; to see if the one in local/virtenv would be executed.&lt;br /&gt;
:You have now a local python installation that you can use, and easy_install will also work with your local user installation.&lt;br /&gt;
&lt;br /&gt;
===Install mediagoblin as a site package===&lt;br /&gt;
&lt;br /&gt;
# Check out mediagoblin from git to e.g. ~/mediagoblin&lt;br /&gt;
# Install MediaGoblin and all dependencies for MediaGoblin with easy_install.&lt;br /&gt;
:* In the mediagoblin directory issue:&lt;br /&gt;
:&amp;lt;blockquote&amp;gt;&amp;lt;pre&amp;gt;python setup.py&amp;lt;/pre&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
:* You will also need to: easy_install lxml&lt;br /&gt;
:* Python-image was trickier to install:&lt;br /&gt;
:&amp;lt;blockquote&amp;gt;&amp;lt;pre&amp;gt;easy_install --find-links http://www.pythonware.com/products/pil/ Imaging&amp;lt;/pre&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
:test by leaving the mediagoblin directory and see if you can import it:&lt;br /&gt;
:&amp;lt;blockquote&amp;gt;&amp;lt;pre&amp;gt;python&amp;lt;ENTER&amp;gt;import mediagoblin&amp;lt;CTRL-D&amp;gt;&amp;lt;/pre&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
:looking for errors.&lt;br /&gt;
&lt;br /&gt;
===Set up an WSGI environment on Dreamhost===&lt;br /&gt;
&lt;br /&gt;
# Enable the mod_passenger setting for ruby/python in the domains web panel&lt;br /&gt;
# &#039;&#039;cd&#039;&#039; into the domain directory (e.g. ~/media.sspaeth.de for me)&lt;br /&gt;
# Copy mediagoblin.ini and paste.ini from the ~/mediagoblin directory here&lt;br /&gt;
# Create passenger_wsgi.py in your domain directory (e.g. ~/media.sspaeth.de for me):&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&amp;lt;pre&amp;gt;import sys, os&lt;br /&gt;
INTERP = &amp;quot;/home/&amp;lt;username&amp;gt;/local/virtenv/bin/python&amp;quot;&lt;br /&gt;
#INTERP is present twice so that the new python interpreter knows the actual executable path&lt;br /&gt;
if sys.executable != INTERP: os.execl(INTERP, INTERP, *sys.argv)&lt;br /&gt;
&lt;br /&gt;
from paste.deploy import loadapp&lt;br /&gt;
application = loadapp(&#039;config:/home/mediagoblin/media.sspaeth.de/paste.ini&#039;)&lt;br /&gt;
&lt;br /&gt;
#If in case of errors, all you get are mysterious error 500, you can set debug=true in paste.ini to see stack traces&lt;br /&gt;
# Otherwise, add this:&lt;br /&gt;
#from paste.exceptions.errormiddleware import ErrorMiddleware&lt;br /&gt;
#application = ErrorMiddleware(application, debug=True)&amp;lt;/pre&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
# Set up the database by issueing: &amp;lt;pre&amp;gt;gmg dbupdate&amp;lt;/pre&amp;gt;&lt;br /&gt;
# (optional but recommended) Serve the static files directly from the webserver.&lt;br /&gt;
:In paste.ini in this section: [composite:routing] comment out the static files:&lt;br /&gt;
   #/mgoblin_static/ = mediagoblin_static&lt;br /&gt;
   #/theme_static/ = theme_static&lt;br /&gt;
:and symlink the mediagobin/mediagoblin/static directoy to public/mgoblin_static&lt;br /&gt;
:           and mediagoblin/mediagoblin/themes to public/theme_static&lt;br /&gt;
:&lt;br /&gt;
:so it is displayed directly. This step might be different depending on your web server configuration. There is no reason that static&lt;br /&gt;
:files need to go through all the python indirection when they can be served directly by nginx/apache/...&lt;br /&gt;
:&lt;br /&gt;
:In case you want to delete your git checkout after the installation (you don&#039;t need it, since you installed the mediagoblin package to ~/local/virtenv/lib/python2.7/mediagoblin... you should do the symlinking from there.&lt;/div&gt;</summary>
		<author><name>Spaetz</name></author>
	</entry>
	<entry>
		<id>https://wiki.mediagoblin.org/index.php?title=Deployment&amp;diff=1005</id>
		<title>Deployment</title>
		<link rel="alternate" type="text/html" href="https://wiki.mediagoblin.org/index.php?title=Deployment&amp;diff=1005"/>
		<updated>2012-11-28T11:21:35Z</updated>

		<summary type="html">&lt;p&gt;Spaetz: /* Set up your python virtualenv */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page could use a lot of work.  For now, a few smaller deployment tips!&lt;br /&gt;
&lt;br /&gt;
See also: http://docs.mediagoblin.org/deploying.html (some of which may belong here)&lt;br /&gt;
&lt;br /&gt;
= FCGI script =&lt;br /&gt;
&lt;br /&gt;
This works great with the apache config example below :)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;#!/path/to/mediagoblin/bin/python&lt;br /&gt;
&lt;br /&gt;
# Written in 2011 by Christopher Allan Webber&lt;br /&gt;
#&lt;br /&gt;
# To the extent possible under law, the author(s) have dedicated all&lt;br /&gt;
# copyright and related and neighboring rights to this software to the&lt;br /&gt;
# public domain worldwide. This software is distributed without any&lt;br /&gt;
# warranty.&lt;br /&gt;
# &lt;br /&gt;
# You should have received a copy of the CC0 Public Domain Dedication along&lt;br /&gt;
# with this software. If not, see&lt;br /&gt;
# &amp;lt;http://creativecommons.org/publicdomain/zero/1.0/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
from paste.deploy import loadapp&lt;br /&gt;
from flup.server.fcgi import WSGIServer&lt;br /&gt;
&lt;br /&gt;
CONFIG_PATH = &#039;/path/to/mediagoblin/paste.ini&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def launch_fcgi():&lt;br /&gt;
    ccengine_wsgi_app = loadapp(&#039;config:&#039; + CONFIG_PATH)&lt;br /&gt;
    WSGIServer(ccengine_wsgi_app).run()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == &#039;__main__&#039;:&lt;br /&gt;
    launch_fcgi()&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Apache 2 Config with fcgid =&lt;br /&gt;
&lt;br /&gt;
Note that the libapache2-mod-fcgi in Debian is in the nonfree section, and MediaGoblin users will want to avoid that. Instead, libapache2-mod-fcgid can be used, but requires a slightly different configuration.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;VirtualHost *:80&amp;gt;&lt;br /&gt;
ServerName media.example.com&lt;br /&gt;
ServerAlias www.media.example.com&lt;br /&gt;
&lt;br /&gt;
DocumentRoot /path/to/mediagoblin&lt;br /&gt;
&lt;br /&gt;
Alias /mgoblin_static/ /path/to/mediagoblin/mediagoblin/static/&lt;br /&gt;
Alias /mgoblin_media/ /path/to/mediagoblin/user_dev/media/public/&lt;br /&gt;
&lt;br /&gt;
# Rewrite all URLs to fcgi, except for static and media urls&lt;br /&gt;
RewriteEngine On&lt;br /&gt;
RewriteRule ^(mgoblin_static|mgoblin_media)($|/) - [L]&lt;br /&gt;
RewriteCond %{REQUEST_FILENAME} !-f&lt;br /&gt;
RewriteRule ^/(.*)$ /mg.fcgi/$1 [QSA,L]&lt;br /&gt;
&lt;br /&gt;
# Allow access to static and media directories&lt;br /&gt;
&amp;lt;Directory /mgoblin_static&amp;gt;&lt;br /&gt;
  Order allow,deny&lt;br /&gt;
  Allow from all&lt;br /&gt;
&amp;lt;/Directory&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;Directory /mgoblin_media&amp;gt;&lt;br /&gt;
  Order allow,deny&lt;br /&gt;
  Allow from all&lt;br /&gt;
&amp;lt;/Directory&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;Directory /path/to/mediagoblin/&amp;gt;&lt;br /&gt;
        SetHandler fcgid-script&lt;br /&gt;
        Options +ExecCGI&lt;br /&gt;
        FcgidWrapper /path/to/mediagoblin/mg.fcgi&lt;br /&gt;
        order allow,deny&lt;br /&gt;
        allow from all&lt;br /&gt;
&amp;lt;/Directory&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Apache Config Example =&lt;br /&gt;
This configuration example uses mod_fastcgi.&lt;br /&gt;
&lt;br /&gt;
To install and enable mod_fastcgi on a Debian/Ubuntu based system:&lt;br /&gt;
&amp;lt;pre&amp;gt;# apt-get install libapache2-mod-suexec libapache2-mod-fastcgi&lt;br /&gt;
# a2enmod suexec&lt;br /&gt;
# a2enmod fastcgi&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sample configuration:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;VirtualHost *:80&amp;gt;&lt;br /&gt;
ServerName mediagoblin.yourdomain.tld&lt;br /&gt;
ServerAdmin webmaster@yourdoimain.tld&lt;br /&gt;
DocumentRoot /var/www/&lt;br /&gt;
# Custom log files&lt;br /&gt;
CustomLog /var/log/apache2/mediagobling_access.log combined&lt;br /&gt;
ErrorLog /var/log/apache2/mediagoblin_error.log&lt;br /&gt;
&lt;br /&gt;
# Serve static and media files via alias&lt;br /&gt;
Alias /mgoblin_static/ /path/to/mediagoblin/mediagoblin/static/&lt;br /&gt;
Alias /mgoblin_media/ /path/to/mediagoblin/user_dev/media/public/&lt;br /&gt;
&lt;br /&gt;
# Rewrite all URLs to fcgi, except for static and media urls&lt;br /&gt;
RewriteEngine On&lt;br /&gt;
RewriteRule ^(mgoblin_static|mgoblin_media)($|/) - [L]&lt;br /&gt;
RewriteCond %{REQUEST_FILENAME} !-f&lt;br /&gt;
RewriteRule ^/(.*)$ /mg.fcgi/$1 [QSA,L]&lt;br /&gt;
&lt;br /&gt;
# Allow access to static and media directories&lt;br /&gt;
&amp;lt;Directory /path/to/mediagoblin/mediagoblin/static&amp;gt;&lt;br /&gt;
  Order allow,deny&lt;br /&gt;
  Allow from all&lt;br /&gt;
&amp;lt;/Directory&amp;gt;&lt;br /&gt;
&amp;lt;Directory /path/to/mediagoblin/mediagoblin/user_dev/media/public&amp;gt;&lt;br /&gt;
  Order allow,deny&lt;br /&gt;
  Allow from all&lt;br /&gt;
&amp;lt;/Directory&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# Connect to fcgi server&lt;br /&gt;
FastCGIExternalServer /var/www/mg.fcgi -host 127.0.0.1:26543&lt;br /&gt;
&amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Then, you need to make sure mediagoblin is running in fcgi mode:&lt;br /&gt;
&amp;lt;pre&amp;gt;cd /path/to/mediagoblin&lt;br /&gt;
./lazyserver.sh --server-name=fcgi fcgi_host=127.0.0.1 fcgi_port=26543&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note: there may be several ways to improve this configuration&lt;br /&gt;
&lt;br /&gt;
= Juju =&lt;br /&gt;
&lt;br /&gt;
There is a juju [https://juju.ubuntu.com/Charms charm] available for deploying mediagoblin into EC2 or on your local box.  [https://juju.ubuntu.com/ juju] is available in Ubuntu 11.10 and later, though it is recommended that you pull it from [https://launchpad.net/~juju/+archive/pkgs| the juju PPA], which includes backported packages going back to Ubuntu 11.10. To use the juju charm, install juju and configure either the [https://juju.ubuntu.com/docs/provider-configuration-local.html local provider] or one of the cloud API providers, currently the [https://juju.ubuntu.com/docs/provider-configuration-ec2.html EC2 provider] is the best supported and works not only with Amazon Web Services but also OpenStack clouds. There is also a newer native OpenStack API provider which is known to support HP Cloud.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# if you have not bootstrapped&lt;br /&gt;
juju bootstrap&lt;br /&gt;
mkdir ~/charms&lt;br /&gt;
bzr init-repo ~/charms/precise&lt;br /&gt;
bzr branch lp:~clint-fewbar/charms/precise/mediagoblin/trunk ~/charms/precise/mediagoblin&lt;br /&gt;
juju deploy --repository ~/charms local:mediagoblin&lt;br /&gt;
juju expose mediagoblin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Currently the charm is volatile, deploying from trunk, and deploys a single-server version of MediaGoblin only. It will eventually relate to the existing juju charms for other supported data stores to allow one to scale out their MediaGoblin instance.&lt;br /&gt;
&lt;br /&gt;
= ArchLinux init scripts =&lt;br /&gt;
&lt;br /&gt;
[http://whird.jpope.org/2012/04/14/mediagoblin-archlinux-rcd-scripts Jeremy Pope has written a nice blogpost] on how to add init scripts to deploy MediaGoblin with both the python paste http server and the celery deployments separated.&lt;br /&gt;
&lt;br /&gt;
If you want a simpler setup and don&#039;t want to deploy celery separately, consider either turning CELERY_ALWAYS_EAGER to true in the paste init script described above, or check out [http://chimo.chromic.org/2012/03/01/mediagoblin-init-script-on-archlinux/ Chimo&#039;s guide].&lt;br /&gt;
&lt;br /&gt;
== Running on Dreamhost.com ==&lt;br /&gt;
&lt;br /&gt;
===Set up your python virtualenv===&lt;br /&gt;
&lt;br /&gt;
dreamhost.com servers come with python 2.4 and 2.5 installed which is too old for mediagoblin. This means you need to compile and install a newer python (don&#039;t worry this is really not difficult on dreamhost servers). In order to be able to install python packages for a local user without touching system files, we need to setup a python &#039;&#039;virtualenv&#039;&#039;. Fortunately, this is not too tricky either. If your server has a python 2.6 or 2.7 installed already, you can skip the python installation stuff and you&#039;ll only need virtualenv.&lt;br /&gt;
&lt;br /&gt;
# Download the latest virtualenv: http://pypi.python.org/packages/source/v/virtualenv/XXX&lt;br /&gt;
# Download the latest python: http://python.org/ftp/python/XXX/Python-XXX.tar.bz2&lt;br /&gt;
# Unpack both&lt;br /&gt;
# Compile and install python locally:&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&amp;lt;pre&amp;gt;./configure --prefix=$HOME/local&lt;br /&gt;
make&lt;br /&gt;
make install&amp;lt;/pre&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
:This will install python (I used 2.7.3) into /home/spaetz/local/... (e.g. .../bin/python). You will get a few warnings about some modules not being able to compile. It was tcl/tk and bzip2 mainly, but things still worked out overall.&lt;br /&gt;
# Install the virtualenv:&lt;br /&gt;
:&amp;lt;blockquote&amp;gt;&amp;lt;pre&amp;gt;~/local/bin/python ~/virtualenv-1.8/virtualenv.py  $HOME/local/virtenv&amp;lt;/pre&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
:You will now have: ~/local/virtenv/bin/python&lt;br /&gt;
# In  ~/.bash_profile add:&lt;br /&gt;
:&amp;lt;blockquote&amp;gt;&amp;lt;pre&amp;gt;PATH=~/local/virtenv/bin:~/local/bin:${PATH}&amp;lt;/pre&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
:so that your local python will be preferred.&lt;br /&gt;
:Log out, log in again and test python&amp;quot; to see which version will be invoked. It should be the new python. Check &amp;quot;which easy_install&amp;quot; to see if the one in local/virtenv would be executed.&lt;br /&gt;
:You have now a local python installation that you can use, and easy_install will also work with your local user installation.&lt;br /&gt;
&lt;br /&gt;
===Install mediagoblin as a site package===&lt;br /&gt;
&lt;br /&gt;
# Check out mediagoblin from git to e.g. ~/mediagoblin&lt;br /&gt;
# Install MediaGoblin and all dependencies for MediaGoblin with easy_install.&lt;br /&gt;
:* In the mediagoblin directory issue:&lt;br /&gt;
:&amp;lt;blockquote&amp;gt;&amp;lt;pre&amp;gt;python setup.py&amp;lt;/pre&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
:* You will also need to: easy_install lxml&lt;br /&gt;
:* Python-image was trickier to install:&lt;br /&gt;
:&amp;lt;blockquote&amp;gt;&amp;lt;pre&amp;gt;easy_install --find-links http://www.pythonware.com/products/pil/ Imaging&amp;lt;/pre&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
:test by leaving the mediagoblin directory and see if you can import it:&lt;br /&gt;
:&amp;lt;blockquote&amp;gt;&amp;lt;pre&amp;gt;python&amp;lt;ENTER&amp;gt;import mediagoblin&amp;lt;CTRL-D&amp;gt;&amp;lt;/pre&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
:looking for errors.&lt;br /&gt;
&lt;br /&gt;
===Set up an WSGI environment on Dreamhost===&lt;br /&gt;
&lt;br /&gt;
# Enable the mod_passenger setting for ruby/python in the domains web panel&lt;br /&gt;
# &#039;&#039;cd&#039;&#039; into the domain directory (e.g. ~/media.sspaeth.de for me)&lt;br /&gt;
# Copy mediagoblin.ini and paste.ini from the ~/mediagoblin directory here&lt;br /&gt;
# Create passenger_wsgi.py in your domain directory (e.g. ~/media.sspaeth.de for me):&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&amp;lt;pre&amp;gt;import sys, os&lt;br /&gt;
INTERP = &amp;quot;/home/&amp;lt;username&amp;gt;/local/virtenv/bin/python&amp;quot;&lt;br /&gt;
#INTERP is present twice so that the new python interpreter knows the actual executable path&lt;br /&gt;
if sys.executable != INTERP: os.execl(INTERP, INTERP, *sys.argv)&lt;br /&gt;
&lt;br /&gt;
from paste.deploy import loadapp&lt;br /&gt;
application = loadapp(&#039;config:/home/mediagoblin/media.sspaeth.de/paste.ini&#039;)&lt;br /&gt;
&lt;br /&gt;
#If in case of errors, all you get are mysterious error 500, you can set debug=true in paste.ini to see stack traces&lt;br /&gt;
# Otherwise, add this:&lt;br /&gt;
#from paste.exceptions.errormiddleware import ErrorMiddleware&lt;br /&gt;
#application = ErrorMiddleware(application, debug=True)&amp;lt;/pre&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
# Set up the database by issueing: &amp;lt;pre&amp;gt;gmg dbupdate&amp;lt;/pre&amp;gt;&lt;br /&gt;
# (optional but recommended) Serve the static files directly from the webserver.&lt;br /&gt;
:In paste.ini in this section: [composite:routing] comment out the static files:&lt;br /&gt;
   #/mgoblin_static/ = mediagoblin_static&lt;br /&gt;
   #/theme_static/ = theme_static&lt;br /&gt;
:and symlink the mediagobin/mediagoblin/static directoy to public/mgoblin_static&lt;br /&gt;
:           and mediagoblin/mediagoblin/themes to public/theme_static&lt;br /&gt;
:&lt;br /&gt;
:so it is displayed directly. This step might be different depending on your web server configuration. There is no reason that static&lt;br /&gt;
:files need to go through all the python indirection when they can be served directly by nginx/apache/...&lt;br /&gt;
:&lt;br /&gt;
:In case you want to delete your git checkout after the installation (you don&#039;t need it, since you installed the mediagoblin package to ~/local/virtenv/lib/python2.7/mediagoblin... you should do the symlinking from there.&lt;/div&gt;</summary>
		<author><name>Spaetz</name></author>
	</entry>
	<entry>
		<id>https://wiki.mediagoblin.org/index.php?title=Deployment&amp;diff=1004</id>
		<title>Deployment</title>
		<link rel="alternate" type="text/html" href="https://wiki.mediagoblin.org/index.php?title=Deployment&amp;diff=1004"/>
		<updated>2012-11-28T11:09:18Z</updated>

		<summary type="html">&lt;p&gt;Spaetz: /* Running on Dreamhost.com */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page could use a lot of work.  For now, a few smaller deployment tips!&lt;br /&gt;
&lt;br /&gt;
See also: http://docs.mediagoblin.org/deploying.html (some of which may belong here)&lt;br /&gt;
&lt;br /&gt;
= FCGI script =&lt;br /&gt;
&lt;br /&gt;
This works great with the apache config example below :)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;#!/path/to/mediagoblin/bin/python&lt;br /&gt;
&lt;br /&gt;
# Written in 2011 by Christopher Allan Webber&lt;br /&gt;
#&lt;br /&gt;
# To the extent possible under law, the author(s) have dedicated all&lt;br /&gt;
# copyright and related and neighboring rights to this software to the&lt;br /&gt;
# public domain worldwide. This software is distributed without any&lt;br /&gt;
# warranty.&lt;br /&gt;
# &lt;br /&gt;
# You should have received a copy of the CC0 Public Domain Dedication along&lt;br /&gt;
# with this software. If not, see&lt;br /&gt;
# &amp;lt;http://creativecommons.org/publicdomain/zero/1.0/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
from paste.deploy import loadapp&lt;br /&gt;
from flup.server.fcgi import WSGIServer&lt;br /&gt;
&lt;br /&gt;
CONFIG_PATH = &#039;/path/to/mediagoblin/paste.ini&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def launch_fcgi():&lt;br /&gt;
    ccengine_wsgi_app = loadapp(&#039;config:&#039; + CONFIG_PATH)&lt;br /&gt;
    WSGIServer(ccengine_wsgi_app).run()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == &#039;__main__&#039;:&lt;br /&gt;
    launch_fcgi()&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Apache 2 Config with fcgid =&lt;br /&gt;
&lt;br /&gt;
Note that the libapache2-mod-fcgi in Debian is in the nonfree section, and MediaGoblin users will want to avoid that. Instead, libapache2-mod-fcgid can be used, but requires a slightly different configuration.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;VirtualHost *:80&amp;gt;&lt;br /&gt;
ServerName media.example.com&lt;br /&gt;
ServerAlias www.media.example.com&lt;br /&gt;
&lt;br /&gt;
DocumentRoot /path/to/mediagoblin&lt;br /&gt;
&lt;br /&gt;
Alias /mgoblin_static/ /path/to/mediagoblin/mediagoblin/static/&lt;br /&gt;
Alias /mgoblin_media/ /path/to/mediagoblin/user_dev/media/public/&lt;br /&gt;
&lt;br /&gt;
# Rewrite all URLs to fcgi, except for static and media urls&lt;br /&gt;
RewriteEngine On&lt;br /&gt;
RewriteRule ^(mgoblin_static|mgoblin_media)($|/) - [L]&lt;br /&gt;
RewriteCond %{REQUEST_FILENAME} !-f&lt;br /&gt;
RewriteRule ^/(.*)$ /mg.fcgi/$1 [QSA,L]&lt;br /&gt;
&lt;br /&gt;
# Allow access to static and media directories&lt;br /&gt;
&amp;lt;Directory /mgoblin_static&amp;gt;&lt;br /&gt;
  Order allow,deny&lt;br /&gt;
  Allow from all&lt;br /&gt;
&amp;lt;/Directory&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;Directory /mgoblin_media&amp;gt;&lt;br /&gt;
  Order allow,deny&lt;br /&gt;
  Allow from all&lt;br /&gt;
&amp;lt;/Directory&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;Directory /path/to/mediagoblin/&amp;gt;&lt;br /&gt;
        SetHandler fcgid-script&lt;br /&gt;
        Options +ExecCGI&lt;br /&gt;
        FcgidWrapper /path/to/mediagoblin/mg.fcgi&lt;br /&gt;
        order allow,deny&lt;br /&gt;
        allow from all&lt;br /&gt;
&amp;lt;/Directory&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Apache Config Example =&lt;br /&gt;
This configuration example uses mod_fastcgi.&lt;br /&gt;
&lt;br /&gt;
To install and enable mod_fastcgi on a Debian/Ubuntu based system:&lt;br /&gt;
&amp;lt;pre&amp;gt;# apt-get install libapache2-mod-suexec libapache2-mod-fastcgi&lt;br /&gt;
# a2enmod suexec&lt;br /&gt;
# a2enmod fastcgi&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sample configuration:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;VirtualHost *:80&amp;gt;&lt;br /&gt;
ServerName mediagoblin.yourdomain.tld&lt;br /&gt;
ServerAdmin webmaster@yourdoimain.tld&lt;br /&gt;
DocumentRoot /var/www/&lt;br /&gt;
# Custom log files&lt;br /&gt;
CustomLog /var/log/apache2/mediagobling_access.log combined&lt;br /&gt;
ErrorLog /var/log/apache2/mediagoblin_error.log&lt;br /&gt;
&lt;br /&gt;
# Serve static and media files via alias&lt;br /&gt;
Alias /mgoblin_static/ /path/to/mediagoblin/mediagoblin/static/&lt;br /&gt;
Alias /mgoblin_media/ /path/to/mediagoblin/user_dev/media/public/&lt;br /&gt;
&lt;br /&gt;
# Rewrite all URLs to fcgi, except for static and media urls&lt;br /&gt;
RewriteEngine On&lt;br /&gt;
RewriteRule ^(mgoblin_static|mgoblin_media)($|/) - [L]&lt;br /&gt;
RewriteCond %{REQUEST_FILENAME} !-f&lt;br /&gt;
RewriteRule ^/(.*)$ /mg.fcgi/$1 [QSA,L]&lt;br /&gt;
&lt;br /&gt;
# Allow access to static and media directories&lt;br /&gt;
&amp;lt;Directory /path/to/mediagoblin/mediagoblin/static&amp;gt;&lt;br /&gt;
  Order allow,deny&lt;br /&gt;
  Allow from all&lt;br /&gt;
&amp;lt;/Directory&amp;gt;&lt;br /&gt;
&amp;lt;Directory /path/to/mediagoblin/mediagoblin/user_dev/media/public&amp;gt;&lt;br /&gt;
  Order allow,deny&lt;br /&gt;
  Allow from all&lt;br /&gt;
&amp;lt;/Directory&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# Connect to fcgi server&lt;br /&gt;
FastCGIExternalServer /var/www/mg.fcgi -host 127.0.0.1:26543&lt;br /&gt;
&amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Then, you need to make sure mediagoblin is running in fcgi mode:&lt;br /&gt;
&amp;lt;pre&amp;gt;cd /path/to/mediagoblin&lt;br /&gt;
./lazyserver.sh --server-name=fcgi fcgi_host=127.0.0.1 fcgi_port=26543&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note: there may be several ways to improve this configuration&lt;br /&gt;
&lt;br /&gt;
= Juju =&lt;br /&gt;
&lt;br /&gt;
There is a juju [https://juju.ubuntu.com/Charms charm] available for deploying mediagoblin into EC2 or on your local box.  [https://juju.ubuntu.com/ juju] is available in Ubuntu 11.10 and later, though it is recommended that you pull it from [https://launchpad.net/~juju/+archive/pkgs| the juju PPA], which includes backported packages going back to Ubuntu 11.10. To use the juju charm, install juju and configure either the [https://juju.ubuntu.com/docs/provider-configuration-local.html local provider] or one of the cloud API providers, currently the [https://juju.ubuntu.com/docs/provider-configuration-ec2.html EC2 provider] is the best supported and works not only with Amazon Web Services but also OpenStack clouds. There is also a newer native OpenStack API provider which is known to support HP Cloud.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# if you have not bootstrapped&lt;br /&gt;
juju bootstrap&lt;br /&gt;
mkdir ~/charms&lt;br /&gt;
bzr init-repo ~/charms/precise&lt;br /&gt;
bzr branch lp:~clint-fewbar/charms/precise/mediagoblin/trunk ~/charms/precise/mediagoblin&lt;br /&gt;
juju deploy --repository ~/charms local:mediagoblin&lt;br /&gt;
juju expose mediagoblin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Currently the charm is volatile, deploying from trunk, and deploys a single-server version of MediaGoblin only. It will eventually relate to the existing juju charms for other supported data stores to allow one to scale out their MediaGoblin instance.&lt;br /&gt;
&lt;br /&gt;
= ArchLinux init scripts =&lt;br /&gt;
&lt;br /&gt;
[http://whird.jpope.org/2012/04/14/mediagoblin-archlinux-rcd-scripts Jeremy Pope has written a nice blogpost] on how to add init scripts to deploy MediaGoblin with both the python paste http server and the celery deployments separated.&lt;br /&gt;
&lt;br /&gt;
If you want a simpler setup and don&#039;t want to deploy celery separately, consider either turning CELERY_ALWAYS_EAGER to true in the paste init script described above, or check out [http://chimo.chromic.org/2012/03/01/mediagoblin-init-script-on-archlinux/ Chimo&#039;s guide].&lt;br /&gt;
&lt;br /&gt;
== Running on Dreamhost.com ==&lt;br /&gt;
&lt;br /&gt;
===Set up your python virtualenv===&lt;br /&gt;
&lt;br /&gt;
# Download the latest virtualenv: http://pypi.python.org/packages/source/v/virtualenv/XXX&lt;br /&gt;
# Download the latest python: http://python.org/ftp/python/XXX/Python-XXX.tar.bz2&lt;br /&gt;
# Unpack both&lt;br /&gt;
# Compile and install python locally:&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&amp;lt;pre&amp;gt;./configure --prefix=$HOME/local&lt;br /&gt;
make&lt;br /&gt;
make install&amp;lt;/pre&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
:This will install python (I used 2.7.3) into /home/spaetz/local/... (e.g. .../bin/python)&lt;br /&gt;
# Install the virtualenv:&lt;br /&gt;
:&amp;lt;blockquote&amp;gt;&amp;lt;pre&amp;gt;~/local/bin/python ~/virtualenv-1.8/virtualenv.py  $HOME/local/virtenv&amp;lt;/pre&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
:You will now have: ~/local/virtenv/bin/python&lt;br /&gt;
# In  ~/.bash_profile add:&lt;br /&gt;
:&amp;lt;blockquote&amp;gt;&amp;lt;pre&amp;gt;PATH=~/local/virtenv/bin:~/local/bin:${PATH}&amp;lt;/pre&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
:so that your local python will be preferred.&lt;br /&gt;
:Log out, log in again and test python&amp;quot; to see which version will be invoked. It should be the new python. Check &amp;quot;which easy_install&amp;quot; to see if the one in local/virtenv would be executed.&lt;br /&gt;
:You have now a local python installation that you can use, and easy_install will work with your local installation.&lt;br /&gt;
&lt;br /&gt;
===Install mediagoblin as a site package===&lt;br /&gt;
&lt;br /&gt;
# Check out mediagoblin from git to e.g. ~/mediagoblin&lt;br /&gt;
# Install MediaGoblin and all dependencies for MediaGoblin with easy_install.&lt;br /&gt;
:* In the mediagoblin directory issue:&lt;br /&gt;
:&amp;lt;blockquote&amp;gt;&amp;lt;pre&amp;gt;python setup.py&amp;lt;/pre&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
:* You will also need to: easy_install lxml&lt;br /&gt;
:* Python-image was trickier to install:&lt;br /&gt;
:&amp;lt;blockquote&amp;gt;&amp;lt;pre&amp;gt;easy_install --find-links http://www.pythonware.com/products/pil/ Imaging&amp;lt;/pre&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
:test by leaving the mediagoblin directory and see if you can import it:&lt;br /&gt;
:&amp;lt;blockquote&amp;gt;&amp;lt;pre&amp;gt;python&amp;lt;ENTER&amp;gt;import mediagoblin&amp;lt;CTRL-D&amp;gt;&amp;lt;/pre&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
:looking for errors.&lt;br /&gt;
&lt;br /&gt;
===Set up an WSGI environment on Dreamhost===&lt;br /&gt;
&lt;br /&gt;
# Enable the mod_passenger setting for ruby/python in the domains web panel&lt;br /&gt;
# &#039;&#039;cd&#039;&#039; into the domain directory (e.g. ~/media.sspaeth.de for me)&lt;br /&gt;
# Copy mediagoblin.ini and paste.ini from the ~/mediagoblin directory here&lt;br /&gt;
# Create passenger_wsgi.py in your domain directory (e.g. ~/media.sspaeth.de for me):&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&amp;lt;pre&amp;gt;import sys, os&lt;br /&gt;
INTERP = &amp;quot;/home/&amp;lt;username&amp;gt;/local/virtenv/bin/python&amp;quot;&lt;br /&gt;
#INTERP is present twice so that the new python interpreter knows the actual executable path&lt;br /&gt;
if sys.executable != INTERP: os.execl(INTERP, INTERP, *sys.argv)&lt;br /&gt;
&lt;br /&gt;
from paste.deploy import loadapp&lt;br /&gt;
application = loadapp(&#039;config:/home/mediagoblin/media.sspaeth.de/paste.ini&#039;)&lt;br /&gt;
&lt;br /&gt;
#If in case of errors, all you get are mysterious error 500, you can set debug=true in paste.ini to see stack traces&lt;br /&gt;
# Otherwise, add this:&lt;br /&gt;
#from paste.exceptions.errormiddleware import ErrorMiddleware&lt;br /&gt;
#application = ErrorMiddleware(application, debug=True)&amp;lt;/pre&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
# Set up the database by issueing: &amp;lt;pre&amp;gt;gmg dbupdate&amp;lt;/pre&amp;gt;&lt;br /&gt;
# (optional but recommended) Serve the static files directly from the webserver.&lt;br /&gt;
:In paste.ini in this section: [composite:routing] comment out the static files:&lt;br /&gt;
   #/mgoblin_static/ = mediagoblin_static&lt;br /&gt;
   #/theme_static/ = theme_static&lt;br /&gt;
:and symlink the mediagobin/mediagoblin/static directoy to public/mgoblin_static&lt;br /&gt;
:           and mediagoblin/mediagoblin/themes to public/theme_static&lt;br /&gt;
:&lt;br /&gt;
:so it is displayed directly. This step might be different depending on your web server configuration. There is no reason that static&lt;br /&gt;
:files need to go through all the python indirection when they can be served directly by nginx/apache/...&lt;br /&gt;
:&lt;br /&gt;
:In case you want to delete your git checkout after the installation (you don&#039;t need it, since you installed the mediagoblin package to ~/local/virtenv/lib/python2.7/mediagoblin... you should do the symlinking from there.&lt;/div&gt;</summary>
		<author><name>Spaetz</name></author>
	</entry>
	<entry>
		<id>https://wiki.mediagoblin.org/index.php?title=Deployment&amp;diff=1003</id>
		<title>Deployment</title>
		<link rel="alternate" type="text/html" href="https://wiki.mediagoblin.org/index.php?title=Deployment&amp;diff=1003"/>
		<updated>2012-11-28T11:08:46Z</updated>

		<summary type="html">&lt;p&gt;Spaetz: Add Deployment on Dreamhost section&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page could use a lot of work.  For now, a few smaller deployment tips!&lt;br /&gt;
&lt;br /&gt;
See also: http://docs.mediagoblin.org/deploying.html (some of which may belong here)&lt;br /&gt;
&lt;br /&gt;
= FCGI script =&lt;br /&gt;
&lt;br /&gt;
This works great with the apache config example below :)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;#!/path/to/mediagoblin/bin/python&lt;br /&gt;
&lt;br /&gt;
# Written in 2011 by Christopher Allan Webber&lt;br /&gt;
#&lt;br /&gt;
# To the extent possible under law, the author(s) have dedicated all&lt;br /&gt;
# copyright and related and neighboring rights to this software to the&lt;br /&gt;
# public domain worldwide. This software is distributed without any&lt;br /&gt;
# warranty.&lt;br /&gt;
# &lt;br /&gt;
# You should have received a copy of the CC0 Public Domain Dedication along&lt;br /&gt;
# with this software. If not, see&lt;br /&gt;
# &amp;lt;http://creativecommons.org/publicdomain/zero/1.0/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
from paste.deploy import loadapp&lt;br /&gt;
from flup.server.fcgi import WSGIServer&lt;br /&gt;
&lt;br /&gt;
CONFIG_PATH = &#039;/path/to/mediagoblin/paste.ini&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def launch_fcgi():&lt;br /&gt;
    ccengine_wsgi_app = loadapp(&#039;config:&#039; + CONFIG_PATH)&lt;br /&gt;
    WSGIServer(ccengine_wsgi_app).run()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == &#039;__main__&#039;:&lt;br /&gt;
    launch_fcgi()&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Apache 2 Config with fcgid =&lt;br /&gt;
&lt;br /&gt;
Note that the libapache2-mod-fcgi in Debian is in the nonfree section, and MediaGoblin users will want to avoid that. Instead, libapache2-mod-fcgid can be used, but requires a slightly different configuration.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;VirtualHost *:80&amp;gt;&lt;br /&gt;
ServerName media.example.com&lt;br /&gt;
ServerAlias www.media.example.com&lt;br /&gt;
&lt;br /&gt;
DocumentRoot /path/to/mediagoblin&lt;br /&gt;
&lt;br /&gt;
Alias /mgoblin_static/ /path/to/mediagoblin/mediagoblin/static/&lt;br /&gt;
Alias /mgoblin_media/ /path/to/mediagoblin/user_dev/media/public/&lt;br /&gt;
&lt;br /&gt;
# Rewrite all URLs to fcgi, except for static and media urls&lt;br /&gt;
RewriteEngine On&lt;br /&gt;
RewriteRule ^(mgoblin_static|mgoblin_media)($|/) - [L]&lt;br /&gt;
RewriteCond %{REQUEST_FILENAME} !-f&lt;br /&gt;
RewriteRule ^/(.*)$ /mg.fcgi/$1 [QSA,L]&lt;br /&gt;
&lt;br /&gt;
# Allow access to static and media directories&lt;br /&gt;
&amp;lt;Directory /mgoblin_static&amp;gt;&lt;br /&gt;
  Order allow,deny&lt;br /&gt;
  Allow from all&lt;br /&gt;
&amp;lt;/Directory&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;Directory /mgoblin_media&amp;gt;&lt;br /&gt;
  Order allow,deny&lt;br /&gt;
  Allow from all&lt;br /&gt;
&amp;lt;/Directory&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;Directory /path/to/mediagoblin/&amp;gt;&lt;br /&gt;
        SetHandler fcgid-script&lt;br /&gt;
        Options +ExecCGI&lt;br /&gt;
        FcgidWrapper /path/to/mediagoblin/mg.fcgi&lt;br /&gt;
        order allow,deny&lt;br /&gt;
        allow from all&lt;br /&gt;
&amp;lt;/Directory&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Apache Config Example =&lt;br /&gt;
This configuration example uses mod_fastcgi.&lt;br /&gt;
&lt;br /&gt;
To install and enable mod_fastcgi on a Debian/Ubuntu based system:&lt;br /&gt;
&amp;lt;pre&amp;gt;# apt-get install libapache2-mod-suexec libapache2-mod-fastcgi&lt;br /&gt;
# a2enmod suexec&lt;br /&gt;
# a2enmod fastcgi&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sample configuration:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;VirtualHost *:80&amp;gt;&lt;br /&gt;
ServerName mediagoblin.yourdomain.tld&lt;br /&gt;
ServerAdmin webmaster@yourdoimain.tld&lt;br /&gt;
DocumentRoot /var/www/&lt;br /&gt;
# Custom log files&lt;br /&gt;
CustomLog /var/log/apache2/mediagobling_access.log combined&lt;br /&gt;
ErrorLog /var/log/apache2/mediagoblin_error.log&lt;br /&gt;
&lt;br /&gt;
# Serve static and media files via alias&lt;br /&gt;
Alias /mgoblin_static/ /path/to/mediagoblin/mediagoblin/static/&lt;br /&gt;
Alias /mgoblin_media/ /path/to/mediagoblin/user_dev/media/public/&lt;br /&gt;
&lt;br /&gt;
# Rewrite all URLs to fcgi, except for static and media urls&lt;br /&gt;
RewriteEngine On&lt;br /&gt;
RewriteRule ^(mgoblin_static|mgoblin_media)($|/) - [L]&lt;br /&gt;
RewriteCond %{REQUEST_FILENAME} !-f&lt;br /&gt;
RewriteRule ^/(.*)$ /mg.fcgi/$1 [QSA,L]&lt;br /&gt;
&lt;br /&gt;
# Allow access to static and media directories&lt;br /&gt;
&amp;lt;Directory /path/to/mediagoblin/mediagoblin/static&amp;gt;&lt;br /&gt;
  Order allow,deny&lt;br /&gt;
  Allow from all&lt;br /&gt;
&amp;lt;/Directory&amp;gt;&lt;br /&gt;
&amp;lt;Directory /path/to/mediagoblin/mediagoblin/user_dev/media/public&amp;gt;&lt;br /&gt;
  Order allow,deny&lt;br /&gt;
  Allow from all&lt;br /&gt;
&amp;lt;/Directory&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# Connect to fcgi server&lt;br /&gt;
FastCGIExternalServer /var/www/mg.fcgi -host 127.0.0.1:26543&lt;br /&gt;
&amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Then, you need to make sure mediagoblin is running in fcgi mode:&lt;br /&gt;
&amp;lt;pre&amp;gt;cd /path/to/mediagoblin&lt;br /&gt;
./lazyserver.sh --server-name=fcgi fcgi_host=127.0.0.1 fcgi_port=26543&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note: there may be several ways to improve this configuration&lt;br /&gt;
&lt;br /&gt;
= Juju =&lt;br /&gt;
&lt;br /&gt;
There is a juju [https://juju.ubuntu.com/Charms charm] available for deploying mediagoblin into EC2 or on your local box.  [https://juju.ubuntu.com/ juju] is available in Ubuntu 11.10 and later, though it is recommended that you pull it from [https://launchpad.net/~juju/+archive/pkgs| the juju PPA], which includes backported packages going back to Ubuntu 11.10. To use the juju charm, install juju and configure either the [https://juju.ubuntu.com/docs/provider-configuration-local.html local provider] or one of the cloud API providers, currently the [https://juju.ubuntu.com/docs/provider-configuration-ec2.html EC2 provider] is the best supported and works not only with Amazon Web Services but also OpenStack clouds. There is also a newer native OpenStack API provider which is known to support HP Cloud.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# if you have not bootstrapped&lt;br /&gt;
juju bootstrap&lt;br /&gt;
mkdir ~/charms&lt;br /&gt;
bzr init-repo ~/charms/precise&lt;br /&gt;
bzr branch lp:~clint-fewbar/charms/precise/mediagoblin/trunk ~/charms/precise/mediagoblin&lt;br /&gt;
juju deploy --repository ~/charms local:mediagoblin&lt;br /&gt;
juju expose mediagoblin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Currently the charm is volatile, deploying from trunk, and deploys a single-server version of MediaGoblin only. It will eventually relate to the existing juju charms for other supported data stores to allow one to scale out their MediaGoblin instance.&lt;br /&gt;
&lt;br /&gt;
= ArchLinux init scripts =&lt;br /&gt;
&lt;br /&gt;
[http://whird.jpope.org/2012/04/14/mediagoblin-archlinux-rcd-scripts Jeremy Pope has written a nice blogpost] on how to add init scripts to deploy MediaGoblin with both the python paste http server and the celery deployments separated.&lt;br /&gt;
&lt;br /&gt;
If you want a simpler setup and don&#039;t want to deploy celery separately, consider either turning CELERY_ALWAYS_EAGER to true in the paste init script described above, or check out [http://chimo.chromic.org/2012/03/01/mediagoblin-init-script-on-archlinux/ Chimo&#039;s guide].&lt;br /&gt;
&lt;br /&gt;
=== Running on Dreamhost.com ===&lt;br /&gt;
&lt;br /&gt;
====Set up your python virtualenv====&lt;br /&gt;
&lt;br /&gt;
# Download the latest virtualenv: http://pypi.python.org/packages/source/v/virtualenv/XXX&lt;br /&gt;
# Download the latest python: http://python.org/ftp/python/XXX/Python-XXX.tar.bz2&lt;br /&gt;
# Unpack both&lt;br /&gt;
# Compile and install python locally:&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&amp;lt;pre&amp;gt;./configure --prefix=$HOME/local&lt;br /&gt;
make&lt;br /&gt;
make install&amp;lt;/pre&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
:This will install python (I used 2.7.3) into /home/spaetz/local/... (e.g. .../bin/python)&lt;br /&gt;
# Install the virtualenv:&lt;br /&gt;
:&amp;lt;blockquote&amp;gt;&amp;lt;pre&amp;gt;~/local/bin/python ~/virtualenv-1.8/virtualenv.py  $HOME/local/virtenv&amp;lt;/pre&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
:You will now have: ~/local/virtenv/bin/python&lt;br /&gt;
# In  ~/.bash_profile add:&lt;br /&gt;
:&amp;lt;blockquote&amp;gt;&amp;lt;pre&amp;gt;PATH=~/local/virtenv/bin:~/local/bin:${PATH}&amp;lt;/pre&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
:so that your local python will be preferred.&lt;br /&gt;
:Log out, log in again and test python&amp;quot; to see which version will be invoked. It should be the new python. Check &amp;quot;which easy_install&amp;quot; to see if the one in local/virtenv would be executed.&lt;br /&gt;
:You have now a local python installation that you can use, and easy_install will work with your local installation.&lt;br /&gt;
&lt;br /&gt;
====Install mediagoblin as a site package====&lt;br /&gt;
&lt;br /&gt;
# Check out mediagoblin from git to e.g. ~/mediagoblin&lt;br /&gt;
# Install MediaGoblin and all dependencies for MediaGoblin with easy_install.&lt;br /&gt;
:* In the mediagoblin directory issue:&lt;br /&gt;
:&amp;lt;blockquote&amp;gt;&amp;lt;pre&amp;gt;python setup.py&amp;lt;/pre&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
:* You will also need to: easy_install lxml&lt;br /&gt;
:* Python-image was trickier to install:&lt;br /&gt;
:&amp;lt;blockquote&amp;gt;&amp;lt;pre&amp;gt;easy_install --find-links http://www.pythonware.com/products/pil/ Imaging&amp;lt;/pre&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
:test by leaving the mediagoblin directory and see if you can import it:&lt;br /&gt;
:&amp;lt;blockquote&amp;gt;&amp;lt;pre&amp;gt;python&amp;lt;ENTER&amp;gt;import mediagoblin&amp;lt;CTRL-D&amp;gt;&amp;lt;/pre&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
:looking for errors.&lt;br /&gt;
&lt;br /&gt;
====Set up an WSGI environment on Dreamhost====&lt;br /&gt;
&lt;br /&gt;
# Enable the mod_passenger setting for ruby/python in the domains web panel&lt;br /&gt;
# &#039;&#039;cd&#039;&#039; into the domain directory (e.g. ~/media.sspaeth.de for me)&lt;br /&gt;
# Copy mediagoblin.ini and paste.ini from the ~/mediagoblin directory here&lt;br /&gt;
# Create passenger_wsgi.py in your domain directory (e.g. ~/media.sspaeth.de for me):&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&amp;lt;pre&amp;gt;import sys, os&lt;br /&gt;
INTERP = &amp;quot;/home/&amp;lt;username&amp;gt;/local/virtenv/bin/python&amp;quot;&lt;br /&gt;
#INTERP is present twice so that the new python interpreter knows the actual executable path&lt;br /&gt;
if sys.executable != INTERP: os.execl(INTERP, INTERP, *sys.argv)&lt;br /&gt;
&lt;br /&gt;
from paste.deploy import loadapp&lt;br /&gt;
application = loadapp(&#039;config:/home/mediagoblin/media.sspaeth.de/paste.ini&#039;)&lt;br /&gt;
&lt;br /&gt;
#If in case of errors, all you get are mysterious error 500, you can set debug=true in paste.ini to see stack traces&lt;br /&gt;
# Otherwise, add this:&lt;br /&gt;
#from paste.exceptions.errormiddleware import ErrorMiddleware&lt;br /&gt;
#application = ErrorMiddleware(application, debug=True)&amp;lt;/pre&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
# Set up the database by issueing: &amp;lt;pre&amp;gt;gmg dbupdate&amp;lt;/pre&amp;gt;&lt;br /&gt;
# (optional but recommended) Serve the static files directly from the webserver.&lt;br /&gt;
:In paste.ini in this section: [composite:routing] comment out the static files:&lt;br /&gt;
   #/mgoblin_static/ = mediagoblin_static&lt;br /&gt;
   #/theme_static/ = theme_static&lt;br /&gt;
:and symlink the mediagobin/mediagoblin/static directoy to public/mgoblin_static&lt;br /&gt;
:           and mediagoblin/mediagoblin/themes to public/theme_static&lt;br /&gt;
:&lt;br /&gt;
:so it is displayed directly. This step might be different depending on your web server configuration. There is no reason that static&lt;br /&gt;
:files need to go through all the python indirection when they can be served directly by nginx/apache/...&lt;br /&gt;
:&lt;br /&gt;
:In case you want to delete your git checkout after the installation (you don&#039;t need it, since you installed the mediagoblin package to ~/local/virtenv/lib/python2.7/mediagoblin... you should do the symlinking from there.&lt;/div&gt;</summary>
		<author><name>Spaetz</name></author>
	</entry>
	<entry>
		<id>https://wiki.mediagoblin.org/index.php?title=User_Experience&amp;diff=1002</id>
		<title>User Experience</title>
		<link rel="alternate" type="text/html" href="https://wiki.mediagoblin.org/index.php?title=User_Experience&amp;diff=1002"/>
		<updated>2012-11-28T11:08:16Z</updated>

		<summary type="html">&lt;p&gt;Spaetz: Remove dreamhost instructions and move to Deployment page&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;We need help doing user experience testing!  This means users testing our software, observing what does and doesn&#039;t work for them, and recording that.&lt;br /&gt;
&lt;br /&gt;
If you&#039;re here to help (HOORAY!) go to the testing instance set up by Caleb Davis: http://omgmg.dyndns.org:6543/ [EDIT: This link has been down since 2011 something, take a look at the [[Live instances]] instead]&lt;br /&gt;
&lt;br /&gt;
Sign up for an account&#039;&#039;&#039;*&#039;&#039;&#039;, add some pictures&#039;&#039;&#039;**&#039;&#039;&#039; and play around. Take some notes and then either set up an account on this wiki and add your thoughts to this page or email them to press@mediagoblin.org. Please include your operating system and what browser you&#039;re using. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;*&#039;&#039;&#039; Your email validation link may be in your spam folder!&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;**&#039;&#039;&#039; NOTHING ON THIS INSTANCE IS PERMANENT.  This is for user experience testing only... your pics will be wiped!&lt;br /&gt;
&lt;br /&gt;
You&#039;ll be able to give us the best feedback if you don&#039;t look at anyone else&#039;s notes before you start. Thanks for helping us with usability!! We really appreciate it!&lt;br /&gt;
&lt;br /&gt;
= User notes go in this section =&lt;br /&gt;
&lt;br /&gt;
=== From Jenny on Google Chrome 13.0.782.220 in Mac OSX 10.6.8 ===&lt;br /&gt;
* login ok, uploading file ok.&lt;br /&gt;
* can enter profile description but it doesn&#039;t seem to show up anywhere?&lt;br /&gt;
* no crash after attemping to upload a non-image and then uploading a real image (jpg)&lt;br /&gt;
* uploaded a sideways image and there is no way to rotate it.&lt;br /&gt;
&lt;br /&gt;
=== From Jenny on Safari 5.1 in Mac OSX 10.6.8 ===&lt;br /&gt;
* login ok, uploading ok&lt;br /&gt;
* same problem with profile description - it&#039;s filled in but doesn&#039;t appear in the profile.&lt;br /&gt;
* everything seems to work ok.&lt;br /&gt;
&lt;br /&gt;
=== From Deb using Ubuntu 10.04, Lucid Lynx (Netbook remix version on an Aspire One) with Firefox version 3.6.18 for Ubuntu on 9.8.2011 ===&lt;br /&gt;
&lt;br /&gt;
* could still use a little note explaining how tags work&lt;br /&gt;
* submission is easy&lt;br /&gt;
* seems odd that I can&#039;t add a picture of myself to my profile on a picture site&lt;br /&gt;
* will people be able to search by pic tags? or search for users? &lt;br /&gt;
* will people be able to group pics into albums? &lt;br /&gt;
* maybe we could have something that is more obviously a dashboard than clicking on the username&lt;br /&gt;
&lt;br /&gt;
=== From Jenny on Google Chrome 14.0.835.124 beta-m in Windows XP Professional ===&lt;br /&gt;
*Log in ok, comments ok, deleting files works now.&lt;br /&gt;
*Profile info only shows up if the website is filled in.&lt;br /&gt;
*Adding a .bmp crashes chrome.&lt;br /&gt;
*Other image types seem to work - tif, gif, png, jpg.&lt;br /&gt;
*Adding other non-images give a message that it is not an image (txt, pdf, mdi).&lt;br /&gt;
*The &amp;lt;- -&amp;gt; buttons say &#039;Temporary button holder&#039; beneath them.&lt;br /&gt;
*The .tif image doesn&#039;t display when browsing individual photos, just in the overall view.&lt;br /&gt;
&lt;br /&gt;
=== From Jenny on IE7 in Windows XP Professional ===&lt;br /&gt;
*Log in ok, comments ok, editing and deleting ok, uploading ok.&lt;br /&gt;
*Display - the profile website runs into the photos. The photos line up exactly with no space between them. Everything is top-justified rather than centered.&lt;br /&gt;
*The tif image doesn&#039;t display on the page for that image (where you can comment on it) - it does display on all other pages though.&lt;br /&gt;
*The save changes button is cut off so you only see the letters &#039;SAVE CHA&#039;.&lt;br /&gt;
*The &amp;quot;Profile Edited&amp;quot; or &amp;quot;Posted Comment&amp;quot; comment dialog box displays over the username and logout buttons, as does the &amp;lt;- -&amp;gt; arrows. These also say &#039;Temporary button holder&#039; which seems wrong.&lt;br /&gt;
= Past notes =&lt;br /&gt;
&lt;br /&gt;
Are here, http://wiki.mediagoblin.org/User_Experience_Past_Notes&lt;br /&gt;
&lt;br /&gt;
= General thoughts on running a user experience test =&lt;br /&gt;
&lt;br /&gt;
Could someone with experience with this fill in info here? ;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
I (Jan-Christoph Borchardt) write a thesis at the moment on [http://owncloud.iuk.hdm-stuttgart.de/apps/files_publiclink/get.php?token=6c766212ba094bea08bf1bb800b3e1e7c785388e Coordinating low-cost usability testing in independent free &amp;amp; open source software projects]&amp;lt;br&amp;gt;&lt;br /&gt;
There are many small tips and recipes on how to do your own testing. Especially look into the &#039;&#039;Methods&#039;&#039; part.&amp;lt;br&amp;gt;&lt;br /&gt;
Please let me know if you have any other experiences with testing, I intend on regularly updating that document and release the full version freely licensed once it’s done as well as some kind of a &#039;&#039;quick start guide&#039;&#039;.&lt;/div&gt;</summary>
		<author><name>Spaetz</name></author>
	</entry>
	<entry>
		<id>https://wiki.mediagoblin.org/index.php?title=User_Experience&amp;diff=1001</id>
		<title>User Experience</title>
		<link rel="alternate" type="text/html" href="https://wiki.mediagoblin.org/index.php?title=User_Experience&amp;diff=1001"/>
		<updated>2012-11-28T11:07:34Z</updated>

		<summary type="html">&lt;p&gt;Spaetz: /* Set up an WSGI environment on Dreamhost */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;We need help doing user experience testing!  This means users testing our software, observing what does and doesn&#039;t work for them, and recording that.&lt;br /&gt;
&lt;br /&gt;
If you&#039;re here to help (HOORAY!) go to the testing instance set up by Caleb Davis: http://omgmg.dyndns.org:6543/ [EDIT: This link has been down since 2011 something, take a look at the [[Live instances]] instead]&lt;br /&gt;
&lt;br /&gt;
Sign up for an account&#039;&#039;&#039;*&#039;&#039;&#039;, add some pictures&#039;&#039;&#039;**&#039;&#039;&#039; and play around. Take some notes and then either set up an account on this wiki and add your thoughts to this page or email them to press@mediagoblin.org. Please include your operating system and what browser you&#039;re using. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;*&#039;&#039;&#039; Your email validation link may be in your spam folder!&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;**&#039;&#039;&#039; NOTHING ON THIS INSTANCE IS PERMANENT.  This is for user experience testing only... your pics will be wiped!&lt;br /&gt;
&lt;br /&gt;
You&#039;ll be able to give us the best feedback if you don&#039;t look at anyone else&#039;s notes before you start. Thanks for helping us with usability!! We really appreciate it!&lt;br /&gt;
&lt;br /&gt;
= User notes go in this section =&lt;br /&gt;
&lt;br /&gt;
=== From Jenny on Google Chrome 13.0.782.220 in Mac OSX 10.6.8 ===&lt;br /&gt;
* login ok, uploading file ok.&lt;br /&gt;
* can enter profile description but it doesn&#039;t seem to show up anywhere?&lt;br /&gt;
* no crash after attemping to upload a non-image and then uploading a real image (jpg)&lt;br /&gt;
* uploaded a sideways image and there is no way to rotate it.&lt;br /&gt;
&lt;br /&gt;
=== From Jenny on Safari 5.1 in Mac OSX 10.6.8 ===&lt;br /&gt;
* login ok, uploading ok&lt;br /&gt;
* same problem with profile description - it&#039;s filled in but doesn&#039;t appear in the profile.&lt;br /&gt;
* everything seems to work ok.&lt;br /&gt;
&lt;br /&gt;
=== From Deb using Ubuntu 10.04, Lucid Lynx (Netbook remix version on an Aspire One) with Firefox version 3.6.18 for Ubuntu on 9.8.2011 ===&lt;br /&gt;
&lt;br /&gt;
* could still use a little note explaining how tags work&lt;br /&gt;
* submission is easy&lt;br /&gt;
* seems odd that I can&#039;t add a picture of myself to my profile on a picture site&lt;br /&gt;
* will people be able to search by pic tags? or search for users? &lt;br /&gt;
* will people be able to group pics into albums? &lt;br /&gt;
* maybe we could have something that is more obviously a dashboard than clicking on the username&lt;br /&gt;
&lt;br /&gt;
=== From Jenny on Google Chrome 14.0.835.124 beta-m in Windows XP Professional ===&lt;br /&gt;
*Log in ok, comments ok, deleting files works now.&lt;br /&gt;
*Profile info only shows up if the website is filled in.&lt;br /&gt;
*Adding a .bmp crashes chrome.&lt;br /&gt;
*Other image types seem to work - tif, gif, png, jpg.&lt;br /&gt;
*Adding other non-images give a message that it is not an image (txt, pdf, mdi).&lt;br /&gt;
*The &amp;lt;- -&amp;gt; buttons say &#039;Temporary button holder&#039; beneath them.&lt;br /&gt;
*The .tif image doesn&#039;t display when browsing individual photos, just in the overall view.&lt;br /&gt;
&lt;br /&gt;
=== From Jenny on IE7 in Windows XP Professional ===&lt;br /&gt;
*Log in ok, comments ok, editing and deleting ok, uploading ok.&lt;br /&gt;
*Display - the profile website runs into the photos. The photos line up exactly with no space between them. Everything is top-justified rather than centered.&lt;br /&gt;
*The tif image doesn&#039;t display on the page for that image (where you can comment on it) - it does display on all other pages though.&lt;br /&gt;
*The save changes button is cut off so you only see the letters &#039;SAVE CHA&#039;.&lt;br /&gt;
*The &amp;quot;Profile Edited&amp;quot; or &amp;quot;Posted Comment&amp;quot; comment dialog box displays over the username and logout buttons, as does the &amp;lt;- -&amp;gt; arrows. These also say &#039;Temporary button holder&#039; which seems wrong.&lt;br /&gt;
=== Running on Dreamhost.com ===&lt;br /&gt;
&lt;br /&gt;
====Set up your python virtualenv====&lt;br /&gt;
&lt;br /&gt;
# Download the latest virtualenv: http://pypi.python.org/packages/source/v/virtualenv/XXX&lt;br /&gt;
# Download the latest python: http://python.org/ftp/python/XXX/Python-XXX.tar.bz2&lt;br /&gt;
# Unpack both&lt;br /&gt;
# Compile and install python locally:&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&amp;lt;pre&amp;gt;./configure --prefix=$HOME/local&lt;br /&gt;
make&lt;br /&gt;
make install&amp;lt;/pre&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
:This will install python (I used 2.7.3) into /home/spaetz/local/... (e.g. .../bin/python)&lt;br /&gt;
# Install the virtualenv:&lt;br /&gt;
:&amp;lt;blockquote&amp;gt;&amp;lt;pre&amp;gt;~/local/bin/python ~/virtualenv-1.8/virtualenv.py  $HOME/local/virtenv&amp;lt;/pre&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
:You will now have: ~/local/virtenv/bin/python&lt;br /&gt;
# In  ~/.bash_profile add:&lt;br /&gt;
:&amp;lt;blockquote&amp;gt;&amp;lt;pre&amp;gt;PATH=~/local/virtenv/bin:~/local/bin:${PATH}&amp;lt;/pre&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
:so that your local python will be preferred.&lt;br /&gt;
:Log out, log in again and test python&amp;quot; to see which version will be invoked. It should be the new python. Check &amp;quot;which easy_install&amp;quot; to see if the one in local/virtenv would be executed.&lt;br /&gt;
:You have now a local python installation that you can use, and easy_install will work with your local installation.&lt;br /&gt;
&lt;br /&gt;
====Install mediagoblin as a site package====&lt;br /&gt;
&lt;br /&gt;
# Check out mediagoblin from git to e.g. ~/mediagoblin&lt;br /&gt;
# Install MediaGoblin and all dependencies for MediaGoblin with easy_install.&lt;br /&gt;
:* In the mediagoblin directory issue:&lt;br /&gt;
:&amp;lt;blockquote&amp;gt;&amp;lt;pre&amp;gt;python setup.py&amp;lt;/pre&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
:* You will also need to: easy_install lxml&lt;br /&gt;
:* Python-image was trickier to install:&lt;br /&gt;
:&amp;lt;blockquote&amp;gt;&amp;lt;pre&amp;gt;easy_install --find-links http://www.pythonware.com/products/pil/ Imaging&amp;lt;/pre&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
:test by leaving the mediagoblin directory and see if you can import it:&lt;br /&gt;
:&amp;lt;blockquote&amp;gt;&amp;lt;pre&amp;gt;python&amp;lt;ENTER&amp;gt;import mediagoblin&amp;lt;CTRL-D&amp;gt;&amp;lt;/pre&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
:looking for errors.&lt;br /&gt;
&lt;br /&gt;
====Set up an WSGI environment on Dreamhost====&lt;br /&gt;
&lt;br /&gt;
# Enable the mod_passenger setting for ruby/python in the domains web panel&lt;br /&gt;
# &#039;&#039;cd&#039;&#039; into the domain directory (e.g. ~/media.sspaeth.de for me)&lt;br /&gt;
# Copy mediagoblin.ini and paste.ini from the ~/mediagoblin directory here&lt;br /&gt;
# Create passenger_wsgi.py in your domain directory (e.g. ~/media.sspaeth.de for me):&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&amp;lt;pre&amp;gt;import sys, os&lt;br /&gt;
INTERP = &amp;quot;/home/&amp;lt;username&amp;gt;/local/virtenv/bin/python&amp;quot;&lt;br /&gt;
#INTERP is present twice so that the new python interpreter knows the actual executable path&lt;br /&gt;
if sys.executable != INTERP: os.execl(INTERP, INTERP, *sys.argv)&lt;br /&gt;
&lt;br /&gt;
from paste.deploy import loadapp&lt;br /&gt;
application = loadapp(&#039;config:/home/mediagoblin/media.sspaeth.de/paste.ini&#039;)&lt;br /&gt;
&lt;br /&gt;
#If in case of errors, all you get are mysterious error 500, you can set debug=true in paste.ini to see stack traces&lt;br /&gt;
# Otherwise, add this:&lt;br /&gt;
#from paste.exceptions.errormiddleware import ErrorMiddleware&lt;br /&gt;
#application = ErrorMiddleware(application, debug=True)&amp;lt;/pre&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
# Set up the database by issueing: &amp;lt;pre&amp;gt;gmg dbupdate&amp;lt;/pre&amp;gt;&lt;br /&gt;
# (optional but recommended) Serve the static files directly from the webserver.&lt;br /&gt;
:In paste.ini in this section: [composite:routing] comment out the static files:&lt;br /&gt;
   #/mgoblin_static/ = mediagoblin_static&lt;br /&gt;
   #/theme_static/ = theme_static&lt;br /&gt;
:and symlink the mediagobin/mediagoblin/static directoy to public/mgoblin_static&lt;br /&gt;
:           and mediagoblin/mediagoblin/themes to public/theme_static&lt;br /&gt;
:&lt;br /&gt;
:so it is displayed directly. This step might be different depending on your web server configuration. There is no reason that static&lt;br /&gt;
:files need to go through all the python indirection when they can be served directly by nginx/apache/...&lt;br /&gt;
:&lt;br /&gt;
:In case you want to delete your git checkout after the installation (you don&#039;t need it, since you installed the mediagoblin package to ~/local/virtenv/lib/python2.7/mediagoblin... you should do the symlinking from there.&lt;br /&gt;
&lt;br /&gt;
= Past notes =&lt;br /&gt;
&lt;br /&gt;
Are here, http://wiki.mediagoblin.org/User_Experience_Past_Notes&lt;br /&gt;
&lt;br /&gt;
= General thoughts on running a user experience test =&lt;br /&gt;
&lt;br /&gt;
Could someone with experience with this fill in info here? ;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
I (Jan-Christoph Borchardt) write a thesis at the moment on [http://owncloud.iuk.hdm-stuttgart.de/apps/files_publiclink/get.php?token=6c766212ba094bea08bf1bb800b3e1e7c785388e Coordinating low-cost usability testing in independent free &amp;amp; open source software projects]&amp;lt;br&amp;gt;&lt;br /&gt;
There are many small tips and recipes on how to do your own testing. Especially look into the &#039;&#039;Methods&#039;&#039; part.&amp;lt;br&amp;gt;&lt;br /&gt;
Please let me know if you have any other experiences with testing, I intend on regularly updating that document and release the full version freely licensed once it’s done as well as some kind of a &#039;&#039;quick start guide&#039;&#039;.&lt;/div&gt;</summary>
		<author><name>Spaetz</name></author>
	</entry>
	<entry>
		<id>https://wiki.mediagoblin.org/index.php?title=User_Experience&amp;diff=1000</id>
		<title>User Experience</title>
		<link rel="alternate" type="text/html" href="https://wiki.mediagoblin.org/index.php?title=User_Experience&amp;diff=1000"/>
		<updated>2012-11-28T11:04:25Z</updated>

		<summary type="html">&lt;p&gt;Spaetz: /* Set up your python virtualenv */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;We need help doing user experience testing!  This means users testing our software, observing what does and doesn&#039;t work for them, and recording that.&lt;br /&gt;
&lt;br /&gt;
If you&#039;re here to help (HOORAY!) go to the testing instance set up by Caleb Davis: http://omgmg.dyndns.org:6543/ [EDIT: This link has been down since 2011 something, take a look at the [[Live instances]] instead]&lt;br /&gt;
&lt;br /&gt;
Sign up for an account&#039;&#039;&#039;*&#039;&#039;&#039;, add some pictures&#039;&#039;&#039;**&#039;&#039;&#039; and play around. Take some notes and then either set up an account on this wiki and add your thoughts to this page or email them to press@mediagoblin.org. Please include your operating system and what browser you&#039;re using. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;*&#039;&#039;&#039; Your email validation link may be in your spam folder!&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;**&#039;&#039;&#039; NOTHING ON THIS INSTANCE IS PERMANENT.  This is for user experience testing only... your pics will be wiped!&lt;br /&gt;
&lt;br /&gt;
You&#039;ll be able to give us the best feedback if you don&#039;t look at anyone else&#039;s notes before you start. Thanks for helping us with usability!! We really appreciate it!&lt;br /&gt;
&lt;br /&gt;
= User notes go in this section =&lt;br /&gt;
&lt;br /&gt;
=== From Jenny on Google Chrome 13.0.782.220 in Mac OSX 10.6.8 ===&lt;br /&gt;
* login ok, uploading file ok.&lt;br /&gt;
* can enter profile description but it doesn&#039;t seem to show up anywhere?&lt;br /&gt;
* no crash after attemping to upload a non-image and then uploading a real image (jpg)&lt;br /&gt;
* uploaded a sideways image and there is no way to rotate it.&lt;br /&gt;
&lt;br /&gt;
=== From Jenny on Safari 5.1 in Mac OSX 10.6.8 ===&lt;br /&gt;
* login ok, uploading ok&lt;br /&gt;
* same problem with profile description - it&#039;s filled in but doesn&#039;t appear in the profile.&lt;br /&gt;
* everything seems to work ok.&lt;br /&gt;
&lt;br /&gt;
=== From Deb using Ubuntu 10.04, Lucid Lynx (Netbook remix version on an Aspire One) with Firefox version 3.6.18 for Ubuntu on 9.8.2011 ===&lt;br /&gt;
&lt;br /&gt;
* could still use a little note explaining how tags work&lt;br /&gt;
* submission is easy&lt;br /&gt;
* seems odd that I can&#039;t add a picture of myself to my profile on a picture site&lt;br /&gt;
* will people be able to search by pic tags? or search for users? &lt;br /&gt;
* will people be able to group pics into albums? &lt;br /&gt;
* maybe we could have something that is more obviously a dashboard than clicking on the username&lt;br /&gt;
&lt;br /&gt;
=== From Jenny on Google Chrome 14.0.835.124 beta-m in Windows XP Professional ===&lt;br /&gt;
*Log in ok, comments ok, deleting files works now.&lt;br /&gt;
*Profile info only shows up if the website is filled in.&lt;br /&gt;
*Adding a .bmp crashes chrome.&lt;br /&gt;
*Other image types seem to work - tif, gif, png, jpg.&lt;br /&gt;
*Adding other non-images give a message that it is not an image (txt, pdf, mdi).&lt;br /&gt;
*The &amp;lt;- -&amp;gt; buttons say &#039;Temporary button holder&#039; beneath them.&lt;br /&gt;
*The .tif image doesn&#039;t display when browsing individual photos, just in the overall view.&lt;br /&gt;
&lt;br /&gt;
=== From Jenny on IE7 in Windows XP Professional ===&lt;br /&gt;
*Log in ok, comments ok, editing and deleting ok, uploading ok.&lt;br /&gt;
*Display - the profile website runs into the photos. The photos line up exactly with no space between them. Everything is top-justified rather than centered.&lt;br /&gt;
*The tif image doesn&#039;t display on the page for that image (where you can comment on it) - it does display on all other pages though.&lt;br /&gt;
*The save changes button is cut off so you only see the letters &#039;SAVE CHA&#039;.&lt;br /&gt;
*The &amp;quot;Profile Edited&amp;quot; or &amp;quot;Posted Comment&amp;quot; comment dialog box displays over the username and logout buttons, as does the &amp;lt;- -&amp;gt; arrows. These also say &#039;Temporary button holder&#039; which seems wrong.&lt;br /&gt;
=== Running on Dreamhost.com ===&lt;br /&gt;
&lt;br /&gt;
====Set up your python virtualenv====&lt;br /&gt;
&lt;br /&gt;
# Download the latest virtualenv: http://pypi.python.org/packages/source/v/virtualenv/XXX&lt;br /&gt;
# Download the latest python: http://python.org/ftp/python/XXX/Python-XXX.tar.bz2&lt;br /&gt;
# Unpack both&lt;br /&gt;
# Compile and install python locally:&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&amp;lt;pre&amp;gt;./configure --prefix=$HOME/local&lt;br /&gt;
make&lt;br /&gt;
make install&amp;lt;/pre&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
:This will install python (I used 2.7.3) into /home/spaetz/local/... (e.g. .../bin/python)&lt;br /&gt;
# Install the virtualenv:&lt;br /&gt;
:&amp;lt;blockquote&amp;gt;&amp;lt;pre&amp;gt;~/local/bin/python ~/virtualenv-1.8/virtualenv.py  $HOME/local/virtenv&amp;lt;/pre&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
:You will now have: ~/local/virtenv/bin/python&lt;br /&gt;
# In  ~/.bash_profile add:&lt;br /&gt;
:&amp;lt;blockquote&amp;gt;&amp;lt;pre&amp;gt;PATH=~/local/virtenv/bin:~/local/bin:${PATH}&amp;lt;/pre&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
:so that your local python will be preferred.&lt;br /&gt;
:Log out, log in again and test python&amp;quot; to see which version will be invoked. It should be the new python. Check &amp;quot;which easy_install&amp;quot; to see if the one in local/virtenv would be executed.&lt;br /&gt;
:You have now a local python installation that you can use, and easy_install will work with your local installation.&lt;br /&gt;
&lt;br /&gt;
====Install mediagoblin as a site package====&lt;br /&gt;
&lt;br /&gt;
# Check out mediagoblin from git to e.g. ~/mediagoblin&lt;br /&gt;
# Install MediaGoblin and all dependencies for MediaGoblin with easy_install.&lt;br /&gt;
:* In the mediagoblin directory issue:&lt;br /&gt;
:&amp;lt;blockquote&amp;gt;&amp;lt;pre&amp;gt;python setup.py&amp;lt;/pre&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
:* You will also need to: easy_install lxml&lt;br /&gt;
:* Python-image was trickier to install:&lt;br /&gt;
:&amp;lt;blockquote&amp;gt;&amp;lt;pre&amp;gt;easy_install --find-links http://www.pythonware.com/products/pil/ Imaging&amp;lt;/pre&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
:test by leaving the mediagoblin directory and see if you can import it:&lt;br /&gt;
:&amp;lt;blockquote&amp;gt;&amp;lt;pre&amp;gt;python&amp;lt;ENTER&amp;gt;import mediagoblin&amp;lt;CTRL-D&amp;gt;&amp;lt;/pre&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
:looking for errors.&lt;br /&gt;
&lt;br /&gt;
====Set up an WSGI environment on Dreamhost====&lt;br /&gt;
&lt;br /&gt;
# Enable the mod_passenger setting for ruby/python in the domains web panel&lt;br /&gt;
# &#039;&#039;cd&#039;&#039; into the domain directory (e.g. ~/media.sspaeth.de for me)&lt;br /&gt;
# Copy mediagoblin.ini and paste.ini from the ~/mediagoblin directory here&lt;br /&gt;
# Create passenger_wsgi.py in your domain directory (e.g. ~/media.sspaeth.de for me):&lt;br /&gt;
    import sys, os&lt;br /&gt;
    INTERP = &amp;quot;/home/&amp;lt;username&amp;gt;/local/virtenv/bin/python&amp;quot;&lt;br /&gt;
    #INTERP is present twice so that the new python interpreter knows the actual executable path&lt;br /&gt;
    if sys.executable != INTERP: os.execl(INTERP, INTERP, *sys.argv)&lt;br /&gt;
&lt;br /&gt;
    from paste.deploy import loadapp&lt;br /&gt;
    application = loadapp(&#039;config:/home/mediagoblin/media.sspaeth.de/paste.ini&#039;)&lt;br /&gt;
&lt;br /&gt;
    #If in case of errors, all you get are mysterious error 500, you can set debug=true in paste.ini to see stack traces&lt;br /&gt;
    # Otherwise, add this:&lt;br /&gt;
    #from paste.exceptions.errormiddleware import ErrorMiddleware&lt;br /&gt;
    #application = ErrorMiddleware(application, debug=True)&lt;br /&gt;
&lt;br /&gt;
# Set up the database by issueing: gmg dbupdate&lt;br /&gt;
# (optional but recommended) Serve the static files directly from the webserver.&lt;br /&gt;
   In paste.ini in this section: [composite:routing] comment out the static files:&lt;br /&gt;
   #/mgoblin_static/ = mediagoblin_static&lt;br /&gt;
   #/theme_static/ = theme_static&lt;br /&gt;
&lt;br /&gt;
   and symlink the mediagobin/mediagoblin/static directoy to public/mgoblin_static&lt;br /&gt;
           and mediagoblin/mediagoblin/themes to public/theme_static&lt;br /&gt;
&lt;br /&gt;
   so it is displayed directly. This step might be different depending&lt;br /&gt;
   on your web server configuration. There is no reason that static&lt;br /&gt;
   files need to go through all the python indirection when they can be&lt;br /&gt;
   served directly by nginx/apache/...&lt;br /&gt;
&lt;br /&gt;
   In case you want to delete your git checkout after the installation (you don&#039;t need it, since you installed the mediagoblin package to ~/local/virtenv/lib/python2.7/mediagoblin...&lt;br /&gt;
   you should do the symlinking from there.&lt;br /&gt;
&lt;br /&gt;
= Past notes =&lt;br /&gt;
&lt;br /&gt;
Are here, http://wiki.mediagoblin.org/User_Experience_Past_Notes&lt;br /&gt;
&lt;br /&gt;
= General thoughts on running a user experience test =&lt;br /&gt;
&lt;br /&gt;
Could someone with experience with this fill in info here? ;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
I (Jan-Christoph Borchardt) write a thesis at the moment on [http://owncloud.iuk.hdm-stuttgart.de/apps/files_publiclink/get.php?token=6c766212ba094bea08bf1bb800b3e1e7c785388e Coordinating low-cost usability testing in independent free &amp;amp; open source software projects]&amp;lt;br&amp;gt;&lt;br /&gt;
There are many small tips and recipes on how to do your own testing. Especially look into the &#039;&#039;Methods&#039;&#039; part.&amp;lt;br&amp;gt;&lt;br /&gt;
Please let me know if you have any other experiences with testing, I intend on regularly updating that document and release the full version freely licensed once it’s done as well as some kind of a &#039;&#039;quick start guide&#039;&#039;.&lt;/div&gt;</summary>
		<author><name>Spaetz</name></author>
	</entry>
	<entry>
		<id>https://wiki.mediagoblin.org/index.php?title=User_Experience&amp;diff=999</id>
		<title>User Experience</title>
		<link rel="alternate" type="text/html" href="https://wiki.mediagoblin.org/index.php?title=User_Experience&amp;diff=999"/>
		<updated>2012-11-28T11:01:55Z</updated>

		<summary type="html">&lt;p&gt;Spaetz: /* Install mediagoblin as a site package */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;We need help doing user experience testing!  This means users testing our software, observing what does and doesn&#039;t work for them, and recording that.&lt;br /&gt;
&lt;br /&gt;
If you&#039;re here to help (HOORAY!) go to the testing instance set up by Caleb Davis: http://omgmg.dyndns.org:6543/ [EDIT: This link has been down since 2011 something, take a look at the [[Live instances]] instead]&lt;br /&gt;
&lt;br /&gt;
Sign up for an account&#039;&#039;&#039;*&#039;&#039;&#039;, add some pictures&#039;&#039;&#039;**&#039;&#039;&#039; and play around. Take some notes and then either set up an account on this wiki and add your thoughts to this page or email them to press@mediagoblin.org. Please include your operating system and what browser you&#039;re using. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;*&#039;&#039;&#039; Your email validation link may be in your spam folder!&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;**&#039;&#039;&#039; NOTHING ON THIS INSTANCE IS PERMANENT.  This is for user experience testing only... your pics will be wiped!&lt;br /&gt;
&lt;br /&gt;
You&#039;ll be able to give us the best feedback if you don&#039;t look at anyone else&#039;s notes before you start. Thanks for helping us with usability!! We really appreciate it!&lt;br /&gt;
&lt;br /&gt;
= User notes go in this section =&lt;br /&gt;
&lt;br /&gt;
=== From Jenny on Google Chrome 13.0.782.220 in Mac OSX 10.6.8 ===&lt;br /&gt;
* login ok, uploading file ok.&lt;br /&gt;
* can enter profile description but it doesn&#039;t seem to show up anywhere?&lt;br /&gt;
* no crash after attemping to upload a non-image and then uploading a real image (jpg)&lt;br /&gt;
* uploaded a sideways image and there is no way to rotate it.&lt;br /&gt;
&lt;br /&gt;
=== From Jenny on Safari 5.1 in Mac OSX 10.6.8 ===&lt;br /&gt;
* login ok, uploading ok&lt;br /&gt;
* same problem with profile description - it&#039;s filled in but doesn&#039;t appear in the profile.&lt;br /&gt;
* everything seems to work ok.&lt;br /&gt;
&lt;br /&gt;
=== From Deb using Ubuntu 10.04, Lucid Lynx (Netbook remix version on an Aspire One) with Firefox version 3.6.18 for Ubuntu on 9.8.2011 ===&lt;br /&gt;
&lt;br /&gt;
* could still use a little note explaining how tags work&lt;br /&gt;
* submission is easy&lt;br /&gt;
* seems odd that I can&#039;t add a picture of myself to my profile on a picture site&lt;br /&gt;
* will people be able to search by pic tags? or search for users? &lt;br /&gt;
* will people be able to group pics into albums? &lt;br /&gt;
* maybe we could have something that is more obviously a dashboard than clicking on the username&lt;br /&gt;
&lt;br /&gt;
=== From Jenny on Google Chrome 14.0.835.124 beta-m in Windows XP Professional ===&lt;br /&gt;
*Log in ok, comments ok, deleting files works now.&lt;br /&gt;
*Profile info only shows up if the website is filled in.&lt;br /&gt;
*Adding a .bmp crashes chrome.&lt;br /&gt;
*Other image types seem to work - tif, gif, png, jpg.&lt;br /&gt;
*Adding other non-images give a message that it is not an image (txt, pdf, mdi).&lt;br /&gt;
*The &amp;lt;- -&amp;gt; buttons say &#039;Temporary button holder&#039; beneath them.&lt;br /&gt;
*The .tif image doesn&#039;t display when browsing individual photos, just in the overall view.&lt;br /&gt;
&lt;br /&gt;
=== From Jenny on IE7 in Windows XP Professional ===&lt;br /&gt;
*Log in ok, comments ok, editing and deleting ok, uploading ok.&lt;br /&gt;
*Display - the profile website runs into the photos. The photos line up exactly with no space between them. Everything is top-justified rather than centered.&lt;br /&gt;
*The tif image doesn&#039;t display on the page for that image (where you can comment on it) - it does display on all other pages though.&lt;br /&gt;
*The save changes button is cut off so you only see the letters &#039;SAVE CHA&#039;.&lt;br /&gt;
*The &amp;quot;Profile Edited&amp;quot; or &amp;quot;Posted Comment&amp;quot; comment dialog box displays over the username and logout buttons, as does the &amp;lt;- -&amp;gt; arrows. These also say &#039;Temporary button holder&#039; which seems wrong.&lt;br /&gt;
=== Running on Dreamhost.com ===&lt;br /&gt;
&lt;br /&gt;
====Set up your python virtualenv====&lt;br /&gt;
&lt;br /&gt;
# Download the latest virtualenv: http://pypi.python.org/packages/source/v/virtualenv/XXX&lt;br /&gt;
# Download the latest python: http://python.org/ftp/python/XXX/Python-XXX.tar.bz2&lt;br /&gt;
# Unpack both&lt;br /&gt;
# Compile and install python locally:&lt;br /&gt;
  &amp;lt;blockquote&amp;gt;&amp;lt;pre&amp;gt;./configure --prefix=$HOME/local&lt;br /&gt;
  make&lt;br /&gt;
  make install&amp;lt;/pre&amp;gt;&amp;lt;/blockquote&amp;gt;This will install python (I used 2.7.3) into /home/spaetz/local/... (e.g. .../bin/python)&lt;br /&gt;
# Install the virtualenv:&lt;br /&gt;
  &amp;lt;blockquote&amp;gt;&amp;lt;pre&amp;gt;~/local/bin/python ~/virtualenv-1.8/virtualenv.py  $HOME/local/virtenv&amp;lt;/pre&amp;gt;&amp;lt;/blockquote&amp;gt;You will now have: ~/local/virtenv/bin/python&lt;br /&gt;
# In  ~/.bash_profile add:&lt;br /&gt;
  &amp;lt;blockquote&amp;gt;&amp;lt;pre&amp;gt;PATH=~/local/virtenv/bin:~/local/bin:${PATH}&amp;lt;/pre&amp;gt;&amp;lt;/blockquote&amp;gt;so that your local python will be preferred.&lt;br /&gt;
Log out, log in again and test python&amp;quot; to see which version will be invoked. It should be the new python. Check &amp;quot;which easy_install&amp;quot; to see if the one in local/virtenv would be executed.&lt;br /&gt;
You have now a local python installation that you can use, and easy_install will work with your local installation.&lt;br /&gt;
&lt;br /&gt;
====Install mediagoblin as a site package====&lt;br /&gt;
&lt;br /&gt;
# Check out mediagoblin from git to e.g. ~/mediagoblin&lt;br /&gt;
# Install MediaGoblin and all dependencies for MediaGoblin with easy_install.&lt;br /&gt;
:* In the mediagoblin directory issue:&lt;br /&gt;
:&amp;lt;blockquote&amp;gt;&amp;lt;pre&amp;gt;python setup.py&amp;lt;/pre&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
:* You will also need to: easy_install lxml&lt;br /&gt;
:* Python-image was trickier to install:&lt;br /&gt;
:&amp;lt;blockquote&amp;gt;&amp;lt;pre&amp;gt;easy_install --find-links http://www.pythonware.com/products/pil/ Imaging&amp;lt;/pre&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
:test by leaving the mediagoblin directory and see if you can import it:&lt;br /&gt;
:&amp;lt;blockquote&amp;gt;&amp;lt;pre&amp;gt;python&amp;lt;ENTER&amp;gt;import mediagoblin&amp;lt;CTRL-D&amp;gt;&amp;lt;/pre&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
:looking for errors.&lt;br /&gt;
&lt;br /&gt;
====Set up an WSGI environment on Dreamhost====&lt;br /&gt;
&lt;br /&gt;
# Enable the mod_passenger setting for ruby/python in the domains web panel&lt;br /&gt;
# &#039;&#039;cd&#039;&#039; into the domain directory (e.g. ~/media.sspaeth.de for me)&lt;br /&gt;
# Copy mediagoblin.ini and paste.ini from the ~/mediagoblin directory here&lt;br /&gt;
# Create passenger_wsgi.py in your domain directory (e.g. ~/media.sspaeth.de for me):&lt;br /&gt;
    import sys, os&lt;br /&gt;
    INTERP = &amp;quot;/home/&amp;lt;username&amp;gt;/local/virtenv/bin/python&amp;quot;&lt;br /&gt;
    #INTERP is present twice so that the new python interpreter knows the actual executable path&lt;br /&gt;
    if sys.executable != INTERP: os.execl(INTERP, INTERP, *sys.argv)&lt;br /&gt;
&lt;br /&gt;
    from paste.deploy import loadapp&lt;br /&gt;
    application = loadapp(&#039;config:/home/mediagoblin/media.sspaeth.de/paste.ini&#039;)&lt;br /&gt;
&lt;br /&gt;
    #If in case of errors, all you get are mysterious error 500, you can set debug=true in paste.ini to see stack traces&lt;br /&gt;
    # Otherwise, add this:&lt;br /&gt;
    #from paste.exceptions.errormiddleware import ErrorMiddleware&lt;br /&gt;
    #application = ErrorMiddleware(application, debug=True)&lt;br /&gt;
&lt;br /&gt;
# Set up the database by issueing: gmg dbupdate&lt;br /&gt;
# (optional but recommended) Serve the static files directly from the webserver.&lt;br /&gt;
   In paste.ini in this section: [composite:routing] comment out the static files:&lt;br /&gt;
   #/mgoblin_static/ = mediagoblin_static&lt;br /&gt;
   #/theme_static/ = theme_static&lt;br /&gt;
&lt;br /&gt;
   and symlink the mediagobin/mediagoblin/static directoy to public/mgoblin_static&lt;br /&gt;
           and mediagoblin/mediagoblin/themes to public/theme_static&lt;br /&gt;
&lt;br /&gt;
   so it is displayed directly. This step might be different depending&lt;br /&gt;
   on your web server configuration. There is no reason that static&lt;br /&gt;
   files need to go through all the python indirection when they can be&lt;br /&gt;
   served directly by nginx/apache/...&lt;br /&gt;
&lt;br /&gt;
   In case you want to delete your git checkout after the installation (you don&#039;t need it, since you installed the mediagoblin package to ~/local/virtenv/lib/python2.7/mediagoblin...&lt;br /&gt;
   you should do the symlinking from there.&lt;br /&gt;
&lt;br /&gt;
= Past notes =&lt;br /&gt;
&lt;br /&gt;
Are here, http://wiki.mediagoblin.org/User_Experience_Past_Notes&lt;br /&gt;
&lt;br /&gt;
= General thoughts on running a user experience test =&lt;br /&gt;
&lt;br /&gt;
Could someone with experience with this fill in info here? ;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
I (Jan-Christoph Borchardt) write a thesis at the moment on [http://owncloud.iuk.hdm-stuttgart.de/apps/files_publiclink/get.php?token=6c766212ba094bea08bf1bb800b3e1e7c785388e Coordinating low-cost usability testing in independent free &amp;amp; open source software projects]&amp;lt;br&amp;gt;&lt;br /&gt;
There are many small tips and recipes on how to do your own testing. Especially look into the &#039;&#039;Methods&#039;&#039; part.&amp;lt;br&amp;gt;&lt;br /&gt;
Please let me know if you have any other experiences with testing, I intend on regularly updating that document and release the full version freely licensed once it’s done as well as some kind of a &#039;&#039;quick start guide&#039;&#039;.&lt;/div&gt;</summary>
		<author><name>Spaetz</name></author>
	</entry>
	<entry>
		<id>https://wiki.mediagoblin.org/index.php?title=User_Experience&amp;diff=998</id>
		<title>User Experience</title>
		<link rel="alternate" type="text/html" href="https://wiki.mediagoblin.org/index.php?title=User_Experience&amp;diff=998"/>
		<updated>2012-11-28T10:59:08Z</updated>

		<summary type="html">&lt;p&gt;Spaetz: /* Set up your python virtualenv */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;We need help doing user experience testing!  This means users testing our software, observing what does and doesn&#039;t work for them, and recording that.&lt;br /&gt;
&lt;br /&gt;
If you&#039;re here to help (HOORAY!) go to the testing instance set up by Caleb Davis: http://omgmg.dyndns.org:6543/ [EDIT: This link has been down since 2011 something, take a look at the [[Live instances]] instead]&lt;br /&gt;
&lt;br /&gt;
Sign up for an account&#039;&#039;&#039;*&#039;&#039;&#039;, add some pictures&#039;&#039;&#039;**&#039;&#039;&#039; and play around. Take some notes and then either set up an account on this wiki and add your thoughts to this page or email them to press@mediagoblin.org. Please include your operating system and what browser you&#039;re using. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;*&#039;&#039;&#039; Your email validation link may be in your spam folder!&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;**&#039;&#039;&#039; NOTHING ON THIS INSTANCE IS PERMANENT.  This is for user experience testing only... your pics will be wiped!&lt;br /&gt;
&lt;br /&gt;
You&#039;ll be able to give us the best feedback if you don&#039;t look at anyone else&#039;s notes before you start. Thanks for helping us with usability!! We really appreciate it!&lt;br /&gt;
&lt;br /&gt;
= User notes go in this section =&lt;br /&gt;
&lt;br /&gt;
=== From Jenny on Google Chrome 13.0.782.220 in Mac OSX 10.6.8 ===&lt;br /&gt;
* login ok, uploading file ok.&lt;br /&gt;
* can enter profile description but it doesn&#039;t seem to show up anywhere?&lt;br /&gt;
* no crash after attemping to upload a non-image and then uploading a real image (jpg)&lt;br /&gt;
* uploaded a sideways image and there is no way to rotate it.&lt;br /&gt;
&lt;br /&gt;
=== From Jenny on Safari 5.1 in Mac OSX 10.6.8 ===&lt;br /&gt;
* login ok, uploading ok&lt;br /&gt;
* same problem with profile description - it&#039;s filled in but doesn&#039;t appear in the profile.&lt;br /&gt;
* everything seems to work ok.&lt;br /&gt;
&lt;br /&gt;
=== From Deb using Ubuntu 10.04, Lucid Lynx (Netbook remix version on an Aspire One) with Firefox version 3.6.18 for Ubuntu on 9.8.2011 ===&lt;br /&gt;
&lt;br /&gt;
* could still use a little note explaining how tags work&lt;br /&gt;
* submission is easy&lt;br /&gt;
* seems odd that I can&#039;t add a picture of myself to my profile on a picture site&lt;br /&gt;
* will people be able to search by pic tags? or search for users? &lt;br /&gt;
* will people be able to group pics into albums? &lt;br /&gt;
* maybe we could have something that is more obviously a dashboard than clicking on the username&lt;br /&gt;
&lt;br /&gt;
=== From Jenny on Google Chrome 14.0.835.124 beta-m in Windows XP Professional ===&lt;br /&gt;
*Log in ok, comments ok, deleting files works now.&lt;br /&gt;
*Profile info only shows up if the website is filled in.&lt;br /&gt;
*Adding a .bmp crashes chrome.&lt;br /&gt;
*Other image types seem to work - tif, gif, png, jpg.&lt;br /&gt;
*Adding other non-images give a message that it is not an image (txt, pdf, mdi).&lt;br /&gt;
*The &amp;lt;- -&amp;gt; buttons say &#039;Temporary button holder&#039; beneath them.&lt;br /&gt;
*The .tif image doesn&#039;t display when browsing individual photos, just in the overall view.&lt;br /&gt;
&lt;br /&gt;
=== From Jenny on IE7 in Windows XP Professional ===&lt;br /&gt;
*Log in ok, comments ok, editing and deleting ok, uploading ok.&lt;br /&gt;
*Display - the profile website runs into the photos. The photos line up exactly with no space between them. Everything is top-justified rather than centered.&lt;br /&gt;
*The tif image doesn&#039;t display on the page for that image (where you can comment on it) - it does display on all other pages though.&lt;br /&gt;
*The save changes button is cut off so you only see the letters &#039;SAVE CHA&#039;.&lt;br /&gt;
*The &amp;quot;Profile Edited&amp;quot; or &amp;quot;Posted Comment&amp;quot; comment dialog box displays over the username and logout buttons, as does the &amp;lt;- -&amp;gt; arrows. These also say &#039;Temporary button holder&#039; which seems wrong.&lt;br /&gt;
=== Running on Dreamhost.com ===&lt;br /&gt;
&lt;br /&gt;
====Set up your python virtualenv====&lt;br /&gt;
&lt;br /&gt;
# Download the latest virtualenv: http://pypi.python.org/packages/source/v/virtualenv/XXX&lt;br /&gt;
# Download the latest python: http://python.org/ftp/python/XXX/Python-XXX.tar.bz2&lt;br /&gt;
# Unpack both&lt;br /&gt;
# Compile and install python locally:&lt;br /&gt;
  &amp;lt;blockquote&amp;gt;&amp;lt;pre&amp;gt;./configure --prefix=$HOME/local&lt;br /&gt;
  make&lt;br /&gt;
  make install&amp;lt;/pre&amp;gt;&amp;lt;/blockquote&amp;gt;This will install python (I used 2.7.3) into /home/spaetz/local/... (e.g. .../bin/python)&lt;br /&gt;
# Install the virtualenv:&lt;br /&gt;
  &amp;lt;blockquote&amp;gt;&amp;lt;pre&amp;gt;~/local/bin/python ~/virtualenv-1.8/virtualenv.py  $HOME/local/virtenv&amp;lt;/pre&amp;gt;&amp;lt;/blockquote&amp;gt;You will now have: ~/local/virtenv/bin/python&lt;br /&gt;
# In  ~/.bash_profile add:&lt;br /&gt;
  &amp;lt;blockquote&amp;gt;&amp;lt;pre&amp;gt;PATH=~/local/virtenv/bin:~/local/bin:${PATH}&amp;lt;/pre&amp;gt;&amp;lt;/blockquote&amp;gt;so that your local python will be preferred.&lt;br /&gt;
Log out, log in again and test python&amp;quot; to see which version will be invoked. It should be the new python. Check &amp;quot;which easy_install&amp;quot; to see if the one in local/virtenv would be executed.&lt;br /&gt;
You have now a local python installation that you can use, and easy_install will work with your local installation.&lt;br /&gt;
&lt;br /&gt;
====Install mediagoblin as a site package====&lt;br /&gt;
&lt;br /&gt;
# Check out mediagoblin from git to e.g. ~/mediagoblin&lt;br /&gt;
# Install MediaGoblin and all dependencies for MediaGoblin with easy_install.&lt;br /&gt;
  - In the mediagoblin directory issue:&lt;br /&gt;
       python setup.py&lt;br /&gt;
&lt;br /&gt;
  - You will also need to: easy_install lxml&lt;br /&gt;
  - Python-image was trickier to install:&lt;br /&gt;
      easy_install --find-links http://www.pythonware.com/products/pil/ Imaging&lt;br /&gt;
&lt;br /&gt;
   test by leaving the mediagoblin directory and see if you can import it:&lt;br /&gt;
       python&amp;lt;ENTER&amp;gt;import mediagoblin&amp;lt;CTRL-D&amp;gt;&lt;br /&gt;
   looking for errors.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Set up an WSGI environment on Dreamhost====&lt;br /&gt;
&lt;br /&gt;
# Enable the mod_passenger setting for ruby/python in the domains web panel&lt;br /&gt;
# &#039;&#039;cd&#039;&#039; into the domain directory (e.g. ~/media.sspaeth.de for me)&lt;br /&gt;
# Copy mediagoblin.ini and paste.ini from the ~/mediagoblin directory here&lt;br /&gt;
# Create passenger_wsgi.py in your domain directory (e.g. ~/media.sspaeth.de for me):&lt;br /&gt;
    import sys, os&lt;br /&gt;
    INTERP = &amp;quot;/home/&amp;lt;username&amp;gt;/local/virtenv/bin/python&amp;quot;&lt;br /&gt;
    #INTERP is present twice so that the new python interpreter knows the actual executable path&lt;br /&gt;
    if sys.executable != INTERP: os.execl(INTERP, INTERP, *sys.argv)&lt;br /&gt;
&lt;br /&gt;
    from paste.deploy import loadapp&lt;br /&gt;
    application = loadapp(&#039;config:/home/mediagoblin/media.sspaeth.de/paste.ini&#039;)&lt;br /&gt;
&lt;br /&gt;
    #If in case of errors, all you get are mysterious error 500, you can set debug=true in paste.ini to see stack traces&lt;br /&gt;
    # Otherwise, add this:&lt;br /&gt;
    #from paste.exceptions.errormiddleware import ErrorMiddleware&lt;br /&gt;
    #application = ErrorMiddleware(application, debug=True)&lt;br /&gt;
&lt;br /&gt;
# Set up the database by issueing: gmg dbupdate&lt;br /&gt;
# (optional but recommended) Serve the static files directly from the webserver.&lt;br /&gt;
   In paste.ini in this section: [composite:routing] comment out the static files:&lt;br /&gt;
   #/mgoblin_static/ = mediagoblin_static&lt;br /&gt;
   #/theme_static/ = theme_static&lt;br /&gt;
&lt;br /&gt;
   and symlink the mediagobin/mediagoblin/static directoy to public/mgoblin_static&lt;br /&gt;
           and mediagoblin/mediagoblin/themes to public/theme_static&lt;br /&gt;
&lt;br /&gt;
   so it is displayed directly. This step might be different depending&lt;br /&gt;
   on your web server configuration. There is no reason that static&lt;br /&gt;
   files need to go through all the python indirection when they can be&lt;br /&gt;
   served directly by nginx/apache/...&lt;br /&gt;
&lt;br /&gt;
   In case you want to delete your git checkout after the installation (you don&#039;t need it, since you installed the mediagoblin package to ~/local/virtenv/lib/python2.7/mediagoblin...&lt;br /&gt;
   you should do the symlinking from there.&lt;br /&gt;
&lt;br /&gt;
= Past notes =&lt;br /&gt;
&lt;br /&gt;
Are here, http://wiki.mediagoblin.org/User_Experience_Past_Notes&lt;br /&gt;
&lt;br /&gt;
= General thoughts on running a user experience test =&lt;br /&gt;
&lt;br /&gt;
Could someone with experience with this fill in info here? ;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
I (Jan-Christoph Borchardt) write a thesis at the moment on [http://owncloud.iuk.hdm-stuttgart.de/apps/files_publiclink/get.php?token=6c766212ba094bea08bf1bb800b3e1e7c785388e Coordinating low-cost usability testing in independent free &amp;amp; open source software projects]&amp;lt;br&amp;gt;&lt;br /&gt;
There are many small tips and recipes on how to do your own testing. Especially look into the &#039;&#039;Methods&#039;&#039; part.&amp;lt;br&amp;gt;&lt;br /&gt;
Please let me know if you have any other experiences with testing, I intend on regularly updating that document and release the full version freely licensed once it’s done as well as some kind of a &#039;&#039;quick start guide&#039;&#039;.&lt;/div&gt;</summary>
		<author><name>Spaetz</name></author>
	</entry>
	<entry>
		<id>https://wiki.mediagoblin.org/index.php?title=User_Experience&amp;diff=997</id>
		<title>User Experience</title>
		<link rel="alternate" type="text/html" href="https://wiki.mediagoblin.org/index.php?title=User_Experience&amp;diff=997"/>
		<updated>2012-11-28T10:57:26Z</updated>

		<summary type="html">&lt;p&gt;Spaetz: fight the formatting&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;We need help doing user experience testing!  This means users testing our software, observing what does and doesn&#039;t work for them, and recording that.&lt;br /&gt;
&lt;br /&gt;
If you&#039;re here to help (HOORAY!) go to the testing instance set up by Caleb Davis: http://omgmg.dyndns.org:6543/ [EDIT: This link has been down since 2011 something, take a look at the [[Live instances]] instead]&lt;br /&gt;
&lt;br /&gt;
Sign up for an account&#039;&#039;&#039;*&#039;&#039;&#039;, add some pictures&#039;&#039;&#039;**&#039;&#039;&#039; and play around. Take some notes and then either set up an account on this wiki and add your thoughts to this page or email them to press@mediagoblin.org. Please include your operating system and what browser you&#039;re using. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;*&#039;&#039;&#039; Your email validation link may be in your spam folder!&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;**&#039;&#039;&#039; NOTHING ON THIS INSTANCE IS PERMANENT.  This is for user experience testing only... your pics will be wiped!&lt;br /&gt;
&lt;br /&gt;
You&#039;ll be able to give us the best feedback if you don&#039;t look at anyone else&#039;s notes before you start. Thanks for helping us with usability!! We really appreciate it!&lt;br /&gt;
&lt;br /&gt;
= User notes go in this section =&lt;br /&gt;
&lt;br /&gt;
=== From Jenny on Google Chrome 13.0.782.220 in Mac OSX 10.6.8 ===&lt;br /&gt;
* login ok, uploading file ok.&lt;br /&gt;
* can enter profile description but it doesn&#039;t seem to show up anywhere?&lt;br /&gt;
* no crash after attemping to upload a non-image and then uploading a real image (jpg)&lt;br /&gt;
* uploaded a sideways image and there is no way to rotate it.&lt;br /&gt;
&lt;br /&gt;
=== From Jenny on Safari 5.1 in Mac OSX 10.6.8 ===&lt;br /&gt;
* login ok, uploading ok&lt;br /&gt;
* same problem with profile description - it&#039;s filled in but doesn&#039;t appear in the profile.&lt;br /&gt;
* everything seems to work ok.&lt;br /&gt;
&lt;br /&gt;
=== From Deb using Ubuntu 10.04, Lucid Lynx (Netbook remix version on an Aspire One) with Firefox version 3.6.18 for Ubuntu on 9.8.2011 ===&lt;br /&gt;
&lt;br /&gt;
* could still use a little note explaining how tags work&lt;br /&gt;
* submission is easy&lt;br /&gt;
* seems odd that I can&#039;t add a picture of myself to my profile on a picture site&lt;br /&gt;
* will people be able to search by pic tags? or search for users? &lt;br /&gt;
* will people be able to group pics into albums? &lt;br /&gt;
* maybe we could have something that is more obviously a dashboard than clicking on the username&lt;br /&gt;
&lt;br /&gt;
=== From Jenny on Google Chrome 14.0.835.124 beta-m in Windows XP Professional ===&lt;br /&gt;
*Log in ok, comments ok, deleting files works now.&lt;br /&gt;
*Profile info only shows up if the website is filled in.&lt;br /&gt;
*Adding a .bmp crashes chrome.&lt;br /&gt;
*Other image types seem to work - tif, gif, png, jpg.&lt;br /&gt;
*Adding other non-images give a message that it is not an image (txt, pdf, mdi).&lt;br /&gt;
*The &amp;lt;- -&amp;gt; buttons say &#039;Temporary button holder&#039; beneath them.&lt;br /&gt;
*The .tif image doesn&#039;t display when browsing individual photos, just in the overall view.&lt;br /&gt;
&lt;br /&gt;
=== From Jenny on IE7 in Windows XP Professional ===&lt;br /&gt;
*Log in ok, comments ok, editing and deleting ok, uploading ok.&lt;br /&gt;
*Display - the profile website runs into the photos. The photos line up exactly with no space between them. Everything is top-justified rather than centered.&lt;br /&gt;
*The tif image doesn&#039;t display on the page for that image (where you can comment on it) - it does display on all other pages though.&lt;br /&gt;
*The save changes button is cut off so you only see the letters &#039;SAVE CHA&#039;.&lt;br /&gt;
*The &amp;quot;Profile Edited&amp;quot; or &amp;quot;Posted Comment&amp;quot; comment dialog box displays over the username and logout buttons, as does the &amp;lt;- -&amp;gt; arrows. These also say &#039;Temporary button holder&#039; which seems wrong.&lt;br /&gt;
=== Running on Dreamhost.com ===&lt;br /&gt;
&lt;br /&gt;
====Set up your python virtualenv====&lt;br /&gt;
&lt;br /&gt;
# Download the latest virtualenv: http://pypi.python.org/packages/source/v/virtualenv/XXX&lt;br /&gt;
# Download the latest python: http://python.org/ftp/python/XXX/Python-XXX.tar.bz2&lt;br /&gt;
# Unpack both&lt;br /&gt;
# Compile and install python locally:&lt;br /&gt;
  &amp;lt;blockquote&amp;gt;&amp;lt;pre&amp;gt;./configure --prefix=$HOME/local&lt;br /&gt;
  make&lt;br /&gt;
  make install&amp;lt;/pre&amp;gt;&amp;lt;/blockquote&amp;gt;This will install python (I used 2.7.3) into /home/spaetz/local/... (e.g. .../bin/python)&lt;br /&gt;
# Install the virtualenv:&lt;br /&gt;
  &amp;lt;blockquote&amp;gt;&amp;lt;pre&amp;gt;~/local/bin/python ~/virtualenv-1.8/virtualenv.py  $HOME/local/virtenv&amp;lt;/pre&amp;gt;&amp;lt;/blockquote&amp;gt;You will now have: ~/local/virtenv/bin/python&lt;br /&gt;
# In  ~/.bash_profile add:&lt;br /&gt;
       PATH=~/local/virtenv/bin:~/local/bin:${PATH}&lt;br /&gt;
&lt;br /&gt;
 so that your local python will be preferred. Log out, log in again and test&lt;br /&gt;
 &amp;quot;python&amp;quot; to see which version will be invoked. It should be the new python.&lt;br /&gt;
 Check &amp;quot;which easy_install&amp;quot; to see if the one in local/virtenv would be executed&lt;br /&gt;
&lt;br /&gt;
You have now a local python installation that you can use, and easy_install will work with your local installation.&lt;br /&gt;
&lt;br /&gt;
====Install mediagoblin as a site package====&lt;br /&gt;
&lt;br /&gt;
# Check out mediagoblin from git to e.g. ~/mediagoblin&lt;br /&gt;
# Install MediaGoblin and all dependencies for MediaGoblin with easy_install.&lt;br /&gt;
  - In the mediagoblin directory issue:&lt;br /&gt;
       python setup.py&lt;br /&gt;
&lt;br /&gt;
  - You will also need to: easy_install lxml&lt;br /&gt;
  - Python-image was trickier to install:&lt;br /&gt;
      easy_install --find-links http://www.pythonware.com/products/pil/ Imaging&lt;br /&gt;
&lt;br /&gt;
   test by leaving the mediagoblin directory and see if you can import it:&lt;br /&gt;
       python&amp;lt;ENTER&amp;gt;import mediagoblin&amp;lt;CTRL-D&amp;gt;&lt;br /&gt;
   looking for errors.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Set up an WSGI environment on Dreamhost====&lt;br /&gt;
&lt;br /&gt;
# Enable the mod_passenger setting for ruby/python in the domains web panel&lt;br /&gt;
# &#039;&#039;cd&#039;&#039; into the domain directory (e.g. ~/media.sspaeth.de for me)&lt;br /&gt;
# Copy mediagoblin.ini and paste.ini from the ~/mediagoblin directory here&lt;br /&gt;
# Create passenger_wsgi.py in your domain directory (e.g. ~/media.sspaeth.de for me):&lt;br /&gt;
    import sys, os&lt;br /&gt;
    INTERP = &amp;quot;/home/&amp;lt;username&amp;gt;/local/virtenv/bin/python&amp;quot;&lt;br /&gt;
    #INTERP is present twice so that the new python interpreter knows the actual executable path&lt;br /&gt;
    if sys.executable != INTERP: os.execl(INTERP, INTERP, *sys.argv)&lt;br /&gt;
&lt;br /&gt;
    from paste.deploy import loadapp&lt;br /&gt;
    application = loadapp(&#039;config:/home/mediagoblin/media.sspaeth.de/paste.ini&#039;)&lt;br /&gt;
&lt;br /&gt;
    #If in case of errors, all you get are mysterious error 500, you can set debug=true in paste.ini to see stack traces&lt;br /&gt;
    # Otherwise, add this:&lt;br /&gt;
    #from paste.exceptions.errormiddleware import ErrorMiddleware&lt;br /&gt;
    #application = ErrorMiddleware(application, debug=True)&lt;br /&gt;
&lt;br /&gt;
# Set up the database by issueing: gmg dbupdate&lt;br /&gt;
# (optional but recommended) Serve the static files directly from the webserver.&lt;br /&gt;
   In paste.ini in this section: [composite:routing] comment out the static files:&lt;br /&gt;
   #/mgoblin_static/ = mediagoblin_static&lt;br /&gt;
   #/theme_static/ = theme_static&lt;br /&gt;
&lt;br /&gt;
   and symlink the mediagobin/mediagoblin/static directoy to public/mgoblin_static&lt;br /&gt;
           and mediagoblin/mediagoblin/themes to public/theme_static&lt;br /&gt;
&lt;br /&gt;
   so it is displayed directly. This step might be different depending&lt;br /&gt;
   on your web server configuration. There is no reason that static&lt;br /&gt;
   files need to go through all the python indirection when they can be&lt;br /&gt;
   served directly by nginx/apache/...&lt;br /&gt;
&lt;br /&gt;
   In case you want to delete your git checkout after the installation (you don&#039;t need it, since you installed the mediagoblin package to ~/local/virtenv/lib/python2.7/mediagoblin...&lt;br /&gt;
   you should do the symlinking from there.&lt;br /&gt;
&lt;br /&gt;
= Past notes =&lt;br /&gt;
&lt;br /&gt;
Are here, http://wiki.mediagoblin.org/User_Experience_Past_Notes&lt;br /&gt;
&lt;br /&gt;
= General thoughts on running a user experience test =&lt;br /&gt;
&lt;br /&gt;
Could someone with experience with this fill in info here? ;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
I (Jan-Christoph Borchardt) write a thesis at the moment on [http://owncloud.iuk.hdm-stuttgart.de/apps/files_publiclink/get.php?token=6c766212ba094bea08bf1bb800b3e1e7c785388e Coordinating low-cost usability testing in independent free &amp;amp; open source software projects]&amp;lt;br&amp;gt;&lt;br /&gt;
There are many small tips and recipes on how to do your own testing. Especially look into the &#039;&#039;Methods&#039;&#039; part.&amp;lt;br&amp;gt;&lt;br /&gt;
Please let me know if you have any other experiences with testing, I intend on regularly updating that document and release the full version freely licensed once it’s done as well as some kind of a &#039;&#039;quick start guide&#039;&#039;.&lt;/div&gt;</summary>
		<author><name>Spaetz</name></author>
	</entry>
	<entry>
		<id>https://wiki.mediagoblin.org/index.php?title=User_Experience&amp;diff=996</id>
		<title>User Experience</title>
		<link rel="alternate" type="text/html" href="https://wiki.mediagoblin.org/index.php?title=User_Experience&amp;diff=996"/>
		<updated>2012-11-28T10:39:33Z</updated>

		<summary type="html">&lt;p&gt;Spaetz: Running on Dreamhost&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;We need help doing user experience testing!  This means users testing our software, observing what does and doesn&#039;t work for them, and recording that.&lt;br /&gt;
&lt;br /&gt;
If you&#039;re here to help (HOORAY!) go to the testing instance set up by Caleb Davis: http://omgmg.dyndns.org:6543/ [EDIT: This link has been down since 2011 something, take a look at the [[Live instances]] instead]&lt;br /&gt;
&lt;br /&gt;
Sign up for an account&#039;&#039;&#039;*&#039;&#039;&#039;, add some pictures&#039;&#039;&#039;**&#039;&#039;&#039; and play around. Take some notes and then either set up an account on this wiki and add your thoughts to this page or email them to press@mediagoblin.org. Please include your operating system and what browser you&#039;re using. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;*&#039;&#039;&#039; Your email validation link may be in your spam folder!&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;**&#039;&#039;&#039; NOTHING ON THIS INSTANCE IS PERMANENT.  This is for user experience testing only... your pics will be wiped!&lt;br /&gt;
&lt;br /&gt;
You&#039;ll be able to give us the best feedback if you don&#039;t look at anyone else&#039;s notes before you start. Thanks for helping us with usability!! We really appreciate it!&lt;br /&gt;
&lt;br /&gt;
= User notes go in this section =&lt;br /&gt;
&lt;br /&gt;
=== From Jenny on Google Chrome 13.0.782.220 in Mac OSX 10.6.8 ===&lt;br /&gt;
* login ok, uploading file ok.&lt;br /&gt;
* can enter profile description but it doesn&#039;t seem to show up anywhere?&lt;br /&gt;
* no crash after attemping to upload a non-image and then uploading a real image (jpg)&lt;br /&gt;
* uploaded a sideways image and there is no way to rotate it.&lt;br /&gt;
&lt;br /&gt;
=== From Jenny on Safari 5.1 in Mac OSX 10.6.8 ===&lt;br /&gt;
* login ok, uploading ok&lt;br /&gt;
* same problem with profile description - it&#039;s filled in but doesn&#039;t appear in the profile.&lt;br /&gt;
* everything seems to work ok.&lt;br /&gt;
&lt;br /&gt;
=== From Deb using Ubuntu 10.04, Lucid Lynx (Netbook remix version on an Aspire One) with Firefox version 3.6.18 for Ubuntu on 9.8.2011 ===&lt;br /&gt;
&lt;br /&gt;
* could still use a little note explaining how tags work&lt;br /&gt;
* submission is easy&lt;br /&gt;
* seems odd that I can&#039;t add a picture of myself to my profile on a picture site&lt;br /&gt;
* will people be able to search by pic tags? or search for users? &lt;br /&gt;
* will people be able to group pics into albums? &lt;br /&gt;
* maybe we could have something that is more obviously a dashboard than clicking on the username&lt;br /&gt;
&lt;br /&gt;
=== From Jenny on Google Chrome 14.0.835.124 beta-m in Windows XP Professional ===&lt;br /&gt;
*Log in ok, comments ok, deleting files works now.&lt;br /&gt;
*Profile info only shows up if the website is filled in.&lt;br /&gt;
*Adding a .bmp crashes chrome.&lt;br /&gt;
*Other image types seem to work - tif, gif, png, jpg.&lt;br /&gt;
*Adding other non-images give a message that it is not an image (txt, pdf, mdi).&lt;br /&gt;
*The &amp;lt;- -&amp;gt; buttons say &#039;Temporary button holder&#039; beneath them.&lt;br /&gt;
*The .tif image doesn&#039;t display when browsing individual photos, just in the overall view.&lt;br /&gt;
&lt;br /&gt;
=== From Jenny on IE7 in Windows XP Professional ===&lt;br /&gt;
*Log in ok, comments ok, editing and deleting ok, uploading ok.&lt;br /&gt;
*Display - the profile website runs into the photos. The photos line up exactly with no space between them. Everything is top-justified rather than centered.&lt;br /&gt;
*The tif image doesn&#039;t display on the page for that image (where you can comment on it) - it does display on all other pages though.&lt;br /&gt;
*The save changes button is cut off so you only see the letters &#039;SAVE CHA&#039;.&lt;br /&gt;
*The &amp;quot;Profile Edited&amp;quot; or &amp;quot;Posted Comment&amp;quot; comment dialog box displays over the username and logout buttons, as does the &amp;lt;- -&amp;gt; arrows. These also say &#039;Temporary button holder&#039; which seems wrong.&lt;br /&gt;
=== Running on Dreamhost.com ===&lt;br /&gt;
&lt;br /&gt;
====Set up your python virtualenv====&lt;br /&gt;
&lt;br /&gt;
# Download the latest virtualenv: http://pypi.python.org/packages/source/v/virtualenv/XXX&lt;br /&gt;
# Download the latest python: http://python.org/ftp/python/XXX/Python-XXX.tar.bz2&lt;br /&gt;
# Unpack both&lt;br /&gt;
# Compile and install python locally:&lt;br /&gt;
      ./configure --prefix=$HOME/local&lt;br /&gt;
      make&lt;br /&gt;
      make install&lt;br /&gt;
&lt;br /&gt;
This will install python (I used 2.7.3) into /home/spaetz/local/... (e.g. .../bin/python)&lt;br /&gt;
# Install the virtualenv:&lt;br /&gt;
       ~/local/bin/python ~/virtualenv-1.8/virtualenv.py  $HOME/local/virtenv&lt;br /&gt;
&lt;br /&gt;
 You will now have: ~/local/virtenv/bin/python&lt;br /&gt;
# In  ~/.bash_profile add:&lt;br /&gt;
       PATH=~/local/virtenv/bin:~/local/bin:${PATH}&lt;br /&gt;
&lt;br /&gt;
 so that your local python will be preferred. Log out, log in again and test&lt;br /&gt;
 &amp;quot;python&amp;quot; to see which version will be invoked. It should be the new python.&lt;br /&gt;
 Check &amp;quot;which easy_install&amp;quot; to see if the one in local/virtenv would be executed&lt;br /&gt;
&lt;br /&gt;
You have now a local python installation that you can use, and easy_install will work with your local installation.&lt;br /&gt;
&lt;br /&gt;
====Install mediagoblin as a site package====&lt;br /&gt;
&lt;br /&gt;
# Check out mediagoblin from git to e.g. ~/mediagoblin&lt;br /&gt;
# Install MediaGoblin and all dependencies for MediaGoblin with easy_install.&lt;br /&gt;
  - In the mediagoblin directory issue:&lt;br /&gt;
       python setup.py&lt;br /&gt;
&lt;br /&gt;
  - You will also need to: easy_install lxml&lt;br /&gt;
  - Python-image was trickier to install:&lt;br /&gt;
      easy_install --find-links http://www.pythonware.com/products/pil/ Imaging&lt;br /&gt;
&lt;br /&gt;
   test by leaving the mediagoblin directory and see if you can import it:&lt;br /&gt;
       python&amp;lt;ENTER&amp;gt;import mediagoblin&amp;lt;CTRL-D&amp;gt;&lt;br /&gt;
   looking for errors.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Set up an WSGI environment on Dreamhost====&lt;br /&gt;
&lt;br /&gt;
# Enable the mod_passenger setting for ruby/python in the domains web panel&lt;br /&gt;
# &#039;&#039;cd&#039;&#039; into the domain directory (e.g. ~/media.sspaeth.de for me)&lt;br /&gt;
# Copy mediagoblin.ini and paste.ini from the ~/mediagoblin directory here&lt;br /&gt;
# Create passenger_wsgi.py in your domain directory (e.g. ~/media.sspaeth.de for me):&lt;br /&gt;
    import sys, os&lt;br /&gt;
    INTERP = &amp;quot;/home/&amp;lt;username&amp;gt;/local/virtenv/bin/python&amp;quot;&lt;br /&gt;
    #INTERP is present twice so that the new python interpreter knows the actual executable path&lt;br /&gt;
    if sys.executable != INTERP: os.execl(INTERP, INTERP, *sys.argv)&lt;br /&gt;
&lt;br /&gt;
    from paste.deploy import loadapp&lt;br /&gt;
    application = loadapp(&#039;config:/home/mediagoblin/media.sspaeth.de/paste.ini&#039;)&lt;br /&gt;
&lt;br /&gt;
    #If in case of errors, all you get are mysterious error 500, you can set debug=true in paste.ini to see stack traces&lt;br /&gt;
    # Otherwise, add this:&lt;br /&gt;
    #from paste.exceptions.errormiddleware import ErrorMiddleware&lt;br /&gt;
    #application = ErrorMiddleware(application, debug=True)&lt;br /&gt;
&lt;br /&gt;
# Set up the database by issueing: gmg dbupdate&lt;br /&gt;
# (optional but recommended) Serve the static files directly from the webserver.&lt;br /&gt;
   In paste.ini in this section: [composite:routing] comment out the static files:&lt;br /&gt;
   #/mgoblin_static/ = mediagoblin_static&lt;br /&gt;
   #/theme_static/ = theme_static&lt;br /&gt;
&lt;br /&gt;
   and symlink the mediagobin/mediagoblin/static directoy to public/mgoblin_static&lt;br /&gt;
           and mediagoblin/mediagoblin/themes to public/theme_static&lt;br /&gt;
&lt;br /&gt;
   so it is displayed directly. This step might be different depending&lt;br /&gt;
   on your web server configuration. There is no reason that static&lt;br /&gt;
   files need to go through all the python indirection when they can be&lt;br /&gt;
   served directly by nginx/apache/...&lt;br /&gt;
&lt;br /&gt;
   In case you want to delete your git checkout after the installation (you don&#039;t need it, since you installed the mediagoblin package to ~/local/virtenv/lib/python2.7/mediagoblin...&lt;br /&gt;
   you should do the symlinking from there.&lt;br /&gt;
&lt;br /&gt;
= Past notes =&lt;br /&gt;
&lt;br /&gt;
Are here, http://wiki.mediagoblin.org/User_Experience_Past_Notes&lt;br /&gt;
&lt;br /&gt;
= General thoughts on running a user experience test =&lt;br /&gt;
&lt;br /&gt;
Could someone with experience with this fill in info here? ;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
I (Jan-Christoph Borchardt) write a thesis at the moment on [http://owncloud.iuk.hdm-stuttgart.de/apps/files_publiclink/get.php?token=6c766212ba094bea08bf1bb800b3e1e7c785388e Coordinating low-cost usability testing in independent free &amp;amp; open source software projects]&amp;lt;br&amp;gt;&lt;br /&gt;
There are many small tips and recipes on how to do your own testing. Especially look into the &#039;&#039;Methods&#039;&#039; part.&amp;lt;br&amp;gt;&lt;br /&gt;
Please let me know if you have any other experiences with testing, I intend on regularly updating that document and release the full version freely licensed once it’s done as well as some kind of a &#039;&#039;quick start guide&#039;&#039;.&lt;/div&gt;</summary>
		<author><name>Spaetz</name></author>
	</entry>
	<entry>
		<id>https://wiki.mediagoblin.org/index.php?title=MediaTypeRefactor&amp;diff=995</id>
		<title>MediaTypeRefactor</title>
		<link rel="alternate" type="text/html" href="https://wiki.mediagoblin.org/index.php?title=MediaTypeRefactor&amp;diff=995"/>
		<updated>2012-11-22T15:47:09Z</updated>

		<summary type="html">&lt;p&gt;Spaetz: /* Mime type */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;We&#039;re planning to extend the media type system so that it&#039;s more like plugins.  This page is to document some of the things we wish media types to be able to accomplish.&lt;br /&gt;
&lt;br /&gt;
== Accurately describe mimetype ==&lt;br /&gt;
&lt;br /&gt;
In feeds and etc, we want to share the mimetype of the entry, and maybe of the individual files?  Should this be on a per-entry or a per-filetype basis?&lt;br /&gt;
&lt;br /&gt;
== Additional field types ==&lt;br /&gt;
===File size===&lt;br /&gt;
For MRSS atom feeds (and probably also in the media &amp;quot;home&amp;quot; page, we need the file size of the media. Currently it is not stored at all. spaetz has a branch that implements a MediaEntry().file_size property. This works OK with local storages as it pulls the files and gets the file size on demand. But on remote storages (Amazon S3), we don&#039;t want to pull all files just to create the atom feed. We will therefore need to store the file size for each main media. Should this simply become part of the main MediaEntry table? Should it be part of an &amp;quot;extended Media Entry&amp;quot; table that is only queried on demand? I guess as we need this for all file types, so it does not make sense to put it in the per-type meta data table...&lt;br /&gt;
Elrond says: I think, we should have filesizes stored in the MedaFiles table. Because each resolution has its own filesize.&lt;br /&gt;
&lt;br /&gt;
=== Mime type ===&lt;br /&gt;
Feeds etc need to be able to specify the mime type of a media file. Currently there is no way to get at the file&#039;s mime type. We&#039;ll need to think whether we store this per-file, simply in an extra field, or in an extra MimeType table? Or...?&lt;br /&gt;
&amp;lt;nowiki&amp;gt;16:13 &amp;lt; Elrond&amp;gt; We had a discussion on mimetype detection from bytes:&lt;br /&gt;
16:13 &amp;lt; Elrond&amp;gt; &amp;gt;&amp;gt;&amp;gt; import magic; ms = magic.open(magic.MAGIC_MIME_TYPE); ms.load(); &lt;br /&gt;
                ms.file(&amp;quot;really_a_jpg.png&amp;quot;)&lt;br /&gt;
16:13 &amp;lt; Elrond&amp;gt; &#039;image/jpeg&#039;&lt;br /&gt;
16:14 &amp;lt; Elrond&amp;gt; Works also:&lt;br /&gt;
16:14 &amp;lt; Elrond&amp;gt; &amp;gt;&amp;gt;&amp;gt; ms.buffer(file(&amp;quot;really_a_jpg.png&amp;quot;).read(20))&lt;br /&gt;
16:14 &amp;lt; Elrond&amp;gt; &#039;image/jpeg&#039;&amp;lt;/nowiki&amp;gt;&lt;/div&gt;</summary>
		<author><name>Spaetz</name></author>
	</entry>
	<entry>
		<id>https://wiki.mediagoblin.org/index.php?title=MediaTypeRefactor&amp;diff=994</id>
		<title>MediaTypeRefactor</title>
		<link rel="alternate" type="text/html" href="https://wiki.mediagoblin.org/index.php?title=MediaTypeRefactor&amp;diff=994"/>
		<updated>2012-11-22T15:00:48Z</updated>

		<summary type="html">&lt;p&gt;Spaetz: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;We&#039;re planning to extend the media type system so that it&#039;s more like plugins.  This page is to document some of the things we wish media types to be able to accomplish.&lt;br /&gt;
&lt;br /&gt;
== Accurately describe mimetype ==&lt;br /&gt;
&lt;br /&gt;
In feeds and etc, we want to share the mimetype of the entry, and maybe of the individual files?  Should this be on a per-entry or a per-filetype basis?&lt;br /&gt;
&lt;br /&gt;
== Additional field types ==&lt;br /&gt;
===File size===&lt;br /&gt;
For MRSS atom feeds (and probably also in the media &amp;quot;home&amp;quot; page, we need the file size of the media. Currently it is not stored at all. spaetz has a branch that implements a MediaEntry().file_size property. This works OK with local storages as it pulls the files and gets the file size on demand. But on remote storages (Amazon S3), we don&#039;t want to pull all files just to create the atom feed. We will therefore need to store the file size for each main media. Should this simply become part of the main MediaEntry table? Should it be part of an &amp;quot;extended Media Entry&amp;quot; table that is only queried on demand? I guess as we need this for all file types, so it does not make sense to put it in the per-type meta data table...&lt;br /&gt;
Elrond says: I think, we should have filesizes stored in the MedaFiles table. Because each resolution has its own filesize.&lt;br /&gt;
&lt;br /&gt;
=== Mime type ===&lt;br /&gt;
Feeds etc need to be able to specify the mime type of a media file. Currently there is no way to get at the file&#039;s mime type. We&#039;ll need to think whether we store this per-file, simply in an extra field, or in an extra MimeType table? Or...?&lt;/div&gt;</summary>
		<author><name>Spaetz</name></author>
	</entry>
	<entry>
		<id>https://wiki.mediagoblin.org/index.php?title=MediaTypeRefactor&amp;diff=993</id>
		<title>MediaTypeRefactor</title>
		<link rel="alternate" type="text/html" href="https://wiki.mediagoblin.org/index.php?title=MediaTypeRefactor&amp;diff=993"/>
		<updated>2012-11-22T14:40:09Z</updated>

		<summary type="html">&lt;p&gt;Spaetz: /* File size */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;We&#039;re planning to extend the media type system so that it&#039;s more like plugins.  This page is to document some of the things we wish media types to be able to accomplish.&lt;br /&gt;
&lt;br /&gt;
== Accurately describe mimetype ==&lt;br /&gt;
&lt;br /&gt;
In feeds and etc, we want to share the mimetype of the entry, and maybe of the individual files?  Should this be on a per-entry or a per-filetype basis?&lt;br /&gt;
&lt;br /&gt;
== Additional field types ==&lt;br /&gt;
===File size===&lt;br /&gt;
For MRSS atom feeds (and probably also in the media &amp;quot;home&amp;quot; page, we need the file size of the media. Currently it is not stored at all. spaetz has a branch that implements a MediaEntry().file_size property. This works OK with local storages as it pulls the files and gets the file size on demand. But on remote storages (Amazon S3), we don&#039;t want to pull all files just to create the atom feed. We will therefore need to store the file size for each main media. Should this simply become part of the main MediaEntry table? Should it be part of an &amp;quot;extended Media Entry&amp;quot; table that is only queried on demand? I guess as we need this for all file types, so it does not make sense to put it in the per-type meta data table...&lt;br /&gt;
=== Mime type ===&lt;br /&gt;
Feeds etc need to be able to specify the mime type of a media file. Currently there is no way to get at the file&#039;s mime type. We&#039;ll need to think whether we store this per-file, simply in an extra field, or in an extra MimeType table? Or...?&lt;/div&gt;</summary>
		<author><name>Spaetz</name></author>
	</entry>
	<entry>
		<id>https://wiki.mediagoblin.org/index.php?title=MediaTypeRefactor&amp;diff=992</id>
		<title>MediaTypeRefactor</title>
		<link rel="alternate" type="text/html" href="https://wiki.mediagoblin.org/index.php?title=MediaTypeRefactor&amp;diff=992"/>
		<updated>2012-11-22T14:36:54Z</updated>

		<summary type="html">&lt;p&gt;Spaetz: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;We&#039;re planning to extend the media type system so that it&#039;s more like plugins.  This page is to document some of the things we wish media types to be able to accomplish.&lt;br /&gt;
&lt;br /&gt;
== Accurately describe mimetype ==&lt;br /&gt;
&lt;br /&gt;
In feeds and etc, we want to share the mimetype of the entry, and maybe of the individual files?  Should this be on a per-entry or a per-filetype basis?&lt;br /&gt;
&lt;br /&gt;
== Additional field types ==&lt;br /&gt;
===File size===&lt;br /&gt;
For MRSS atom feeds (and probably also in the media &amp;quot;home&amp;quot; page, we need the file size of the media. Currently it is not stored at all. spaetz has a branch that implements a MediaEntry().file_size property. This works OK with local storages as it pulls the files and gets the file size on demand. But on remote storages (Amazon S3), we don&#039;t want to pull all files just to create the atom feed. We will therefore need to store the file size for each main media. Should this simply become part of the main MediaEntry table? Should it be part of an &amp;quot;extended Media Entry&amp;quot; table that is only queried on demand? I guess as we need this for all file types, so it does not make sense to put it in the per-type meta data table...&lt;/div&gt;</summary>
		<author><name>Spaetz</name></author>
	</entry>
</feed>