<?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=Breton</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=Breton"/>
	<link rel="alternate" type="text/html" href="https://wiki.mediagoblin.org/Special:Contributions/Breton"/>
	<updated>2026-06-07T03:22:44Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.39.17</generator>
	<entry>
		<id>https://wiki.mediagoblin.org/index.php?title=HackingHowto&amp;diff=1904</id>
		<title>HackingHowto</title>
		<link rel="alternate" type="text/html" href="https://wiki.mediagoblin.org/index.php?title=HackingHowto&amp;diff=1904"/>
		<updated>2017-06-10T00:43:24Z</updated>

		<summary type="html">&lt;p&gt;Breton: added info about rabbitmq-server for debian&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Hacking HOWTO =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== So you want to hack on GNU MediaGoblin? ==&lt;br /&gt;
&lt;br /&gt;
First thing to do is check out the [http://mediagoblin.org/join/ web site] where we list all the project&lt;br /&gt;
infrastructure including:&lt;br /&gt;
&lt;br /&gt;
* the IRC channel&lt;br /&gt;
* the mailing list&lt;br /&gt;
* the issue tracker&lt;br /&gt;
&lt;br /&gt;
Additionally, we have information on how to get involved, who to talk&lt;br /&gt;
to, what needs to be worked on, and other things besides!&lt;br /&gt;
&lt;br /&gt;
Second thing to do is take a look at [http://docs.mediagoblin.org/devel/codebase.html codebase chapter] where&lt;br /&gt;
we&#039;ve started documenting how GNU MediaGoblin is built and how to add&lt;br /&gt;
new things.  If you&#039;re planning on contributing in python, you should be aware&lt;br /&gt;
of [http://www.python.org/dev/peps/pep-0008/ PEP-8], the official Python style guide,&lt;br /&gt;
which we follow.&lt;br /&gt;
&lt;br /&gt;
Third you&#039;ll need to get the requirements.&lt;br /&gt;
&lt;br /&gt;
Fourth, you&#039;ll need to build a development environment.  We use an&lt;br /&gt;
in-package checkout of virtualenv.  This isn&#039;t the convenional way to&lt;br /&gt;
install virtualenv (normally you don&#039;t install virtualenv inside the&lt;br /&gt;
package itself) but we&#039;ve found that it&#039;s significantly easier for&lt;br /&gt;
newcomers who aren&#039;t already familiar with virtualenv.  If you *are*&lt;br /&gt;
already familiar with virtualenv, feel free to just install&lt;br /&gt;
mediagoblin in your own virtualenv setup... the necessary adjustments&lt;br /&gt;
should be obvious.&lt;br /&gt;
&lt;br /&gt;
== Python 2 vs Python 3 ==&lt;br /&gt;
&lt;br /&gt;
GNU MediaGoblin was originally written for Python 2, and much of the documentation on the wiki reflects that. However, since release v0.9.0, GNU MediaGoblin has attempted to provide support for Python 3. Unfortunately, not everything is working for Python 3 environments yet. Below is a non-exhaustive list of things that might not work if you set up GNU MediaGoblin a Python 3 environment.&lt;br /&gt;
&lt;br /&gt;
=== Python 3 Issues ===&lt;br /&gt;
&lt;br /&gt;
* fcgi - none of the flup packages ([https://pypi.python.org/pypi/flup flup], [https://pypi.python.org/pypi/flup-py3 flup-py3], [https://pypi.python.org/pypi/flup6 flup6]) appear to have proper support for Python 3.5.&lt;br /&gt;
* audio file spectrographs - [https://pypi.python.org/pypi/scikits.audiolab scikits.audiolab] [https://issues.mediagoblin.org/ticket/5467 appears to not work] in Python 3.&lt;br /&gt;
* Rackspace storage - the [https://pypi.python.org/pypi/python-cloudfiles cloudfiles] plugin may not work with Python 3.&lt;br /&gt;
&lt;br /&gt;
== Getting requirements ==&lt;br /&gt;
&lt;br /&gt;
First, you need to have the following installed before you can build&lt;br /&gt;
an environment for hacking on GNU MediaGoblin:&lt;br /&gt;
&lt;br /&gt;
* Python 2.7  - http://www.python.org/ (You&#039;ll need Python as well as the dev files for building modules.)&lt;br /&gt;
* python-lxml        - http://lxml.de/&lt;br /&gt;
* git                - http://git-scm.com/&lt;br /&gt;
* SQLAlchemy 0.7.0 or higher   - http://www.sqlalchemy.org/&lt;br /&gt;
* Pillow - http://python-pillow.org/&lt;br /&gt;
* virtualenv         - http://www.virtualenv.org/&lt;br /&gt;
* Python GStreamer Bindings - http://gstreamer.freedesktop.org/modules/gst-python.html&lt;br /&gt;
* Node.js&lt;br /&gt;
* RabbitMQ server&lt;br /&gt;
&lt;br /&gt;
=== GNU/Linux ===&lt;br /&gt;
&lt;br /&gt;
==== Debian and derivatives ====&lt;br /&gt;
&lt;br /&gt;
If you&#039;re running Debian GNU/Linux or a Debian-derived distribution&lt;br /&gt;
such as Debian, Mint, or [http://bugs.foocorp.net/issues/478 Ubuntu 10.10+], running the following should install these&lt;br /&gt;
requirements:&lt;br /&gt;
&lt;br /&gt;
{{Cmd|sudo apt-get install git-core python python-dev python-lxml python-imaging python-virtualenv python-gst-1.0 libjpeg8-dev autoconf nodejs npm nodejs-legacy rabbitmq-server}}&lt;br /&gt;
&lt;br /&gt;
==== Debian GNU/Linux jessie ====&lt;br /&gt;
&lt;br /&gt;
{{Cmd|sudo apt-get install -y git-core python python-dev python-lxml python-imaging python-virtualenv libjpeg-dev autoconf nodejs npm nodejs-legacy python-gst-1.0 gstreamer1.0-plugins-base gstreamer1.0-plugins-bad gstreamer1.0-plugins-good gstreamer1.0-plugins-ugly gstreamer1.0-libav python-numpy python-scipy libsndfile1-dev libasound2-dev libgstreamer-plugins-base1.0-dev rabbitmq-server}}&lt;br /&gt;
&lt;br /&gt;
==== Fedora / RedHat(?) / CentOS ====&lt;br /&gt;
&lt;br /&gt;
===== On Fedora: =====&lt;br /&gt;
&lt;br /&gt;
{{Cmd|yum install python-paste-deploy python-paste-script git-core python python-devel python-lxml python-imaging python-virtualenv gstreamer-python nodejs}}&lt;br /&gt;
&lt;br /&gt;
===== On CentOS7: =====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;epel-release&#039;&#039;&#039; is the prerequisite for most of the below listed packages&lt;br /&gt;
&lt;br /&gt;
{{Cmd|sudo yum install epel-release}}&lt;br /&gt;
&lt;br /&gt;
{{Cmd|sudo yum update}}&lt;br /&gt;
&lt;br /&gt;
{{Cmd|sudo yum install python-paste-deploy python-paste-script \ git-core python python-devel python-lxml python-imaging \ python-virtualenv npm automake nginx gcc}}&lt;br /&gt;
&lt;br /&gt;
for video to work correctly (as per [https://mediagoblin.readthedocs.io/en/stable/siteadmin/media-types.html?highlight=video#video Enabling Media-Types Video]) you may choose to install AWEL 3rd party repo which provides with the latest gstreamer bindings and more:&lt;br /&gt;
&lt;br /&gt;
* [http://awel.domblogger.net/7/media/x86_64/repoview/awel-media-release.html AWEL Repo],[https://media.librelamp.com/gst AWEL Gstreamer]&lt;br /&gt;
&lt;br /&gt;
once installed:&lt;br /&gt;
&lt;br /&gt;
{{Cmd|sudo yum install gstreamer1 gstreamer1-libav gstreamer1-plugins-base gstreamer1-plugins-base-tools gstreamer1-plugins-good gstreamer1-plugins-ugly gstreamer1-plugins-bad gstreamer1-python ffmpeg }}&lt;br /&gt;
&lt;br /&gt;
==== openSUSE ====&lt;br /&gt;
&lt;br /&gt;
This instructions might be incomplete.&lt;br /&gt;
Try on openSUSE 13.2 or 13.1:&lt;br /&gt;
&lt;br /&gt;
{{Cmd|zypper install python-devel python-gstreamer-0_10 git-core python python-lxml python-Pillow python-virtualenv npm}}&lt;br /&gt;
&lt;br /&gt;
==== ArchLinux / Parabola ====&lt;br /&gt;
&lt;br /&gt;
The following command should work (&amp;lt;del&amp;gt;not tested on a new ArchLinux / Parabola install&amp;lt;/del&amp;gt;. tested, it works):&lt;br /&gt;
&lt;br /&gt;
{{Cmd|pacman -S git python2 python2-lxml python2-pillow python2-virtualenv gstreamer0.10-python}}&lt;br /&gt;
&lt;br /&gt;
=== Mac OS X ===&lt;br /&gt;
&lt;br /&gt;
==== Mac OS X Lion ====&lt;br /&gt;
&lt;br /&gt;
Download the Newest Python.&lt;br /&gt;
&lt;br /&gt;
Git is already installed.&lt;br /&gt;
&lt;br /&gt;
* Note for Pillow and lxml, you can: pip install Pillow lxml&lt;br /&gt;
&lt;br /&gt;
Python-lxml: http://muffinresearch.co.uk/archives/2009/03/05/install-lxml-on-osx/ with sudo&lt;br /&gt;
&lt;br /&gt;
Pillow: http://pillow.readthedocs.org/en/3.0.x/installation.html#os-x-installation&lt;br /&gt;
&lt;br /&gt;
Libjpeg &amp;amp; Libpng: http://ethan.tira-thompson.com/Mac_OS_X_Ports.html Combo Installer&lt;br /&gt;
&lt;br /&gt;
==== Mac OS X Snow Leopard ====&lt;br /&gt;
&lt;br /&gt;
# You will probably want to install MacPorts this will give you access to many free software packages in the same manner to apt-get and yum: https://www.macports.org/install.php&lt;br /&gt;
# Ensure you install Git and the command line tools: https://help.github.com/articles/set-up-git#platform-mac&lt;br /&gt;
# Once both of those are installed type this in your terminal and enter your password when prompted for it {{Cmd|sudo port install python27 py27-lxml py27-sqlalchemy py27-Pillow py27-virtualenv py27-gst-python py27-pastescript}}&lt;br /&gt;
&lt;br /&gt;
=== Microsoft Windows ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Thanks wctype!&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==== Getting requirements ====&lt;br /&gt;
&lt;br /&gt;
* Python 2.7  -  [http://www.python.org/download/ Download] &amp;lt;!-- http://www.python.org/ftp/python/2.7.3/python-2.7.3.msi --&amp;gt;&lt;br /&gt;
* git - [https://github.com/msysgit/git/downloads Download] &amp;lt;!-- https://github.com/downloads/msysgit/git/Git-1.7.11-preview20120620.exe --&amp;gt;&lt;br /&gt;
* python-lxml - [http://pypi.python.org/pypi/lxml/2.3.5#downloads Tarball] [http://www.lfd.uci.edu/~gohlke/pythonlibs/#pil Binaries] &amp;lt;!-- http://pypi.python.org/packages/source/l/lxml/lxml-2.3.5.tar.gz, http://www.lfd.uci.edu/~gohlke/pythonlibs/z8sp4uqu/lxml-2.3.5.win32-py2.7.exe --&amp;gt;&lt;br /&gt;
* Pillow - [http://pillow.readthedocs.org/en/3.0.x/installation.html#windows-installation Download] &amp;lt;!-- http://effbot.org/downloads/PIL-1.1.7.win32-py2.7.exe] --&amp;gt;&lt;br /&gt;
* virtualenv - [http://pypi.python.org/pypi/virtualenvwrapper-win/1.0.8#downloads Download] &amp;lt;!-- http://pypi.python.org/packages/source/v/virtualenvwrapper-win/virtualenvwrapper-win-1.0.8.zip --&amp;gt;&lt;br /&gt;
* OSSBuild project provides reasonably up-to-date binaries of GStreamer - [https://code.google.com/p/ossbuild/downloads/list Download] &amp;lt;!-- http://ossbuild.googlecode.com/files/GStreamer-WinBuilds-GPL-x86.msi --&amp;gt;&lt;br /&gt;
* py-bcrypt - [https://bitbucket.org/alexandrul/py-bcrypt/downloads/ Download] &amp;lt;!-- https://bitbucket.org/alexandrul/py-bcrypt/downloads/py-bcrypt-0.2.post1.win32-py2.7.exe --&amp;gt;&lt;br /&gt;
* Node JS&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;You can help:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
If you have instructions for other GNU/Linux distributions, Windows, or Mac OS X to set&lt;br /&gt;
up requirements, [http://mediagoblin.org/join/ let us know]!&lt;br /&gt;
&lt;br /&gt;
== How to set up and maintain an environment for hacking with virtualenv ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Requirements&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
No additional requirements.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Create a development environment&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
After installing the requirements, follow these steps:&lt;br /&gt;
&lt;br /&gt;
* Clone the repository: {{Cmd|git clone &amp;lt;nowiki&amp;gt;git://git.savannah.gnu.org/mediagoblin.git&amp;lt;/nowiki&amp;gt;}}&lt;br /&gt;
* Make the environment: {{Cmd|./bootstrap.sh &amp;amp;&amp;amp; ./configure &amp;amp;&amp;amp; make}}&lt;br /&gt;
* Init the database:&lt;br /&gt;
  {{Cmd|./bin/gmg dbupdate}}&lt;br /&gt;
&lt;br /&gt;
That&#039;s it!&lt;br /&gt;
&lt;br /&gt;
If you want to make sure things are working, consider running the test suite:&lt;br /&gt;
  {{Cmd|./runtests.sh}}&lt;br /&gt;
&lt;br /&gt;
(If you have troubles in the remaining steps, consider try installing&lt;br /&gt;
virtualenv with one of the flags --setuptools, --distribute or possibly --no-site-packages.  Additionally, if your system has python3.X as the default, you might need to do virtualenv --python=python2.7 or --python=python2.6)&lt;br /&gt;
&lt;br /&gt;
If you have problems, please [http://mediagoblin.org/join/ let us know]!&lt;br /&gt;
&lt;br /&gt;
== Updating an existing environment ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Updating for dependency changes&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
While hacking on GNU MediaGoblin over time, you&#039;ll eventually have to&lt;br /&gt;
update your development environment because the dependencies have&lt;br /&gt;
changed.&lt;br /&gt;
&lt;br /&gt;
To do that, run:&lt;br /&gt;
&lt;br /&gt;
{{Cmd|./bin/python setup.py develop --upgrade &amp;amp;&amp;amp; ./bin/gmg dbupdate}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Updating for code changes&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{{Cmd|git pull -u}}&lt;br /&gt;
{{Cmd|git submodule update}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;NOTE:&#039;&#039;&#039; MediaGoblin used to be hosted on gitorious.org, but that is moving to read-only mode, so we&#039;re now on Savannah.  If you have an old checkout, please update it by running the following:&lt;br /&gt;
&lt;br /&gt;
{{Cmd|git remote set-url origin git://git.savannah.gnu.org/mediagoblin.git}}&lt;br /&gt;
&lt;br /&gt;
== Running the server ==&lt;br /&gt;
&lt;br /&gt;
If you want to get things running quickly and without hassle, just&lt;br /&gt;
run:&lt;br /&gt;
&lt;br /&gt;
{{Cmd|./lazyserver.sh}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
This will start up a python server where you can begin playing with&lt;br /&gt;
mediagoblin, listening on 127.0.0.1:6543.  It will also run celery in &amp;quot;always eager&amp;quot; mode so you&lt;br /&gt;
don&#039;t have to start a separate process for it.&lt;br /&gt;
&lt;br /&gt;
By default, the instance is not sending out confirmation mails. Instead they are redirected to the standard output (the console) of lazyserver.sh.&lt;br /&gt;
&lt;br /&gt;
You can change this behavior setting &amp;lt;code&amp;gt;email_debug_mode&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; in mediagoblin.ini&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
This is fine in development, but if you want to actually run celery&lt;br /&gt;
separately for testing (or deployment purposes), you&#039;ll want to run&lt;br /&gt;
the server independently:&lt;br /&gt;
&lt;br /&gt;
{{Cmd|./bin/paster serve paste.ini --reload}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Running celeryd ==&lt;br /&gt;
&lt;br /&gt;
If you aren&#039;t using &amp;lt;tt&amp;gt;./lazyserver.sh&amp;lt;/tt&amp;gt; or otherwise aren&#039;t running celery&lt;br /&gt;
in always eager mode, you&#039;ll need to do this if you want your media to&lt;br /&gt;
process and actually show up.  It&#039;s probably a good idea in&lt;br /&gt;
development to have the web server (above) running in one terminal and&lt;br /&gt;
celeryd in another window.&lt;br /&gt;
&lt;br /&gt;
Run:&lt;br /&gt;
&lt;br /&gt;
{{Cmd|&amp;lt;nowiki&amp;gt;CELERY_CONFIG_MODULE=mediagoblin.init.celery.from_celery ./bin/celeryd&amp;lt;/nowiki&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Running the test suite ==&lt;br /&gt;
&lt;br /&gt;
See also [[UnitTests]] and [[Manual Functional Testing]].&lt;br /&gt;
&lt;br /&gt;
Run:&lt;br /&gt;
&lt;br /&gt;
{{Cmd|./runtests.sh}}&lt;br /&gt;
&lt;br /&gt;
== Running a shell ==&lt;br /&gt;
&lt;br /&gt;
If you want a shell with your database pre-setup and an instantiated&lt;br /&gt;
application ready and at your fingertips ......&lt;br /&gt;
&lt;br /&gt;
Run:&lt;br /&gt;
&lt;br /&gt;
{{Cmd|./bin/gmg shell}}&lt;br /&gt;
&lt;br /&gt;
== Troubleshooting ==&lt;br /&gt;
&lt;br /&gt;
If you see a python error, search for the full line in [https://issues.mediagoblin.org/report trac] to find issues that mention the same . If it has not been fixed, you can update corresponding bug reports or open a new one.&lt;br /&gt;
&lt;br /&gt;
For developers it is a special pleasure to test and apply user submitted patches. Here is a good minimal [https://issues.mediagoblin.org/timeline?from=2016-02-28T17%3A16%3A39-05%3A00&amp;amp;precision=second git workflow] as example.&lt;br /&gt;
&lt;br /&gt;
== Wiping your user data ==&lt;br /&gt;
&lt;br /&gt;
You can completely wipe all data from the instance by doing:&lt;br /&gt;
&lt;br /&gt;
{{Cmd|rm -rf mediagoblin.db kombu.db celery.db user_dev; ./bin/gmg dbupdate}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Unless you&#039;re doing development and working on and testing creating&lt;br /&gt;
a new instance, you will probably never have to do this.&lt;br /&gt;
&lt;br /&gt;
== Quickstart for Django programmers ==&lt;br /&gt;
&lt;br /&gt;
We&#039;re not using Django, but the codebase is very Django-like in its&lt;br /&gt;
structure.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;tt&amp;gt;routing.py&amp;lt;/tt&amp;gt; is like &amp;lt;tt&amp;gt;urls.py&amp;lt;/tt&amp;gt; in Django&lt;br /&gt;
* &amp;lt;tt&amp;gt;models.py&amp;lt;/tt&amp;gt; has SQLAlchemy ORM definitions&lt;br /&gt;
* &amp;lt;tt&amp;gt;views.py&amp;lt;/tt&amp;gt; is where the views go&lt;br /&gt;
&lt;br /&gt;
We&#039;re using SQLAlchemy, which is semi-similar to the Django ORM, but&lt;br /&gt;
not really because you can get a lot more fine-grained.  The&lt;br /&gt;
[http://docs.sqlalchemy.org/en/latest/orm/tutorial.html SQLAlchemy ORM tutorial] is a great place to start.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;YouCanHelp&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
If there are other things that you think would help orient someone&lt;br /&gt;
new to GNU MediaGoblin but coming from Django, let us know!&lt;br /&gt;
&lt;br /&gt;
== Showing off your work with PageKite ==&lt;br /&gt;
&lt;br /&gt;
If you&#039;re doing development with MediaGoblin, it&#039;s sometimes helpful to show off your work to gather feedback from other contributors.  A number of the MediaGoblin developers use something called [http://pagekite.net PageKite], which is a fellow free software web service which makes temporarily showing off work on your machine easy.  There&#039;s a [http://pagekite.net/wiki/Howto/UsePageKiteWithMediaGoblin/ tutorial on how to use PageKite and MediaGoblin together] available on the PageKite wiki.&lt;br /&gt;
&lt;br /&gt;
If you are doing a lot of MediaGoblin development, the PageKite people have graciously offered us a good amount of bandwidth at no cost in an effort to help out fellow free software projects.  If you&#039;ve been making significant contributions, PM Chris Webber on freenode (who is paroneayea there) and ask if you can be added to our group plan.&lt;br /&gt;
&lt;br /&gt;
== Bite-sized bugs to start with ==&lt;br /&gt;
&lt;br /&gt;
Now you should visit our latest list of [http://issues.mediagoblin.org/query?status=!closed&amp;amp;keywords=~bitesized bite-sized issues] because squishing bugs is messy fun. If you&#039;re interested in other things to work on, or need help getting started on a bug, let us know on [http://mediagoblin.org/join/ the mailing list] or on the [http://mediagoblin.org/join/ IRC channel].&lt;/div&gt;</summary>
		<author><name>Breton</name></author>
	</entry>
	<entry>
		<id>https://wiki.mediagoblin.org/index.php?title=GSOC_2017&amp;diff=1895</id>
		<title>GSOC 2017</title>
		<link rel="alternate" type="text/html" href="https://wiki.mediagoblin.org/index.php?title=GSOC_2017&amp;diff=1895"/>
		<updated>2017-03-04T19:08:29Z</updated>

		<summary type="html">&lt;p&gt;Breton: /* Chunked uploads / multi-upload UI. */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;We are hoping to participate in [https://developers.google.com/open-source/gsoc/ GSOC 2017] under the GNU umbrella. &lt;br /&gt;
 &lt;br /&gt;
You may want to check for a &amp;quot;possible mentor&amp;quot; before applying for this topic.  If you have your own idea, probably bring it up in #mediagoblin on irc.freenode.net !&lt;br /&gt;
&lt;br /&gt;
= How do I apply as a student ? =&lt;br /&gt;
&lt;br /&gt;
* [https://developers.google.com/open-source/gsoc/ Submit your application].  Please see the application submission template on the [http://www.gnu.org/software/soc-projects/guidelines.html GNU GSoC guidelines page].&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;
* If you have never done web development in python before, MediaGoblin is a pretty good place to start !  However, we highly recommend going through the [https://docs.djangoproject.com/en/1.7/intro/tutorial01/ Django tutorial]... this isn&#039;t a requirement, but it will help you be better prepared.&lt;br /&gt;
* Work on a small task, and mention it in your application.  The [http://issues.mediagoblin.org/query?status=!closed&amp;amp;keywords=~bitesized bitesized list] is often helpful.&lt;br /&gt;
* Also, be aware when submitting: Summer of Code applicants are expected to work &#039;&#039;&#039;40 hours per week&#039;&#039;&#039;... so, a full time internship !  If you propose, please be sure you are ready to make that level of commitment.&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)!  Please, please join our channel and introduce yourself.  We would love to hear from you !&lt;br /&gt;
&lt;br /&gt;
= Possible projects with mentors =&lt;br /&gt;
== Multiple qualities of video ==&lt;br /&gt;
&lt;br /&gt;
Now MediaGoblin supports only a single quality of video files. We want to fix that and support multiple qualities: 360p, 480p, 720p, 1080p, [https://en.wikipedia.org/wiki/Ultra-high-definition_television 4k]. This requires changes to frontend and to backend. To implement it, one must have some experience in JavaScript and Python.&lt;br /&gt;
&lt;br /&gt;
There are some hidden issues though. For example, when a user uploads a video in 1080p, it will have to be transcoded to all other qualities. But it will take a lot of time. Ideally, we don&#039;t want to wait for all variants to be ready before we can already display the video. Also, if several videos were uploaded, we don&#039;t want to get blocked on the first one getting transcoded for a long time.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Mentor&#039;&#039;&#039;: Boris Bobrov (breton)&lt;br /&gt;
* &#039;&#039;&#039;Difficulty&#039;&#039;&#039;: Medium or High, depending on the design&lt;br /&gt;
* &#039;&#039;&#039;Required skills&#039;&#039;&#039;: Python, JavaScript. Nice to have: celery, gstreamer&lt;br /&gt;
&lt;br /&gt;
== Port federation code to ActivityPub ==&lt;br /&gt;
&lt;br /&gt;
Right now we have a federation branch to be merged shortly by Jessica Tallon.  This adds basic federation support to MediaGoblin.  Right now the federation code is based on the [https://github.com/e14n/pump.io/blob/master/API.md Pump API]; however, we&#039;d like to port it to the work we&#039;re doing on https://www.w3.org/TR/activitypub/[https://www.w3.org/TR/activitypub/ ActivityPub] as part of the [https://www.w3.org/wiki/Socialwg W3C Social Working Group].  ActivityPub is fairly close to the Pump API, but there are some differences (most notably a move from ActivityStreams 1.0 to ActivityStreams 2.0, although there are others).  Your mission, if you choose to accept it, is to port MediaGoblin&#039;s federation code to ActivityPub, ideally while supporting the Pump API in a backwards compatible fashion (if possible).&lt;br /&gt;
&lt;br /&gt;
Jessica Tallon willing to personally mentor this one. So if you wanted to learn about federation from the source itself, here&#039;s the way to do it!&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Possible mentors&#039;&#039;&#039;: Jessica Tallon (tsyesika)&lt;br /&gt;
* &#039;&#039;&#039;Difficulty&#039;&#039;&#039;: TODO&lt;br /&gt;
* &#039;&#039;&#039;Required skills&#039;&#039;&#039;: Python&lt;/div&gt;</summary>
		<author><name>Breton</name></author>
	</entry>
	<entry>
		<id>https://wiki.mediagoblin.org/index.php?title=GSOC_2017&amp;diff=1893</id>
		<title>GSOC 2017</title>
		<link rel="alternate" type="text/html" href="https://wiki.mediagoblin.org/index.php?title=GSOC_2017&amp;diff=1893"/>
		<updated>2017-03-04T17:36:25Z</updated>

		<summary type="html">&lt;p&gt;Breton: drop access control task&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;We are hoping to participate in [https://developers.google.com/open-source/gsoc/ GSOC 2017] under the GNU umbrella. &lt;br /&gt;
 &lt;br /&gt;
You may want to check for a &amp;quot;possible mentor&amp;quot; before applying for this topic.  If you have your own idea, probably bring it up in #mediagoblin on irc.freenode.net !&lt;br /&gt;
&lt;br /&gt;
= How do I apply as a student ? =&lt;br /&gt;
&lt;br /&gt;
* [https://developers.google.com/open-source/gsoc/ Submit your application].  Please see the application submission template on the [http://www.gnu.org/software/soc-projects/guidelines.html GNU GSoC guidelines page].&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;
* If you have never done web development in python before, MediaGoblin is a pretty good place to start !  However, we highly recommend going through the [https://docs.djangoproject.com/en/1.7/intro/tutorial01/ Django tutorial]... this isn&#039;t a requirement, but it will help you be better prepared.&lt;br /&gt;
* Work on a small task, and mention it in your application.  The [http://issues.mediagoblin.org/query?status=!closed&amp;amp;keywords=~bitesized bitesized list] is often helpful.&lt;br /&gt;
* Also, be aware when submitting: Summer of Code applicants are expected to work &#039;&#039;&#039;40 hours per week&#039;&#039;&#039;... so, a full time internship !  If you propose, please be sure you are ready to make that level of commitment.&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)!  Please, please join our channel and introduce yourself.  We would love to hear from you !&lt;br /&gt;
&lt;br /&gt;
= Possible projects with mentors =&lt;br /&gt;
== Multiple qualities of video ==&lt;br /&gt;
&lt;br /&gt;
Now MediaGoblin supports only a single quality of video files. We want to fix that and support multiple qualities: 360p, 480p, 720p, 1080p, [https://en.wikipedia.org/wiki/Ultra-high-definition_television 4k]. This requires changes to frontend and to backend. To implement it, one must have some experience in JavaScript and Python.&lt;br /&gt;
&lt;br /&gt;
There are some hidden issues though. For example, when a user uploads a video in 1080p, it will have to be transcoded to all other qualities. But it will take a lot of time. Ideally, we don&#039;t want to wait for all variants to be ready before we can already display the video. Also, if several videos were uploaded, we don&#039;t want to get blocked on the first one getting transcoded for a long time.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Mentor&#039;&#039;&#039;: Boris Bobrov (breton)&lt;br /&gt;
* &#039;&#039;&#039;Difficulty&#039;&#039;&#039;: Medium or High, depending on the design&lt;br /&gt;
* &#039;&#039;&#039;Required skills&#039;&#039;&#039;: Python, JavaScript. Nice to have: celery, gstreamer&lt;br /&gt;
&lt;br /&gt;
== Port federation code to ActivityPub ==&lt;br /&gt;
&lt;br /&gt;
Right now we have a federation branch to be merged shortly by Jessica Tallon.  This adds basic federation support to MediaGoblin.  Right now the federation code is based on the [https://github.com/e14n/pump.io/blob/master/API.md Pump API]; however, we&#039;d like to port it to the work we&#039;re doing on https://www.w3.org/TR/activitypub/[https://www.w3.org/TR/activitypub/ ActivityPub] as part of the [https://www.w3.org/wiki/Socialwg W3C Social Working Group].  ActivityPub is fairly close to the Pump API, but there are some differences (most notably a move from ActivityStreams 1.0 to ActivityStreams 2.0, although there are others).  Your mission, if you choose to accept it, is to port MediaGoblin&#039;s federation code to ActivityPub, ideally while supporting the Pump API in a backwards compatible fashion (if possible).&lt;br /&gt;
&lt;br /&gt;
Jessica Tallon willing to personally mentor this one. So if you wanted to learn about federation from the source itself, here&#039;s the way to do it!&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Possible mentors&#039;&#039;&#039;: Jessica Tallon (tsyesika)&lt;br /&gt;
* &#039;&#039;&#039;Difficulty&#039;&#039;&#039;: TODO&lt;br /&gt;
* &#039;&#039;&#039;Required skills&#039;&#039;&#039;: Python&lt;br /&gt;
&lt;br /&gt;
== Chunked uploads / multi-upload UI. ==&lt;br /&gt;
&lt;br /&gt;
We want to have multi-upload from cli (usecase: go to my directory with photos and upload them all) and from web-interface (using maybe zip, maybe html5 feature). There is already https://github.com/VenKamikaze/mediagoblin-html5-multi-upload which might be what we need, so before choosing this task please verify.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Possible Mentors:&#039;&#039;&#039; Christopher Allan Webber (paroneayea), Boris Bobrov (breton).&lt;br /&gt;
* &#039;&#039;&#039;Difficulty&#039;&#039;&#039;: low&lt;br /&gt;
* &#039;&#039;&#039;Required skills&#039;&#039;&#039;: Python, HTML, CSS&lt;/div&gt;</summary>
		<author><name>Breton</name></author>
	</entry>
	<entry>
		<id>https://wiki.mediagoblin.org/index.php?title=GSOC_2017&amp;diff=1892</id>
		<title>GSOC 2017</title>
		<link rel="alternate" type="text/html" href="https://wiki.mediagoblin.org/index.php?title=GSOC_2017&amp;diff=1892"/>
		<updated>2017-02-22T20:25:15Z</updated>

		<summary type="html">&lt;p&gt;Breton: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;We are hoping to participate in [https://developers.google.com/open-source/gsoc/ GSOC 2017] under the GNU umbrella. &lt;br /&gt;
 &lt;br /&gt;
You may want to check for a &amp;quot;possible mentor&amp;quot; before applying for this topic.  If you have your own idea, probably bring it up in #mediagoblin on irc.freenode.net !&lt;br /&gt;
&lt;br /&gt;
= How do I apply as a student ? =&lt;br /&gt;
&lt;br /&gt;
* [https://developers.google.com/open-source/gsoc/ Submit your application].  Please see the application submission template on the [http://www.gnu.org/software/soc-projects/guidelines.html GNU GSoC guidelines page].&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;
* If you have never done web development in python before, MediaGoblin is a pretty good place to start !  However, we highly recommend going through the [https://docs.djangoproject.com/en/1.7/intro/tutorial01/ Django tutorial]... this isn&#039;t a requirement, but it will help you be better prepared.&lt;br /&gt;
* Work on a small task, and mention it in your application.  The [http://issues.mediagoblin.org/query?status=!closed&amp;amp;keywords=~bitesized bitesized list] is often helpful.&lt;br /&gt;
* Also, be aware when submitting: Summer of Code applicants are expected to work &#039;&#039;&#039;40 hours per week&#039;&#039;&#039;... so, a full time internship !  If you propose, please be sure you are ready to make that level of commitment.&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)!  Please, please join our channel and introduce yourself.  We would love to hear from you !&lt;br /&gt;
&lt;br /&gt;
= Possible projects with mentors =&lt;br /&gt;
== Multiple qualities of video ==&lt;br /&gt;
&lt;br /&gt;
Now MediaGoblin supports only a single quality of video files. We want to fix that and support multiple qualities: 360p, 480p, 720p, 1080p, [https://en.wikipedia.org/wiki/Ultra-high-definition_television 4k]. This requires changes to frontend and to backend. To implement it, one must have some experience in JavaScript and Python.&lt;br /&gt;
&lt;br /&gt;
There are some hidden issues though. For example, when a user uploads a video in 1080p, it will have to be transcoded to all other qualities. But it will take a lot of time. Ideally, we don&#039;t want to wait for all variants to be ready before we can already display the video. Also, if several videos were uploaded, we don&#039;t want to get blocked on the first one getting transcoded for a long time.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Mentor&#039;&#039;&#039;: Boris Bobrov (breton)&lt;br /&gt;
* &#039;&#039;&#039;Difficulty&#039;&#039;&#039;: Medium or High, depending on the design&lt;br /&gt;
* &#039;&#039;&#039;Required skills&#039;&#039;&#039;: Python, JavaScript. Nice to have: celery, gstreamer&lt;br /&gt;
&lt;br /&gt;
== Port federation code to ActivityPub ==&lt;br /&gt;
&lt;br /&gt;
Right now we have a federation branch to be merged shortly by Jessica Tallon.  This adds basic federation support to MediaGoblin.  Right now the federation code is based on the [https://github.com/e14n/pump.io/blob/master/API.md Pump API]; however, we&#039;d like to port it to the work we&#039;re doing on https://www.w3.org/TR/activitypub/[https://www.w3.org/TR/activitypub/ ActivityPub] as part of the [https://www.w3.org/wiki/Socialwg W3C Social Working Group].  ActivityPub is fairly close to the Pump API, but there are some differences (most notably a move from ActivityStreams 1.0 to ActivityStreams 2.0, although there are others).  Your mission, if you choose to accept it, is to port MediaGoblin&#039;s federation code to ActivityPub, ideally while supporting the Pump API in a backwards compatible fashion (if possible).&lt;br /&gt;
&lt;br /&gt;
Jessica Tallon willing to personally mentor this one. So if you wanted to learn about federation from the source itself, here&#039;s the way to do it!&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Possible mentors&#039;&#039;&#039;: Jessica Tallon (tsyesika)&lt;br /&gt;
* &#039;&#039;&#039;Difficulty&#039;&#039;&#039;: TODO&lt;br /&gt;
* &#039;&#039;&#039;Required skills&#039;&#039;&#039;: Python&lt;br /&gt;
&lt;br /&gt;
== Access control ==&lt;br /&gt;
&lt;br /&gt;
Today MediaGoblin doesn&#039;t handle permissions very well. Anybody can see anything. What should be is proper access control. Owner of media or collection should be able to set who can view, edit and comment their mediafiles. Users could be added to groups, and groups could participate in permissions too. Different permissions might also apply to guests and registered users. Who can add users to groups should be controlled too.&lt;br /&gt;
&lt;br /&gt;
A good proposal would include description of capabilities of the access control system. Don&#039;t forget that REST should be covered too. Also, it should be clear how the whole thing works with federation.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Possible mentors&#039;&#039;&#039;: Boris Bobrov (breton)&lt;br /&gt;
* &#039;&#039;&#039;Difficulty&#039;&#039;&#039;: Medium&lt;br /&gt;
* &#039;&#039;&#039;Required skills&#039;&#039;&#039;: Python, HTML, CSS&lt;br /&gt;
&lt;br /&gt;
On top of that, audit system might be implemented. Who added user to group? Who edited or deleted a file? Who changed a permission?&lt;br /&gt;
&lt;br /&gt;
Adding audit will bump &#039;&#039;&#039;difficulty&#039;&#039;&#039; of the task to 4.&lt;br /&gt;
&lt;br /&gt;
== Chunked uploads / multi-upload UI. ==&lt;br /&gt;
&lt;br /&gt;
We want to have multi-upload from cli (usecase: go to my directory with photos and upload them all) and from web-interface (using maybe zip, maybe html5 feature). There is already https://github.com/VenKamikaze/mediagoblin-html5-multi-upload which might be what we need, so before choosing this task please verify.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Possible Mentors:&#039;&#039;&#039; Christopher Allan Webber (paroneayea), Boris Bobrov (breton).&lt;br /&gt;
* &#039;&#039;&#039;Difficulty&#039;&#039;&#039;: low&lt;br /&gt;
* &#039;&#039;&#039;Required skills&#039;&#039;&#039;: Python, HTML, CSS&lt;/div&gt;</summary>
		<author><name>Breton</name></author>
	</entry>
	<entry>
		<id>https://wiki.mediagoblin.org/index.php?title=GSOC_2017&amp;diff=1891</id>
		<title>GSOC 2017</title>
		<link rel="alternate" type="text/html" href="https://wiki.mediagoblin.org/index.php?title=GSOC_2017&amp;diff=1891"/>
		<updated>2017-02-22T20:11:48Z</updated>

		<summary type="html">&lt;p&gt;Breton: /* Chunked uploads / multi-upload UI. */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;We are hoping to participate in [https://developers.google.com/open-source/gsoc/ GSOC 2017] under the GNU umbrella. &lt;br /&gt;
 &lt;br /&gt;
You may want to check for a &amp;quot;possible mentor&amp;quot; before applying for this topic.  If you have your own idea, probably bring it up in #mediagoblin on irc.freenode.net !&lt;br /&gt;
&lt;br /&gt;
= How do I apply as a student ? =&lt;br /&gt;
&lt;br /&gt;
* [https://developers.google.com/open-source/gsoc/ Submit your application].  Please see the application submission template on the [http://www.gnu.org/software/soc-projects/guidelines.html GNU GSoC guidelines page].&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;
* If you have never done web development in python before, MediaGoblin is a pretty good place to start !  However, we highly recommend going through the [https://docs.djangoproject.com/en/1.7/intro/tutorial01/ Django tutorial]... this isn&#039;t a requirement, but it will help you be better prepared.&lt;br /&gt;
* Work on a small task, and mention it in your application.  The [http://issues.mediagoblin.org/query?status=!closed&amp;amp;keywords=~bitesized bitesized list] is often helpful.&lt;br /&gt;
* Also, be aware when submitting: Summer of Code applicants are expected to work &#039;&#039;&#039;40 hours per week&#039;&#039;&#039;... so, a full time internship !  If you propose, please be sure you are ready to make that level of commitment.&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)!  Please, please join our channel and introduce yourself.  We would love to hear from you !&lt;br /&gt;
&lt;br /&gt;
= Possible projects with mentors =&lt;br /&gt;
== Multiple qualities of video ==&lt;br /&gt;
&lt;br /&gt;
Now MediaGoblin supports only a single quality of video files. We want to fix that and support multiple qualities: 360p, 480p, 720p, 1080p, [https://en.wikipedia.org/wiki/Ultra-high-definition_television 4k]. This requires changes to frontend and to backend. To implement it, one must have some experience in JavaScript and Python.&lt;br /&gt;
&lt;br /&gt;
There are some hidden issues though. For example, when a user uploads a video in 1080p, it will have to be transcoded to all other qualities. But it will take a lot of time. Ideally, we don&#039;t want to wait for all variants to be ready before we can already display the video. Also, if several videos were uploaded, we don&#039;t want to get blocked on the first one getting transcoded for a long time.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Mentor&#039;&#039;&#039;: Boris Bobrov (breton)&lt;br /&gt;
* &#039;&#039;&#039;Difficulty&#039;&#039;&#039;: Medium or High, depending on the design&lt;br /&gt;
* &#039;&#039;&#039;Required skills&#039;&#039;&#039;: Python, JavaScript. Nice to have: celery, gstreamer&lt;br /&gt;
&lt;br /&gt;
== Port federation code to ActivityPub ==&lt;br /&gt;
&lt;br /&gt;
Right now we have a federation branch to be merged shortly by Jessica Tallon.  This adds basic federation support to MediaGoblin.  Right now the federation code is based on the [https://github.com/e14n/pump.io/blob/master/API.md Pump API]; however, we&#039;d like to port it to the work we&#039;re doing on https://www.w3.org/TR/activitypub/[https://www.w3.org/TR/activitypub/ ActivityPub] as part of the [https://www.w3.org/wiki/Socialwg W3C Social Working Group].  ActivityPub is fairly close to the Pump API, but there are some differences (most notably a move from ActivityStreams 1.0 to ActivityStreams 2.0, although there are others).  Your mission, if you choose to accept it, is to port MediaGoblin&#039;s federation code to ActivityPub, ideally while supporting the Pump API in a backwards compatible fashion (if possible).&lt;br /&gt;
&lt;br /&gt;
Is Jessica Tallon willing to personally mentor this one? /* so if you wanted to learn about federation from the source itself, here&#039;s the way to do it! */&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Possible mentors&#039;&#039;&#039;: Jessica Tallon (tsyesika)&lt;br /&gt;
* &#039;&#039;&#039;Difficulty&#039;&#039;&#039;: TODO&lt;br /&gt;
* &#039;&#039;&#039;Required skills&#039;&#039;&#039;: Python&lt;br /&gt;
&lt;br /&gt;
== Access control ==&lt;br /&gt;
&lt;br /&gt;
Today MediaGoblin doesn&#039;t handle permissions very well. Anybody can see anything. What should be is proper access control. Owner of media or collection should be able to set who can view, edit and comment their mediafiles. Users could be added to groups, and groups could participate in permissions too. Different permissions might also apply to guests and registered users. Who can add users to groups should be controlled too.&lt;br /&gt;
&lt;br /&gt;
A good proposal would include description of capabilities of the access control system. Don&#039;t forget that REST should be covered too. Also, it should be clear how the whole thing works with federation.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Possible mentors&#039;&#039;&#039;: Boris Bobrov (breton)&lt;br /&gt;
* &#039;&#039;&#039;Difficulty&#039;&#039;&#039;: Medium&lt;br /&gt;
* &#039;&#039;&#039;Required skills&#039;&#039;&#039;: Python, HTML, CSS&lt;br /&gt;
&lt;br /&gt;
On top of that, audit system might be implemented. Who added user to group? Who edited or deleted a file? Who changed a permission?&lt;br /&gt;
&lt;br /&gt;
Adding audit will bump &#039;&#039;&#039;difficulty&#039;&#039;&#039; of the task to 4.&lt;br /&gt;
&lt;br /&gt;
== Chunked uploads / multi-upload UI. ==&lt;br /&gt;
&lt;br /&gt;
We want to have multi-upload from cli (usecase: go to my directory with photos and upload them all) and from web-interface (using maybe zip, maybe html5 feature). There is already https://github.com/VenKamikaze/mediagoblin-html5-multi-upload which might be what we need, so before choosing this task please verify.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Possible Mentors:&#039;&#039;&#039; Christopher Allan Webber (paroneayea), Boris Bobrov (breton).&lt;br /&gt;
* &#039;&#039;&#039;Difficulty&#039;&#039;&#039;: low&lt;br /&gt;
* &#039;&#039;&#039;Required skills&#039;&#039;&#039;: Python, HTML, CSS&lt;/div&gt;</summary>
		<author><name>Breton</name></author>
	</entry>
	<entry>
		<id>https://wiki.mediagoblin.org/index.php?title=GSOC_2017&amp;diff=1890</id>
		<title>GSOC 2017</title>
		<link rel="alternate" type="text/html" href="https://wiki.mediagoblin.org/index.php?title=GSOC_2017&amp;diff=1890"/>
		<updated>2017-02-22T20:06:41Z</updated>

		<summary type="html">&lt;p&gt;Breton: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;We are hoping to participate in [https://developers.google.com/open-source/gsoc/ GSOC 2017] under the GNU umbrella. &lt;br /&gt;
 &lt;br /&gt;
You may want to check for a &amp;quot;possible mentor&amp;quot; before applying for this topic.  If you have your own idea, probably bring it up in #mediagoblin on irc.freenode.net !&lt;br /&gt;
&lt;br /&gt;
= How do I apply as a student ? =&lt;br /&gt;
&lt;br /&gt;
* [https://developers.google.com/open-source/gsoc/ Submit your application].  Please see the application submission template on the [http://www.gnu.org/software/soc-projects/guidelines.html GNU GSoC guidelines page].&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;
* If you have never done web development in python before, MediaGoblin is a pretty good place to start !  However, we highly recommend going through the [https://docs.djangoproject.com/en/1.7/intro/tutorial01/ Django tutorial]... this isn&#039;t a requirement, but it will help you be better prepared.&lt;br /&gt;
* Work on a small task, and mention it in your application.  The [http://issues.mediagoblin.org/query?status=!closed&amp;amp;keywords=~bitesized bitesized list] is often helpful.&lt;br /&gt;
* Also, be aware when submitting: Summer of Code applicants are expected to work &#039;&#039;&#039;40 hours per week&#039;&#039;&#039;... so, a full time internship !  If you propose, please be sure you are ready to make that level of commitment.&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)!  Please, please join our channel and introduce yourself.  We would love to hear from you !&lt;br /&gt;
&lt;br /&gt;
= Possible projects with mentors =&lt;br /&gt;
== Multiple qualities of video ==&lt;br /&gt;
&lt;br /&gt;
Now MediaGoblin supports only a single quality of video files. We want to fix that and support multiple qualities: 360p, 480p, 720p, 1080p, [https://en.wikipedia.org/wiki/Ultra-high-definition_television 4k]. This requires changes to frontend and to backend. To implement it, one must have some experience in JavaScript and Python.&lt;br /&gt;
&lt;br /&gt;
There are some hidden issues though. For example, when a user uploads a video in 1080p, it will have to be transcoded to all other qualities. But it will take a lot of time. Ideally, we don&#039;t want to wait for all variants to be ready before we can already display the video. Also, if several videos were uploaded, we don&#039;t want to get blocked on the first one getting transcoded for a long time.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Mentor&#039;&#039;&#039;: Boris Bobrov (breton)&lt;br /&gt;
* &#039;&#039;&#039;Difficulty&#039;&#039;&#039;: Medium or High, depending on the design&lt;br /&gt;
* &#039;&#039;&#039;Required skills&#039;&#039;&#039;: Python, JavaScript. Nice to have: celery, gstreamer&lt;br /&gt;
&lt;br /&gt;
== Port federation code to ActivityPub ==&lt;br /&gt;
&lt;br /&gt;
Right now we have a federation branch to be merged shortly by Jessica Tallon.  This adds basic federation support to MediaGoblin.  Right now the federation code is based on the [https://github.com/e14n/pump.io/blob/master/API.md Pump API]; however, we&#039;d like to port it to the work we&#039;re doing on https://www.w3.org/TR/activitypub/[https://www.w3.org/TR/activitypub/ ActivityPub] as part of the [https://www.w3.org/wiki/Socialwg W3C Social Working Group].  ActivityPub is fairly close to the Pump API, but there are some differences (most notably a move from ActivityStreams 1.0 to ActivityStreams 2.0, although there are others).  Your mission, if you choose to accept it, is to port MediaGoblin&#039;s federation code to ActivityPub, ideally while supporting the Pump API in a backwards compatible fashion (if possible).&lt;br /&gt;
&lt;br /&gt;
Is Jessica Tallon willing to personally mentor this one? /* so if you wanted to learn about federation from the source itself, here&#039;s the way to do it! */&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Possible mentors&#039;&#039;&#039;: Jessica Tallon (tsyesika)&lt;br /&gt;
* &#039;&#039;&#039;Difficulty&#039;&#039;&#039;: TODO&lt;br /&gt;
* &#039;&#039;&#039;Required skills&#039;&#039;&#039;: Python&lt;br /&gt;
&lt;br /&gt;
== Access control ==&lt;br /&gt;
&lt;br /&gt;
Today MediaGoblin doesn&#039;t handle permissions very well. Anybody can see anything. What should be is proper access control. Owner of media or collection should be able to set who can view, edit and comment their mediafiles. Users could be added to groups, and groups could participate in permissions too. Different permissions might also apply to guests and registered users. Who can add users to groups should be controlled too.&lt;br /&gt;
&lt;br /&gt;
A good proposal would include description of capabilities of the access control system. Don&#039;t forget that REST should be covered too. Also, it should be clear how the whole thing works with federation.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Possible mentors&#039;&#039;&#039;: Boris Bobrov (breton)&lt;br /&gt;
* &#039;&#039;&#039;Difficulty&#039;&#039;&#039;: Medium&lt;br /&gt;
* &#039;&#039;&#039;Required skills&#039;&#039;&#039;: Python, HTML, CSS&lt;br /&gt;
&lt;br /&gt;
On top of that, audit system might be implemented. Who added user to group? Who edited or deleted a file? Who changed a permission?&lt;br /&gt;
&lt;br /&gt;
Adding audit will bump &#039;&#039;&#039;difficulty&#039;&#039;&#039; of the task to 4.&lt;br /&gt;
&lt;br /&gt;
== Chunked uploads / multi-upload UI. ==&lt;br /&gt;
&lt;br /&gt;
We want to have multi-upload from cli (usecase: go to my directory with photos and upload them all) and from web-interface (using maybe zip, maybe html5 feature). There is already https://github.com/VenKamikaze/mediagoblin-html5-multi-upload which might be what we need, so before choosing this task please verify.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Possible Mentors:&#039;&#039;&#039; Christopher Allan Webber (paroneayea), Boris Bobrov (breton).&lt;br /&gt;
* &#039;&#039;&#039;Difficulty&#039;&#039;&#039;: low&lt;br /&gt;
* &#039;&#039;&#039;Required skills&#039;&#039;&#039;: python, html, css&lt;/div&gt;</summary>
		<author><name>Breton</name></author>
	</entry>
	<entry>
		<id>https://wiki.mediagoblin.org/index.php?title=GSOC_2017&amp;diff=1889</id>
		<title>GSOC 2017</title>
		<link rel="alternate" type="text/html" href="https://wiki.mediagoblin.org/index.php?title=GSOC_2017&amp;diff=1889"/>
		<updated>2017-02-22T19:48:39Z</updated>

		<summary type="html">&lt;p&gt;Breton: /* Access control */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;We are hoping to participate in [https://developers.google.com/open-source/gsoc/ GSOC 2017] under the GNU umbrella. &lt;br /&gt;
 &lt;br /&gt;
You may want to check for a &amp;quot;possible mentor&amp;quot; before applying for this topic.  If you have your own idea, probably bring it up in #mediagoblin on irc.freenode.net !&lt;br /&gt;
&lt;br /&gt;
= How do I apply as a student ? =&lt;br /&gt;
&lt;br /&gt;
* [https://developers.google.com/open-source/gsoc/ Submit your application].  Please see the application submission template on the [http://www.gnu.org/software/soc-projects/guidelines.html GNU GSoC guidelines page].&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;
* If you have never done web development in python before, MediaGoblin is a pretty good place to start !  However, we highly recommend going through the [https://docs.djangoproject.com/en/1.7/intro/tutorial01/ Django tutorial]... this isn&#039;t a requirement, but it will help you be better prepared.&lt;br /&gt;
* Work on a small task, and mention it in your application.  The [http://issues.mediagoblin.org/query?status=!closed&amp;amp;keywords=~bitesized bitesized list] is often helpful.&lt;br /&gt;
* Also, be aware when submitting: Summer of Code applicants are expected to work &#039;&#039;&#039;40 hours per week&#039;&#039;&#039;... so, a full time internship !  If you propose, please be sure you are ready to make that level of commitment.&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)!  Please, please join our channel and introduce yourself.  We would love to hear from you !&lt;br /&gt;
&lt;br /&gt;
= Possible projects with mentors =&lt;br /&gt;
== Multiple qualities of video ==&lt;br /&gt;
&lt;br /&gt;
Now MediaGoblin supports only a single quality of video files. We want to fix that and support multiple qualities: 360p, 480p, 720p, 1080p, [https://en.wikipedia.org/wiki/Ultra-high-definition_television 4k]. This requires changes to frontend and to backend. To implement it, one must have some experience in JavaScript and Python.&lt;br /&gt;
&lt;br /&gt;
There are some hidden issues though. For example, when a user uploads a video in 1080p, it will have to be transcoded to all other qualities. But it will take a lot of time. Ideally, we don&#039;t want to wait for all variants to be ready before we can already display the video. Also, if several videos were uploaded, we don&#039;t want to get blocked on the first one getting transcoded for a long time.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Mentor&#039;&#039;&#039;: Boris Bobrov (breton)&lt;br /&gt;
* &#039;&#039;&#039;Difficulty&#039;&#039;&#039;: 2-4 out of 5 depending on what will be implemented&lt;br /&gt;
* &#039;&#039;&#039;Required skills&#039;&#039;&#039;: Python, JavaScript. Nice to have: celery, gstreamer&lt;br /&gt;
&lt;br /&gt;
== Port federation code to ActivityPub ==&lt;br /&gt;
&lt;br /&gt;
Right now we have a federation branch to be merged shortly by Jessica Tallon.  This adds basic federation support to MediaGoblin.  Right now the federation code is based on the [https://github.com/e14n/pump.io/blob/master/API.md Pump API]; however, we&#039;d like to port it to the work we&#039;re doing on https://www.w3.org/TR/activitypub/[https://www.w3.org/TR/activitypub/ ActivityPub] as part of the [https://www.w3.org/wiki/Socialwg W3C Social Working Group].  ActivityPub is fairly close to the Pump API, but there are some differences (most notably a move from ActivityStreams 1.0 to ActivityStreams 2.0, although there are others).  Your mission, if you choose to accept it, is to port MediaGoblin&#039;s federation code to ActivityPub, ideally while supporting the Pump API in a backwards compatible fashion (if possible).&lt;br /&gt;
&lt;br /&gt;
Is Jessica Tallon willing to personally mentor this one? /* so if you wanted to learn about federation from the source itself, here&#039;s the way to do it! */&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Possible mentors&#039;&#039;&#039;: Jessica Tallon (tsyesika)&lt;br /&gt;
* &#039;&#039;&#039;Difficulty&#039;&#039;&#039;: TODO&lt;br /&gt;
* &#039;&#039;&#039;Required skills&#039;&#039;&#039;: Python&lt;br /&gt;
&lt;br /&gt;
== Access control ==&lt;br /&gt;
&lt;br /&gt;
Today MediaGoblin doesn&#039;t handle permissions very well. Anybody can see anything. What should be is proper access control. Owner of media or collection should be able to set who can view, edit and comment their mediafiles. Users could be added to groups, and groups could participate in permissions too. Different permissions might also apply to guests and registered users. Who can add users to groups should be controlled too.&lt;br /&gt;
&lt;br /&gt;
A good proposal would include description of capabilities of the access control system. Don&#039;t forget that REST should be covered too. Also, it should be clear how the whole thing works with federation.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Possible mentors&#039;&#039;&#039;: Boris Bobrov (breton)&lt;br /&gt;
* &#039;&#039;&#039;Difficulty&#039;&#039;&#039;: 3 out of 5 if only access control is implemented. 4 out of 5 if audit is implemented&lt;br /&gt;
* &#039;&#039;&#039;Required skills&#039;&#039;&#039;: Python, HTML, CSS&lt;br /&gt;
&lt;br /&gt;
On top of that, audit system might be implemented. Who added user to group? Who edited or deleted a file? Who changed a permission?&lt;br /&gt;
&lt;br /&gt;
Adding audit will bump &#039;&#039;&#039;difficulty&#039;&#039;&#039; of the task to 4.&lt;/div&gt;</summary>
		<author><name>Breton</name></author>
	</entry>
	<entry>
		<id>https://wiki.mediagoblin.org/index.php?title=GSOC_2017&amp;diff=1888</id>
		<title>GSOC 2017</title>
		<link rel="alternate" type="text/html" href="https://wiki.mediagoblin.org/index.php?title=GSOC_2017&amp;diff=1888"/>
		<updated>2017-02-22T19:41:14Z</updated>

		<summary type="html">&lt;p&gt;Breton: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;We are hoping to participate in [https://developers.google.com/open-source/gsoc/ GSOC 2017] under the GNU umbrella. &lt;br /&gt;
 &lt;br /&gt;
You may want to check for a &amp;quot;possible mentor&amp;quot; before applying for this topic.  If you have your own idea, probably bring it up in #mediagoblin on irc.freenode.net !&lt;br /&gt;
&lt;br /&gt;
= How do I apply as a student ? =&lt;br /&gt;
&lt;br /&gt;
* [https://developers.google.com/open-source/gsoc/ Submit your application].  Please see the application submission template on the [http://www.gnu.org/software/soc-projects/guidelines.html GNU GSoC guidelines page].&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;
* If you have never done web development in python before, MediaGoblin is a pretty good place to start !  However, we highly recommend going through the [https://docs.djangoproject.com/en/1.7/intro/tutorial01/ Django tutorial]... this isn&#039;t a requirement, but it will help you be better prepared.&lt;br /&gt;
* Work on a small task, and mention it in your application.  The [http://issues.mediagoblin.org/query?status=!closed&amp;amp;keywords=~bitesized bitesized list] is often helpful.&lt;br /&gt;
* Also, be aware when submitting: Summer of Code applicants are expected to work &#039;&#039;&#039;40 hours per week&#039;&#039;&#039;... so, a full time internship !  If you propose, please be sure you are ready to make that level of commitment.&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)!  Please, please join our channel and introduce yourself.  We would love to hear from you !&lt;br /&gt;
&lt;br /&gt;
= Possible projects with mentors =&lt;br /&gt;
== Multiple qualities of video ==&lt;br /&gt;
&lt;br /&gt;
Now MediaGoblin supports only a single quality of video files. We want to fix that and support multiple qualities: 360p, 480p, 720p, 1080p, [https://en.wikipedia.org/wiki/Ultra-high-definition_television 4k]. This requires changes to frontend and to backend. To implement it, one must have some experience in JavaScript and Python.&lt;br /&gt;
&lt;br /&gt;
There are some hidden issues though. For example, when a user uploads a video in 1080p, it will have to be transcoded to all other qualities. But it will take a lot of time. Ideally, we don&#039;t want to wait for all variants to be ready before we can already display the video. Also, if several videos were uploaded, we don&#039;t want to get blocked on the first one getting transcoded for a long time.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Mentor&#039;&#039;&#039;: Boris Bobrov (breton)&lt;br /&gt;
* &#039;&#039;&#039;Difficulty&#039;&#039;&#039;: 2-4 out of 5 depending on what will be implemented&lt;br /&gt;
* &#039;&#039;&#039;Required skills&#039;&#039;&#039;: Python, JavaScript. Nice to have: celery, gstreamer&lt;br /&gt;
&lt;br /&gt;
== Port federation code to ActivityPub ==&lt;br /&gt;
&lt;br /&gt;
Right now we have a federation branch to be merged shortly by Jessica Tallon.  This adds basic federation support to MediaGoblin.  Right now the federation code is based on the [https://github.com/e14n/pump.io/blob/master/API.md Pump API]; however, we&#039;d like to port it to the work we&#039;re doing on https://www.w3.org/TR/activitypub/[https://www.w3.org/TR/activitypub/ ActivityPub] as part of the [https://www.w3.org/wiki/Socialwg W3C Social Working Group].  ActivityPub is fairly close to the Pump API, but there are some differences (most notably a move from ActivityStreams 1.0 to ActivityStreams 2.0, although there are others).  Your mission, if you choose to accept it, is to port MediaGoblin&#039;s federation code to ActivityPub, ideally while supporting the Pump API in a backwards compatible fashion (if possible).&lt;br /&gt;
&lt;br /&gt;
Is Jessica Tallon willing to personally mentor this one? /* so if you wanted to learn about federation from the source itself, here&#039;s the way to do it! */&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Possible mentors&#039;&#039;&#039;: Jessica Tallon (tsyesika)&lt;br /&gt;
* &#039;&#039;&#039;Difficulty&#039;&#039;&#039;: TODO&lt;br /&gt;
* &#039;&#039;&#039;Required skills&#039;&#039;&#039;: Python&lt;br /&gt;
&lt;br /&gt;
== Access control ==&lt;br /&gt;
&lt;br /&gt;
Today MediaGoblin doesn&#039;t handle permissions very well. Anybody can see anything. What should be is proper access control. Owner of media or collection should be able to set who can view, edit and comment their mediafiles. Users could be added to groups, and groups could participate in permissions too. Different permissions might also apply to guests and registered users. Who can add users to groups? Who added user to group? Who edited or deleted a file? Who changed a permission?&lt;br /&gt;
&lt;br /&gt;
A good proposal would include description of capabilities of the access control system and, maybe, audit system. Don&#039;t forget that REST should be covered too. Also, it should be clear how the whole thing works with federation.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Possible mentors&#039;&#039;&#039;: Boris Bobrov (breton).&lt;br /&gt;
* &#039;&#039;&#039;Difficulty&#039;&#039;&#039;: 3 out of 5 if only access control is implemented. 4 out of 5 if you &lt;br /&gt;
* &#039;&#039;&#039;Required skills&#039;&#039;&#039;: Python, HTML, CSS.&lt;/div&gt;</summary>
		<author><name>Breton</name></author>
	</entry>
	<entry>
		<id>https://wiki.mediagoblin.org/index.php?title=GSOC_2017&amp;diff=1887</id>
		<title>GSOC 2017</title>
		<link rel="alternate" type="text/html" href="https://wiki.mediagoblin.org/index.php?title=GSOC_2017&amp;diff=1887"/>
		<updated>2017-02-22T19:28:53Z</updated>

		<summary type="html">&lt;p&gt;Breton: Added required skills&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;We are hoping to participate in [https://developers.google.com/open-source/gsoc/ GSOC 2017] under the GNU umbrella. &lt;br /&gt;
 &lt;br /&gt;
You may want to check for a &amp;quot;possible mentor&amp;quot; before applying for this topic.  If you have your own idea, probably bring it up in #mediagoblin on irc.freenode.net !&lt;br /&gt;
&lt;br /&gt;
= How do I apply as a student ? =&lt;br /&gt;
&lt;br /&gt;
* [https://developers.google.com/open-source/gsoc/ Submit your application].  Please see the application submission template on the [http://www.gnu.org/software/soc-projects/guidelines.html GNU GSoC guidelines page].&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;
* If you have never done web development in python before, MediaGoblin is a pretty good place to start !  However, we highly recommend going through the [https://docs.djangoproject.com/en/1.7/intro/tutorial01/ Django tutorial]... this isn&#039;t a requirement, but it will help you be better prepared.&lt;br /&gt;
* Work on a small task, and mention it in your application.  The [http://issues.mediagoblin.org/query?status=!closed&amp;amp;keywords=~bitesized bitesized list] is often helpful.&lt;br /&gt;
* Also, be aware when submitting: Summer of Code applicants are expected to work &#039;&#039;&#039;40 hours per week&#039;&#039;&#039;... so, a full time internship !  If you propose, please be sure you are ready to make that level of commitment.&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)!  Please, please join our channel and introduce yourself.  We would love to hear from you !&lt;br /&gt;
&lt;br /&gt;
= Possible projects with mentors =&lt;br /&gt;
== Multiple qualities of video ==&lt;br /&gt;
&lt;br /&gt;
Now MediaGoblin supports only a single quality of video files. We want to fix that and support multiple qualities: 360p, 480p, 720p, 1080p, [https://en.wikipedia.org/wiki/Ultra-high-definition_television 4k]. This requires changes to frontend and to backend. To implement it, one must have some experience in JavaScript and Python.&lt;br /&gt;
&lt;br /&gt;
There are some hidden issues though. For example, when a user uploads a video in 1080p, it will have to be transcoded to all other qualities. But it will take a lot of time. Ideally, we don&#039;t want to wait for all variants to be ready before we can already display the video. Also, if several videos were uploaded, we don&#039;t want to get blocked on the first one getting transcoded for a long time.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Mentor&#039;&#039;&#039;: Boris Bobrov (breton)&lt;br /&gt;
* &#039;&#039;&#039;Difficulty&#039;&#039;&#039;: 2-4 out of 5 depending on what will be implemented&lt;br /&gt;
* &#039;&#039;&#039;Required skills&#039;&#039;&#039;: Python, JavaScript. Nice to have: celery, gstreamer&lt;br /&gt;
&lt;br /&gt;
== Port federation code to ActivityPub ==&lt;br /&gt;
&lt;br /&gt;
Right now we have a federation branch to be merged shortly by Jessica Tallon.  This adds basic federation support to MediaGoblin.  Right now the federation code is based on the [https://github.com/e14n/pump.io/blob/master/API.md Pump API]; however, we&#039;d like to port it to the work we&#039;re doing on https://www.w3.org/TR/activitypub/[https://www.w3.org/TR/activitypub/ ActivityPub] as part of the [https://www.w3.org/wiki/Socialwg W3C Social Working Group].  ActivityPub is fairly close to the Pump API, but there are some differences (most notably a move from ActivityStreams 1.0 to ActivityStreams 2.0, although there are others).  Your mission, if you choose to accept it, is to port MediaGoblin&#039;s federation code to ActivityPub, ideally while supporting the Pump API in a backwards compatible fashion (if possible).&lt;br /&gt;
&lt;br /&gt;
Is Jessica Tallon willing to personally mentor this one? /* so if you wanted to learn about federation from the source itself, here&#039;s the way to do it! */&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Possible mentors&#039;&#039;&#039;: Jessica Tallon (tsyesika)&lt;br /&gt;
* &#039;&#039;&#039;Difficulty&#039;&#039;&#039;: TODO&lt;br /&gt;
* &#039;&#039;&#039;Required skills&#039;&#039;&#039;: Python&lt;br /&gt;
&lt;br /&gt;
== Access control ==&lt;br /&gt;
&lt;br /&gt;
Today MediaGoblin doesn&#039;t handle permissions very well. Anybody can see anything. What should be is proper access control. Owner of media or collection should be able to set who can view, edit and comment their mediafiles. Users could be added to groups, and groups could participate in permissions too. Different permissions might also apply to guests and registered users. Who can add users to groups? Who added user to group? Who edited or deleted a file? Who changed a permission?&lt;br /&gt;
&lt;br /&gt;
A good proposal would include description of capabilities of the access control system and, maybe, audit system. Don&#039;t forget that REST should be covered too. Also, it should be clear how the whole thing works with federation.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Possible mentors&#039;&#039;&#039;: Boris Bobrov (breton).&lt;br /&gt;
* &#039;&#039;&#039;Difficulty&#039;&#039;&#039;: 2-4 out of 5 depending on what will be implemented&lt;br /&gt;
* &#039;&#039;&#039;Required skills&#039;&#039;&#039;: Python, HTML, CSS.&lt;/div&gt;</summary>
		<author><name>Breton</name></author>
	</entry>
	<entry>
		<id>https://wiki.mediagoblin.org/index.php?title=GSOC_2017&amp;diff=1886</id>
		<title>GSOC 2017</title>
		<link rel="alternate" type="text/html" href="https://wiki.mediagoblin.org/index.php?title=GSOC_2017&amp;diff=1886"/>
		<updated>2017-02-22T19:01:48Z</updated>

		<summary type="html">&lt;p&gt;Breton: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;We are hoping to participate in [https://developers.google.com/open-source/gsoc/ GSOC 2017] under the GNU umbrella. &lt;br /&gt;
 &lt;br /&gt;
You may want to check for a &amp;quot;possible mentor&amp;quot; before applying for this topic.  If you have your own idea, probably bring it up in #mediagoblin on irc.freenode.net !&lt;br /&gt;
&lt;br /&gt;
= How do I apply as a student ? =&lt;br /&gt;
&lt;br /&gt;
* [https://developers.google.com/open-source/gsoc/ Submit your application].  Please see the application submission template on the [http://www.gnu.org/software/soc-projects/guidelines.html GNU GSoC guidelines page].&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;
* If you have never done web development in python before, MediaGoblin is a pretty good place to start !  However, we highly recommend going through the [https://docs.djangoproject.com/en/1.7/intro/tutorial01/ Django tutorial]... this isn&#039;t a requirement, but it will help you be better prepared.&lt;br /&gt;
* Work on a small task, and mention it in your application.  The [http://issues.mediagoblin.org/query?status=!closed&amp;amp;keywords=~bitesized bitesized list] is often helpful.&lt;br /&gt;
* Also, be aware when submitting: Summer of Code applicants are expected to work &#039;&#039;&#039;40 hours per week&#039;&#039;&#039;... so, a full time internship !  If you propose, please be sure you are ready to make that level of commitment.&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)!  Please, please join our channel and introduce yourself.  We would love to hear from you !&lt;br /&gt;
&lt;br /&gt;
= Possible projects with mentors =&lt;br /&gt;
== Multiple qualities of video ==&lt;br /&gt;
&lt;br /&gt;
Now MediaGoblin supports only a single quality of video files. We want to fix that and support multiple qualities: 360p, 480p, 720p, 1080p, [https://en.wikipedia.org/wiki/Ultra-high-definition_television 4k]. This requires changes to frontend and to backend. To implement it, one must have some experience in JavaScript and Python.&lt;br /&gt;
&lt;br /&gt;
There are some hidden issues though. For example, when a user uploads a video in 1080p, it will have to be transcoded to all other qualities. But it will take a lot of time. Ideally, we don&#039;t want to wait for all variants to be ready before we can already display the video. Also, if several videos were uploaded, we don&#039;t want to get blocked on the first one getting transcoded for a long time.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Mentor&#039;&#039;&#039;: Boris Bobrov (breton)&lt;br /&gt;
* &#039;&#039;&#039;Difficulty&#039;&#039;&#039;: 2-4 out of 5 depending on what will be implemented&lt;br /&gt;
&lt;br /&gt;
== Port federation code to ActivityPub ==&lt;br /&gt;
&lt;br /&gt;
Right now we have a federation branch to be merged shortly by Jessica Tallon.  This adds basic federation support to MediaGoblin.  Right now the federation code is based on the [https://github.com/e14n/pump.io/blob/master/API.md Pump API]; however, we&#039;d like to port it to the work we&#039;re doing on https://www.w3.org/TR/activitypub/[https://www.w3.org/TR/activitypub/ ActivityPub] as part of the [https://www.w3.org/wiki/Socialwg W3C Social Working Group].  ActivityPub is fairly close to the Pump API, but there are some differences (most notably a move from ActivityStreams 1.0 to ActivityStreams 2.0, although there are others).  Your mission, if you choose to accept it, is to port MediaGoblin&#039;s federation code to ActivityPub, ideally while supporting the Pump API in a backwards compatible fashion (if possible).&lt;br /&gt;
&lt;br /&gt;
Is Jessica Tallon willing to personally mentor this one? /* so if you wanted to learn about federation from the source itself, here&#039;s the way to do it! */&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Possible mentors&#039;&#039;&#039;: Jessica Tallon (tsyesika)&lt;br /&gt;
&lt;br /&gt;
== Access control ==&lt;br /&gt;
&lt;br /&gt;
Today MediaGoblin doesn&#039;t handle permissions very well. Anybody can see anything. What should be is proper access control. Owner of media or collection should be able to set who can view, edit and comment their mediafiles. Users could be added to groups, and groups could participate in permissions too. Different permissions might also apply to guests and registered users. Who can add users to groups? Who added user to group? Who edited or deleted a file? Who changed a permission?&lt;br /&gt;
&lt;br /&gt;
A good proposal would include description of capabilities of the access control system and, maybe, audit system. Don&#039;t forget that REST should be covered too. Also, it should be clear how the whole thing works with federation.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Possible mentors&#039;&#039;&#039;: Boris Bobrov (breton).&lt;br /&gt;
* &#039;&#039;&#039;Difficulty&#039;&#039;&#039;: 2-4 out of 5 depending on what will be implemented&lt;/div&gt;</summary>
		<author><name>Breton</name></author>
	</entry>
	<entry>
		<id>https://wiki.mediagoblin.org/index.php?title=GSOC_2017&amp;diff=1885</id>
		<title>GSOC 2017</title>
		<link rel="alternate" type="text/html" href="https://wiki.mediagoblin.org/index.php?title=GSOC_2017&amp;diff=1885"/>
		<updated>2017-02-22T14:39:00Z</updated>

		<summary type="html">&lt;p&gt;Breton: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;We are hoping to participate in [https://developers.google.com/open-source/gsoc/ GSOC 2017] under the GNU umbrella. &lt;br /&gt;
 &lt;br /&gt;
You may want to check for a &amp;quot;possible mentor&amp;quot; before applying for this topic.  If you have your own idea, probably bring it up in #mediagoblin on irc.freenode.net !&lt;br /&gt;
&lt;br /&gt;
= How do I apply as a student ? =&lt;br /&gt;
&lt;br /&gt;
* [https://developers.google.com/open-source/gsoc/ Submit your application].  Please see the application submission template on the [http://www.gnu.org/software/soc-projects/guidelines.html GNU GSoC guidelines page].&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;
* If you have never done web development in python before, MediaGoblin is a pretty good place to start !  However, we highly recommend going through the [https://docs.djangoproject.com/en/1.7/intro/tutorial01/ Django tutorial]... this isn&#039;t a requirement, but it will help you be better prepared.&lt;br /&gt;
* Work on a small task, and mention it in your application.  The [http://issues.mediagoblin.org/query?status=!closed&amp;amp;keywords=~bitesized bitesized list] is often helpful.&lt;br /&gt;
* Also, be aware when submitting: Summer of Code applicants are expected to work &#039;&#039;&#039;40 hours per week&#039;&#039;&#039;... so, a full time internship !  If you propose, please be sure you are ready to make that level of commitment.&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)!  Please, please join our channel and introduce yourself.  We would love to hear from you !&lt;br /&gt;
&lt;br /&gt;
= Possible projects with mentors. =&lt;br /&gt;
== Multiple qualities of video. ==&lt;br /&gt;
&lt;br /&gt;
Now MediaGoblin supports only a single quality of video files. We want to fix that and support multiple qualities: 360p, 480p, 720p, 1080p, [https://en.wikipedia.org/wiki/Ultra-high-definition_television 4k]. This requires changes to frontend and to backend. To implement it, one must have some experience in JavaScript and Python.&lt;br /&gt;
&lt;br /&gt;
There are some hidden issues though. For example, when a user uploads a video in 1080p, it will have to be transcoded to all other qualities. But it will take a lot of time. Ideally, we don&#039;t want to wait for all variants to be ready before we can already display the video. Also, if several videos were uploaded, we don&#039;t want to get blocked on the first one getting transcoded for a long time.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Mentor&#039;&#039;&#039;: Boris Bobrov (breton)&lt;br /&gt;
* &#039;&#039;&#039;Difficulty&#039;&#039;&#039;: 2-4 out of 5 depending on what will be implemented&lt;br /&gt;
&lt;br /&gt;
== Port federation code to ActivityPub ==&lt;br /&gt;
&lt;br /&gt;
Right now we have a federation branch to be merged shortly by Jessica Tallon.  This adds basic federation support to MediaGoblin.  Right now the federation code is based on the [https://github.com/e14n/pump.io/blob/master/API.md Pump API]; however, we&#039;d like to port it to the work we&#039;re doing on https://www.w3.org/TR/activitypub/[https://www.w3.org/TR/activitypub/ ActivityPub] as part of the [https://www.w3.org/wiki/Socialwg W3C Social Working Group].  ActivityPub is fairly close to the Pump API, but there are some differences (most notably a move from ActivityStreams 1.0 to ActivityStreams 2.0, although there are others).  Your mission, if you choose to accept it, is to port MediaGoblin&#039;s federation code to ActivityPub, ideally while supporting the Pump API in a backwards compatible fashion (if possible).&lt;br /&gt;
&lt;br /&gt;
Is Jessica Tallon willing to personally mentor this one? /* so if you wanted to learn about federation from the source itself, here&#039;s the way to do it! */&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Possible mentors&#039;&#039;&#039;:Jessica Tallon (tsyesika)&lt;br /&gt;
&lt;br /&gt;
== Access control ==&lt;br /&gt;
&lt;br /&gt;
Today MediaGoblin doesn&#039;t handle permissions very well. Anybody can see anything. What should be is proper access control. Owner of media or collection should be able to set who can view, edit and comment their mediafiles. Users could be added to groups, and groups could participate in permissions too. Different permissions might also apply to guests and registered users. Who can add users to groups? Who added user to group? Who edited or deleted a file? Who changed a permission?&lt;br /&gt;
&lt;br /&gt;
A good proposal would include description of capabilities of the access control system and, maybe, audit system. Don&#039;t forget that REST should be covered too. Also, it should be clear how the whole thing works with federation.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Possible mentors&#039;&#039;&#039;: Boris Bobrov (breton).&lt;br /&gt;
&#039;&#039;&#039;Difficulty&#039;&#039;&#039;: 2-4 out of 5 depending on what will be implemented&lt;/div&gt;</summary>
		<author><name>Breton</name></author>
	</entry>
	<entry>
		<id>https://wiki.mediagoblin.org/index.php?title=GSOC_2017&amp;diff=1880</id>
		<title>GSOC 2017</title>
		<link rel="alternate" type="text/html" href="https://wiki.mediagoblin.org/index.php?title=GSOC_2017&amp;diff=1880"/>
		<updated>2017-02-04T22:08:39Z</updated>

		<summary type="html">&lt;p&gt;Breton: /* Possible projects with mentors. */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;We are hoping to participate in [https://developers.google.com/open-source/gsoc/ GSOC 2017] under the GNU umbrella. &lt;br /&gt;
 &lt;br /&gt;
You may want to check for a &amp;quot;possible mentor&amp;quot; before applying for this topic.  If you have your own idea, probably bring it up in #mediagoblin on irc.freenode.net !&lt;br /&gt;
&lt;br /&gt;
= How do I apply as a student ? =&lt;br /&gt;
&lt;br /&gt;
* [https://developers.google.com/open-source/gsoc/ Submit your application].  Please see the application submission template on the [http://www.gnu.org/software/soc-projects/guidelines.html GNU GSoC guidelines page].&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;
* If you have never done web development in python before, MediaGoblin is a pretty good place to start !  However, we highly recommend going through the [https://docs.djangoproject.com/en/1.7/intro/tutorial01/ Django tutorial]... this isn&#039;t a requirement, but it will help you be better prepared.&lt;br /&gt;
* Work on a small task, and mention it in your application.  The [http://issues.mediagoblin.org/query?status=!closed&amp;amp;keywords=~bitesized bitesized list] is often helpful.&lt;br /&gt;
* Also, be aware when submitting: Summer of Code applicants are expected to work &#039;&#039;&#039;40 hours per week&#039;&#039;&#039;... so, a full time internship !  If you propose, please be sure you are ready to make that level of commitment.&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)!  Please, please join our channel and introduce yourself.  We would love to hear from you !&lt;br /&gt;
&lt;br /&gt;
= Possible projects with mentors. =&lt;br /&gt;
== Chunked uploads / multi-upload UI. ==&lt;br /&gt;
&lt;br /&gt;
We want to have multi-upload from cli (usecase: go to my directory with photos and upload them all) and from web-interface (using maybe zip, maybe html5 feature). There is already https://github.com/VenKamikaze/mediagoblin-html5-multi-upload which might be what we need, so before choosing this task please verify.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Possible Mentors:&#039;&#039;&#039; Christopher Allan Webber, Boris Bobrov (breton).&lt;br /&gt;
&lt;br /&gt;
== Multiple qualities of video. ==&lt;br /&gt;
&lt;br /&gt;
Now MediaGoblin supports only a single quality of video files. We want to fix that and support multiple qualities: 360p, 480p, 720p, 1080p, [https://en.wikipedia.org/wiki/Ultra-high-definition_television 4k]. This requires changes to frontend and to backend. To implement it, one must have some experience in JavaScript and Python.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Possible mentors&#039;&#039;&#039;: Boris Bobrov (breton).&lt;br /&gt;
&lt;br /&gt;
== Port federation code to ActivityPub ==&lt;br /&gt;
&lt;br /&gt;
Right now we have a federation branch to be merged shortly by Jessica Tallon.  This adds basic federation support to MediaGoblin.  Right now the federation code is based on the [https://github.com/e14n/pump.io/blob/master/API.md Pump API]; however, we&#039;d like to port it to the work we&#039;re doing on [https://www.w3.org/TR/activitypub/ ActivityPub] as part of the [https://www.w3.org/wiki/Socialwg W3C Social Working Group].  ActivityPub is fairly close to the Pump API, but there are some differences (most notably a move from ActivityStreams 1.0 to ActivityStreams 2.0, though there are others).  Your mission, if you choose to accept it, is to port MediaGoblin&#039;s federation code to ActivityPub, ideally while supporting the Pump API in a backwards compatible fashion (if possible).&lt;br /&gt;
&lt;br /&gt;
Is Jessica Tallon willing to personally mentor this one? /* so if you wanted to learn about federation from the source itself, here&#039;s the way to do it! */&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Possible mentors&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
== Access control ==&lt;br /&gt;
&lt;br /&gt;
Today MediaGoblin doesn&#039;t handle permissions very well. Anybody can see anything. What should be is proper access control. Owner of media or collection should be able to set who can view, edit and comment their mediafiles. Users could be added to groups, and groups could participate in permissions too. Different permisions might also apply to guests and registered users. Who can add users to groups? Who added user to group? Who edited or deleted a file? Who changed a permission?&lt;br /&gt;
&lt;br /&gt;
A good proposal would include description of capabilities of the access control system and, maybe, audit system. Don&#039;t forget that REST should be covered too. Also, it should be clear how the whole thing works with federation.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Possible mentors&#039;&#039;&#039;: Boris Bobrov (breton).&lt;/div&gt;</summary>
		<author><name>Breton</name></author>
	</entry>
	<entry>
		<id>https://wiki.mediagoblin.org/index.php?title=GSOC_2017&amp;diff=1878</id>
		<title>GSOC 2017</title>
		<link rel="alternate" type="text/html" href="https://wiki.mediagoblin.org/index.php?title=GSOC_2017&amp;diff=1878"/>
		<updated>2017-01-23T19:06:19Z</updated>

		<summary type="html">&lt;p&gt;Breton: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;We are hoping to participate in [https://developers.google.com/open-source/gsoc/ GSOC 2017] under the GNU umbrella. &lt;br /&gt;
 &lt;br /&gt;
You may want to check for a &amp;quot;possible mentor&amp;quot; before applying for this topic.  If you have your own idea, probably bring it up in #mediagoblin on irc.freenode.net !&lt;br /&gt;
&lt;br /&gt;
= How do I apply as a student ? =&lt;br /&gt;
&lt;br /&gt;
* [https://developers.google.com/open-source/gsoc/ Submit your application].  Please see the application submission template on the [http://www.gnu.org/software/soc-projects/guidelines.html GNU GSoC guidelines page].&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;
* If you have never done web development in python before, MediaGoblin is a pretty good place to start !  However, we highly recommend going through the [https://docs.djangoproject.com/en/1.7/intro/tutorial01/ Django tutorial]... this isn&#039;t a requirement, but it will help you be better prepared.&lt;br /&gt;
* Work on a small task, and mention it in your application.  The [http://issues.mediagoblin.org/query?status=!closed&amp;amp;keywords=~bitesized bitesized list] is often helpful.&lt;br /&gt;
* Also, be aware when submitting: Summer of Code applicants are expected to work &#039;&#039;&#039;40 hours per week&#039;&#039;&#039;... so, a full time internship !  If you propose, please be sure you are ready to make that level of commitment.&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)!  Please, please join our channel and introduce yourself.  We would love to hear from you !&lt;br /&gt;
&lt;br /&gt;
= Possible projects with mentors. =&lt;br /&gt;
== Chunked uploads / multi-upload UI. ==&lt;br /&gt;
&lt;br /&gt;
We want to have multi-upload from cli (usecase: go to my directory with photos and upload them all) and from web-interface (using maybe zip, maybe html5 feature). There is already https://github.com/VenKamikaze/mediagoblin-html5-multi-upload which might be what we need, so before choosing this task please verify.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Possible Mentors:&#039;&#039;&#039; Christopher Allan Webber, Boris Bobrov (breton).&lt;br /&gt;
&lt;br /&gt;
== Multiple qualities of video. ==&lt;br /&gt;
&lt;br /&gt;
Now MediaGoblin supports only a single quality of video files. We want to fix that and support multiple qualities: 360p, 480p, 720p, 1080p, [https://en.wikipedia.org/wiki/Ultra-high-definition_television 4k]. This requires changes to frontend and to backend. To implement it, one must have some experience in JavaScript and Python.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Possible mentors&#039;&#039;&#039;: Boris Bobrov (breton).&lt;br /&gt;
&lt;br /&gt;
== Port federation code to ActivityPub ==&lt;br /&gt;
&lt;br /&gt;
Right now we have a federation branch to be merged shortly by Jessica Tallon.  This adds basic federation support to MediaGoblin.  Right now the federation code is based on the [https://github.com/e14n/pump.io/blob/master/API.md Pump API]; however, we&#039;d like to port it to the work we&#039;re doing on [https://www.w3.org/TR/activitypub/ ActivityPub] as part of the [https://www.w3.org/wiki/Socialwg W3C Social Working Group].  ActivityPub is fairly close to the Pump API, but there are some differences (most notably a move from ActivityStreams 1.0 to ActivityStreams 2.0, though there are others).  Your mission, if you choose to accept it, is to port MediaGoblin&#039;s federation code to ActivityPub, ideally while supporting the Pump API in a backwards compatible fashion (if possible).&lt;br /&gt;
&lt;br /&gt;
Is Jessica Tallon willing to personally mentor this one? /* so if you wanted to learn about federation from the source itself, here&#039;s the way to do it! */&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Possible mentors&#039;&#039;&#039;:&lt;/div&gt;</summary>
		<author><name>Breton</name></author>
	</entry>
	<entry>
		<id>https://wiki.mediagoblin.org/index.php?title=GSOC_2016&amp;diff=1877</id>
		<title>GSOC 2016</title>
		<link rel="alternate" type="text/html" href="https://wiki.mediagoblin.org/index.php?title=GSOC_2016&amp;diff=1877"/>
		<updated>2017-01-23T19:05:11Z</updated>

		<summary type="html">&lt;p&gt;Breton: Breton moved page GSOC 2016 to GSOC 2017: It&amp;#039;s new GSoC!&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[GSOC 2017]]&lt;/div&gt;</summary>
		<author><name>Breton</name></author>
	</entry>
	<entry>
		<id>https://wiki.mediagoblin.org/index.php?title=GSOC_2017&amp;diff=1876</id>
		<title>GSOC 2017</title>
		<link rel="alternate" type="text/html" href="https://wiki.mediagoblin.org/index.php?title=GSOC_2017&amp;diff=1876"/>
		<updated>2017-01-23T19:05:11Z</updated>

		<summary type="html">&lt;p&gt;Breton: Breton moved page GSOC 2016 to GSOC 2017: It&amp;#039;s new GSoC!&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;We are hoping to participate in [https://developers.google.com/open-source/gsoc/ GSOC 2016] under the GNU umbrella. &lt;br /&gt;
 &lt;br /&gt;
You may want to check for a &amp;quot;possible mentor&amp;quot; before applying for this topic.  If you have your own idea, probably bring it up in #mediagoblin on irc.freenode.net !&lt;br /&gt;
&lt;br /&gt;
= How do I apply as a student ? =&lt;br /&gt;
&lt;br /&gt;
* [https://developers.google.com/open-source/gsoc/ Submit your application].  Please see the application submission template on the [http://www.gnu.org/software/soc-projects/guidelines.html GNU GSoC guidelines page].&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;
* If you have never done web development in python before, MediaGoblin is a pretty good place to start !  However, we highly recommend going through the [https://docs.djangoproject.com/en/1.7/intro/tutorial01/ Django tutorial]... this isn&#039;t a requirement, but it will help you be better prepared.&lt;br /&gt;
* Work on a small task, and mention it in your application.  The [http://issues.mediagoblin.org/query?status=!closed&amp;amp;keywords=~bitesized bitesized list] is often helpful.&lt;br /&gt;
* Also, be aware when submitting: Summer of Code applicants are expected to work &#039;&#039;&#039;40 hours per week&#039;&#039;&#039;... so, a full time internship !  If you propose, please be sure you are ready to make that level of commitment.&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)!  Please, please join our channel and introduce yourself.  We would love to hear from you !&lt;br /&gt;
&lt;br /&gt;
= Possible projects with mentors. =&lt;br /&gt;
== Chunked uploads / multi-upload UI. ==&lt;br /&gt;
&lt;br /&gt;
We want to have multi-upload from cli (usecase: go to my directory with photos and upload them all) and from web-interface (using maybe zip, maybe html5 feature). There is already https://github.com/VenKamikaze/mediagoblin-html5-multi-upload which might be what we need, so before choosing this task please verify.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Possible Mentors:&#039;&#039;&#039; Christopher Allan Webber, Boris Bobrov (breton).&lt;br /&gt;
&lt;br /&gt;
== Subtitle interface. ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Possible Mentors:&#039;&#039;&#039; Christopher Allan Webber, Boris Bobrov (breton).&lt;br /&gt;
&lt;br /&gt;
We want subtitle support for our player. Subtitles should be supported as separate files and as embedded into video/audio files. Popular formats should be supported. Also, there can be multiple subtitles per video. It will require work on front-end and maybe some fixes to backend.&lt;br /&gt;
&lt;br /&gt;
== Multiple qualities of video. ==&lt;br /&gt;
&lt;br /&gt;
Now MediaGoblin supports only a single quality of video files. We want to fix that and support multiple qualities: 360p, 480p, 720p, 1080p, [https://en.wikipedia.org/wiki/Ultra-high-definition_television 4k]. This requires changes to frontend and to backend. To implement it, one must have some experience in JavaScript and Python.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Possible mentors&#039;&#039;&#039;: Boris Bobrov (breton).&lt;br /&gt;
&lt;br /&gt;
== Port federation code to ActivityPub ==&lt;br /&gt;
&lt;br /&gt;
Right now we have a federation branch to be merged shortly by Jessica Tallon.  This adds basic federation support to MediaGoblin.  Right now the federation code is based on the [https://github.com/e14n/pump.io/blob/master/API.md Pump API]; however, we&#039;d like to port it to the work we&#039;re doing on [https://www.w3.org/TR/activitypub/ ActivityPub] as part of the [https://www.w3.org/wiki/Socialwg W3C Social Working Group].  ActivityPub is fairly close to the Pump API, but there are some differences (most notably a move from ActivityStreams 1.0 to ActivityStreams 2.0, though there are others).  Your mission, if you choose to accept it, is to port MediaGoblin&#039;s federation code to ActivityPub, ideally while supporting the Pump API in a backwards compatible fashion (if possible).&lt;br /&gt;
&lt;br /&gt;
Jessica Tallon is willing to personally mentor this one, so if you wanted to learn about federation from the source itself, here&#039;s the way to do it!&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Possible mentors&#039;&#039;&#039;: Jessica Tallon&lt;/div&gt;</summary>
		<author><name>Breton</name></author>
	</entry>
	<entry>
		<id>https://wiki.mediagoblin.org/index.php?title=GSOC_2017&amp;diff=1824</id>
		<title>GSOC 2017</title>
		<link rel="alternate" type="text/html" href="https://wiki.mediagoblin.org/index.php?title=GSOC_2017&amp;diff=1824"/>
		<updated>2016-03-01T08:09:14Z</updated>

		<summary type="html">&lt;p&gt;Breton: added my nick&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;We are hoping to participate in [https://developers.google.com/open-source/gsoc/ GSOC 2016] under the GNU umbrella. &lt;br /&gt;
 &lt;br /&gt;
You may want to check for a &amp;quot;possible mentor&amp;quot; before applying for this topic.  If you have your own idea, probably bring it up in #mediagoblin on irc.freenode.net !&lt;br /&gt;
&lt;br /&gt;
= How do I apply as a student ? =&lt;br /&gt;
&lt;br /&gt;
* [https://developers.google.com/open-source/gsoc/ Submit your application].  Please see the application submission template on the [http://www.gnu.org/software/soc-projects/guidelines.html GNU GSoC guidelines page].&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;
* If you have never done web development in python before, MediaGoblin is a pretty good place to start !  However, we highly recommend going through the [https://docs.djangoproject.com/en/1.7/intro/tutorial01/ Django tutorial]... this isn&#039;t a requirement, but it will help you be better prepared.&lt;br /&gt;
* Work on a small task, and mention it in your application.  The [http://issues.mediagoblin.org/query?status=!closed&amp;amp;keywords=~bitesized bitesized list] is often helpful.&lt;br /&gt;
* Also, be aware when submitting: Summer of Code applicants are expected to work &#039;&#039;&#039;40 hours per week&#039;&#039;&#039;... so, a full time internship !  If you propose, please be sure you are ready to make that level of commitment.&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)!  Please, please join our channel and introduce yourself.  We would love to hear from you !&lt;br /&gt;
&lt;br /&gt;
= Possible projects with mentors. =&lt;br /&gt;
== Chunked uploads / multi-upload UI. ==&lt;br /&gt;
&lt;br /&gt;
We want to have multi-upload from cli (usecase: go to my directory with photos and upload them all) and from web-interface (using maybe zip, maybe html5 feature). There is already https://github.com/VenKamikaze/mediagoblin-html5-multi-upload which might be what we need, so before choosing this task please verify.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Possible Mentors:&#039;&#039;&#039; Christopher Allan Webber, Boris Bobrov (breton).&lt;br /&gt;
&lt;br /&gt;
== Subtitle interface. ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Possible Mentors:&#039;&#039;&#039; Christopher Allan Webber, Boris Bobrov (breton).&lt;br /&gt;
&lt;br /&gt;
We want subtitle support for our player. Subtitles should be supported as separate files and as embedded into video/audio files. Popular formats should be supported. Also, there can be multiple subtitles per video. It will require work on front-end and maybe some fixes to backend.&lt;br /&gt;
&lt;br /&gt;
== Multiple qualities of video. ==&lt;br /&gt;
&lt;br /&gt;
Now MediaGoblin supports only a single quality of video files. We want to fix that and support multiple qualities: 360p, 480p, 720p, 1080p, [https://en.wikipedia.org/wiki/Ultra-high-definition_television 4k]. This requires changes to frontend and to backend. To implement it, one must have some experience in JavaScript and Python.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Possible mentors&#039;&#039;&#039;: Boris Bobrov (breton).&lt;/div&gt;</summary>
		<author><name>Breton</name></author>
	</entry>
	<entry>
		<id>https://wiki.mediagoblin.org/index.php?title=GSOC_2017&amp;diff=1776</id>
		<title>GSOC 2017</title>
		<link rel="alternate" type="text/html" href="https://wiki.mediagoblin.org/index.php?title=GSOC_2017&amp;diff=1776"/>
		<updated>2016-02-02T22:44:16Z</updated>

		<summary type="html">&lt;p&gt;Breton: Created page with &amp;quot;We are hoping to participate in [https://developers.google.com/open-source/gsoc/ GSOC 2016] under the GNU umbrella.   You may want to check for a &amp;quot;possible mentor&amp;quot; before appl...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;We are hoping to participate in [https://developers.google.com/open-source/gsoc/ GSOC 2016] under the GNU umbrella. &lt;br /&gt;
&lt;br /&gt;
You may want to check for a &amp;quot;possible mentor&amp;quot; before applying for this topic.  If you have your own idea, probably bring it up in #mediagoblin on irc.freenode.net!&lt;br /&gt;
&lt;br /&gt;
= How do I apply as a student? =&lt;br /&gt;
&lt;br /&gt;
* [https://developers.google.com/open-source/gsoc/ Submit your application].  Please see the application submission template on the [http://www.gnu.org/software/soc-projects/guidelines.html GNU GSoC guidelines page].&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;
* If you have never done web development in python before, MediaGoblin is a pretty good place to start!  However, we highly recommend going through the [https://docs.djangoproject.com/en/1.7/intro/tutorial01/ Django tutorial]... this isn&#039;t a requirement, but it will help you be better prepared.&lt;br /&gt;
* Work on a small task, and mention it in your application.  The [http://issues.mediagoblin.org/query?status=!closed&amp;amp;keywords=~bitesized bitesized list] is often helpful.&lt;br /&gt;
* Also, be aware when submitting: Summer of Code applicants are expected to work &#039;&#039;&#039;40 hours per week&#039;&#039;&#039;... so, a full time internship!  If you propose, please be sure you are ready to make that level of commitment.&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)!  Please, please join our channel and introduce yourself.  We&#039;d love to hear from you!&lt;br /&gt;
&lt;br /&gt;
= Possible projects with mentors =&lt;br /&gt;
== Chunked uploads / multi-upload UI ==&lt;br /&gt;
&lt;br /&gt;
We want to have multi-upload from cli (usecase: go to my directory with photos and upload them all) and from web-interface (using maybe zip, maybe html5 feature). There is already https://github.com/VenKamikaze/mediagoblin-html5-multi-upload which might be what we need, so before choosing this task please verify.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Possible Mentors:&#039;&#039;&#039; Christopher Allan Webber, Boris Bobrov&lt;br /&gt;
&lt;br /&gt;
== Subtitle interface ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Possible Mentors:&#039;&#039;&#039; Christopher Allan Webber, Boris Bobrov&lt;br /&gt;
&lt;br /&gt;
We want subtitle support for our player. Subtitles should be supported as separate files and as embedded into video/audio files. Popular formats should be supported. Also, there can be multiple subtitles per video. It will require work on front-end and maybe some fixes to backend.&lt;br /&gt;
&lt;br /&gt;
== Multiple qualities of video ==&lt;br /&gt;
&lt;br /&gt;
Now MediaGoblin supports only a single quality of video files. We want to fix that and support multiple qualities: 360p, 480p, 720p, 1080p, 4k. This requires changes to frontend and to backend. To implement it, one must have some experience in JavaScript and Python.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Possible mentors&#039;&#039;&#039;: Boris Bobrov&lt;/div&gt;</summary>
		<author><name>Breton</name></author>
	</entry>
	<entry>
		<id>https://wiki.mediagoblin.org/index.php?title=Meeting&amp;diff=1731</id>
		<title>Meeting</title>
		<link rel="alternate" type="text/html" href="https://wiki.mediagoblin.org/index.php?title=Meeting&amp;diff=1731"/>
		<updated>2015-09-05T16:13:06Z</updated>

		<summary type="html">&lt;p&gt;Breton: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== MediaGoblin Monthly Meeting ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;When:&#039;&#039;&#039; 9:00 am Pacific Time first Saturday of the month. [http://www.timeanddate.com/worldclock/converter.html Convert time to your timezone].  Print current UTC time: &amp;lt;code&amp;gt;date -u +&amp;quot;It&#039;s %F %T UTC&amp;quot;&amp;lt;/code&amp;gt;.  [https://en.wikipedia.org/wiki/Daylight_saving_time_in_the_United_States#2005_revision_to_dates_of_observance Pacific Time in 2014 has DST between March 9th and November 2nd].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Where:&#039;&#039;&#039; IRC #mediagoblin on irc.freenode.net&lt;br /&gt;
&lt;br /&gt;
Always announced several days in advance on the [http://lists.mediagoblin.org/pipermail/devel/ mailing list] as is date adjustments, agenda discussion and other meeting preparation.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Purpose:&#039;&#039;&#039; The idea is to discuss the past month, what happened, what was good, what should be done better. And to create roadmap for the upcoming month and assign tasks to people willing to handle them.&lt;br /&gt;
&lt;br /&gt;
Typical Agenda topics:&lt;br /&gt;
&lt;br /&gt;
* What happened in the last month, what was good, what could be better next time?&lt;br /&gt;
* What should be done next month?&lt;br /&gt;
&lt;br /&gt;
Meetings are logged. [http://mediagoblin.org/irclogs/ Logs for past meetings.]&lt;br /&gt;
&lt;br /&gt;
== Next Meeting ==&lt;br /&gt;
&lt;br /&gt;
Every first Saturday of the month with JIT-compiled agenda.&lt;br /&gt;
&lt;br /&gt;
== Past Meetings ==&lt;br /&gt;
&lt;br /&gt;
=== March 7, 2015, 09:00AM Pacific Time, 17:00 UTC ===&lt;br /&gt;
&lt;br /&gt;
* Moving off of gitorious, to?&lt;br /&gt;
* 0.8.0 upcoming release&lt;br /&gt;
* LibrePlanet and W3C meeting&lt;br /&gt;
* GSoC 2015&lt;br /&gt;
* Heads up: UserOps list&lt;br /&gt;
* Federation status&lt;br /&gt;
* Chris to take a temporary break?&lt;br /&gt;
&lt;br /&gt;
=== December 6, 2014, 09:00AM Pacific Time, 17:00 UTC ===&lt;br /&gt;
&lt;br /&gt;
* 0.8.0 upcoming release&lt;br /&gt;
** Current state (including looking at issue list)&lt;br /&gt;
** How to help!&lt;br /&gt;
*** Help us [https://issues.mediagoblin.org/query?status=new&amp;amp;status=in_progress&amp;amp;status=accepted&amp;amp;status=review&amp;amp;group=status&amp;amp;milestone=0.8.0 fix issues!]&lt;br /&gt;
*** Documentation (check it!  improve it!)&lt;br /&gt;
*** Gstreamer 1.0 merge?&lt;br /&gt;
*** Help test!&lt;br /&gt;
*** Translate? (Maybe, but maybe not yet?)&lt;br /&gt;
* Translation talk, if breton is around&lt;br /&gt;
* Update on federation&lt;br /&gt;
* Update on W3C group&lt;br /&gt;
&lt;br /&gt;
=== November 1, 2014, 09:00AM Pacific Time, 16:00 UTC&amp;lt;!-- change to 17:00 for December 2014 --&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
Loose meeting structure :)&lt;br /&gt;
&lt;br /&gt;
=== October 4, 2014, 09:00AM Pacific Time, 16:00 UTC&amp;lt;!-- change to 17:00 for December 2014 --&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
* 0.8.0 progress&lt;br /&gt;
** Python 3 is in!&lt;br /&gt;
** Cleanup happening&lt;br /&gt;
** What&#039;s next&lt;br /&gt;
*** Gstreamer 1.0 merge&lt;br /&gt;
*** Search merge&lt;br /&gt;
*** [https://issues.mediagoblin.org/query?status=new&amp;amp;status=in_progress&amp;amp;status=accepted&amp;amp;status=review&amp;amp;group=status&amp;amp;milestone=0.8.0 Tickets!]&lt;br /&gt;
* Autoconf update&lt;br /&gt;
* Breton&#039;s translation update&lt;br /&gt;
* Federation update&lt;br /&gt;
* Deployment research update&lt;br /&gt;
* Add your things!&lt;br /&gt;
&lt;br /&gt;
=== September 6, 2014, 09:00AM Pacific Time, 16:00 UTC&amp;lt;!-- change to 17:00 for December 2014 --&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
* Things happened! Horray!&lt;br /&gt;
** 0.7.0 is out!&lt;br /&gt;
** GSoC is done!&lt;br /&gt;
* Transifex move... help!&lt;br /&gt;
* 0.8.0 planning&lt;br /&gt;
* Updates on federation&lt;br /&gt;
* Updates on campaign-todo-items&lt;br /&gt;
* Premium hosting and deployment&lt;br /&gt;
* Documentation updates ( j1mc )&lt;br /&gt;
* Triage day!  And the [https://etherpad.mozilla.org/gmg-triage new setup]!&lt;br /&gt;
* Help on reviewing?&lt;br /&gt;
* Epicanis&#039; feature questions&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== August 2, 2014, 09:00AM Pacific Time, 16:00 UTC&amp;lt;!-- change to 17:00 for December 2014 --&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
* GSoC updates&lt;br /&gt;
* State of 0.7.0&lt;br /&gt;
* State of Federation&lt;br /&gt;
* State of post-campaign stuff (rewards, etc)&lt;br /&gt;
* General community updates&lt;br /&gt;
* Feedback: how are things going?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== June 7, 2014, 09:00AM Pacific Time, 16:00 UTC&amp;lt;!-- change to 17:00 for December 2014 --&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
* GSoC updates&lt;br /&gt;
* Researchcation brief summary&lt;br /&gt;
* Campaign-related updates&lt;br /&gt;
* Upcoming release&lt;br /&gt;
* Code reviews&lt;br /&gt;
&lt;br /&gt;
=== May 3, 2014, 09:00AM Pacific Time, 16:00 UTC&amp;lt;!-- change to 17:00 for December 2014 --&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
* GSoC starts!&lt;br /&gt;
* Post campaign updates!&lt;br /&gt;
** Horray, we did it!&lt;br /&gt;
** Unlocked features&lt;br /&gt;
** The rewards&lt;br /&gt;
** Premium hosting brainstorm&lt;br /&gt;
** Extra features brainstorm&lt;br /&gt;
* [http://lists.mediagoblin.org/pipermail/devel/2014-May/000867.html Metadata] discussion&lt;br /&gt;
* Chris&#039; researchcation&lt;br /&gt;
** Federation stuff&lt;br /&gt;
** Deployment stuff&lt;br /&gt;
** Other stuff?&lt;br /&gt;
* Help review!&lt;br /&gt;
* Add your items HERE!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== March 1st, 2014, 09:00AM Pacific Time, 17:00 UTC&amp;lt;!-- change to 16:00 for April-November 2014; then to 17:00 for December 2014 --&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
* GSoC&lt;br /&gt;
* The [http://mediagoblin.org/pages/campaign.html crowdfunding campaign!]&lt;br /&gt;
** State of things / Q &amp;amp; A&lt;br /&gt;
** You can help!&lt;br /&gt;
* MediaGoblin in the meanwhile&lt;br /&gt;
&lt;br /&gt;
=== November 2nd, 2013, 09:00AM Pacific Time, 16:00 UTC ===&lt;br /&gt;
&lt;br /&gt;
Pretty loose on the schedule this month? :)&lt;br /&gt;
&lt;br /&gt;
* Post-conference wrapup stuff?&lt;br /&gt;
* What&#039;s ahead in the next year for MediaGoblin?&lt;br /&gt;
&lt;br /&gt;
=== October 5th, 2013, 09:00AM Pacific Time, 16:00 UTC ===&lt;br /&gt;
&lt;br /&gt;
* Post-OPW/GSoC wrapup discussion &lt;br /&gt;
* Huge pile of code to review&lt;br /&gt;
* Planning out 0.6.0&lt;br /&gt;
* Road to 1.0&lt;br /&gt;
* mediagoblin.org changes&lt;br /&gt;
* GNU 30th recap, upcoming conferences&lt;br /&gt;
* MediaGoblin&#039;s graphic design?&lt;br /&gt;
&lt;br /&gt;
=== September 7th, 2013 ===&lt;br /&gt;
&lt;br /&gt;
* 0.5.0 release recap!&lt;br /&gt;
* Next release: 0.6.0!&lt;br /&gt;
* GSoC/OPW updates&lt;br /&gt;
* Review queue that needs attention&lt;br /&gt;
* GNU 30th! (and traveling)&lt;br /&gt;
* Other things???&lt;br /&gt;
&lt;br /&gt;
=== August 3rd, 2013 9:00 am Pacific Time (2013-08-03 16:00 UTC) ===&lt;br /&gt;
&lt;br /&gt;
* Configure &amp;amp;&amp;amp; make merge&lt;br /&gt;
* 0.5.0 plans&lt;br /&gt;
* GSoC / OPW updates&lt;br /&gt;
* GNU 30th birthday party / GoblinCon? :)&lt;br /&gt;
* Documentation overhaul&lt;br /&gt;
* Reprocessing&lt;br /&gt;
* Bonus topics&lt;br /&gt;
** Mumble server&lt;br /&gt;
** XUDD&lt;br /&gt;
&lt;br /&gt;
=== July 6th, 2013 9:00 am Pacific Time (2013-07-06 16:00 UTC) ===&lt;br /&gt;
&lt;br /&gt;
* 0.4.0 is out! On to 0.4.1!&lt;br /&gt;
* OPW/GSoC update&lt;br /&gt;
* Federation status&lt;br /&gt;
* Module owners (and reducing the &amp;quot;Chris Webber bottleneck&amp;quot;)?&lt;br /&gt;
** Projects like Blender, the Linux Kernel, and qemu have &amp;quot;module owners&amp;quot;, people responsible for a domain of the code&lt;br /&gt;
** Could/should MediaGoblin do the same?&lt;br /&gt;
** How would that be broken up?&lt;br /&gt;
&lt;br /&gt;
=== Jun 1st, 2013 9:00 am Pacific Time (2013-06-01 16:00 UTC) ===&lt;br /&gt;
&lt;br /&gt;
* Welcoming our GSoC and OPW interns&lt;br /&gt;
* The coming 0.4.0&lt;br /&gt;
* What&#039;s after 0.4.0?&lt;br /&gt;
* RTL&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== May 4th, 2013, 9:00 am Pacific Time (2013-05-04 16:00 UTC) ===&lt;br /&gt;
&lt;br /&gt;
[[meeting-2013-05-04|May 4th, 2013, 9:00 am Pacific Time (2013-05-04 16:00 UTC)]]&lt;br /&gt;
&lt;br /&gt;
* GSOC and Gnome Outreach for Women participation update&lt;br /&gt;
* Mention the bug triage meeting&lt;br /&gt;
* Improving our unit tests?&lt;br /&gt;
* 0.4.0 release coming soon&lt;br /&gt;
* Help review code?&lt;br /&gt;
* Thanking simonft for sysadmin help!&lt;br /&gt;
&lt;br /&gt;
=== April 6, 2013, 9:00 am Pacific Time (2013-03-30 16:00 UTC) ===&lt;br /&gt;
&lt;br /&gt;
* Plugins update&lt;br /&gt;
* Post-libreplanet sprint merging&lt;br /&gt;
* Gstreamer 1.0 stuff (if Joar is here!)&lt;br /&gt;
* GSOC and Gnome Outreach for Women participation&lt;br /&gt;
* ???&lt;br /&gt;
&lt;br /&gt;
=== March 2nd, 2013, 9:00 am Pacific Time (2013-03-02 16:00 UTC) ===&lt;br /&gt;
&lt;br /&gt;
* Bug triage day discussion&lt;br /&gt;
* Upgrading Trac to 1.0&lt;br /&gt;
* Next release: 0.3.3&lt;br /&gt;
* Consider have release dates?&lt;br /&gt;
* Plugin stystem&lt;br /&gt;
* Consider moving to GStreamer 1.0&lt;br /&gt;
** Debian - 1.0 in sid&lt;br /&gt;
** Ubuntu - 1.0 in 12.10&lt;br /&gt;
*** Possibly backports for 12.04&lt;br /&gt;
** Fedora - 1.0 in 18&lt;br /&gt;
* Upcoming conferences and hackathons&lt;br /&gt;
&lt;br /&gt;
=== February 9th, 2013, 9:00 am Pacific Time (2013-02-09 16:00 UTC) ===&lt;br /&gt;
&lt;br /&gt;
* 0.3.3 milestone!  What about our next release? :)&lt;br /&gt;
* Where to put Developer docs?&lt;br /&gt;
*: Our Documentation for developers is currently a bit split. Some are on the wiki, some in the main docs. There are pros and cons for both. We should consider where to put things. One place? Which? Or decide on an individual basis?&lt;br /&gt;
*: Good about main docs: Easy to integrate source code doc strings. That way internal api docs can be kept mostly up to date.&lt;br /&gt;
*: Good about wiki: Doesn&#039;t feel so &amp;quot;set in stone&amp;quot;.&lt;br /&gt;
* wiki spam: Do we want to change something?&lt;br /&gt;
* [http://lists.mediagoblin.org/pipermail/devel/2012-November/000307.html Designing features!]&lt;br /&gt;
* Plugins, and architecting for plugins&lt;br /&gt;
* Chris Webber gives updates on how he&#039;s settling into his role ;)&lt;br /&gt;
&lt;br /&gt;
=== October 13th, 2012, 9:00 am Pacific Time (2012-10-13 16:00 UTC) ===&lt;br /&gt;
&lt;br /&gt;
* 0.3.2 release&lt;br /&gt;
** What existing features need to be wrapped up?&lt;br /&gt;
*** Werkzeug switch&lt;br /&gt;
** What time might we do the release?&lt;br /&gt;
* Fundraising campaign&lt;br /&gt;
** Keeping things going mid-campaign&lt;br /&gt;
** You have questions?  I have answers, kinda :)&lt;br /&gt;
* Getting new contributors involved&lt;br /&gt;
* Plugins?  New features?&lt;br /&gt;
&lt;br /&gt;
==== Etherpad ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
AGENDA&lt;br /&gt;
&lt;br /&gt;
     0.3.2 release &lt;br /&gt;
&lt;br /&gt;
     What existing features need to be wrapped up? &lt;br /&gt;
&lt;br /&gt;
     Werkzeug switch &lt;br /&gt;
&lt;br /&gt;
     What time might we do the release? &lt;br /&gt;
&lt;br /&gt;
    Congrats to Deb from the mediagoblin team! Congrats de Deb!&lt;br /&gt;
&lt;br /&gt;
     Fundraising campaign &lt;br /&gt;
&lt;br /&gt;
     Keeping things going mid-campaign &lt;br /&gt;
&lt;br /&gt;
     You have questions?  I have answers, kinda :) &lt;br /&gt;
&lt;br /&gt;
     Getting new contributors involved &lt;br /&gt;
&lt;br /&gt;
     Plugins?  New features? &lt;br /&gt;
&lt;br /&gt;
-- http://wiki.mediagoblin.org/Meeting#Next_Meeting&lt;br /&gt;
Fundraising stuff&lt;br /&gt;
Things are going great mostly when people check it out!&lt;br /&gt;
But how to spread the word?&lt;br /&gt;
&lt;br /&gt;
    should contact more podcasts, etc&lt;br /&gt;
&lt;br /&gt;
    currently working with FSF on this&lt;br /&gt;
&lt;br /&gt;
    need community to spread the word!&lt;br /&gt;
&lt;br /&gt;
    List of places already spreaded list and contacted&lt;br /&gt;
&lt;br /&gt;
VideoThumbnailerMarkII&lt;br /&gt;
New video thumbnailer, rewritten to try to eliminate a bug in the old one where processing would stall.&lt;br /&gt;
New bugs introduce (of course ;)&lt;br /&gt;
Collections&lt;br /&gt;
Merged - Thanks aaronw!&lt;br /&gt;
WebOb =&amp;gt; Werkzeug switch&lt;br /&gt;
Made some things break. Need help with testing + bugfixes&lt;br /&gt;
borked stuffs:&lt;br /&gt;
&lt;br /&gt;
    Accessing paths without trailing slashes, e.g. /submit (instead of /submit/)&lt;br /&gt;
&lt;br /&gt;
    Still a lot of legacy WebOb responses (such as webob.exc.HTTPFound() HTTPForbidden() left)&lt;br /&gt;
&lt;br /&gt;
API&lt;br /&gt;
Delivered to mrn.is, tryggvib will test it and get back with feedback.&lt;br /&gt;
Working, still a lot of room for improvements.&lt;br /&gt;
Mostly done, usable, still room for improvements. Example applications:&lt;br /&gt;
&lt;br /&gt;
    https://github.com/jwandborg/automgtic&lt;br /&gt;
&lt;br /&gt;
    https://github.com/jwandborg/omgmg&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== September 1st, 2012, 9:00 am Pacific Time (2012-09-01 16:00 UTC) ===&lt;br /&gt;
&lt;br /&gt;
[http://mediagoblin.org/irclogs/irc_meeting_2012-09-01.txt IRC log]&lt;br /&gt;
&lt;br /&gt;
* FIXME - can someone type in summary here?&lt;br /&gt;
&lt;br /&gt;
=== August 4th, 2012, 9:00 am Pacific Time (2012-08-04 16:00 UTC) ===&lt;br /&gt;
&lt;br /&gt;
[http://mediagoblin.org/irclogs/irc_meeting_2012-08-04.txt IRC log]&lt;br /&gt;
&lt;br /&gt;
* Release schedule&lt;br /&gt;
* Plugins and themes! Who&#039;s working on one? What problems are you having? -- Please write up issues for problems so they can get fixed!&lt;br /&gt;
* Should we namespace plugins? If so, how should we namespace plugins?&lt;br /&gt;
** Python 3.3 will have support for namespace plugins. [http://www.python.org/dev/peps/pep-0420/#namespace-packages-today]&lt;br /&gt;
** In Python &amp;gt;=2.3, &amp;lt;3.3 it&#039;s a hack [http://www.python.org/dev/peps/pep-0402/#the-problem][http://www.python.org/dev/peps/pep-0420/#namespace-packages-today]&lt;br /&gt;
** Flask has a workaround[https://github.com/mitsuhiko/flask/blob/master/flask/ext/__init__.py]&lt;br /&gt;
&lt;br /&gt;
=== July 7th, 2012, 9:00 am Pacific Time (2012-07-07 16:00 UTC) ===&lt;br /&gt;
&lt;br /&gt;
[http://mediagoblin.org/irclogs/irc_meeting_2012-07-07.txt IRC log]&lt;br /&gt;
&lt;br /&gt;
Announcements:&lt;br /&gt;
&lt;br /&gt;
* Anyone who wants to edit the wiki needs to be in the goblin army group. Ask Will or Chris to get added.&lt;br /&gt;
* Plugin infrastructure landed. If you&#039;re interested in writing plugins, talk to Will. Some documentation at http://docs.mediagoblin.org/#part-2-plugin-writer-s-guide&lt;br /&gt;
&lt;br /&gt;
Agenda:&lt;br /&gt;
&lt;br /&gt;
* Keyboard shortcuts ([http://issues.mediagoblin.org/ticket/346 #346])&lt;br /&gt;
* Ticket triaging?&lt;br /&gt;
* Base plugin stuff!&lt;br /&gt;
* Theming&lt;br /&gt;
* Conference: OSCON&lt;br /&gt;
* Chris Webber&#039;s new &amp;quot;office hours&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== June 2nd, 2012, 9:00 am Pacific Time ===&lt;br /&gt;
&lt;br /&gt;
[http://mediagoblin.org/irclogs/irc_meeting_2012-06-02.txt IRC log]&lt;br /&gt;
&lt;br /&gt;
* docs changes&lt;br /&gt;
** Will split the docs/ guide into a Site Administrator&#039;s Guide and a Plugin Writer&#039;s Guide&lt;br /&gt;
** Has anyone looked at the Plugin Writer&#039;s Guide, yet?&lt;br /&gt;
** Will wants to add a &amp;quot;Contributor&#039;s Guide&amp;quot; to docs/ which he&#039;d update from the wiki before every release&lt;br /&gt;
* Is there a way to improve our unit tests and motivation to write them?&lt;br /&gt;
** Simulating a browser by the way of [http://phantomjs.org/ PhantomJS], [http://seleniumhq.org/ Selenium] instead of having code simulating other code against itself might be more natural to write and even more testing the actual application. I have a good feeling about this, please prove me wrong if I&#039;d be. --[[User:Joar|Joar]] 08:53, 28 May 2012 (EDT)&lt;br /&gt;
* Administrative panel/tools and user uploads panel&lt;br /&gt;
* Git and tickets &lt;br /&gt;
* Plugins&lt;br /&gt;
** What&#039;s the state of things?&lt;br /&gt;
** Documentation&lt;br /&gt;
** What plugins might we want to build for this upcoming release?&lt;br /&gt;
** What things do we currently have that we might want to pluginify?&lt;br /&gt;
* State of kuneco/federation mini-update (Chris)&lt;br /&gt;
&lt;br /&gt;
=== May 5th, 2012, 9:00 am Pacific Time ===&lt;br /&gt;
&lt;br /&gt;
[http://mediagoblin.org/irclogs/irc_meeting_2012-05-05.txt IRC log]&lt;br /&gt;
&lt;br /&gt;
* Post-release reflections&lt;br /&gt;
** Woohoo, release!&lt;br /&gt;
** How did this release process go?&lt;br /&gt;
*** We should talk about that conference.&lt;br /&gt;
** What&#039;s left to clean up?&lt;br /&gt;
*** Mongokit-&amp;gt;SQL &amp;quot;style&amp;quot; query conversion?&lt;br /&gt;
*** Other cruft code?&lt;br /&gt;
* What are our next goals?&lt;br /&gt;
** Plugins&lt;br /&gt;
** Federation&lt;br /&gt;
** Favoriting&lt;br /&gt;
*** Take that, Pinterest! ;)&lt;br /&gt;
** Galleries&lt;br /&gt;
** Theming&lt;br /&gt;
*** Using sass would be neat&lt;br /&gt;
** Access restrictions&lt;br /&gt;
*** User management, or having a &amp;quot;secret url&amp;quot; that is not in the photo index that you can share with friends and generate as needed for any media type&lt;br /&gt;
** What about traffic? Some of us will host GMG on limited plans.&lt;br /&gt;
** Some kind of coding guidelines? Do we have a philosophy like &amp;quot;Keep it Simple, Stupid&amp;quot;&lt;br /&gt;
*** This concerns things like: Should plugins land in core eventually, do we want to support ALL THE MEDIA TYPES, ...&lt;br /&gt;
** Podcasting support?&lt;br /&gt;
** Things that have been hanging???&lt;br /&gt;
** Bugtrackers and milestone?&lt;br /&gt;
** More??? We should organize things!&lt;br /&gt;
* jancborchardt and his team of UX wizard-students&lt;br /&gt;
* Website redesign&lt;br /&gt;
* OpenShift?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== April 7th, 2012, 4:00 pm UTC ===&lt;br /&gt;
&lt;br /&gt;
[http://mediagoblin.org/irclogs/irc_meeting_2012-04-07.txt IRC log]&lt;br /&gt;
&lt;br /&gt;
* Post-SQL stuff&lt;br /&gt;
* Pending 0.0.3 release!&lt;br /&gt;
* Are there stray patches/branches to be merged?&lt;br /&gt;
* Our glorious upcoming plugin future! (Update from Will)&lt;br /&gt;
&lt;br /&gt;
=== March 3rd, 2012, 9:00 am Pacific Time ===&lt;br /&gt;
&lt;br /&gt;
[http://mediagoblin.org/irclogs/irc_meeting_2012-03-03.txt IRC log]&lt;br /&gt;
&lt;br /&gt;
* [[GSOC 2012]]&lt;br /&gt;
* State of the SQL transition (preview: it&#039;s super close, but we need help!)&lt;br /&gt;
* Plugin discussion (Will can&#039;t make this, but we should talk about use cases)&lt;br /&gt;
* MediaGoblin at upcoming conferences&lt;br /&gt;
* PageKite accounts&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 2012-02 (held on 2012-02-04) ===&lt;br /&gt;
&lt;br /&gt;
[http://mediagoblin.org/irclogs/irc_meeting_2012-02-04.txt IRC log]&lt;br /&gt;
&lt;br /&gt;
* Code style guide?  See also: http://issues.mediagoblin.org/ticket/197&lt;br /&gt;
* Kuneco/federation&lt;br /&gt;
* API&lt;br /&gt;
* More testing discussion?&lt;br /&gt;
* Theming?&lt;br /&gt;
* Preliminary plugin discussion&lt;br /&gt;
* Status update from the &amp;quot;SQL Team&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Some of the decisions:&lt;br /&gt;
&lt;br /&gt;
* file an issue about proper &amp;amp;lt;audio&amp;amp;gt; support.&lt;br /&gt;
* some TODOs recorded&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 2011-12 (held on 2011-12-03) ===&lt;br /&gt;
&lt;br /&gt;
[http://mediagoblin.org/irclogs/irc_meeting_2011-12-03.txt IRC log]&lt;br /&gt;
&lt;br /&gt;
* We plan to create a plugin system.  Do we want to create that soon or push it off until things settle a bit more?  ([[User:Willkg|Willkg]] 08:54, 10 November 2011 (EST))&lt;br /&gt;
* [[Feature Ideas]]: What should we do about the wiki page? Keep it and have it as a monthly topic for &amp;quot;what next&amp;quot;? Convert everything to long waiting bugs?&lt;br /&gt;
* Possibility of an [[SQL Database Backend]]?&lt;br /&gt;
*: &#039;executive summary&#039; (well, you should read the long docs): &amp;quot;We could move to sql. It&#039;s probably replacing one type of pain by another type of pain, but those are somewhat comparable. Leaving the main question: Do we want to occupy our main devs for some long time with this task and loose momentum?&amp;quot;&lt;br /&gt;
* Schendje&#039;s [http://wiki.mediagoblin.org/Feature_Ideas/Activities activities proposal]&lt;br /&gt;
* &amp;quot;Coming up next&amp;quot; blogpost draft by Deb Nicholson&lt;br /&gt;
* Jef&#039;s requests:&lt;br /&gt;
** Ticket #466 &amp;quot;Use of &amp;quot;Submit&amp;quot; in site copy is sterile and not as friendly and welcoming as it could be&amp;quot;. I&#039;d really like to change this soon to something more suitable. How can we improve the wording here? Some alternatives have been mentioned in the bug report, but which one should we pick? Link: http://bugs.foocorp.net/issues/466&lt;br /&gt;
** The concept and naming of &amp;quot;favourites&amp;quot;. We&#039;ll (hopefully) be able to &amp;quot;favourite&amp;quot; media soon, which I *think* means that 1) it&#039;ll work like a &amp;quot;I like this&amp;quot; comment, a quick token of appreciation, 2) it&#039;ll be added to your list of favourites so you can save and promote it, and 3) we could maybe use the number of favourites as a ranking. What I&#039;d like to know is: is that the intended purpose? If so, should we name them favo(u)rites or something else? &amp;quot;Like&amp;quot;, &amp;quot;love&amp;quot;, &amp;quot;save&amp;quot;, &amp;quot;appreciate&amp;quot;, &amp;quot;heart&amp;quot;, &amp;quot;high five&amp;quot; and many more could all be contenders. And the name should be consistent with the action and purpose, of course. So I&#039;d like to clear up how and why we will use favourites and what we should call them.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 2011-11 (held on 2011-11-05) ===&lt;br /&gt;
&lt;br /&gt;
[http://mediagoblin.org/irclogs/irc_meeting_2011-11-05.txt IRC log]&lt;br /&gt;
&lt;br /&gt;
* What happened in the last month, what was good, what could be better next time?&lt;br /&gt;
** Release:&lt;br /&gt;
*** Good: 0.1.0 released!&lt;br /&gt;
*** Bad: postponing vs not postponing&lt;br /&gt;
** Sites and deployment documentation:&lt;br /&gt;
*** Good: new mediagoblin.org&lt;br /&gt;
*** Good: deployment documentation&lt;br /&gt;
*** Bad: py-bcrypt’s site was down just after the release, so the virtualenv deployment didn’t work, and it wasn’t clear how to fix it.&lt;br /&gt;
** Live instances:&lt;br /&gt;
*** Joar has a live instance!&lt;br /&gt;
*** But what does it mean? Should ordinary users start using it?&lt;br /&gt;
**** Details at [[User:Joar/mg.wandborg.se]] -- [[User:Joar|Joar]] 17:01, 6 November 2011 (EST)&lt;br /&gt;
*** nyergler added a note about &amp;quot;heartbeat&amp;quot;/status to API notes&lt;br /&gt;
* What should be done next month?&lt;br /&gt;
* Starting real work on federation (via OStatus)... and do we split any of this work out into its own library?&lt;br /&gt;
* An API&lt;br /&gt;
* Creative Commons licensing tools&lt;br /&gt;
* Merging in the multimedia/video branch&lt;br /&gt;
*: (this is *very close* already actually thanks to the hard work of Joar Wandborg!  But we need some help on the gstreamer front to fix a few issues... if you or someone you know is an expert in this area we could really use their help to make the videos that come out smoother!)&lt;br /&gt;
* Rollover items from 0.1.0&lt;br /&gt;
* Multiple file upload interface&lt;br /&gt;
* Drag and drop uploads interface (probably related!)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 2011-10 (held on 2011-10-01) ===&lt;br /&gt;
&lt;br /&gt;
[http://mediagoblin.org/irclogs/irc_meeting_2011-10-01.txt IRC log]&lt;br /&gt;
&lt;br /&gt;
This month&#039;s meeting was a quickly announced short meeting. The project is getting back on track and next month&#039;s meeting will be scheduled more properly. A bunch of people were around.&lt;br /&gt;
&lt;br /&gt;
The most important decisions:&lt;br /&gt;
* The project will keep monthly releases. They&#039;re the heartbeat of the project.&lt;br /&gt;
* Release 0.1.0 this sunday/monday.&lt;br /&gt;
* New website will hopefully be deployed in the next few days.&lt;br /&gt;
* And the following things are planned to happen during this month: Most importantly federation. The developers have decided to make up their minds on what federation aactually should mean for MediaGoblin. Concerning code, probably &amp;quot;activity streams&amp;quot; are the first goal. If there is no (good) python library for this, a new stand alone library may be created. If so, a name for it has to be found. It should have something about communication in it. And the other thing to happen during this month is an ongoing discussion about &amp;quot;bus factor&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 2011-09 (held on 2011-09-03) ===&lt;br /&gt;
&lt;br /&gt;
[http://mediagoblin.org/irclogs/irc_meeting_2011-09-03.txt IRC log]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 2011-08 (held on 2011-08-06) ===&lt;br /&gt;
&lt;br /&gt;
[http://mediagoblin.org/irclogs/irc_meeting_2011-08-06.txt IRC log]&lt;/div&gt;</summary>
		<author><name>Breton</name></author>
	</entry>
	<entry>
		<id>https://wiki.mediagoblin.org/index.php?title=CommunityGovernance&amp;diff=1705</id>
		<title>CommunityGovernance</title>
		<link rel="alternate" type="text/html" href="https://wiki.mediagoblin.org/index.php?title=CommunityGovernance&amp;diff=1705"/>
		<updated>2015-06-06T19:27:25Z</updated>

		<summary type="html">&lt;p&gt;Breton: /* MediaGoblin translation platform */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
MediaGoblin is a community project and we everybody try to help each other. Chris Webber is our lead developer, but the project should be able to self govern so he can take a break if he needs it or when he or other contributors take deserved holidays :) &lt;br /&gt;
&lt;br /&gt;
In general, you can ask anything in the mailing list or the IRC channel and hopefully somebody will answer soon. Topics are discussed in the mailing list, IRC channel or monthly meetings (in the IRC channel).&lt;br /&gt;
&lt;br /&gt;
In this page we list several tasks or areas along with the names or nicks of MediaGoblin community members that may help on them (for example, because they have permissions to perform certain operations). Please be kind when asking for help, most of us are volunteering for MediaGoblin in our free time, so answers or problems resolution can take a while.&lt;br /&gt;
&lt;br /&gt;
Feel free to edit this page to list more tasks or sign the ones you self-assign.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
More information about this in this mailing list thread: http://lists.mediagoblin.org/pipermail/devel/XXXXX&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== MediaGoblin codebase ==&lt;br /&gt;
&lt;br /&gt;
* People with permissions to commit/merge and handle the main codebase&lt;br /&gt;
&lt;br /&gt;
* General stuff: breton&lt;br /&gt;
* Python 3 support: berkerpeksag (berker on IRC), breton&lt;br /&gt;
* Audio/Video: breton&lt;br /&gt;
&lt;br /&gt;
== MediaGoblin website ==&lt;br /&gt;
&lt;br /&gt;
* People with permissions to handle website outages&lt;br /&gt;
&lt;br /&gt;
* Publish pages (for example new releases)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== MediaGoblin wiki ==&lt;br /&gt;
&lt;br /&gt;
* Wiki administration&lt;br /&gt;
&lt;br /&gt;
== MediaGoblin issue tracker ==&lt;br /&gt;
&lt;br /&gt;
* Help triaging bugs:&lt;br /&gt;
&lt;br /&gt;
* People with permissions to create accounts in trac&lt;br /&gt;
&lt;br /&gt;
* People with permissions to delete users/issues/comments in trac&lt;br /&gt;
&lt;br /&gt;
* Volunteers for spam cleaning: LArjona&lt;br /&gt;
&lt;br /&gt;
== MediaGoblin translation platform ==&lt;br /&gt;
&lt;br /&gt;
* If there is need of manual import/export files between Pootle and the MediaGoblin codebase, who can help on that&lt;br /&gt;
* LArjona (Spanish translator) can guide new translators, reproduce problems in the translation platform, test changes, and help with Pootle quality checks. Available in the mailing list and IRC channel.&lt;br /&gt;
* breton knows how and why translations are downloaded/compiled&lt;br /&gt;
&lt;br /&gt;
== MediaGoblin IRC channel and mailing list ==&lt;br /&gt;
&lt;br /&gt;
* Change IRC topic, channel operators&lt;/div&gt;</summary>
		<author><name>Breton</name></author>
	</entry>
	<entry>
		<id>https://wiki.mediagoblin.org/index.php?title=CommunityGovernance&amp;diff=1704</id>
		<title>CommunityGovernance</title>
		<link rel="alternate" type="text/html" href="https://wiki.mediagoblin.org/index.php?title=CommunityGovernance&amp;diff=1704"/>
		<updated>2015-06-06T19:26:47Z</updated>

		<summary type="html">&lt;p&gt;Breton: /* MediaGoblin codebase */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
MediaGoblin is a community project and we everybody try to help each other. Chris Webber is our lead developer, but the project should be able to self govern so he can take a break if he needs it or when he or other contributors take deserved holidays :) &lt;br /&gt;
&lt;br /&gt;
In general, you can ask anything in the mailing list or the IRC channel and hopefully somebody will answer soon. Topics are discussed in the mailing list, IRC channel or monthly meetings (in the IRC channel).&lt;br /&gt;
&lt;br /&gt;
In this page we list several tasks or areas along with the names or nicks of MediaGoblin community members that may help on them (for example, because they have permissions to perform certain operations). Please be kind when asking for help, most of us are volunteering for MediaGoblin in our free time, so answers or problems resolution can take a while.&lt;br /&gt;
&lt;br /&gt;
Feel free to edit this page to list more tasks or sign the ones you self-assign.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
More information about this in this mailing list thread: http://lists.mediagoblin.org/pipermail/devel/XXXXX&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== MediaGoblin codebase ==&lt;br /&gt;
&lt;br /&gt;
* People with permissions to commit/merge and handle the main codebase&lt;br /&gt;
&lt;br /&gt;
* General stuff: breton&lt;br /&gt;
* Python 3 support: berkerpeksag (berker on IRC), breton&lt;br /&gt;
* Audio/Video: breton&lt;br /&gt;
&lt;br /&gt;
== MediaGoblin website ==&lt;br /&gt;
&lt;br /&gt;
* People with permissions to handle website outages&lt;br /&gt;
&lt;br /&gt;
* Publish pages (for example new releases)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== MediaGoblin wiki ==&lt;br /&gt;
&lt;br /&gt;
* Wiki administration&lt;br /&gt;
&lt;br /&gt;
== MediaGoblin issue tracker ==&lt;br /&gt;
&lt;br /&gt;
* Help triaging bugs:&lt;br /&gt;
&lt;br /&gt;
* People with permissions to create accounts in trac&lt;br /&gt;
&lt;br /&gt;
* People with permissions to delete users/issues/comments in trac&lt;br /&gt;
&lt;br /&gt;
* Volunteers for spam cleaning: LArjona&lt;br /&gt;
&lt;br /&gt;
== MediaGoblin translation platform ==&lt;br /&gt;
&lt;br /&gt;
* If there is need of manual import/export files between Pootle and the MediaGoblin codebase, who can help on that&lt;br /&gt;
* LArjona (Spanish translator) can guide new translators, reproduce problems in the translation platform, test changes, and help with Pootle quality checks. Available in the mailing list and IRC channel.&lt;br /&gt;
&lt;br /&gt;
== MediaGoblin IRC channel and mailing list ==&lt;br /&gt;
&lt;br /&gt;
* Change IRC topic, channel operators&lt;/div&gt;</summary>
		<author><name>Breton</name></author>
	</entry>
	<entry>
		<id>https://wiki.mediagoblin.org/index.php?title=GSOC_2015&amp;diff=1682</id>
		<title>GSOC 2015</title>
		<link rel="alternate" type="text/html" href="https://wiki.mediagoblin.org/index.php?title=GSOC_2015&amp;diff=1682"/>
		<updated>2015-03-20T20:33:54Z</updated>

		<summary type="html">&lt;p&gt;Breton: /* How do I apply as a student? */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;We are hoping to participate in GSOC 2015 under the GNU umbrella. &lt;br /&gt;
&lt;br /&gt;
You may want to check for a &amp;quot;possible mentor&amp;quot; before applying for this topic.  If you have your own idea, probably bring it up in #mediagoblin on irc.freenode.net!&lt;br /&gt;
&lt;br /&gt;
= How do I apply as a student? =&lt;br /&gt;
&lt;br /&gt;
* Submit your application.  Please see the application submission template on the [http://www.gnu.org/software/soc-projects/guidelines.html GNU GSoC guidelines page].&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;
* If you have never done web development in python before, MediaGoblin is a pretty good place to start!  However, we highly recommend going through the [https://docs.djangoproject.com/en/1.7/intro/tutorial01/ Django tutorial]... this isn&#039;t a requirement, but it will help you be better prepared.&lt;br /&gt;
* Work on a small task, and mention it in your application.  The [http://issues.mediagoblin.org/query?status=!closed&amp;amp;keywords=~bitesized bitesized list] is often helpful.&lt;br /&gt;
* Also, be aware when submitting: Summer of Code applicants are expected to work &#039;&#039;&#039;40 hours per week&#039;&#039;&#039;... so, a full time internship!  If you propose, please be sure you are ready to make that level of commitment.&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)!  Please, please join our channel and introduce yourself.  We&#039;d love to hear from you!&lt;br /&gt;
&lt;br /&gt;
= Possible projects with mentors =&lt;br /&gt;
== Chunked uploads / multi-upload UI ==&lt;br /&gt;
&lt;br /&gt;
We want to have multi-upload from cli (usecase: go to my directory with photos and upload them all) and from web-interface (using maybe zip, maybe html5 feature). There is already https://github.com/VenKamikaze/mediagoblin-html5-multi-upload which might be what we need, so before choosing this task please verify.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Possible Mentors:&#039;&#039;&#039; Christopher Allan Webber&lt;br /&gt;
&lt;br /&gt;
== subtitle interface ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Possible Mentors:&#039;&#039;&#039; Christopher Allan Webber, Boris Bobrov&lt;br /&gt;
&lt;br /&gt;
We want subtitle support for our player. Subtitles should be supported as separate files and as embedded into video/audio files. Popular formats should be supported. Also, there can be multiple subtitles per video. It will require work on front-end and maybe some fixes to backend.&lt;br /&gt;
&lt;br /&gt;
== android UI making use of pump api ==&lt;br /&gt;
&lt;br /&gt;
Have you ever seen instagram app? We want something similar using pump api.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Possible mentors&#039;&#039;&#039;: Boris Bobrov (clueless about android development though)&lt;/div&gt;</summary>
		<author><name>Breton</name></author>
	</entry>
	<entry>
		<id>https://wiki.mediagoblin.org/index.php?title=GSOC_2015&amp;diff=1681</id>
		<title>GSOC 2015</title>
		<link rel="alternate" type="text/html" href="https://wiki.mediagoblin.org/index.php?title=GSOC_2015&amp;diff=1681"/>
		<updated>2015-03-16T16:15:55Z</updated>

		<summary type="html">&lt;p&gt;Breton: /* subtitle interface */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;We are hoping to participate in GSOC 2015 under the GNU umbrella. &lt;br /&gt;
&lt;br /&gt;
You may want to check for a &amp;quot;possible mentor&amp;quot; before applying for this topic.  If you have your own idea, probably bring it up in #mediagoblin on irc.freenode.net!&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.  Please see the application submission template on the [http://www.gnu.org/software/soc-projects/guidelines.html GNU GSoC guidelines page].&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;
* If you have never done web development in python before, MediaGoblin is a pretty good place to start!  However, we highly recommend going through the [https://docs.djangoproject.com/en/1.7/intro/tutorial01/ Django tutorial]... this isn&#039;t a requirement, but it will help you be better prepared.&lt;br /&gt;
* Work on a small task, and mention it in your application.  The [http://issues.mediagoblin.org/query?status=!closed&amp;amp;keywords=~bitesized bitesized list] is often helpful.&lt;br /&gt;
* Also, be aware when submitting: Summer of Code applicants are expected to work &#039;&#039;&#039;40 hours per week&#039;&#039;&#039;... so, a full time internship!  If you propose, please be sure you are ready to make that level of commitment.&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)!  Please, please join our channel and introduce yourself.  We&#039;d love to hear from you!&lt;br /&gt;
&lt;br /&gt;
= Possible projects with mentors =&lt;br /&gt;
== Chunked uploads / multi-upload UI ==&lt;br /&gt;
&lt;br /&gt;
We want to have multi-upload from cli (usecase: go to my directory with photos and upload them all) and from web-interface (using maybe zip, maybe html5 feature). There is already https://github.com/VenKamikaze/mediagoblin-html5-multi-upload which might be what we need, so before choosing this task please verify.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Possible Mentors:&#039;&#039;&#039; Christopher Allan Webber&lt;br /&gt;
&lt;br /&gt;
== subtitle interface ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Possible Mentors:&#039;&#039;&#039; Christopher Allan Webber, Boris Bobrov&lt;br /&gt;
&lt;br /&gt;
We want subtitle support for our player. Subtitles should be supported as separate files and as embedded into video/audio files. Popular formats should be supported. Also, there can be multiple subtitles per video. It will require work on front-end and maybe some fixes to backend.&lt;br /&gt;
&lt;br /&gt;
== android UI making use of pump api ==&lt;br /&gt;
&lt;br /&gt;
Have you ever seen instagram app? We want something similar using pump api.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Possible mentors&#039;&#039;&#039;: Boris Bobrov (clueless about android development though)&lt;/div&gt;</summary>
		<author><name>Breton</name></author>
	</entry>
	<entry>
		<id>https://wiki.mediagoblin.org/index.php?title=GSOC_2015&amp;diff=1676</id>
		<title>GSOC 2015</title>
		<link rel="alternate" type="text/html" href="https://wiki.mediagoblin.org/index.php?title=GSOC_2015&amp;diff=1676"/>
		<updated>2015-03-13T09:50:06Z</updated>

		<summary type="html">&lt;p&gt;Breton: /* Possible projects with mentors */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;We are hoping to participate in GSOC 2015 under the GNU umbrella. &lt;br /&gt;
&lt;br /&gt;
You may want to check for a &amp;quot;possible mentor&amp;quot; before applying for this topic.  If you have your own idea, probably bring it up in #mediagoblin on irc.freenode.net!&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.  Please see the application submission template on the [http://www.gnu.org/software/soc-projects/guidelines.html GNU GSoC guidelines page].&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;
* If you have never done web development in python before, MediaGoblin is a pretty good place to start!  However, we highly recommend going through the [https://docs.djangoproject.com/en/1.7/intro/tutorial01/ Django tutorial]... this isn&#039;t a requirement, but it will help you be better prepared.&lt;br /&gt;
* Work on a small task, and mention it in your application.  The [http://issues.mediagoblin.org/query?status=!closed&amp;amp;keywords=~bitesized bitesized list] is often helpful.&lt;br /&gt;
* Also, be aware when submitting: Summer of Code applicants are expected to work &#039;&#039;&#039;40 hours per week&#039;&#039;&#039;... so, a full time internship!  If you propose, please be sure you are ready to make that level of commitment.&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)!  Please, please join our channel and introduce yourself.  We&#039;d love to hear from you!&lt;br /&gt;
&lt;br /&gt;
= Possible projects with mentors =&lt;br /&gt;
== Chunked uploads / multi-upload UI ==&lt;br /&gt;
&lt;br /&gt;
We want to have multi-upload from cli (usecase: go to my directory with photos and upload them all) and from web-interface (using maybe zip, maybe html5 feature). There is already https://github.com/VenKamikaze/mediagoblin-html5-multi-upload which might be what we need, so before choosing this task please verify.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Possible Mentors:&#039;&#039;&#039; Christopher Allan Webber&lt;br /&gt;
&lt;br /&gt;
== Podcast support / feed overhaul ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Possible Mentors:&#039;&#039;&#039; Christopher Allan Webber&lt;br /&gt;
&lt;br /&gt;
== subtitle interface ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Possible Mentors:&#039;&#039;&#039; Christopher Allan Webber, Boris Bobrov&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
We want subtitle support for our player. Subtitles should be supported as separate files and as embedded into video/audio files. Popular formats should be supported. Also, there can be multiple subtitles per video. It will require work on front-end and maybe some fixes to backend.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== android UI making use of pump api ==&lt;br /&gt;
&lt;br /&gt;
Have you ever seen instagram app? We want something similar using pump api.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Possible mentors&#039;&#039;&#039;: Boris Bobrov (clueless about android development though)&lt;br /&gt;
&lt;br /&gt;
= Possible projects, no mentors claimed yet =&lt;br /&gt;
&lt;br /&gt;
== owncloud backend for mg (hmmmm) ==&lt;/div&gt;</summary>
		<author><name>Breton</name></author>
	</entry>
	<entry>
		<id>https://wiki.mediagoblin.org/index.php?title=GSOC_2015&amp;diff=1675</id>
		<title>GSOC 2015</title>
		<link rel="alternate" type="text/html" href="https://wiki.mediagoblin.org/index.php?title=GSOC_2015&amp;diff=1675"/>
		<updated>2015-03-08T21:13:24Z</updated>

		<summary type="html">&lt;p&gt;Breton: some cleanup&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;We are hoping to participate in GSOC 2015 under the GNU umbrella. &lt;br /&gt;
&lt;br /&gt;
You may want to check for a &amp;quot;possible mentor&amp;quot; before applying for this topic.  If you have your own idea, probably bring it up in #mediagoblin on irc.freenode.net!&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.  Please see the application submission template on the [http://www.gnu.org/software/soc-projects/guidelines.html GNU GSoC guidelines page].&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;
* If you have never done web development in python before, MediaGoblin is a pretty good place to start!  However, we highly recommend going through the [https://docs.djangoproject.com/en/1.7/intro/tutorial01/ Django tutorial]... this isn&#039;t a requirement, but it will help you be better prepared.&lt;br /&gt;
* Work on a small task, and mention it in your application.  The [http://issues.mediagoblin.org/query?status=!closed&amp;amp;keywords=~bitesized bitesized list] is often helpful.&lt;br /&gt;
* Also, be aware when submitting: Summer of Code applicants are expected to work &#039;&#039;&#039;40 hours per week&#039;&#039;&#039;... so, a full time internship!  If you propose, please be sure you are ready to make that level of commitment.&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)!  Please, please join our channel and introduce yourself.  We&#039;d love to hear from you!&lt;br /&gt;
&lt;br /&gt;
= Possible projects with mentors =&lt;br /&gt;
== Chunked uploads / multi-upload UI ==&lt;br /&gt;
&lt;br /&gt;
We want to have multi-upload from cli (usecase: go to my directory with photos and upload them all) and from web-interface (using maybe zip, maybe html5 feature). There is already https://github.com/VenKamikaze/mediagoblin-html5-multi-upload which might be what we need, so before choosing this task please verify.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Possible Mentors:&#039;&#039;&#039; Christopher Allan Webber&lt;br /&gt;
&lt;br /&gt;
== Podcast support / feed overhaul ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Possible Mentors:&#039;&#039;&#039; Christopher Allan Webber&lt;br /&gt;
&lt;br /&gt;
== subtitle interface ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Possible Mentors:&#039;&#039;&#039; Christopher Allan Webber, Boris Bobrov&lt;br /&gt;
&lt;br /&gt;
== android UI making use of pump api ==&lt;br /&gt;
&lt;br /&gt;
Have you ever seen instagram app? We want something similar using pump api.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Possible mentors&#039;&#039;&#039;: Boris Bobrov (clueless about android development though)&lt;br /&gt;
&lt;br /&gt;
We want subtitle support for our player. Subtitles should be supported as separate files and as embedded into video/audio files. Popular formats should be supported. Also, there can be multiple subtitles per video. It will require work on front-end and maybe some fixes to backend.&lt;br /&gt;
&lt;br /&gt;
= Possible projects, no mentors claimed yet =&lt;br /&gt;
&lt;br /&gt;
== owncloud backend for mg (hmmmm) ==&lt;/div&gt;</summary>
		<author><name>Breton</name></author>
	</entry>
	<entry>
		<id>https://wiki.mediagoblin.org/index.php?title=GSOC_2015&amp;diff=1674</id>
		<title>GSOC 2015</title>
		<link rel="alternate" type="text/html" href="https://wiki.mediagoblin.org/index.php?title=GSOC_2015&amp;diff=1674"/>
		<updated>2015-03-08T21:11:31Z</updated>

		<summary type="html">&lt;p&gt;Breton: /* android UI making use of pump api */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;We are hoping to participate in GSOC 2015 under the GNU umbrella. &lt;br /&gt;
&lt;br /&gt;
You may want to check for a &amp;quot;possible mentor&amp;quot; before applying for this topic.  If you have your own idea, probably bring it up in #mediagoblin on irc.freenode.net!&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.  Please see the application submission template on the [http://www.gnu.org/software/soc-projects/guidelines.html GNU GSoC guidelines page].&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;
* If you have never done web development in python before, MediaGoblin is a pretty good place to start!  However, we highly recommend going through the [https://docs.djangoproject.com/en/1.7/intro/tutorial01/ Django tutorial]... this isn&#039;t a requirement, but it will help you be better prepared.&lt;br /&gt;
* Work on a small task, and mention it in your application.  The [http://issues.mediagoblin.org/query?status=!closed&amp;amp;keywords=~bitesized bitesized list] is often helpful.&lt;br /&gt;
* Also, be aware when submitting: Summer of Code applicants are expected to work &#039;&#039;&#039;40 hours per week&#039;&#039;&#039;... so, a full time internship!  If you propose, please be sure you are ready to make that level of commitment.&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)!  Please, please join our channel and introduce yourself.  We&#039;d love to hear from you!&lt;br /&gt;
&lt;br /&gt;
= Possible projects with mentors =&lt;br /&gt;
== Chunked uploads / multi-upload UI ==&lt;br /&gt;
&lt;br /&gt;
We want to have multi-upload from cli (usecase: go to my directory with photos and upload them all) and from web-interface (using maybe zip, maybe html5 feature). There is already https://github.com/VenKamikaze/mediagoblin-html5-multi-upload which might be what we need, so before choosing this task please verify.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Possible Mentors:&#039;&#039;&#039; Christopher Allan Webber&lt;br /&gt;
&lt;br /&gt;
== Podcast support / feed overhaul ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Possible Mentors:&#039;&#039;&#039; Christopher Allan Webber&lt;br /&gt;
&lt;br /&gt;
== subtitle interface ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Possible Mentors:&#039;&#039;&#039; Christopher Allan Webber, Boris Bobrov&lt;br /&gt;
&lt;br /&gt;
We want subtitle support for our player. Subtitles should be supported as separate files and as embedded into video/audio files. Popular formats should be supported. Also, there can be multiple subtitles per video. It will require work on front-end and maybe some fixes to backend.&lt;br /&gt;
&lt;br /&gt;
= Possible projects, no mentors claimed yet ==&lt;br /&gt;
&lt;br /&gt;
== android UI making use of pump api ==&lt;br /&gt;
&lt;br /&gt;
Have you ever seen instagram app? We want something similar using pump api.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Possible mentors&#039;&#039;&#039;: Boris Bobrov (clueless about android development though)&lt;br /&gt;
&lt;br /&gt;
== owncloud backend for mg (hmmmm) ==&lt;/div&gt;</summary>
		<author><name>Breton</name></author>
	</entry>
	<entry>
		<id>https://wiki.mediagoblin.org/index.php?title=GSOC_2015&amp;diff=1673</id>
		<title>GSOC 2015</title>
		<link rel="alternate" type="text/html" href="https://wiki.mediagoblin.org/index.php?title=GSOC_2015&amp;diff=1673"/>
		<updated>2015-03-08T21:09:38Z</updated>

		<summary type="html">&lt;p&gt;Breton: /* Possible projects with mentors */ added some info&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;We are hoping to participate in GSOC 2015 under the GNU umbrella. &lt;br /&gt;
&lt;br /&gt;
You may want to check for a &amp;quot;possible mentor&amp;quot; before applying for this topic.  If you have your own idea, probably bring it up in #mediagoblin on irc.freenode.net!&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.  Please see the application submission template on the [http://www.gnu.org/software/soc-projects/guidelines.html GNU GSoC guidelines page].&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;
* If you have never done web development in python before, MediaGoblin is a pretty good place to start!  However, we highly recommend going through the [https://docs.djangoproject.com/en/1.7/intro/tutorial01/ Django tutorial]... this isn&#039;t a requirement, but it will help you be better prepared.&lt;br /&gt;
* Work on a small task, and mention it in your application.  The [http://issues.mediagoblin.org/query?status=!closed&amp;amp;keywords=~bitesized bitesized list] is often helpful.&lt;br /&gt;
* Also, be aware when submitting: Summer of Code applicants are expected to work &#039;&#039;&#039;40 hours per week&#039;&#039;&#039;... so, a full time internship!  If you propose, please be sure you are ready to make that level of commitment.&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)!  Please, please join our channel and introduce yourself.  We&#039;d love to hear from you!&lt;br /&gt;
&lt;br /&gt;
= Possible projects with mentors =&lt;br /&gt;
== Chunked uploads / multi-upload UI ==&lt;br /&gt;
&lt;br /&gt;
We want to have multi-upload from cli (usecase: go to my directory with photos and upload them all) and from web-interface (using maybe zip, maybe html5 feature). There is already https://github.com/VenKamikaze/mediagoblin-html5-multi-upload which might be what we need, so before choosing this task please verify.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Possible Mentors:&#039;&#039;&#039; Christopher Allan Webber&lt;br /&gt;
&lt;br /&gt;
== Podcast support / feed overhaul ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Possible Mentors:&#039;&#039;&#039; Christopher Allan Webber&lt;br /&gt;
&lt;br /&gt;
== subtitle interface ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Possible Mentors:&#039;&#039;&#039; Christopher Allan Webber, Boris Bobrov&lt;br /&gt;
&lt;br /&gt;
We want subtitle support for our player. Subtitles should be supported as separate files and as embedded into video/audio files. Popular formats should be supported. Also, there can be multiple subtitles per video. It will require work on front-end and maybe some fixes to backend.&lt;br /&gt;
&lt;br /&gt;
= Possible projects, no mentors claimed yet ==&lt;br /&gt;
&lt;br /&gt;
== android UI making use of pump api ==&lt;br /&gt;
== owncloud backend for mg (hmmmm) ==&lt;/div&gt;</summary>
		<author><name>Breton</name></author>
	</entry>
	<entry>
		<id>https://wiki.mediagoblin.org/index.php?title=Translations&amp;diff=1626</id>
		<title>Translations</title>
		<link rel="alternate" type="text/html" href="https://wiki.mediagoblin.org/index.php?title=Translations&amp;diff=1626"/>
		<updated>2014-12-07T22:52:27Z</updated>

		<summary type="html">&lt;p&gt;Breton: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= For translators =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color: red;&amp;quot;&amp;gt;This section contains obsolete information. Now Mediagoblin lives on Pootle.&lt;br /&gt;
Before the section is updated, you can ask about the process using one of methods listed on&lt;br /&gt;
http://mediagoblin.org/pages/join.html&amp;lt;/pre&amp;gt;&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;
=== &#039;&#039;&#039;العربية&#039;&#039;&#039; ===&lt;br /&gt;
&lt;br /&gt;
.سنتخذ الاصطلاحات التالية للترجمة العربية. إذا كنت تريد تحسين الترجمة يرجى اقتراح التغبرات في صفحة النقاش في هذا المقال&lt;br /&gt;
{|&lt;br /&gt;
!الانجليزية&lt;br /&gt;
!العربية&lt;br /&gt;
|-&lt;br /&gt;
|MediaGoblin . &lt;br /&gt;
|ميدياغوبلن&lt;br /&gt;
|-&lt;br /&gt;
|media . &lt;br /&gt;
|الميديا&lt;br /&gt;
|-&lt;br /&gt;
|slug . &lt;br /&gt;
|المسار&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>Breton</name></author>
	</entry>
	<entry>
		<id>https://wiki.mediagoblin.org/index.php?title=Deployment&amp;diff=1593</id>
		<title>Deployment</title>
		<link rel="alternate" type="text/html" href="https://wiki.mediagoblin.org/index.php?title=Deployment&amp;diff=1593"/>
		<updated>2014-10-05T22:07:02Z</updated>

		<summary type="html">&lt;p&gt;Breton: /* uwsgi with configs */&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;
= uwsgi =&lt;br /&gt;
&lt;br /&gt;
Possibly a cleaner way to do nginx configuration than the official nginx + fastcgi suggestions!&lt;br /&gt;
&lt;br /&gt;
http://qalthos.github.io/blog/FOSS@RIT/deploying-mediagoblin-1-fastcgi-vs-uwsgi.html&lt;br /&gt;
&lt;br /&gt;
= uwsgi with configs =&lt;br /&gt;
&lt;br /&gt;
Below there are 3 configs: for nginx, for uwsgi version 1.2.3-debian and for supervisord, used to run celery.&lt;br /&gt;
&lt;br /&gt;
In future, when newer versions of uwsgi appear in debian, supervisor can be removed.&lt;br /&gt;
&lt;br /&gt;
All instructions below are for Debian 7. They should also work with rpm-based systems, but with other paths.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get install uwsgi uwsgi-plugin-python nginx-full supervisor;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/etc/nginx/sites-available/mediagoblin:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
        server_name &amp;lt;domain&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
        access_log /var/log/nginx/mg.access.log;&lt;br /&gt;
        error_log /var/log/nginx/mg.error.log error;&lt;br /&gt;
&lt;br /&gt;
        #include global/common.conf;&lt;br /&gt;
&lt;br /&gt;
        client_max_body_size 100m;&lt;br /&gt;
        add_header X-Content-Type-Options nosniff;&lt;br /&gt;
&lt;br /&gt;
        root /path/to/mediagoblin//user_dev/;&lt;br /&gt;
&lt;br /&gt;
        location /mgoblin_static/ {&lt;br /&gt;
                alias /path/to/mediagoblin/mediagoblin/static/;&lt;br /&gt;
        }&lt;br /&gt;
        location /mgoblin_media/ {&lt;br /&gt;
                alias /path/to/mediagoblin/user_dev/media/public/;&lt;br /&gt;
        }&lt;br /&gt;
        location /theme_static/ {&lt;br /&gt;
        }&lt;br /&gt;
        location /plugin_static/ {&lt;br /&gt;
        }&lt;br /&gt;
        location / {&lt;br /&gt;
                uwsgi_pass unix:///tmp/mg.uwsgi.sock;&lt;br /&gt;
                uwsgi_param SCRIPT_NAME &amp;quot;/&amp;quot;;&lt;br /&gt;
                include uwsgi_params;&lt;br /&gt;
        }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/etc/uwsgi/apps-available/mg.yaml:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
uwsgi:&lt;br /&gt;
 uid: mediagoblin&lt;br /&gt;
 gid: mediagoblin&lt;br /&gt;
 socket: /tmp/mg.uwsgi.sock&lt;br /&gt;
 chown-socket: www-data:www-data&lt;br /&gt;
 plugins: python&lt;br /&gt;
 home: /path/to/mediagoblin/&lt;br /&gt;
 chdir: /path/to/mediagoblin/&lt;br /&gt;
 ini-paste: /path/to/mediagoblin/paste_local.ini&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/etc/supervisor/conf.d/mediagoblin.conf:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[program:celery]&lt;br /&gt;
command=/path/to/mediagoblin/bin/celery worker -l debug&lt;br /&gt;
&lt;br /&gt;
; Set PYTHONPATH to the directory containing celeryconfig.py&lt;br /&gt;
environment=PYTHONPATH=&amp;quot;/path/to/mediagoblin&amp;quot;,MEDIAGOBLIN_CONFIG=&amp;quot;/path/to/mediagoblin/mediagoblin_local.ini&amp;quot;,CELERY_CONFIG_MODULE=&amp;quot;mediagoblin.init.celery.from_celery&amp;quot;&lt;br /&gt;
&lt;br /&gt;
directory=/path/to/mediagoblin/&lt;br /&gt;
user=mediagoblin&lt;br /&gt;
numprocs=1&lt;br /&gt;
; uncomment below to enable logs saving&lt;br /&gt;
;stdout_logfile=/some/logs/path/celeryd_stdout.log&lt;br /&gt;
;stderr_logfile=/some/logs/path/celeryd_stderr.log&lt;br /&gt;
autostart=true&lt;br /&gt;
autorestart=false&lt;br /&gt;
startsecs=10&lt;br /&gt;
&lt;br /&gt;
; Need to wait for currently executing tasks to finish at shutdown.&lt;br /&gt;
; Increase this if you have very long running tasks.&lt;br /&gt;
stopwaitsecs = 600&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After setting all configs do:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ln -s /etc/nginx/sites-available/mediagoblin /etc/nginx/sites-enabled/&lt;br /&gt;
ln -s /etc/uwsgi/apps-available/mg.yaml /etc/uwsgi/apps-enabled/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
And don&#039;t forget to restart all your daemons:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
service uwsgi restart;&lt;br /&gt;
service nginx restart;&lt;br /&gt;
service supervisor stop; sleep 1; service supervisor start  # sleep 1 might be needed here because supervisor really stops not at once&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= FCGI script =&lt;br /&gt;
&lt;br /&gt;
This works great with the apache FCGID config example in the next section :) in which case you should name it &amp;quot;mg.fcgi&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Before use, make sure you replace &#039;/path/to/mediagoblin/bin/python&#039; with a real path on your server, e.g. &#039;/srv/www/myhomepage.com/mediagoblin/bin/python&#039;. Also replace &#039;/path/to/mediagoblin/paste.ini&#039;.&lt;br /&gt;
&lt;br /&gt;
If you encounter problems, try executing executing the script manually, e.g. &amp;lt;pre&amp;gt;./mg.fcgi&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Script:&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;
## Uncomment this to run celery in &amp;quot;always eager&amp;quot; mode... ie, you don&#039;t have&lt;br /&gt;
## to run a separate process, but submissions wait till processing finishes&lt;br /&gt;
# import os&lt;br /&gt;
# os.environ[&#039;CELERY_ALWAYS_EAGER&#039;] = &#039;true&#039;&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 main section. libapache2-mod-fcgid can be used, but requires a slightly different configuration. For yum-based distributions, you may need to install mod_fcgid. &lt;br /&gt;
&lt;br /&gt;
  &amp;lt;VirtualHost *:80&amp;gt;&lt;br /&gt;
    Options +ExecCGI&lt;br /&gt;
  &lt;br /&gt;
    # Accept up to 16MB requests&lt;br /&gt;
    FcgidMaxRequestLen 16777216&lt;br /&gt;
  &lt;br /&gt;
    ServerName mediagoblin.example.org&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;
    ScriptAlias / /path/to/mediagoblin/mg.fcgi/&lt;br /&gt;
  &amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Apache 2 Config With mod_wsgi =&lt;br /&gt;
&lt;br /&gt;
Apache can manage the MediaGoblin application itself with mod_wsgi. It requires slightly more configuration on the Apache side, but cuts out the FastCGI middleware. See their [http://code.google.com/p/modwsgi/wiki/ConfigurationGuidelines configuration guidelines] for advanced configuration.&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;VirtualHost *:80&amp;gt;&lt;br /&gt;
    ServerName mediagoblin.example.org&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;
    WSGIScriptAlias / /path/to/mediagoblin/wsgi.py&lt;br /&gt;
    # Set user and group to whatever user you used to install mediagoblin (if you used a system account, &lt;br /&gt;
    # it may have the group &#039;nogroup&#039; assigned, in that case you can remove the group parameter)&lt;br /&gt;
    # Remember to change python-path too!&lt;br /&gt;
    # Replace the python version in the &#039;python-path&#039; below with the correct one (eg 2.x -&amp;gt; 2.7)&lt;br /&gt;
    WSGIPassAuthorization On&lt;br /&gt;
    WSGIDaemonProcess gmg user=mediagoblin group=mediagoblin processes=2 threads=10 \&lt;br /&gt;
        umask=0007 inactivity-timeout=900 maximum-requests=1000 \&lt;br /&gt;
        python-path=/path/to/mediagoblin/:/path/to/mediagoblin/lib/python-2.x/site-packages/&lt;br /&gt;
    WSGIProcessGroup gmg&lt;br /&gt;
    WSGIApplicationGroup %{GLOBAL}&lt;br /&gt;
   &lt;br /&gt;
        &amp;lt;Directory &amp;quot;/path/to/mediagoblin/mediagoblin/static/&amp;quot;&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 &amp;quot;/path/to/mediagoblin/user_dev/media/public&amp;quot;&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;/VirtualHost&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You&#039;ll also need to copy this into /path/to/mediagoblin/wsgi.py:&lt;br /&gt;
&lt;br /&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;
  &lt;br /&gt;
  import site&lt;br /&gt;
  # Replace the python version with the correct one in the line below (eg 2.x -&amp;gt; 2.7)&lt;br /&gt;
  site.addsitedir(&#039;/path/to/mediagoblin/lib/python-2.x/site-packages&#039;)&lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
  from paste.deploy import loadapp&lt;br /&gt;
  &lt;br /&gt;
  CONFIG_PATH = &#039;/path/to/mediagoblin/paste.ini&#039;&lt;br /&gt;
  &lt;br /&gt;
  ## Uncomment this to run celery in &amp;quot;always eager&amp;quot; mode... ie, you don&#039;t have&lt;br /&gt;
  ## to run a separate process, but submissions wait till processing finishes&lt;br /&gt;
  #import os&lt;br /&gt;
  #os.environ[&#039;CELERY_ALWAYS_EAGER&#039;] = &#039;true&#039;&lt;br /&gt;
  &lt;br /&gt;
  application = loadapp(&#039;config:&#039; + CONFIG_PATH)&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;
If it is too slow and you use the deflate module, you could try to use the following option : SetOutputFilter INFLATE&lt;br /&gt;
&lt;br /&gt;
= Lighttpd =&lt;br /&gt;
&lt;br /&gt;
This configuration example uses mod_fastcgi.&lt;br /&gt;
Make a symbolic link from &amp;lt;pre&amp;gt;/etc/lighttpd/conf-available/10-fastcgi.conf&amp;lt;/pre&amp;gt; to &amp;lt;pre&amp;gt;/etc/lighttpd/conf-enabled/10-fastcgi.conf&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ln -s /etc/lighttpd/conf-available/10-fastcgi.conf /etc/lighttpd/conf-enabled/10-fastcgi.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
then edit your /etc/lighttpd/conf-enabled/10-fastcgi.conf file modifying it as below to serve mediagoblin on the /tube/ path of your webserver.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
## FastCGI programs have the same functionality as CGI programs,&lt;br /&gt;
## but are considerably faster through lower interpreter startup&lt;br /&gt;
## time and socketed communication&lt;br /&gt;
##&lt;br /&gt;
## Documentation: /usr/share/doc/lighttpd-doc/fastcgi.txt.gz&lt;br /&gt;
##                http://www.lighttpd.net/documentation/fastcgi.html&lt;br /&gt;
&lt;br /&gt;
server.modules   += ( &amp;quot;mod_fastcgi&amp;quot; )&lt;br /&gt;
&lt;br /&gt;
## Start an FastCGI server for mediagoblin (lazyserver.sh or other deployments scripts should be up and running)&lt;br /&gt;
fastcgi.server = (&lt;br /&gt;
    # url at which the app should be accessible on the server&lt;br /&gt;
      &amp;quot;/tube&amp;quot; =&amp;gt;&lt;br /&gt;
      # mnemonical name of the backend&lt;br /&gt;
      ( &amp;quot;mg-local&amp;quot; =&amp;gt; (&lt;br /&gt;
                &amp;quot;host&amp;quot; =&amp;gt; &amp;quot;127.0.0.1&amp;quot;,&lt;br /&gt;
                &amp;quot;port&amp;quot; =&amp;gt; 6543,&lt;br /&gt;
                &amp;quot;docroot&amp;quot; =&amp;gt; &amp;quot;/path/to/mediagoblin-git-folder/mediagoblin&amp;quot;,&lt;br /&gt;
                &amp;quot;check-local&amp;quot; =&amp;gt; &amp;quot;disable&amp;quot;&lt;br /&gt;
                )&lt;br /&gt;
        )&lt;br /&gt;
&lt;br /&gt;
)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then open your /etc/lighttpd/lighttpd.conf and add the configuration to serve directly the static/public folders&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
alias.url += (&lt;br /&gt;
        &amp;quot;/mgoblin_static/&amp;quot; =&amp;gt; &amp;quot;/path/to/mediagoblin-git-folder/mediagoblin/static/&amp;quot;,&lt;br /&gt;
        &amp;quot;/mgoblin_media/&amp;quot; =&amp;gt; &amp;quot;/path/to/mediagoblin-git-folder/user_dev/media/public/&amp;quot;,&lt;br /&gt;
        &amp;quot;/theme_static/&amp;quot; =&amp;gt; &amp;quot;/path/to/mediagoblin-git-folder/user_dev/theme_static/&amp;quot;,&lt;br /&gt;
        &amp;quot;/plugin_static/&amp;quot; =&amp;gt; &amp;quot;/path/to/mediagoblin-git-folder/user_dev/plugin_static/&amp;quot;&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Done!&lt;br /&gt;
&lt;br /&gt;
= OpenShift =&lt;br /&gt;
&lt;br /&gt;
Thers&#039;s a blogpost saying how to [http://www.sud0.com/gnu-media-goblin-on-openshift.html install mediagoblin on openshift].&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;
= Init scripts =&lt;br /&gt;
&lt;br /&gt;
== Debian init scripts ==&lt;br /&gt;
&lt;br /&gt;
Joar has some scripts for running celery and mediagoblin separately that are designed for Debian.&lt;br /&gt;
&lt;br /&gt;
https://github.com/joar/mediagoblin-init-scripts&lt;br /&gt;
&lt;br /&gt;
== Arch Linux 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;
&lt;br /&gt;
&lt;br /&gt;
== Generic, simple init script ==&lt;br /&gt;
&lt;br /&gt;
This is a super stupidly simple init script that was used for mediagoblin.com... note that this has Celery running in always eager mode.&lt;br /&gt;
&lt;br /&gt;
You will need to adjust the paths appropriately.  This could probably be better written!&lt;br /&gt;
&lt;br /&gt;
  #! /bin/sh&lt;br /&gt;
  &lt;br /&gt;
  ## Stupidly simple mediagoblin init script.&lt;br /&gt;
  # &lt;br /&gt;
  # Written in 2012 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;
  PASTER=/srv/mediagoblin.com/bin/paster&lt;br /&gt;
  PASTE_CONFIG=/srv/mediagoblin.com/paste.ini&lt;br /&gt;
  OPTIONS=&amp;quot;--pid-file=/tmp/mediagoblin.pid \&lt;br /&gt;
   --log-file=/srv/mediagoblin.com/paster.log \&lt;br /&gt;
   --server-name=fcgi fcgi_host=127.0.0.1 fcgi_port=26543&amp;quot;&lt;br /&gt;
  &lt;br /&gt;
  CELERY_ALWAYS_EAGER=true su -pc &amp;quot;$PASTER serve $PASTE_CONFIG $1 $OPTIONS&amp;quot; webadmin&lt;br /&gt;
&lt;br /&gt;
== systemd init scripts ==&lt;br /&gt;
&lt;br /&gt;
The following systemd scripts provide separate Paste and Celery instances. Replace &amp;lt;code&amp;gt;/path/to/mediagoblin&amp;lt;/code&amp;gt; to match your install path. The directories &amp;lt;code&amp;gt;/var/log/mediagoblin&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;/var/run/mediagoblin&amp;lt;/code&amp;gt; are not created by default; you may create them yourself or change the location of the pid and log files. You may omit the log file if you choose. The init scripts provided below assume customized versions of mediagoblin.ini and paste.ini have been created as mediagoblin_local.ini and paste_local.ini, respectively; you should change those lines to point back to the original mediagoblin.ini or paste.ini files if you haven&#039;t made customizations.&lt;br /&gt;
&lt;br /&gt;
If you prefer not to run separate Celery, uncomment &amp;lt;code&amp;gt;Environment=CELERY_ALWAYS_EAGER=true&amp;lt;/code&amp;gt; and comment &amp;lt;code&amp;gt;Environment=CELERY_ALWAYS_EAGER=false&amp;lt;/code&amp;gt;. You won&#039;t need the file &amp;lt;code&amp;gt;/etc/systemd/system/gmg-celery.service&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;/etc/systemd/system/gmg.service&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=Mediagoblin&lt;br /&gt;
  &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=forking&lt;br /&gt;
 User=mediagoblin&lt;br /&gt;
 Group=mediagoblin&lt;br /&gt;
 #Environment=CELERY_ALWAYS_EAGER=true&lt;br /&gt;
 Environment=CELERY_ALWAYS_EAGER=false&lt;br /&gt;
 WorkingDirectory=/path/to/mediagoblin&lt;br /&gt;
 ExecStart=/path/to/mediagoblin/bin/paster serve \&lt;br /&gt;
              /path/to/mediagoblin/paste_local.ini \&lt;br /&gt;
              --pid-file=/var/run/mediagoblin/paster.pid \&lt;br /&gt;
              --log-file=/var/log/mediagoblin/paster.log \&lt;br /&gt;
              --daemon \&lt;br /&gt;
              --server-name=fcgi fcgi_host=127.0.0.1 fcgi_port=26543&lt;br /&gt;
 ExecStop=/path/to/mediagoblin/bin/paster serve \&lt;br /&gt;
             --pid-file=/var/run/mediagoblin/paster.pid \&lt;br /&gt;
             /path/to/mediagoblin/paste_local.ini stop&lt;br /&gt;
 PIDFile=/var/run/mediagoblin/mediagoblin.pid&lt;br /&gt;
 &lt;br /&gt;
 [Install]&lt;br /&gt;
 WantedBy=multi-user.target&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;/etc/systemd/system/gmg-celeryd.service&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=Mediagoblin Celeryd&lt;br /&gt;
  &lt;br /&gt;
 [Service]&lt;br /&gt;
 User=mediagoblin&lt;br /&gt;
 Group=mediagoblin&lt;br /&gt;
 Type=simple&lt;br /&gt;
 WorkingDirectory=/path/to/mediagoblin&lt;br /&gt;
 Environment=&amp;quot;MEDIAGOBLIN_CONFIG=/path/to/mediagoblin/mediagoblin_local.ini&amp;quot; \&lt;br /&gt;
 CELERY_CONFIG_MODULE=mediagoblin.init.celery.from_celery&lt;br /&gt;
 ExecStart=/path/to/mediagoblin/bin/celeryd&lt;br /&gt;
 PIDFile=/var/run/mediagoblin/mediagoblin-celeryd.pid&lt;br /&gt;
 &lt;br /&gt;
 [Install]&lt;br /&gt;
 WantedBy=multi-user.target&lt;br /&gt;
&lt;br /&gt;
Invoke the Paste or Celery processes using systemctl. Eg,&lt;br /&gt;
&lt;br /&gt;
 $ sudo systemctl start|stop|restart gmg.service&lt;br /&gt;
&lt;br /&gt;
 $ sudo systemctl start|stop|restart gmg-celeryd.service&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;br /&gt;
&lt;br /&gt;
=Miscellaneous Hacks=&lt;br /&gt;
==Force translation==&lt;br /&gt;
There might some conditions under which you would prefer that MediaGoblin always return the same translation.  If you are deploying with nginx and fastcgi, you can force MediaGoblin to return a specific translation regardless of browser preferences by passing a specific HTTP_ACCEPT_LANGUAGE fastcgi parameter in your location block. Example last line in location block:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
    fastcgi_param HTTP_ACCEPT_LANGUAGE es; #force spanish translation&lt;br /&gt;
 &amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Create an admin user==&lt;br /&gt;
&lt;br /&gt;
To create an admin user, first create the user you need either via the website or the command&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
./bin/gmg adduser&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then to turn it into an admin account use&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
./bin/gmg makeadmin your_username&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Breton</name></author>
	</entry>
	<entry>
		<id>https://wiki.mediagoblin.org/index.php?title=Deployment&amp;diff=1542</id>
		<title>Deployment</title>
		<link rel="alternate" type="text/html" href="https://wiki.mediagoblin.org/index.php?title=Deployment&amp;diff=1542"/>
		<updated>2014-06-23T14:58:25Z</updated>

		<summary type="html">&lt;p&gt;Breton: /* uwsgi with configs */&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;
= uwsgi =&lt;br /&gt;
&lt;br /&gt;
Possibly a cleaner way to do nginx configuration than the official nginx + fastcgi suggestions!&lt;br /&gt;
&lt;br /&gt;
http://qalthos.github.io/blog/FOSS@RIT/deploying-mediagoblin-1-fastcgi-vs-uwsgi.html&lt;br /&gt;
&lt;br /&gt;
= uwsgi with configs =&lt;br /&gt;
&lt;br /&gt;
Below there are 3 configs: for nginx, for uwsgi version 1.2.3-debian and for supervisord, used to run celery.&lt;br /&gt;
&lt;br /&gt;
In future, when newer versions of uwsgi appear in debian, supervisor can be removed.&lt;br /&gt;
&lt;br /&gt;
All instructions below are for Debian 7. They should also work with rpm-based systems, but with other paths.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get install uwsgi uwsgi-plugin-python nginx-full supervisor;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/etc/nginx/sites-available/mediagoblin:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
        server_name &amp;lt;domain&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
        access_log /var/log/nginx/mg.access.log;&lt;br /&gt;
        error_log /var/log/nginx/mg.error.log error;&lt;br /&gt;
&lt;br /&gt;
        #include global/common.conf;&lt;br /&gt;
&lt;br /&gt;
        client_max_body_size 100m;&lt;br /&gt;
        add_header X-Content-Type-Options nosniff;&lt;br /&gt;
&lt;br /&gt;
        root /path/to/mediagoblin//user_dev/;&lt;br /&gt;
&lt;br /&gt;
        location /mgoblin_static/ {&lt;br /&gt;
                alias /path/to/mediagoblin/mediagoblin/static/;&lt;br /&gt;
        }&lt;br /&gt;
        location /mgoblin_media/ {&lt;br /&gt;
                alias /path/to/mediagoblin/user_dev/media/public/;&lt;br /&gt;
        }&lt;br /&gt;
        location /theme_static/ {&lt;br /&gt;
        }&lt;br /&gt;
        location /plugin_static/ {&lt;br /&gt;
        }&lt;br /&gt;
        location / {&lt;br /&gt;
                uwsgi_pass unix:///tmp/mg.uwsgi.sock;&lt;br /&gt;
                uwsgi_param SCRIPT_NAME &amp;quot;/&amp;quot;;&lt;br /&gt;
                include uwsgi_params;&lt;br /&gt;
        }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/etc/uwsgi/apps-available/mg.yaml:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
uwsgi:&lt;br /&gt;
 uid: mediagoblin&lt;br /&gt;
 gid: mediagoblin&lt;br /&gt;
 socket: /tmp/mg.uwsgi.sock&lt;br /&gt;
 chown-socket: www-data:www-data&lt;br /&gt;
 plugins: python&lt;br /&gt;
 home: /path/to/mediagoblin/&lt;br /&gt;
 chdir: /path/to/mediagoblin/&lt;br /&gt;
 ini-paste: /path/to/mediagoblin/paste_local.ini&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/etc/supervisor/conf.d/mediagoblin.conf:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[program:celery]&lt;br /&gt;
command=/path/to/mediagoblin/bin/celery worker -l debug&lt;br /&gt;
&lt;br /&gt;
; Set PYTHONPATH to the directory containing celeryconfig.py&lt;br /&gt;
environment=PYTHONPATH=&amp;quot;/path/to/mediagoblin&amp;quot;,MEDIAGOBLIN_CONFIG=&amp;quot;/path/to/mediagoblin/mediagoblin_local.ini&amp;quot;,CELERY_CONFIG_MODULE=&amp;quot;mediagoblin.init.celery.from_celery&amp;quot;&lt;br /&gt;
&lt;br /&gt;
directory=/path/to/mediagoblin/&lt;br /&gt;
user=mediagoblin&lt;br /&gt;
numprocs=1&lt;br /&gt;
; uncomment below to enable logs saving&lt;br /&gt;
;stdout_logfile=/some/logs/path/celeryd_stdout.log&lt;br /&gt;
;stderr_logfile=/some/logs/path/celeryd_stderr.log&lt;br /&gt;
autostart=true&lt;br /&gt;
autorestart=false&lt;br /&gt;
startsecs=10&lt;br /&gt;
&lt;br /&gt;
; Need to wait for currently executing tasks to finish at shutdown.&lt;br /&gt;
; Increase this if you have very long running tasks.&lt;br /&gt;
stopwaitsecs = 600&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After setting all configs do:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ln -s /etc/nginx/sites-available/mediagoblin /etc/nginx/sites-enabled/&lt;br /&gt;
ln -s /etc/uwsgi/apps-available/mg.yaml /etc/uwsgi/apps-enabled/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= FCGI script =&lt;br /&gt;
&lt;br /&gt;
This works great with the apache FCGID config example in the next section :) in which case you should name it &amp;quot;mg.fcgi&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Before use, make sure you replace &#039;/path/to/mediagoblin/bin/python&#039; with a real path on your server, e.g. &#039;/srv/www/myhomepage.com/mediagoblin/bin/python&#039;. Also replace &#039;/path/to/mediagoblin/paste.ini&#039;.&lt;br /&gt;
&lt;br /&gt;
If you encounter problems, try executing executing the script manually, e.g. &amp;lt;pre&amp;gt;./mg.fcgi&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Script:&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;
## Uncomment this to run celery in &amp;quot;always eager&amp;quot; mode... ie, you don&#039;t have&lt;br /&gt;
## to run a separate process, but submissions wait till processing finishes&lt;br /&gt;
# import os&lt;br /&gt;
# os.environ[&#039;CELERY_ALWAYS_EAGER&#039;] = &#039;true&#039;&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 main section. libapache2-mod-fcgid can be used, but requires a slightly different configuration. For yum-based distributions, you may need to install mod_fcgid. &lt;br /&gt;
&lt;br /&gt;
  &amp;lt;VirtualHost *:80&amp;gt;&lt;br /&gt;
    Options +ExecCGI&lt;br /&gt;
  &lt;br /&gt;
    # Accept up to 16MB requests&lt;br /&gt;
    FcgidMaxRequestLen 16777216&lt;br /&gt;
  &lt;br /&gt;
    ServerName mediagoblin.example.org&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;
    ScriptAlias / /path/to/mediagoblin/mg.fcgi/&lt;br /&gt;
  &amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Apache 2 Config With mod_wsgi =&lt;br /&gt;
&lt;br /&gt;
Apache can manage the MediaGoblin application itself with mod_wsgi. It requires slightly more configuration on the Apache side, but cuts out the FastCGI middleware. See their [http://code.google.com/p/modwsgi/wiki/ConfigurationGuidelines configuration guidelines] for advanced configuration.&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;VirtualHost *:80&amp;gt;&lt;br /&gt;
    ServerName mediagoblin.example.org&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;
    WSGIScriptAlias / /path/to/mediagoblin/wsgi.py&lt;br /&gt;
    # Set user and group to whatever Apache runs as&lt;br /&gt;
    WSGIDaemonProcess gmg user=apache group=apache processes=2 threads=10 \&lt;br /&gt;
        umask=0007 inactivity-timeout=900 maximum-requests=1000 \&lt;br /&gt;
        python-path=/path/to/mediagoblin/:/path/to/mediagoblin/lib/python-2.x/site-packages/&lt;br /&gt;
    WSGIProcessGroup gmg&lt;br /&gt;
     WSGIApplicationGroup %{GLOBAL}&lt;br /&gt;
   &lt;br /&gt;
        &amp;lt;Directory &amp;quot;/path/to/mediagoblin/mediagoblin/static/&amp;quot;&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 &amp;quot;/path/to/mediagoblin/user_dev/media/public&amp;quot;&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;/VirtualHost&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You&#039;ll also need to copy this into /path/to/mediagoblin/wsgi.py:&lt;br /&gt;
&lt;br /&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;
  &lt;br /&gt;
  CONFIG_PATH = &#039;/path/to/mediagoblin/paste.ini&#039;&lt;br /&gt;
  &lt;br /&gt;
  ## Uncomment this to run celery in &amp;quot;always eager&amp;quot; mode... ie, you don&#039;t have&lt;br /&gt;
  ## to run a separate process, but submissions wait till processing finishes&lt;br /&gt;
  #import os&lt;br /&gt;
  #os.environ[&#039;CELERY_ALWAYS_EAGER&#039;] = &#039;true&#039;&lt;br /&gt;
  &lt;br /&gt;
  application = loadapp(&#039;config:&#039; + CONFIG_PATH)&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;
If it is too slow and you use the deflate module, you could try to use the following option : SetOutputFilter INFLATE&lt;br /&gt;
&lt;br /&gt;
= Lighttpd =&lt;br /&gt;
&lt;br /&gt;
This configuration example uses mod_fastcgi.&lt;br /&gt;
Make a symbolic link from &amp;lt;pre&amp;gt;/etc/lighttpd/conf-available/10-fastcgi.conf&amp;lt;/pre&amp;gt; to &amp;lt;pre&amp;gt;/etc/lighttpd/conf-enabled/10-fastcgi.conf&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ln -s /etc/lighttpd/conf-available/10-fastcgi.conf /etc/lighttpd/conf-enabled/10-fastcgi.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
then edit your /etc/lighttpd/conf-enabled/10-fastcgi.conf file modifying it as below to serve mediagoblin on the /tube/ path of your webserver.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
## FastCGI programs have the same functionality as CGI programs,&lt;br /&gt;
## but are considerably faster through lower interpreter startup&lt;br /&gt;
## time and socketed communication&lt;br /&gt;
##&lt;br /&gt;
## Documentation: /usr/share/doc/lighttpd-doc/fastcgi.txt.gz&lt;br /&gt;
##                http://www.lighttpd.net/documentation/fastcgi.html&lt;br /&gt;
&lt;br /&gt;
server.modules   += ( &amp;quot;mod_fastcgi&amp;quot; )&lt;br /&gt;
&lt;br /&gt;
## Start an FastCGI server for mediagoblin (lazyserver.sh or other deployments scripts should be up and running)&lt;br /&gt;
fastcgi.server = (&lt;br /&gt;
    # url at which the app should be accessible on the server&lt;br /&gt;
      &amp;quot;/tube&amp;quot; =&amp;gt;&lt;br /&gt;
      # mnemonical name of the backend&lt;br /&gt;
      ( &amp;quot;mg-local&amp;quot; =&amp;gt; (&lt;br /&gt;
                &amp;quot;host&amp;quot; =&amp;gt; &amp;quot;127.0.0.1&amp;quot;,&lt;br /&gt;
                &amp;quot;port&amp;quot; =&amp;gt; 6543,&lt;br /&gt;
                &amp;quot;docroot&amp;quot; =&amp;gt; &amp;quot;/path/to/mediagoblin-git-folder/mediagoblin&amp;quot;,&lt;br /&gt;
                &amp;quot;check-local&amp;quot; =&amp;gt; &amp;quot;disable&amp;quot;&lt;br /&gt;
                )&lt;br /&gt;
        )&lt;br /&gt;
&lt;br /&gt;
)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then open your /etc/lighttpd/lighttpd.conf and add the configuration to serve directly the static/public folders&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
alias.url += (&lt;br /&gt;
        &amp;quot;/mgoblin_static/&amp;quot; =&amp;gt; &amp;quot;/path/to/mediagoblin-git-folder/mediagoblin/static/&amp;quot;,&lt;br /&gt;
        &amp;quot;/mgoblin_media/&amp;quot; =&amp;gt; &amp;quot;/path/to/mediagoblin-git-folder/user_dev/media/public/&amp;quot;,&lt;br /&gt;
        &amp;quot;/theme_static/&amp;quot; =&amp;gt; &amp;quot;/path/to/mediagoblin-git-folder/user_dev/theme_static/&amp;quot;,&lt;br /&gt;
        &amp;quot;/plugin_static/&amp;quot; =&amp;gt; &amp;quot;/path/to/mediagoblin-git-folder/user_dev/plugin_static/&amp;quot;&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Done!&lt;br /&gt;
&lt;br /&gt;
= OpenShift =&lt;br /&gt;
&lt;br /&gt;
Thers&#039;s a blogpost saying how to [http://www.sud0.com/gnu-media-goblin-on-openshift.html install mediagoblin on openshift].&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;
= Init scripts =&lt;br /&gt;
&lt;br /&gt;
== Debian init scripts ==&lt;br /&gt;
&lt;br /&gt;
Joar has some scripts for running celery and mediagoblin separately that are designed for Debian.&lt;br /&gt;
&lt;br /&gt;
https://github.com/joar/mediagoblin-init-scripts&lt;br /&gt;
&lt;br /&gt;
== Arch Linux 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;
&lt;br /&gt;
&lt;br /&gt;
== Generic, simple init script ==&lt;br /&gt;
&lt;br /&gt;
This is a super stupidly simple init script that was used for mediagoblin.com... note that this has Celery running in always eager mode.&lt;br /&gt;
&lt;br /&gt;
You will need to adjust the paths appropriately.  This could probably be better written!&lt;br /&gt;
&lt;br /&gt;
  #! /bin/sh&lt;br /&gt;
  &lt;br /&gt;
  ## Stupidly simple mediagoblin init script.&lt;br /&gt;
  # &lt;br /&gt;
  # Written in 2012 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;
  PASTER=/srv/mediagoblin.com/bin/paster&lt;br /&gt;
  PASTE_CONFIG=/srv/mediagoblin.com/paste.ini&lt;br /&gt;
  OPTIONS=&amp;quot;--pid-file=/tmp/mediagoblin.pid \&lt;br /&gt;
   --log-file=/srv/mediagoblin.com/paster.log \&lt;br /&gt;
   --server-name=fcgi fcgi_host=127.0.0.1 fcgi_port=26543&amp;quot;&lt;br /&gt;
  &lt;br /&gt;
  CELERY_ALWAYS_EAGER=true su -pc &amp;quot;$PASTER serve $PASTE_CONFIG $1 $OPTIONS&amp;quot; webadmin&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;br /&gt;
&lt;br /&gt;
=Miscellaneous Hacks=&lt;br /&gt;
==Force translation==&lt;br /&gt;
There might some conditions under which you would prefer that MediaGoblin always return the same translation.  If you are deploying with nginx and fastcgi, you can force MediaGoblin to return a specific translation regardless of browser preferences by passing a specific HTTP_ACCEPT_LANGUAGE fastcgi parameter in your location block. Example last line in location block:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
    fastcgi_param HTTP_ACCEPT_LANGUAGE es; #force spanish translation&lt;br /&gt;
 &amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Create an admin user==&lt;br /&gt;
&lt;br /&gt;
To create an admin user, first create the user you need either via the website or the command&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
./bin/gmg adduser&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then to turn it into an admin account use&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
./bin/gmg makeadmin your_username&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Breton</name></author>
	</entry>
	<entry>
		<id>https://wiki.mediagoblin.org/index.php?title=Deployment&amp;diff=1541</id>
		<title>Deployment</title>
		<link rel="alternate" type="text/html" href="https://wiki.mediagoblin.org/index.php?title=Deployment&amp;diff=1541"/>
		<updated>2014-06-21T07:11:46Z</updated>

		<summary type="html">&lt;p&gt;Breton: /* uwsgi with configs */&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;
= uwsgi =&lt;br /&gt;
&lt;br /&gt;
Possibly a cleaner way to do nginx configuration than the official nginx + fastcgi suggestions!&lt;br /&gt;
&lt;br /&gt;
http://qalthos.github.io/blog/FOSS@RIT/deploying-mediagoblin-1-fastcgi-vs-uwsgi.html&lt;br /&gt;
&lt;br /&gt;
= uwsgi with configs =&lt;br /&gt;
&lt;br /&gt;
Below there are 3 configs: for nginx, for uwsgi version 1.2.3-debian and for supervisord, used to run celery.&lt;br /&gt;
&lt;br /&gt;
In future, when newer versions of uwsgi appear in debian, supervisor can be removed.&lt;br /&gt;
&lt;br /&gt;
All instructions below are for Debian 6. They should also work with rpm-based systems, but with other paths.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get install uwsgi uwsgi-plugin-python nginx-full supervisor;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/etc/nginx/sites-available/mediagoblin:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
        server_name &amp;lt;domain&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
        access_log /var/log/nginx/mg.access.log;&lt;br /&gt;
        error_log /var/log/nginx/mg.error.log error;&lt;br /&gt;
&lt;br /&gt;
        #include global/common.conf;&lt;br /&gt;
&lt;br /&gt;
        client_max_body_size 100m;&lt;br /&gt;
        add_header X-Content-Type-Options nosniff;&lt;br /&gt;
&lt;br /&gt;
        root /path/to/mediagoblin//user_dev/;&lt;br /&gt;
&lt;br /&gt;
        location /mgoblin_static/ {&lt;br /&gt;
                alias /path/to/mediagoblin/mediagoblin/static/;&lt;br /&gt;
        }&lt;br /&gt;
        location /mgoblin_media/ {&lt;br /&gt;
                alias /path/to/mediagoblin/user_dev/media/public/;&lt;br /&gt;
        }&lt;br /&gt;
        location /theme_static/ {&lt;br /&gt;
        }&lt;br /&gt;
        location /plugin_static/ {&lt;br /&gt;
        }&lt;br /&gt;
        location / {&lt;br /&gt;
                uwsgi_pass unix:///tmp/mg.uwsgi.sock;&lt;br /&gt;
                uwsgi_param SCRIPT_NAME &amp;quot;/&amp;quot;;&lt;br /&gt;
                include uwsgi_params;&lt;br /&gt;
        }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/etc/uwsgi/apps-available/mg.yaml:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
uwsgi:&lt;br /&gt;
 uid: mediagoblin&lt;br /&gt;
 gid: mediagoblin&lt;br /&gt;
 socket: /tmp/mg.uwsgi.sock&lt;br /&gt;
 chown-socket: www-data:www-data&lt;br /&gt;
 plugins: python&lt;br /&gt;
 home: /path/to/mediagoblin/&lt;br /&gt;
 chdir: /path/to/mediagoblin/&lt;br /&gt;
 ini-paste: /path/to/mediagoblin/paste_local.ini&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/etc/supervisor/conf.d/mediagoblin.conf:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[program:celery]&lt;br /&gt;
command=/path/to/mediagoblin/bin/celery worker -l debug&lt;br /&gt;
&lt;br /&gt;
; Set PYTHONPATH to the directory containing celeryconfig.py&lt;br /&gt;
environment=PYTHONPATH=&amp;quot;/path/to/mediagoblin&amp;quot;,MEDIAGOBLIN_CONFIG=&amp;quot;/path/to/mediagoblin/mediagoblin_local.ini&amp;quot;,CELERY_CONFIG_MODULE=&amp;quot;mediagoblin.init.celery.from_celery&amp;quot;&lt;br /&gt;
&lt;br /&gt;
directory=/path/to/mediagoblin/&lt;br /&gt;
user=mediagoblin&lt;br /&gt;
numprocs=1&lt;br /&gt;
; uncomment below to enable logs saving&lt;br /&gt;
;stdout_logfile=/some/logs/path/celeryd_stdout.log&lt;br /&gt;
;stderr_logfile=/some/logs/path/celeryd_stderr.log&lt;br /&gt;
autostart=true&lt;br /&gt;
autorestart=false&lt;br /&gt;
startsecs=10&lt;br /&gt;
&lt;br /&gt;
; Need to wait for currently executing tasks to finish at shutdown.&lt;br /&gt;
; Increase this if you have very long running tasks.&lt;br /&gt;
stopwaitsecs = 600&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After setting all configs do:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ln -s /etc/nginx/sites-available/mediagoblin /etc/nginx/sites-enabled/&lt;br /&gt;
ln -s /etc/uwsgi/apps-available/mg.yaml /etc/uwsgi/apps-enabled/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= FCGI script =&lt;br /&gt;
&lt;br /&gt;
This works great with the apache FCGID config example in the next section :) in which case you should name it &amp;quot;mg.fcgi&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Before use, make sure you replace &#039;/path/to/mediagoblin/bin/python&#039; with a real path on your server, e.g. &#039;/srv/www/myhomepage.com/mediagoblin/bin/python&#039;. Also replace &#039;/path/to/mediagoblin/paste.ini&#039;.&lt;br /&gt;
&lt;br /&gt;
If you encounter problems, try executing executing the script manually, e.g. &amp;lt;pre&amp;gt;./mg.fcgi&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Script:&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;
## Uncomment this to run celery in &amp;quot;always eager&amp;quot; mode... ie, you don&#039;t have&lt;br /&gt;
## to run a separate process, but submissions wait till processing finishes&lt;br /&gt;
# import os&lt;br /&gt;
# os.environ[&#039;CELERY_ALWAYS_EAGER&#039;] = &#039;true&#039;&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 main section. libapache2-mod-fcgid can be used, but requires a slightly different configuration. For yum-based distributions, you may need to install mod_fcgid. &lt;br /&gt;
&lt;br /&gt;
  &amp;lt;VirtualHost *:80&amp;gt;&lt;br /&gt;
    Options +ExecCGI&lt;br /&gt;
  &lt;br /&gt;
    # Accept up to 16MB requests&lt;br /&gt;
    FcgidMaxRequestLen 16777216&lt;br /&gt;
  &lt;br /&gt;
    ServerName mediagoblin.example.org&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;
    ScriptAlias / /path/to/mediagoblin/mg.fcgi/&lt;br /&gt;
  &amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Apache 2 Config With mod_wsgi =&lt;br /&gt;
&lt;br /&gt;
Apache can manage the MediaGoblin application itself with mod_wsgi. It requires slightly more configuration on the Apache side, but cuts out the FastCGI middleware. See their [http://code.google.com/p/modwsgi/wiki/ConfigurationGuidelines configuration guidelines] for advanced configuration.&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;VirtualHost *:80&amp;gt;&lt;br /&gt;
    ServerName mediagoblin.example.org&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;
    WSGIScriptAlias / /path/to/mediagoblin/wsgi.py&lt;br /&gt;
    # Set user and group to whatever Apache runs as&lt;br /&gt;
    WSGIDaemonProcess gmg user=apache group=apache processes=2 threads=10 \&lt;br /&gt;
        umask=0007 inactivity-timeout=900 maximum-requests=1000 \&lt;br /&gt;
        python-path=/path/to/mediagoblin/:/path/to/mediagoblin/lib/python-2.x/site-packages/&lt;br /&gt;
    WSGIProcessGroup gmg&lt;br /&gt;
     WSGIApplicationGroup %{GLOBAL}&lt;br /&gt;
   &lt;br /&gt;
        &amp;lt;Directory &amp;quot;/path/to/mediagoblin/mediagoblin/static/&amp;quot;&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 &amp;quot;/path/to/mediagoblin/user_dev/media/public&amp;quot;&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;/VirtualHost&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You&#039;ll also need to copy this into /path/to/mediagoblin/wsgi.py:&lt;br /&gt;
&lt;br /&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;
  &lt;br /&gt;
  CONFIG_PATH = &#039;/path/to/mediagoblin/paste.ini&#039;&lt;br /&gt;
  &lt;br /&gt;
  ## Uncomment this to run celery in &amp;quot;always eager&amp;quot; mode... ie, you don&#039;t have&lt;br /&gt;
  ## to run a separate process, but submissions wait till processing finishes&lt;br /&gt;
  #import os&lt;br /&gt;
  #os.environ[&#039;CELERY_ALWAYS_EAGER&#039;] = &#039;true&#039;&lt;br /&gt;
  &lt;br /&gt;
  application = loadapp(&#039;config:&#039; + CONFIG_PATH)&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;
If it is too slow and you use the deflate module, you could try to use the following option : SetOutputFilter INFLATE&lt;br /&gt;
&lt;br /&gt;
= Lighttpd =&lt;br /&gt;
&lt;br /&gt;
This configuration example uses mod_fastcgi.&lt;br /&gt;
Make a symbolic link from &amp;lt;pre&amp;gt;/etc/lighttpd/conf-available/10-fastcgi.conf&amp;lt;/pre&amp;gt; to &amp;lt;pre&amp;gt;/etc/lighttpd/conf-enabled/10-fastcgi.conf&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ln -s /etc/lighttpd/conf-available/10-fastcgi.conf /etc/lighttpd/conf-enabled/10-fastcgi.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
then edit your /etc/lighttpd/conf-enabled/10-fastcgi.conf file modifying it as below to serve mediagoblin on the /tube/ path of your webserver.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
## FastCGI programs have the same functionality as CGI programs,&lt;br /&gt;
## but are considerably faster through lower interpreter startup&lt;br /&gt;
## time and socketed communication&lt;br /&gt;
##&lt;br /&gt;
## Documentation: /usr/share/doc/lighttpd-doc/fastcgi.txt.gz&lt;br /&gt;
##                http://www.lighttpd.net/documentation/fastcgi.html&lt;br /&gt;
&lt;br /&gt;
server.modules   += ( &amp;quot;mod_fastcgi&amp;quot; )&lt;br /&gt;
&lt;br /&gt;
## Start an FastCGI server for mediagoblin (lazyserver.sh or other deployments scripts should be up and running)&lt;br /&gt;
fastcgi.server = (&lt;br /&gt;
    # url at which the app should be accessible on the server&lt;br /&gt;
      &amp;quot;/tube&amp;quot; =&amp;gt;&lt;br /&gt;
      # mnemonical name of the backend&lt;br /&gt;
      ( &amp;quot;mg-local&amp;quot; =&amp;gt; (&lt;br /&gt;
                &amp;quot;host&amp;quot; =&amp;gt; &amp;quot;127.0.0.1&amp;quot;,&lt;br /&gt;
                &amp;quot;port&amp;quot; =&amp;gt; 6543,&lt;br /&gt;
                &amp;quot;docroot&amp;quot; =&amp;gt; &amp;quot;/path/to/mediagoblin-git-folder/mediagoblin&amp;quot;,&lt;br /&gt;
                &amp;quot;check-local&amp;quot; =&amp;gt; &amp;quot;disable&amp;quot;&lt;br /&gt;
                )&lt;br /&gt;
        )&lt;br /&gt;
&lt;br /&gt;
)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then open your /etc/lighttpd/lighttpd.conf and add the configuration to serve directly the static/public folders&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
alias.url += (&lt;br /&gt;
        &amp;quot;/mgoblin_static/&amp;quot; =&amp;gt; &amp;quot;/path/to/mediagoblin-git-folder/mediagoblin/static/&amp;quot;,&lt;br /&gt;
        &amp;quot;/mgoblin_media/&amp;quot; =&amp;gt; &amp;quot;/path/to/mediagoblin-git-folder/user_dev/media/public/&amp;quot;,&lt;br /&gt;
        &amp;quot;/theme_static/&amp;quot; =&amp;gt; &amp;quot;/path/to/mediagoblin-git-folder/user_dev/theme_static/&amp;quot;,&lt;br /&gt;
        &amp;quot;/plugin_static/&amp;quot; =&amp;gt; &amp;quot;/path/to/mediagoblin-git-folder/user_dev/plugin_static/&amp;quot;&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Done!&lt;br /&gt;
&lt;br /&gt;
= OpenShift =&lt;br /&gt;
&lt;br /&gt;
Thers&#039;s a blogpost saying how to [http://www.sud0.com/gnu-media-goblin-on-openshift.html install mediagoblin on openshift].&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;
= Init scripts =&lt;br /&gt;
&lt;br /&gt;
== Debian init scripts ==&lt;br /&gt;
&lt;br /&gt;
Joar has some scripts for running celery and mediagoblin separately that are designed for Debian.&lt;br /&gt;
&lt;br /&gt;
https://github.com/joar/mediagoblin-init-scripts&lt;br /&gt;
&lt;br /&gt;
== Arch Linux 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;
&lt;br /&gt;
&lt;br /&gt;
== Generic, simple init script ==&lt;br /&gt;
&lt;br /&gt;
This is a super stupidly simple init script that was used for mediagoblin.com... note that this has Celery running in always eager mode.&lt;br /&gt;
&lt;br /&gt;
You will need to adjust the paths appropriately.  This could probably be better written!&lt;br /&gt;
&lt;br /&gt;
  #! /bin/sh&lt;br /&gt;
  &lt;br /&gt;
  ## Stupidly simple mediagoblin init script.&lt;br /&gt;
  # &lt;br /&gt;
  # Written in 2012 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;
  PASTER=/srv/mediagoblin.com/bin/paster&lt;br /&gt;
  PASTE_CONFIG=/srv/mediagoblin.com/paste.ini&lt;br /&gt;
  OPTIONS=&amp;quot;--pid-file=/tmp/mediagoblin.pid \&lt;br /&gt;
   --log-file=/srv/mediagoblin.com/paster.log \&lt;br /&gt;
   --server-name=fcgi fcgi_host=127.0.0.1 fcgi_port=26543&amp;quot;&lt;br /&gt;
  &lt;br /&gt;
  CELERY_ALWAYS_EAGER=true su -pc &amp;quot;$PASTER serve $PASTE_CONFIG $1 $OPTIONS&amp;quot; webadmin&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;br /&gt;
&lt;br /&gt;
=Miscellaneous Hacks=&lt;br /&gt;
==Force translation==&lt;br /&gt;
There might some conditions under which you would prefer that MediaGoblin always return the same translation.  If you are deploying with nginx and fastcgi, you can force MediaGoblin to return a specific translation regardless of browser preferences by passing a specific HTTP_ACCEPT_LANGUAGE fastcgi parameter in your location block. Example last line in location block:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
    fastcgi_param HTTP_ACCEPT_LANGUAGE es; #force spanish translation&lt;br /&gt;
 &amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Create an admin user==&lt;br /&gt;
&lt;br /&gt;
To create an admin user, first create the user you need either via the website or the command&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
./bin/gmg adduser&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then to turn it into an admin account use&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
./bin/gmg makeadmin your_username&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Breton</name></author>
	</entry>
	<entry>
		<id>https://wiki.mediagoblin.org/index.php?title=Deployment&amp;diff=1540</id>
		<title>Deployment</title>
		<link rel="alternate" type="text/html" href="https://wiki.mediagoblin.org/index.php?title=Deployment&amp;diff=1540"/>
		<updated>2014-06-21T07:10:21Z</updated>

		<summary type="html">&lt;p&gt;Breton: /* uwsgi with configs */&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;
= uwsgi =&lt;br /&gt;
&lt;br /&gt;
Possibly a cleaner way to do nginx configuration than the official nginx + fastcgi suggestions!&lt;br /&gt;
&lt;br /&gt;
http://qalthos.github.io/blog/FOSS@RIT/deploying-mediagoblin-1-fastcgi-vs-uwsgi.html&lt;br /&gt;
&lt;br /&gt;
= uwsgi with configs =&lt;br /&gt;
&lt;br /&gt;
Below there are 3 configs: for nginx, for uwsgi version 1.2.3-debian and for supervisord, used to run celery.&lt;br /&gt;
&lt;br /&gt;
In future, when newer versions of uwsgi appear in debian, supervisor can be removed.&lt;br /&gt;
&lt;br /&gt;
All instructions below are for Debian 6. They should also work with rpm-based systems, but with other paths.&lt;br /&gt;
&lt;br /&gt;
apt-get install uwsgi uwsgi-plugin-python nginx-full supervisor;&lt;br /&gt;
&lt;br /&gt;
/etc/nginx/sites-available/mediagoblin:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
        server_name &amp;lt;domain&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
        access_log /var/log/nginx/mg.access.log;&lt;br /&gt;
        error_log /var/log/nginx/mg.error.log error;&lt;br /&gt;
&lt;br /&gt;
        #include global/common.conf;&lt;br /&gt;
&lt;br /&gt;
        client_max_body_size 100m;&lt;br /&gt;
        add_header X-Content-Type-Options nosniff;&lt;br /&gt;
&lt;br /&gt;
        root /path/to/mediagoblin//user_dev/;&lt;br /&gt;
&lt;br /&gt;
        location /mgoblin_static/ {&lt;br /&gt;
                alias /path/to/mediagoblin/mediagoblin/static/;&lt;br /&gt;
        }&lt;br /&gt;
        location /mgoblin_media/ {&lt;br /&gt;
                alias /path/to/mediagoblin/user_dev/media/public/;&lt;br /&gt;
        }&lt;br /&gt;
        location /theme_static/ {&lt;br /&gt;
        }&lt;br /&gt;
        location /plugin_static/ {&lt;br /&gt;
        }&lt;br /&gt;
        location / {&lt;br /&gt;
                uwsgi_pass unix:///tmp/mg.uwsgi.sock;&lt;br /&gt;
                uwsgi_param SCRIPT_NAME &amp;quot;/&amp;quot;;&lt;br /&gt;
                include uwsgi_params;&lt;br /&gt;
        }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/etc/uwsgi/apps-available/mg.yaml:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
uwsgi:&lt;br /&gt;
 uid: mediagoblin&lt;br /&gt;
 gid: mediagoblin&lt;br /&gt;
 socket: /tmp/mg.uwsgi.sock&lt;br /&gt;
 chown-socket: www-data:www-data&lt;br /&gt;
 plugins: python&lt;br /&gt;
 home: /path/to/mediagoblin/&lt;br /&gt;
 chdir: /path/to/mediagoblin/&lt;br /&gt;
 ini-paste: /path/to/mediagoblin/paste_local.ini&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/etc/supervisor/conf.d/mediagoblin.conf:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[program:celery]&lt;br /&gt;
command=/path/to/mediagoblin/bin/celery worker -l debug&lt;br /&gt;
&lt;br /&gt;
; Set PYTHONPATH to the directory containing celeryconfig.py&lt;br /&gt;
environment=PYTHONPATH=&amp;quot;/path/to/mediagoblin&amp;quot;,MEDIAGOBLIN_CONFIG=&amp;quot;/path/to/mediagoblin/mediagoblin_local.ini&amp;quot;,CELERY_CONFIG_MODULE=&amp;quot;mediagoblin.init.celery.from_celery&amp;quot;&lt;br /&gt;
&lt;br /&gt;
directory=/path/to/mediagoblin/&lt;br /&gt;
user=mediagoblin&lt;br /&gt;
numprocs=1&lt;br /&gt;
; uncomment below to enable logs saving&lt;br /&gt;
;stdout_logfile=/some/logs/path/celeryd_stdout.log&lt;br /&gt;
;stderr_logfile=/some/logs/path/celeryd_stderr.log&lt;br /&gt;
autostart=true&lt;br /&gt;
autorestart=false&lt;br /&gt;
startsecs=10&lt;br /&gt;
&lt;br /&gt;
; Need to wait for currently executing tasks to finish at shutdown.&lt;br /&gt;
; Increase this if you have very long running tasks.&lt;br /&gt;
stopwaitsecs = 600&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After setting all configs do:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ln -s /etc/nginx/sites-available/mediagoblin /etc/nginx/sites-enabled/&lt;br /&gt;
ln -s /etc/uwsgi/apps-available/mg.yaml /etc/uwsgi/apps-enabled/mg.yaml&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= FCGI script =&lt;br /&gt;
&lt;br /&gt;
This works great with the apache FCGID config example in the next section :) in which case you should name it &amp;quot;mg.fcgi&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Before use, make sure you replace &#039;/path/to/mediagoblin/bin/python&#039; with a real path on your server, e.g. &#039;/srv/www/myhomepage.com/mediagoblin/bin/python&#039;. Also replace &#039;/path/to/mediagoblin/paste.ini&#039;.&lt;br /&gt;
&lt;br /&gt;
If you encounter problems, try executing executing the script manually, e.g. &amp;lt;pre&amp;gt;./mg.fcgi&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Script:&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;
## Uncomment this to run celery in &amp;quot;always eager&amp;quot; mode... ie, you don&#039;t have&lt;br /&gt;
## to run a separate process, but submissions wait till processing finishes&lt;br /&gt;
# import os&lt;br /&gt;
# os.environ[&#039;CELERY_ALWAYS_EAGER&#039;] = &#039;true&#039;&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 main section. libapache2-mod-fcgid can be used, but requires a slightly different configuration. For yum-based distributions, you may need to install mod_fcgid. &lt;br /&gt;
&lt;br /&gt;
  &amp;lt;VirtualHost *:80&amp;gt;&lt;br /&gt;
    Options +ExecCGI&lt;br /&gt;
  &lt;br /&gt;
    # Accept up to 16MB requests&lt;br /&gt;
    FcgidMaxRequestLen 16777216&lt;br /&gt;
  &lt;br /&gt;
    ServerName mediagoblin.example.org&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;
    ScriptAlias / /path/to/mediagoblin/mg.fcgi/&lt;br /&gt;
  &amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Apache 2 Config With mod_wsgi =&lt;br /&gt;
&lt;br /&gt;
Apache can manage the MediaGoblin application itself with mod_wsgi. It requires slightly more configuration on the Apache side, but cuts out the FastCGI middleware. See their [http://code.google.com/p/modwsgi/wiki/ConfigurationGuidelines configuration guidelines] for advanced configuration.&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;VirtualHost *:80&amp;gt;&lt;br /&gt;
    ServerName mediagoblin.example.org&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;
    WSGIScriptAlias / /path/to/mediagoblin/wsgi.py&lt;br /&gt;
    # Set user and group to whatever Apache runs as&lt;br /&gt;
    WSGIDaemonProcess gmg user=apache group=apache processes=2 threads=10 \&lt;br /&gt;
        umask=0007 inactivity-timeout=900 maximum-requests=1000 \&lt;br /&gt;
        python-path=/path/to/mediagoblin/:/path/to/mediagoblin/lib/python-2.x/site-packages/&lt;br /&gt;
    WSGIProcessGroup gmg&lt;br /&gt;
     WSGIApplicationGroup %{GLOBAL}&lt;br /&gt;
   &lt;br /&gt;
        &amp;lt;Directory &amp;quot;/path/to/mediagoblin/mediagoblin/static/&amp;quot;&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 &amp;quot;/path/to/mediagoblin/user_dev/media/public&amp;quot;&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;/VirtualHost&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You&#039;ll also need to copy this into /path/to/mediagoblin/wsgi.py:&lt;br /&gt;
&lt;br /&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;
  &lt;br /&gt;
  CONFIG_PATH = &#039;/path/to/mediagoblin/paste.ini&#039;&lt;br /&gt;
  &lt;br /&gt;
  ## Uncomment this to run celery in &amp;quot;always eager&amp;quot; mode... ie, you don&#039;t have&lt;br /&gt;
  ## to run a separate process, but submissions wait till processing finishes&lt;br /&gt;
  #import os&lt;br /&gt;
  #os.environ[&#039;CELERY_ALWAYS_EAGER&#039;] = &#039;true&#039;&lt;br /&gt;
  &lt;br /&gt;
  application = loadapp(&#039;config:&#039; + CONFIG_PATH)&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;
If it is too slow and you use the deflate module, you could try to use the following option : SetOutputFilter INFLATE&lt;br /&gt;
&lt;br /&gt;
= Lighttpd =&lt;br /&gt;
&lt;br /&gt;
This configuration example uses mod_fastcgi.&lt;br /&gt;
Make a symbolic link from &amp;lt;pre&amp;gt;/etc/lighttpd/conf-available/10-fastcgi.conf&amp;lt;/pre&amp;gt; to &amp;lt;pre&amp;gt;/etc/lighttpd/conf-enabled/10-fastcgi.conf&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ln -s /etc/lighttpd/conf-available/10-fastcgi.conf /etc/lighttpd/conf-enabled/10-fastcgi.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
then edit your /etc/lighttpd/conf-enabled/10-fastcgi.conf file modifying it as below to serve mediagoblin on the /tube/ path of your webserver.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
## FastCGI programs have the same functionality as CGI programs,&lt;br /&gt;
## but are considerably faster through lower interpreter startup&lt;br /&gt;
## time and socketed communication&lt;br /&gt;
##&lt;br /&gt;
## Documentation: /usr/share/doc/lighttpd-doc/fastcgi.txt.gz&lt;br /&gt;
##                http://www.lighttpd.net/documentation/fastcgi.html&lt;br /&gt;
&lt;br /&gt;
server.modules   += ( &amp;quot;mod_fastcgi&amp;quot; )&lt;br /&gt;
&lt;br /&gt;
## Start an FastCGI server for mediagoblin (lazyserver.sh or other deployments scripts should be up and running)&lt;br /&gt;
fastcgi.server = (&lt;br /&gt;
    # url at which the app should be accessible on the server&lt;br /&gt;
      &amp;quot;/tube&amp;quot; =&amp;gt;&lt;br /&gt;
      # mnemonical name of the backend&lt;br /&gt;
      ( &amp;quot;mg-local&amp;quot; =&amp;gt; (&lt;br /&gt;
                &amp;quot;host&amp;quot; =&amp;gt; &amp;quot;127.0.0.1&amp;quot;,&lt;br /&gt;
                &amp;quot;port&amp;quot; =&amp;gt; 6543,&lt;br /&gt;
                &amp;quot;docroot&amp;quot; =&amp;gt; &amp;quot;/path/to/mediagoblin-git-folder/mediagoblin&amp;quot;,&lt;br /&gt;
                &amp;quot;check-local&amp;quot; =&amp;gt; &amp;quot;disable&amp;quot;&lt;br /&gt;
                )&lt;br /&gt;
        )&lt;br /&gt;
&lt;br /&gt;
)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then open your /etc/lighttpd/lighttpd.conf and add the configuration to serve directly the static/public folders&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
alias.url += (&lt;br /&gt;
        &amp;quot;/mgoblin_static/&amp;quot; =&amp;gt; &amp;quot;/path/to/mediagoblin-git-folder/mediagoblin/static/&amp;quot;,&lt;br /&gt;
        &amp;quot;/mgoblin_media/&amp;quot; =&amp;gt; &amp;quot;/path/to/mediagoblin-git-folder/user_dev/media/public/&amp;quot;,&lt;br /&gt;
        &amp;quot;/theme_static/&amp;quot; =&amp;gt; &amp;quot;/path/to/mediagoblin-git-folder/user_dev/theme_static/&amp;quot;,&lt;br /&gt;
        &amp;quot;/plugin_static/&amp;quot; =&amp;gt; &amp;quot;/path/to/mediagoblin-git-folder/user_dev/plugin_static/&amp;quot;&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Done!&lt;br /&gt;
&lt;br /&gt;
= OpenShift =&lt;br /&gt;
&lt;br /&gt;
Thers&#039;s a blogpost saying how to [http://www.sud0.com/gnu-media-goblin-on-openshift.html install mediagoblin on openshift].&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;
= Init scripts =&lt;br /&gt;
&lt;br /&gt;
== Debian init scripts ==&lt;br /&gt;
&lt;br /&gt;
Joar has some scripts for running celery and mediagoblin separately that are designed for Debian.&lt;br /&gt;
&lt;br /&gt;
https://github.com/joar/mediagoblin-init-scripts&lt;br /&gt;
&lt;br /&gt;
== Arch Linux 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;
&lt;br /&gt;
&lt;br /&gt;
== Generic, simple init script ==&lt;br /&gt;
&lt;br /&gt;
This is a super stupidly simple init script that was used for mediagoblin.com... note that this has Celery running in always eager mode.&lt;br /&gt;
&lt;br /&gt;
You will need to adjust the paths appropriately.  This could probably be better written!&lt;br /&gt;
&lt;br /&gt;
  #! /bin/sh&lt;br /&gt;
  &lt;br /&gt;
  ## Stupidly simple mediagoblin init script.&lt;br /&gt;
  # &lt;br /&gt;
  # Written in 2012 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;
  PASTER=/srv/mediagoblin.com/bin/paster&lt;br /&gt;
  PASTE_CONFIG=/srv/mediagoblin.com/paste.ini&lt;br /&gt;
  OPTIONS=&amp;quot;--pid-file=/tmp/mediagoblin.pid \&lt;br /&gt;
   --log-file=/srv/mediagoblin.com/paster.log \&lt;br /&gt;
   --server-name=fcgi fcgi_host=127.0.0.1 fcgi_port=26543&amp;quot;&lt;br /&gt;
  &lt;br /&gt;
  CELERY_ALWAYS_EAGER=true su -pc &amp;quot;$PASTER serve $PASTE_CONFIG $1 $OPTIONS&amp;quot; webadmin&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;br /&gt;
&lt;br /&gt;
=Miscellaneous Hacks=&lt;br /&gt;
==Force translation==&lt;br /&gt;
There might some conditions under which you would prefer that MediaGoblin always return the same translation.  If you are deploying with nginx and fastcgi, you can force MediaGoblin to return a specific translation regardless of browser preferences by passing a specific HTTP_ACCEPT_LANGUAGE fastcgi parameter in your location block. Example last line in location block:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
    fastcgi_param HTTP_ACCEPT_LANGUAGE es; #force spanish translation&lt;br /&gt;
 &amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Create an admin user==&lt;br /&gt;
&lt;br /&gt;
To create an admin user, first create the user you need either via the website or the command&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
./bin/gmg adduser&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then to turn it into an admin account use&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
./bin/gmg makeadmin your_username&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Breton</name></author>
	</entry>
	<entry>
		<id>https://wiki.mediagoblin.org/index.php?title=Deployment&amp;diff=1539</id>
		<title>Deployment</title>
		<link rel="alternate" type="text/html" href="https://wiki.mediagoblin.org/index.php?title=Deployment&amp;diff=1539"/>
		<updated>2014-06-21T07:03:16Z</updated>

		<summary type="html">&lt;p&gt;Breton: &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;
= uwsgi =&lt;br /&gt;
&lt;br /&gt;
Possibly a cleaner way to do nginx configuration than the official nginx + fastcgi suggestions!&lt;br /&gt;
&lt;br /&gt;
http://qalthos.github.io/blog/FOSS@RIT/deploying-mediagoblin-1-fastcgi-vs-uwsgi.html&lt;br /&gt;
&lt;br /&gt;
= uwsgi with configs =&lt;br /&gt;
&lt;br /&gt;
Below there are 3 configs: for nginx, for uwsgi version 1.2.3-debian and for supervisord, used to run celery&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
        server_name &amp;lt;domain&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
        access_log /var/log/nginx/mg.access.log;&lt;br /&gt;
        error_log /var/log/nginx/mg.error.log error;&lt;br /&gt;
&lt;br /&gt;
        #include global/common.conf;&lt;br /&gt;
&lt;br /&gt;
        client_max_body_size 100m;&lt;br /&gt;
        add_header X-Content-Type-Options nosniff;&lt;br /&gt;
&lt;br /&gt;
        root /path/to/mediagoblin//user_dev/;&lt;br /&gt;
&lt;br /&gt;
        location /mgoblin_static/ {&lt;br /&gt;
                alias /path/to/mediagoblin/mediagoblin/static/;&lt;br /&gt;
        }&lt;br /&gt;
        location /mgoblin_media/ {&lt;br /&gt;
                alias /path/to/mediagoblin/user_dev/media/public/;&lt;br /&gt;
        }&lt;br /&gt;
        location /theme_static/ {&lt;br /&gt;
        }&lt;br /&gt;
        location /plugin_static/ {&lt;br /&gt;
        }&lt;br /&gt;
        location / {&lt;br /&gt;
                uwsgi_pass unix:///tmp/mg.uwsgi.sock;&lt;br /&gt;
                uwsgi_param SCRIPT_NAME &amp;quot;/&amp;quot;;&lt;br /&gt;
                include uwsgi_params;&lt;br /&gt;
        }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
mg.yaml:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
uwsgi:&lt;br /&gt;
 uid: mediagoblin&lt;br /&gt;
 gid: mediagoblin&lt;br /&gt;
 socket: /tmp/mg.uwsgi.sock&lt;br /&gt;
 chown-socket: www-data:www-data&lt;br /&gt;
 plugins: python&lt;br /&gt;
 home: /path/to/mediagoblin/&lt;br /&gt;
 chdir: /path/to/mediagoblin/&lt;br /&gt;
 ini-paste: /path/to/mediagoblin/paste_local.ini&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/etc/supervisor/conf.d/mediagoblin.conf:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[program:celery]&lt;br /&gt;
command=/home/mediagoblin/bretons-mediagoblin/bin/celery worker -l debug&lt;br /&gt;
&lt;br /&gt;
; Set PYTHONPATH to the directory containing celeryconfig.py&lt;br /&gt;
environment=PYTHONPATH=&amp;quot;/path/to/mediagoblin&amp;quot;,MEDIAGOBLIN_CONFIG=&amp;quot;/path/to/mediagoblin/mediagoblin_local.ini&amp;quot;,CELERY_CONFIG_MODULE=&amp;quot;mediagoblin.init.celery.from_celery&amp;quot;&lt;br /&gt;
&lt;br /&gt;
directory=/path/to/mediagoblin/&lt;br /&gt;
user=mediagoblin&lt;br /&gt;
numprocs=1&lt;br /&gt;
; uncomment below to enable logs saving&lt;br /&gt;
;stdout_logfile=/some/logs/path/celeryd_stdout.log&lt;br /&gt;
;stderr_logfile=/some/logs/path/celeryd_stderr.log&lt;br /&gt;
autostart=true&lt;br /&gt;
autorestart=false&lt;br /&gt;
startsecs=10&lt;br /&gt;
&lt;br /&gt;
; Need to wait for currently executing tasks to finish at shutdown.&lt;br /&gt;
; Increase this if you have very long running tasks.&lt;br /&gt;
stopwaitsecs = 600&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= FCGI script =&lt;br /&gt;
&lt;br /&gt;
This works great with the apache FCGID config example in the next section :) in which case you should name it &amp;quot;mg.fcgi&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Before use, make sure you replace &#039;/path/to/mediagoblin/bin/python&#039; with a real path on your server, e.g. &#039;/srv/www/myhomepage.com/mediagoblin/bin/python&#039;. Also replace &#039;/path/to/mediagoblin/paste.ini&#039;.&lt;br /&gt;
&lt;br /&gt;
If you encounter problems, try executing executing the script manually, e.g. &amp;lt;pre&amp;gt;./mg.fcgi&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Script:&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;
## Uncomment this to run celery in &amp;quot;always eager&amp;quot; mode... ie, you don&#039;t have&lt;br /&gt;
## to run a separate process, but submissions wait till processing finishes&lt;br /&gt;
# import os&lt;br /&gt;
# os.environ[&#039;CELERY_ALWAYS_EAGER&#039;] = &#039;true&#039;&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 main section. libapache2-mod-fcgid can be used, but requires a slightly different configuration. For yum-based distributions, you may need to install mod_fcgid. &lt;br /&gt;
&lt;br /&gt;
  &amp;lt;VirtualHost *:80&amp;gt;&lt;br /&gt;
    Options +ExecCGI&lt;br /&gt;
  &lt;br /&gt;
    # Accept up to 16MB requests&lt;br /&gt;
    FcgidMaxRequestLen 16777216&lt;br /&gt;
  &lt;br /&gt;
    ServerName mediagoblin.example.org&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;
    ScriptAlias / /path/to/mediagoblin/mg.fcgi/&lt;br /&gt;
  &amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Apache 2 Config With mod_wsgi =&lt;br /&gt;
&lt;br /&gt;
Apache can manage the MediaGoblin application itself with mod_wsgi. It requires slightly more configuration on the Apache side, but cuts out the FastCGI middleware. See their [http://code.google.com/p/modwsgi/wiki/ConfigurationGuidelines configuration guidelines] for advanced configuration.&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;VirtualHost *:80&amp;gt;&lt;br /&gt;
    ServerName mediagoblin.example.org&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;
    WSGIScriptAlias / /path/to/mediagoblin/wsgi.py&lt;br /&gt;
    # Set user and group to whatever Apache runs as&lt;br /&gt;
    WSGIDaemonProcess gmg user=apache group=apache processes=2 threads=10 \&lt;br /&gt;
        umask=0007 inactivity-timeout=900 maximum-requests=1000 \&lt;br /&gt;
        python-path=/path/to/mediagoblin/:/path/to/mediagoblin/lib/python-2.x/site-packages/&lt;br /&gt;
    WSGIProcessGroup gmg&lt;br /&gt;
     WSGIApplicationGroup %{GLOBAL}&lt;br /&gt;
   &lt;br /&gt;
        &amp;lt;Directory &amp;quot;/path/to/mediagoblin/mediagoblin/static/&amp;quot;&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 &amp;quot;/path/to/mediagoblin/user_dev/media/public&amp;quot;&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;/VirtualHost&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You&#039;ll also need to copy this into /path/to/mediagoblin/wsgi.py:&lt;br /&gt;
&lt;br /&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;
  &lt;br /&gt;
  CONFIG_PATH = &#039;/path/to/mediagoblin/paste.ini&#039;&lt;br /&gt;
  &lt;br /&gt;
  ## Uncomment this to run celery in &amp;quot;always eager&amp;quot; mode... ie, you don&#039;t have&lt;br /&gt;
  ## to run a separate process, but submissions wait till processing finishes&lt;br /&gt;
  #import os&lt;br /&gt;
  #os.environ[&#039;CELERY_ALWAYS_EAGER&#039;] = &#039;true&#039;&lt;br /&gt;
  &lt;br /&gt;
  application = loadapp(&#039;config:&#039; + CONFIG_PATH)&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;
If it is too slow and you use the deflate module, you could try to use the following option : SetOutputFilter INFLATE&lt;br /&gt;
&lt;br /&gt;
= Lighttpd =&lt;br /&gt;
&lt;br /&gt;
This configuration example uses mod_fastcgi.&lt;br /&gt;
Make a symbolic link from &amp;lt;pre&amp;gt;/etc/lighttpd/conf-available/10-fastcgi.conf&amp;lt;/pre&amp;gt; to &amp;lt;pre&amp;gt;/etc/lighttpd/conf-enabled/10-fastcgi.conf&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ln -s /etc/lighttpd/conf-available/10-fastcgi.conf /etc/lighttpd/conf-enabled/10-fastcgi.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
then edit your /etc/lighttpd/conf-enabled/10-fastcgi.conf file modifying it as below to serve mediagoblin on the /tube/ path of your webserver.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
## FastCGI programs have the same functionality as CGI programs,&lt;br /&gt;
## but are considerably faster through lower interpreter startup&lt;br /&gt;
## time and socketed communication&lt;br /&gt;
##&lt;br /&gt;
## Documentation: /usr/share/doc/lighttpd-doc/fastcgi.txt.gz&lt;br /&gt;
##                http://www.lighttpd.net/documentation/fastcgi.html&lt;br /&gt;
&lt;br /&gt;
server.modules   += ( &amp;quot;mod_fastcgi&amp;quot; )&lt;br /&gt;
&lt;br /&gt;
## Start an FastCGI server for mediagoblin (lazyserver.sh or other deployments scripts should be up and running)&lt;br /&gt;
fastcgi.server = (&lt;br /&gt;
    # url at which the app should be accessible on the server&lt;br /&gt;
      &amp;quot;/tube&amp;quot; =&amp;gt;&lt;br /&gt;
      # mnemonical name of the backend&lt;br /&gt;
      ( &amp;quot;mg-local&amp;quot; =&amp;gt; (&lt;br /&gt;
                &amp;quot;host&amp;quot; =&amp;gt; &amp;quot;127.0.0.1&amp;quot;,&lt;br /&gt;
                &amp;quot;port&amp;quot; =&amp;gt; 6543,&lt;br /&gt;
                &amp;quot;docroot&amp;quot; =&amp;gt; &amp;quot;/path/to/mediagoblin-git-folder/mediagoblin&amp;quot;,&lt;br /&gt;
                &amp;quot;check-local&amp;quot; =&amp;gt; &amp;quot;disable&amp;quot;&lt;br /&gt;
                )&lt;br /&gt;
        )&lt;br /&gt;
&lt;br /&gt;
)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then open your /etc/lighttpd/lighttpd.conf and add the configuration to serve directly the static/public folders&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
alias.url += (&lt;br /&gt;
        &amp;quot;/mgoblin_static/&amp;quot; =&amp;gt; &amp;quot;/path/to/mediagoblin-git-folder/mediagoblin/static/&amp;quot;,&lt;br /&gt;
        &amp;quot;/mgoblin_media/&amp;quot; =&amp;gt; &amp;quot;/path/to/mediagoblin-git-folder/user_dev/media/public/&amp;quot;,&lt;br /&gt;
        &amp;quot;/theme_static/&amp;quot; =&amp;gt; &amp;quot;/path/to/mediagoblin-git-folder/user_dev/theme_static/&amp;quot;,&lt;br /&gt;
        &amp;quot;/plugin_static/&amp;quot; =&amp;gt; &amp;quot;/path/to/mediagoblin-git-folder/user_dev/plugin_static/&amp;quot;&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Done!&lt;br /&gt;
&lt;br /&gt;
= OpenShift =&lt;br /&gt;
&lt;br /&gt;
Thers&#039;s a blogpost saying how to [http://www.sud0.com/gnu-media-goblin-on-openshift.html install mediagoblin on openshift].&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;
= Init scripts =&lt;br /&gt;
&lt;br /&gt;
== Debian init scripts ==&lt;br /&gt;
&lt;br /&gt;
Joar has some scripts for running celery and mediagoblin separately that are designed for Debian.&lt;br /&gt;
&lt;br /&gt;
https://github.com/joar/mediagoblin-init-scripts&lt;br /&gt;
&lt;br /&gt;
== Arch Linux 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;
&lt;br /&gt;
&lt;br /&gt;
== Generic, simple init script ==&lt;br /&gt;
&lt;br /&gt;
This is a super stupidly simple init script that was used for mediagoblin.com... note that this has Celery running in always eager mode.&lt;br /&gt;
&lt;br /&gt;
You will need to adjust the paths appropriately.  This could probably be better written!&lt;br /&gt;
&lt;br /&gt;
  #! /bin/sh&lt;br /&gt;
  &lt;br /&gt;
  ## Stupidly simple mediagoblin init script.&lt;br /&gt;
  # &lt;br /&gt;
  # Written in 2012 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;
  PASTER=/srv/mediagoblin.com/bin/paster&lt;br /&gt;
  PASTE_CONFIG=/srv/mediagoblin.com/paste.ini&lt;br /&gt;
  OPTIONS=&amp;quot;--pid-file=/tmp/mediagoblin.pid \&lt;br /&gt;
   --log-file=/srv/mediagoblin.com/paster.log \&lt;br /&gt;
   --server-name=fcgi fcgi_host=127.0.0.1 fcgi_port=26543&amp;quot;&lt;br /&gt;
  &lt;br /&gt;
  CELERY_ALWAYS_EAGER=true su -pc &amp;quot;$PASTER serve $PASTE_CONFIG $1 $OPTIONS&amp;quot; webadmin&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;br /&gt;
&lt;br /&gt;
=Miscellaneous Hacks=&lt;br /&gt;
==Force translation==&lt;br /&gt;
There might some conditions under which you would prefer that MediaGoblin always return the same translation.  If you are deploying with nginx and fastcgi, you can force MediaGoblin to return a specific translation regardless of browser preferences by passing a specific HTTP_ACCEPT_LANGUAGE fastcgi parameter in your location block. Example last line in location block:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
    fastcgi_param HTTP_ACCEPT_LANGUAGE es; #force spanish translation&lt;br /&gt;
 &amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Create an admin user==&lt;br /&gt;
&lt;br /&gt;
To create an admin user, first create the user you need either via the website or the command&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
./bin/gmg adduser&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then to turn it into an admin account use&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
./bin/gmg makeadmin your_username&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Breton</name></author>
	</entry>
	<entry>
		<id>https://wiki.mediagoblin.org/index.php?title=User:Breton/GSoC2014&amp;diff=1523</id>
		<title>User:Breton/GSoC2014</title>
		<link rel="alternate" type="text/html" href="https://wiki.mediagoblin.org/index.php?title=User:Breton/GSoC2014&amp;diff=1523"/>
		<updated>2014-04-06T19:00:09Z</updated>

		<summary type="html">&lt;p&gt;Breton: /* Write migrations */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==About me==&lt;br /&gt;
&lt;br /&gt;
My name is Boris Bobrov. I am a fourth-year student in Moscow State University, Tashkent branch, applied math and informatics faculty.&lt;br /&gt;
&lt;br /&gt;
You can contact me via:&lt;br /&gt;
* jabber: breton@jabber.ru&lt;br /&gt;
* email: breton@cynicmansion.ru&lt;br /&gt;
* irc: breton in #mediagoblin&lt;br /&gt;
&lt;br /&gt;
===Experience===&lt;br /&gt;
* 3.5 years of Python&lt;br /&gt;
* 3 years of Django&lt;br /&gt;
* 3.5 years of C in university&lt;br /&gt;
* 1.5 years of C++ in university&lt;br /&gt;
* 4 years of javascript (though I don&#039;t write too much in it); with jQuery and pure&lt;br /&gt;
* 6 years of HTML and CSS&lt;br /&gt;
* 1.5 year of Scheme and 12 months of Common Lisp&lt;br /&gt;
* basic knowledge of system administration (set up nginx, uwsgi etc, familiar with cron, shell scripting)&lt;br /&gt;
* a couple of FreeBSD kernel modules&lt;br /&gt;
&lt;br /&gt;
===I use===&lt;br /&gt;
* Debian as main OS&lt;br /&gt;
* git (mercurial where required)&lt;br /&gt;
* vim&lt;br /&gt;
&lt;br /&gt;
I am quite new to Mediagoblin community, but you may already know me by http://issues.mediagoblin.org/ticket/858 for the start&lt;br /&gt;
&lt;br /&gt;
==Python 3 port==&lt;br /&gt;
&lt;br /&gt;
===The goal===&lt;br /&gt;
&lt;br /&gt;
Have Mediagoblin running on python3 and python2 with a single codebase.&lt;br /&gt;
&lt;br /&gt;
===Rough plan===&lt;br /&gt;
&lt;br /&gt;
====Requirements====&lt;br /&gt;
In bug https://issues.mediagoblin.org/ticket/813 there is a table (with my little edit):&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Library&lt;br /&gt;
!py3?&lt;br /&gt;
!notes&lt;br /&gt;
|-&lt;br /&gt;
| setuptools         || X    || Distribute&lt;br /&gt;
|-&lt;br /&gt;
| PasteScript        || ??   || not *technically* necessary;&lt;br /&gt;
|-&lt;br /&gt;
| wtforms            || X    ||&lt;br /&gt;
|-&lt;br /&gt;
| py-bcrypt          || X    ||&lt;br /&gt;
|-&lt;br /&gt;
| pytest&amp;gt;=2.3.1      || X    ||&lt;br /&gt;
|-&lt;br /&gt;
| pytest-xdist       || X    ||&lt;br /&gt;
|-&lt;br /&gt;
| werkzeug&amp;gt;=0.7      || X    ||&lt;br /&gt;
|-&lt;br /&gt;
| celery&amp;gt;=3.0        || X    ||&lt;br /&gt;
|-&lt;br /&gt;
| kombu              || X    ||&lt;br /&gt;
|-&lt;br /&gt;
| jinja2             || X    ||&lt;br /&gt;
|-&lt;br /&gt;
| sphinx             || X    ||&lt;br /&gt;
|-&lt;br /&gt;
| Babel&amp;lt;1.0          ||      || Babel 0.9.6 does not support py3&lt;br /&gt;
|-&lt;br /&gt;
| argparse           || X    ||&lt;br /&gt;
|-&lt;br /&gt;
| webtest&amp;lt;2          || X    ||&lt;br /&gt;
|-&lt;br /&gt;
| ConfigObj          || X    || officially supported from now&lt;br /&gt;
|-&lt;br /&gt;
| Markdown           || X    ||&lt;br /&gt;
|-&lt;br /&gt;
| sqlalchemy&amp;gt;=0.8.0  || X    ||&lt;br /&gt;
|-&lt;br /&gt;
| sqlalchemy-migrate ||      || unmaintained anyhow :\&lt;br /&gt;
|-&lt;br /&gt;
| mock               || X    ||&lt;br /&gt;
|-&lt;br /&gt;
| itsdangerous       || X    ||&lt;br /&gt;
|-&lt;br /&gt;
| pytz               || X    ||&lt;br /&gt;
|-&lt;br /&gt;
| six                || X    ||&lt;br /&gt;
|-&lt;br /&gt;
| oauthlib==0.5.0    || X    ||&lt;br /&gt;
|-&lt;br /&gt;
| unidecode          || X    ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
sqlalchemy-migrate is suggested to change to Alembic.&lt;br /&gt;
&lt;br /&gt;
Something need to be done with Babel. &#039;&#039;&#039;TODO&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
====Version considerations====&lt;br /&gt;
&lt;br /&gt;
We should support is 3.2. 3.1 is too old and is present in old Debian. RHEL people install the latest version anyway. 3.2 is available in current Debian.&lt;br /&gt;
Though 3.3 has some nice features that would make the migration easier, u&#039;&#039; strings for example.&lt;br /&gt;
&lt;br /&gt;
The goal is to have a nice clean codebase that runs python 2.6, 2.7, 3.3. If some time will be left, 3.2 will be supported.&lt;br /&gt;
&lt;br /&gt;
====Caveats====&lt;br /&gt;
&lt;br /&gt;
Article http://lucumr.pocoo.org/2013/5/21/porting-to-python-3-redux/ describes some caveats, they should be checked:&lt;br /&gt;
&lt;br /&gt;
# Metaclass Syntax Changes -- metaclasses are not used in gmg&lt;br /&gt;
# Dictionaries. Mostly describes how to write dictionary-like objects. I think it&#039;s not interesting in our case, though TODO.&lt;br /&gt;
# General Iterator Changes -- not used.&lt;br /&gt;
# Transformation Codecs -- are used in some parts. Also, it differs in 3.2 and 3.3.&lt;br /&gt;
# Filesystem and file IO access -- something happens in gmg, not sure yet, what.&lt;br /&gt;
# The last and the biggest -- String Handling&lt;br /&gt;
&lt;br /&gt;
====Plan====&lt;br /&gt;
&lt;br /&gt;
# sort out versions of dependencies. Babel &amp;lt; 1.0 does not support py3. Maybe switch to newer versions of babel? Etc.&lt;br /&gt;
# adopt tox -- https://bitbucket.org/hpk42/tox, use it for different Python versions and interpreters.&lt;br /&gt;
# do something about Paste. The whole Paste as well as pastescript is python3-incompatible.&lt;br /&gt;
# follow suggestion on #813: &amp;quot;Start porting MediaGoblin&#039;s code to python 3 generally. Ignore migrations, just support MediaGoblin &amp;quot;starting with the latest database schema&amp;quot;, or even easier, set up your database on the python 2 branch before you git checkout the python 3 branch. ;)&amp;quot;&lt;br /&gt;
# write migrations&lt;br /&gt;
# if time left, backport to 3.2&lt;br /&gt;
&lt;br /&gt;
=====Sort out versions of dependencies=====&lt;br /&gt;
# Babel &amp;lt; 1.0 does not support py3. Maybe switch to newer versions of babel?&lt;br /&gt;
# TODO, some stuff didn&#039;t work while I was trying to convert to py3.&lt;br /&gt;
&lt;br /&gt;
=====Adopt tox=====&lt;br /&gt;
&lt;br /&gt;
=====Do something about Paste=====&lt;br /&gt;
&lt;br /&gt;
=====Start porting code to python3=====&lt;br /&gt;
# There is an option to use &amp;quot;six&amp;quot;. I suggest not to use it, for code cleanness. If some compatibility code will be required, it will be shipped in _compat module.&lt;br /&gt;
# http://python3porting.com/noconv.html suggests to convert to python3 and then convert back to python2. I agree with that and will do so.&lt;br /&gt;
# Hold up to ideas listed on http://lucumr.pocoo.org/2013/5/21/porting-to-python-3-redux/, like &amp;quot;Test for 2.x not 3.x&amp;quot;.&lt;br /&gt;
# The conversion will look like this: 3.3 -&amp;gt; 2.7 -&amp;gt; 2.6 [-&amp;gt; 3.2] [-&amp;gt; 3.4?].&lt;br /&gt;
# To minimize the number of errors need to be fixed during an iteration, the conversion will be done by a number of fixes. A fix is a line from &amp;quot;2to3 -l&amp;quot;. Every &amp;quot;fix&amp;quot; will be tested in order mentioned above, after it gives 0 errors, another one will be applied.&lt;br /&gt;
&lt;br /&gt;
=====Write migrations=====&lt;br /&gt;
* Switch to Alembic&lt;br /&gt;
* It still doesn&#039;t support hacks around SQLite migrations.&lt;br /&gt;
* But there is a workaround that looks small and which we could use perhaps -- https://github.com/klugjohannes/alembic-sqlite&lt;br /&gt;
&lt;br /&gt;
=====Backport to 3.2=====&lt;br /&gt;
* As said on http://lucumr.pocoo.org/2013/5/21/porting-to-python-3-redux/, &amp;quot;Supporting 3.2 is possible if you are willing to wrap all your strings in function calls which I don&#039;t recommend doing for aesthetic and performance reasons&amp;quot;.&lt;br /&gt;
* Mostly we use hardcore unicode strings in tests. Maybe code aesthetics is not so important there?&lt;br /&gt;
&lt;br /&gt;
==What I do and don&#039;t know==&lt;br /&gt;
# Paste. I have no idea what it is for.&lt;br /&gt;
# sqlalchemy-migrate. Never used it. Though I have worked with django&#039;s south.&lt;br /&gt;
# No experience in migrating to Python 3 and no proper experience in Python 3.&lt;br /&gt;
&lt;br /&gt;
Also see [[/Melange]]&lt;/div&gt;</summary>
		<author><name>Breton</name></author>
	</entry>
	<entry>
		<id>https://wiki.mediagoblin.org/index.php?title=User:Breton/GSoC2014&amp;diff=1516</id>
		<title>User:Breton/GSoC2014</title>
		<link rel="alternate" type="text/html" href="https://wiki.mediagoblin.org/index.php?title=User:Breton/GSoC2014&amp;diff=1516"/>
		<updated>2014-03-20T21:27:34Z</updated>

		<summary type="html">&lt;p&gt;Breton: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==About me==&lt;br /&gt;
&lt;br /&gt;
My name is Boris Bobrov. I am a fourth-year student in Moscow State University, Tashkent branch, applied math and informatics faculty.&lt;br /&gt;
&lt;br /&gt;
You can contact me via:&lt;br /&gt;
* jabber: breton@jabber.ru&lt;br /&gt;
* email: breton@cynicmansion.ru&lt;br /&gt;
* irc: breton in #mediagoblin&lt;br /&gt;
&lt;br /&gt;
===Experience===&lt;br /&gt;
* 3.5 years of Python&lt;br /&gt;
* 3 years of Django&lt;br /&gt;
* 3.5 years of C in university&lt;br /&gt;
* 1.5 years of C++ in university&lt;br /&gt;
* 4 years of javascript (though I don&#039;t write too much in it); with jQuery and pure&lt;br /&gt;
* 6 years of HTML and CSS&lt;br /&gt;
* 1.5 year of Scheme and 12 months of Common Lisp&lt;br /&gt;
* basic knowledge of system administration (set up nginx, uwsgi etc, familiar with cron, shell scripting)&lt;br /&gt;
* a couple of FreeBSD kernel modules&lt;br /&gt;
&lt;br /&gt;
===I use===&lt;br /&gt;
* Debian as main OS&lt;br /&gt;
* git (mercurial where required)&lt;br /&gt;
* vim&lt;br /&gt;
&lt;br /&gt;
I am quite new to Mediagoblin community, but you may already know me by http://issues.mediagoblin.org/ticket/858 for the start&lt;br /&gt;
&lt;br /&gt;
==Python 3 port==&lt;br /&gt;
&lt;br /&gt;
===The goal===&lt;br /&gt;
&lt;br /&gt;
Have Mediagoblin running on python3 and python2 with a single codebase.&lt;br /&gt;
&lt;br /&gt;
===Rough plan===&lt;br /&gt;
&lt;br /&gt;
====Requirements====&lt;br /&gt;
In bug https://issues.mediagoblin.org/ticket/813 there is a table (with my little edit):&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Library&lt;br /&gt;
!py3?&lt;br /&gt;
!notes&lt;br /&gt;
|-&lt;br /&gt;
| setuptools         || X    || Distribute&lt;br /&gt;
|-&lt;br /&gt;
| PasteScript        || ??   || not *technically* necessary;&lt;br /&gt;
|-&lt;br /&gt;
| wtforms            || X    ||&lt;br /&gt;
|-&lt;br /&gt;
| py-bcrypt          || X    ||&lt;br /&gt;
|-&lt;br /&gt;
| pytest&amp;gt;=2.3.1      || X    ||&lt;br /&gt;
|-&lt;br /&gt;
| pytest-xdist       || X    ||&lt;br /&gt;
|-&lt;br /&gt;
| werkzeug&amp;gt;=0.7      || X    ||&lt;br /&gt;
|-&lt;br /&gt;
| celery&amp;gt;=3.0        || X    ||&lt;br /&gt;
|-&lt;br /&gt;
| kombu              || X    ||&lt;br /&gt;
|-&lt;br /&gt;
| jinja2             || X    ||&lt;br /&gt;
|-&lt;br /&gt;
| sphinx             || X    ||&lt;br /&gt;
|-&lt;br /&gt;
| Babel&amp;lt;1.0          ||      || Babel 0.9.6 does not support py3&lt;br /&gt;
|-&lt;br /&gt;
| argparse           || X    ||&lt;br /&gt;
|-&lt;br /&gt;
| webtest&amp;lt;2          || X    ||&lt;br /&gt;
|-&lt;br /&gt;
| ConfigObj          || X    || officially supported from now&lt;br /&gt;
|-&lt;br /&gt;
| Markdown           || X    ||&lt;br /&gt;
|-&lt;br /&gt;
| sqlalchemy&amp;gt;=0.8.0  || X    ||&lt;br /&gt;
|-&lt;br /&gt;
| sqlalchemy-migrate ||      || unmaintained anyhow :\&lt;br /&gt;
|-&lt;br /&gt;
| mock               || X    ||&lt;br /&gt;
|-&lt;br /&gt;
| itsdangerous       || X    ||&lt;br /&gt;
|-&lt;br /&gt;
| pytz               || X    ||&lt;br /&gt;
|-&lt;br /&gt;
| six                || X    ||&lt;br /&gt;
|-&lt;br /&gt;
| oauthlib==0.5.0    || X    ||&lt;br /&gt;
|-&lt;br /&gt;
| unidecode          || X    ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
sqlalchemy-migrate is suggested to change to Alembic.&lt;br /&gt;
&lt;br /&gt;
Something need to be done with Babel. &#039;&#039;&#039;TODO&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
====Version considerations====&lt;br /&gt;
&lt;br /&gt;
We should support is 3.2. 3.1 is too old and is present in old Debian. RHEL people install the latest version anyway. 3.2 is available in current Debian.&lt;br /&gt;
Though 3.3 has some nice features that would make the migration easier, u&#039;&#039; strings for example.&lt;br /&gt;
&lt;br /&gt;
The goal is to have a nice clean codebase that runs python 2.6, 2.7, 3.3. If some time will be left, 3.2 will be supported.&lt;br /&gt;
&lt;br /&gt;
====Caveats====&lt;br /&gt;
&lt;br /&gt;
Article http://lucumr.pocoo.org/2013/5/21/porting-to-python-3-redux/ describes some caveats, they should be checked:&lt;br /&gt;
&lt;br /&gt;
# Metaclass Syntax Changes -- metaclasses are not used in gmg&lt;br /&gt;
# Dictionaries. Mostly describes how to write dictionary-like objects. I think it&#039;s not interesting in our case, though TODO.&lt;br /&gt;
# General Iterator Changes -- not used.&lt;br /&gt;
# Transformation Codecs -- are used in some parts. Also, it differs in 3.2 and 3.3.&lt;br /&gt;
# Filesystem and file IO access -- something happens in gmg, not sure yet, what.&lt;br /&gt;
# The last and the biggest -- String Handling&lt;br /&gt;
&lt;br /&gt;
====Plan====&lt;br /&gt;
&lt;br /&gt;
# sort out versions of dependencies. Babel &amp;lt; 1.0 does not support py3. Maybe switch to newer versions of babel? Etc.&lt;br /&gt;
# adopt tox -- https://bitbucket.org/hpk42/tox, use it for different Python versions and interpreters.&lt;br /&gt;
# do something about Paste. The whole Paste as well as pastescript is python3-incompatible.&lt;br /&gt;
# follow suggestion on #813: &amp;quot;Start porting MediaGoblin&#039;s code to python 3 generally. Ignore migrations, just support MediaGoblin &amp;quot;starting with the latest database schema&amp;quot;, or even easier, set up your database on the python 2 branch before you git checkout the python 3 branch. ;)&amp;quot;&lt;br /&gt;
# write migrations&lt;br /&gt;
# if time left, backport to 3.2&lt;br /&gt;
&lt;br /&gt;
=====Sort out versions of dependencies=====&lt;br /&gt;
# Babel &amp;lt; 1.0 does not support py3. Maybe switch to newer versions of babel?&lt;br /&gt;
# TODO, some stuff didn&#039;t work while I was trying to convert to py3.&lt;br /&gt;
&lt;br /&gt;
=====Adopt tox=====&lt;br /&gt;
&lt;br /&gt;
=====Do something about Paste=====&lt;br /&gt;
&lt;br /&gt;
=====Start porting code to python3=====&lt;br /&gt;
# There is an option to use &amp;quot;six&amp;quot;. I suggest not to use it, for code cleanness. If some compatibility code will be required, it will be shipped in _compat module.&lt;br /&gt;
# http://python3porting.com/noconv.html suggests to convert to python3 and then convert back to python2. I agree with that and will do so.&lt;br /&gt;
# Hold up to ideas listed on http://lucumr.pocoo.org/2013/5/21/porting-to-python-3-redux/, like &amp;quot;Test for 2.x not 3.x&amp;quot;.&lt;br /&gt;
# The conversion will look like this: 3.3 -&amp;gt; 2.7 -&amp;gt; 2.6 [-&amp;gt; 3.2] [-&amp;gt; 3.4?].&lt;br /&gt;
# To minimize the number of errors need to be fixed during an iteration, the conversion will be done by a number of fixes. A fix is a line from &amp;quot;2to3 -l&amp;quot;. Every &amp;quot;fix&amp;quot; will be tested in order mentioned above, after it gives 0 errors, another one will be applied.&lt;br /&gt;
&lt;br /&gt;
=====Write migrations=====&lt;br /&gt;
* Switch to Alembic&lt;br /&gt;
* It still doesn&#039;t support hacks around SQLite migrations.&lt;br /&gt;
* But there is a workaround which looks small and which we could use perhaps -- https://github.com/klugjohannes/alembic-sqlite&lt;br /&gt;
&lt;br /&gt;
=====Backport to 3.2=====&lt;br /&gt;
* As said on http://lucumr.pocoo.org/2013/5/21/porting-to-python-3-redux/, &amp;quot;Supporting 3.2 is possible if you are willing to wrap all your strings in function calls which I don&#039;t recommend doing for aesthetic and performance reasons&amp;quot;.&lt;br /&gt;
* Mostly we use hardcore unicode strings in tests. Maybe code aesthetics is not so important there?&lt;br /&gt;
&lt;br /&gt;
==What I do and don&#039;t know==&lt;br /&gt;
# Paste. I have no idea what it is for.&lt;br /&gt;
# sqlalchemy-migrate. Never used it. Though I have worked with django&#039;s south.&lt;br /&gt;
# No experience in migrating to Python 3 and no proper experience in Python 3.&lt;br /&gt;
&lt;br /&gt;
Also see [[/Melange]]&lt;/div&gt;</summary>
		<author><name>Breton</name></author>
	</entry>
	<entry>
		<id>https://wiki.mediagoblin.org/index.php?title=User:Breton/GSoC2014/Melange&amp;diff=1515</id>
		<title>User:Breton/GSoC2014/Melange</title>
		<link rel="alternate" type="text/html" href="https://wiki.mediagoblin.org/index.php?title=User:Breton/GSoC2014/Melange&amp;diff=1515"/>
		<updated>2014-03-20T21:26:31Z</updated>

		<summary type="html">&lt;p&gt;Breton: Created page with &amp;quot;This application was submitted to Melange with compliance to GNU template. Pasting it here.  &amp;lt;pre&amp;gt; Your name     Boris Bobrov  Your email address     breton@cynicmansion.ru  T...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This application was submitted to Melange with compliance to GNU template. Pasting it here.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Your name&lt;br /&gt;
    Boris Bobrov&lt;br /&gt;
&lt;br /&gt;
Your email address&lt;br /&gt;
    breton@cynicmansion.ru&lt;br /&gt;
&lt;br /&gt;
The name of the project&lt;br /&gt;
    Mediagoblin: Python 3 port + switch to Alembic&lt;br /&gt;
&lt;br /&gt;
Summary&lt;br /&gt;
    Port all of MediaGoblin&#039;s code to python 3: https://issues.mediagoblin.org/ticket/813&lt;br /&gt;
    Currently MediaGoblin uses sqlalchemy-migrate, but it&#039;s fairly outdated and unmaintained.&lt;br /&gt;
    Port the migration infrastructure to using Alembic instead. Which is also python3-compatible.&lt;br /&gt;
&lt;br /&gt;
Benefits&lt;br /&gt;
    Python 3 is a new modern language that gaines popularity.&lt;br /&gt;
    Also sqlalchemy-migrate used there is old and should be changed to a new shiny Alembic&lt;br /&gt;
&lt;br /&gt;
Deliverables&lt;br /&gt;
    All code will be python3.3-compatible, it means, that there the whole codebase will work with python 2.6, 2.7, 3.3+, maybe 3.2.&lt;br /&gt;
    Minimal requirements&#039; versions will be determined and the code will be ported to use them.&lt;br /&gt;
    Alembic will be switched to sqlalchemy-migrate. Alembic is a database-schema migration tool.&lt;br /&gt;
&lt;br /&gt;
Plan&lt;br /&gt;
    A rough plan:&lt;br /&gt;
        1. do something about Paste. Paste as well as pastescript is python3-incompatible.&lt;br /&gt;
            - Drop it!&lt;br /&gt;
        2. sort out versions of dependencies. Babel &amp;lt; 1.0 does not support py3. Maybe switch to newer versions of babel? Etc.&lt;br /&gt;
        3. adopt tox -- https://bitbucket.org/hpk42/tox, use it for different Python versions and interpreters.&lt;br /&gt;
        4. follow suggestion on #813: &amp;quot;Start porting MediaGoblin&#039;s code to python 3 generally. Ignore migrations, just support MediaGoblin &amp;quot;starting with the latest database schema&amp;quot;, or even easier, set up your database on the python 2 branch before you git checkout the python 3 branch. ;)&amp;quot;&lt;br /&gt;
            - There is an option to use &amp;quot;six&amp;quot;. I suggest not to use it, for code cleanness. If some compatibility code will be required, it will be shipped in _compat module.&lt;br /&gt;
            - http://python3porting.com/noconv.html suggests to convert to python3 and then convert back to python2. I agree with that and will do so.&lt;br /&gt;
            - Hold up to ideas listed on http://lucumr.pocoo.org/2013/5/21/porting-to-python-3-redux/, like &amp;quot;Test for 2.x not 3.x&amp;quot;.&lt;br /&gt;
            - The conversion will look like this: 3.3 -&amp;gt; 2.7 -&amp;gt; 2.6 [-&amp;gt; 3.2] [-&amp;gt; 3.4?].&lt;br /&gt;
            - To minimize the number of errors need to be fixed during an iteration, the conversion will be done by a number of fixes. A fix is a line from &amp;quot;2to3 -l&amp;quot;. Every &amp;quot;fix&amp;quot; will be tested in order mentioned above, after it gives 0 errors, another one will be applied.&lt;br /&gt;
        5. Write migrations&lt;br /&gt;
            - Switch to Alembic&lt;br /&gt;
            - It still doesn&#039;t support hacks around SQLite migrations.&lt;br /&gt;
            - But there is a workaround which looks small and which we could use perhaps -- https://github.com/klugjohannes/alembic-sqlite&lt;br /&gt;
        6. if time left, backport to 3.2&lt;br /&gt;
    A little script involving 2to3 shows that these types of changes are required:&lt;br /&gt;
        import, set_literal, input, idioms, print, dict, ws_comma (sorted asc).&lt;br /&gt;
    Timeline:&lt;br /&gt;
        Bonding period: getting to know architecture better, reading requirements&#039; changelogs, experimenting.&lt;br /&gt;
        19 May -- 27 May: drop Paste, drop sqlalchemy-migrate, getting dependencies, fix tests&lt;br /&gt;
        28 May -- 1 June: adopting tox, making current tests pass and getting failures on python 3.&lt;br /&gt;
        2 June -- 15 June: porting&lt;br /&gt;
        15 June -- 27 June (mid-term): if everything is done, porting to python 3.2. Else finishing what remains. Or start switching to Alembic.&lt;br /&gt;
        30 June -- 20 Jule: integrating Alembic&lt;br /&gt;
        31 Jule -- 11 August: backporting old migrations to Alembic&lt;br /&gt;
&lt;br /&gt;
Communication&lt;br /&gt;
    We are going to chat in email, mailing lists and IRC. My nick in IRC is breton, I already hang out in #mediagoblin on freenode.&lt;br /&gt;
    I use git, mediagoblin is stored in git, we shall work using it.&lt;br /&gt;
&lt;br /&gt;
Qualification&lt;br /&gt;
    Experience:&lt;br /&gt;
        3.5 years of Python&lt;br /&gt;
        3 years of Django&lt;br /&gt;
        3.5 years of C in university&lt;br /&gt;
        1.5 years of C++ in university&lt;br /&gt;
        4 years of javascript (though I don&#039;t write too much in it); with jQuery and pure&lt;br /&gt;
        6 years of HTML and CSS&lt;br /&gt;
        1.5 year of Scheme and 12 months of Common Lisp&lt;br /&gt;
        basic knowledge of system administration (set up nginx, uwsgi etc, familiar with cron, shell scripting)&lt;br /&gt;
        a couple of FreeBSD kernel modules&lt;br /&gt;
    I use&lt;br /&gt;
        Debian as main OS&lt;br /&gt;
        git (mercurial where required)&lt;br /&gt;
        vim&lt;br /&gt;
    I liked the project because it&#039;s:&lt;br /&gt;
        1. MediaGoblin. I like it&#039;s idea and what people do there;&lt;br /&gt;
        2. Python;&lt;br /&gt;
        3. Python 3. I don&#039;t have too much experience in Python 3, and I want to a) learn it better and b) learn how to port to it.&lt;br /&gt;
    You can find my github repo here: https://github.com/bretonium/&lt;br /&gt;
    I don&#039;t know some of the tools used there, such as Paste. I don&#039;t think it&#039;s a problem, because one of the subtasks is to drop it.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Breton</name></author>
	</entry>
	<entry>
		<id>https://wiki.mediagoblin.org/index.php?title=User:Breton/GSoC2014&amp;diff=1514</id>
		<title>User:Breton/GSoC2014</title>
		<link rel="alternate" type="text/html" href="https://wiki.mediagoblin.org/index.php?title=User:Breton/GSoC2014&amp;diff=1514"/>
		<updated>2014-03-20T20:58:53Z</updated>

		<summary type="html">&lt;p&gt;Breton: /* Write migrations */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==About me==&lt;br /&gt;
&lt;br /&gt;
My name is Boris Bobrov. I am a fourth-year student in Moscow State University, Tashkent branch, applied math and informatics faculty.&lt;br /&gt;
&lt;br /&gt;
You can contact me via:&lt;br /&gt;
* jabber: breton@jabber.ru&lt;br /&gt;
* email: breton@cynicmansion.ru&lt;br /&gt;
* irc: breton in #mediagoblin&lt;br /&gt;
&lt;br /&gt;
===Experience===&lt;br /&gt;
* 3.5 years of Python&lt;br /&gt;
* 3 years of Django&lt;br /&gt;
* 3.5 years of C in university&lt;br /&gt;
* 1.5 years of C++ in university&lt;br /&gt;
* 4 years of javascript (though I don&#039;t write too much in it); with jQuery and pure&lt;br /&gt;
* 6 years of HTML and CSS&lt;br /&gt;
* 1.5 year of Scheme and 12 months of Common Lisp&lt;br /&gt;
* basic knowledge of system administration (set up nginx, uwsgi etc, familiar with cron, shell scripting)&lt;br /&gt;
* a couple of FreeBSD kernel modules&lt;br /&gt;
&lt;br /&gt;
===I use===&lt;br /&gt;
* Debian as main OS&lt;br /&gt;
* git (mercurial where required)&lt;br /&gt;
* vim&lt;br /&gt;
&lt;br /&gt;
I am quite new to Mediagoblin community, but you may already know me by http://issues.mediagoblin.org/ticket/858 for the start&lt;br /&gt;
&lt;br /&gt;
==Python 3 port==&lt;br /&gt;
&lt;br /&gt;
===The goal===&lt;br /&gt;
&lt;br /&gt;
Have Mediagoblin running on python3 and python2 with a single codebase.&lt;br /&gt;
&lt;br /&gt;
===Rough plan===&lt;br /&gt;
&lt;br /&gt;
====Requirements====&lt;br /&gt;
In bug https://issues.mediagoblin.org/ticket/813 there is a table (with my little edit):&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Library&lt;br /&gt;
!py3?&lt;br /&gt;
!notes&lt;br /&gt;
|-&lt;br /&gt;
| setuptools         || X    || Distribute&lt;br /&gt;
|-&lt;br /&gt;
| PasteScript        || ??   || not *technically* necessary;&lt;br /&gt;
|-&lt;br /&gt;
| wtforms            || X    ||&lt;br /&gt;
|-&lt;br /&gt;
| py-bcrypt          || X    ||&lt;br /&gt;
|-&lt;br /&gt;
| pytest&amp;gt;=2.3.1      || X    ||&lt;br /&gt;
|-&lt;br /&gt;
| pytest-xdist       || X    ||&lt;br /&gt;
|-&lt;br /&gt;
| werkzeug&amp;gt;=0.7      || X    ||&lt;br /&gt;
|-&lt;br /&gt;
| celery&amp;gt;=3.0        || X    ||&lt;br /&gt;
|-&lt;br /&gt;
| kombu              || X    ||&lt;br /&gt;
|-&lt;br /&gt;
| jinja2             || X    ||&lt;br /&gt;
|-&lt;br /&gt;
| sphinx             || X    ||&lt;br /&gt;
|-&lt;br /&gt;
| Babel&amp;lt;1.0          ||      || Babel 0.9.6 does not support py3&lt;br /&gt;
|-&lt;br /&gt;
| argparse           || X    ||&lt;br /&gt;
|-&lt;br /&gt;
| webtest&amp;lt;2          || X    ||&lt;br /&gt;
|-&lt;br /&gt;
| ConfigObj          || X    || officially supported from now&lt;br /&gt;
|-&lt;br /&gt;
| Markdown           || X    ||&lt;br /&gt;
|-&lt;br /&gt;
| sqlalchemy&amp;gt;=0.8.0  || X    ||&lt;br /&gt;
|-&lt;br /&gt;
| sqlalchemy-migrate ||      || unmaintained anyhow :\&lt;br /&gt;
|-&lt;br /&gt;
| mock               || X    ||&lt;br /&gt;
|-&lt;br /&gt;
| itsdangerous       || X    ||&lt;br /&gt;
|-&lt;br /&gt;
| pytz               || X    ||&lt;br /&gt;
|-&lt;br /&gt;
| six                || X    ||&lt;br /&gt;
|-&lt;br /&gt;
| oauthlib==0.5.0    || X    ||&lt;br /&gt;
|-&lt;br /&gt;
| unidecode          || X    ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
sqlalchemy-migrate is suggested to change to Alembic.&lt;br /&gt;
&lt;br /&gt;
Something need to be done with Babel. &#039;&#039;&#039;TODO&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
====Version considerations====&lt;br /&gt;
&lt;br /&gt;
We should support is 3.2. 3.1 is too old and is present in old Debian. RHEL people install the latest version anyway. 3.2 is available in current Debian.&lt;br /&gt;
Though 3.3 has some nice features that would make the migration easier, u&#039;&#039; strings for example.&lt;br /&gt;
&lt;br /&gt;
The goal is to have a nice clean codebase that runs python 2.6, 2.7, 3.3. If some time will be left, 3.2 will be supported.&lt;br /&gt;
&lt;br /&gt;
====Caveats====&lt;br /&gt;
&lt;br /&gt;
Article http://lucumr.pocoo.org/2013/5/21/porting-to-python-3-redux/ describes some caveats, they should be checked:&lt;br /&gt;
&lt;br /&gt;
# Metaclass Syntax Changes -- metaclasses are not used in gmg&lt;br /&gt;
# Dictionaries. Mostly describes how to write dictionary-like objects. I think it&#039;s not interesting in our case, though TODO.&lt;br /&gt;
# General Iterator Changes -- not used.&lt;br /&gt;
# Transformation Codecs -- are used in some parts. Also, it differs in 3.2 and 3.3.&lt;br /&gt;
# Filesystem and file IO access -- something happens in gmg, not sure yet, what.&lt;br /&gt;
# The last and the biggest -- String Handling&lt;br /&gt;
&lt;br /&gt;
====Plan====&lt;br /&gt;
&lt;br /&gt;
# sort out versions of dependencies. Babel &amp;lt; 1.0 does not support py3. Maybe switch to newer versions of babel? Etc.&lt;br /&gt;
# adopt tox -- https://bitbucket.org/hpk42/tox, use it for different Python versions and interpreters.&lt;br /&gt;
# do something about Paste. The whole Paste as well as pastescript is python3-incompatible.&lt;br /&gt;
# follow suggestion on #813: &amp;quot;Start porting MediaGoblin&#039;s code to python 3 generally. Ignore migrations, just support MediaGoblin &amp;quot;starting with the latest database schema&amp;quot;, or even easier, set up your database on the python 2 branch before you git checkout the python 3 branch. ;)&amp;quot;&lt;br /&gt;
# write migrations&lt;br /&gt;
# if time left, backport to 3.2&lt;br /&gt;
&lt;br /&gt;
=====Sort out versions of dependencies=====&lt;br /&gt;
# Babel &amp;lt; 1.0 does not support py3. Maybe switch to newer versions of babel?&lt;br /&gt;
# TODO, some stuff didn&#039;t work while I was trying to convert to py3.&lt;br /&gt;
&lt;br /&gt;
=====Adopt tox=====&lt;br /&gt;
&lt;br /&gt;
=====Do something about Paste=====&lt;br /&gt;
&lt;br /&gt;
=====Start porting code to python3=====&lt;br /&gt;
# There is an option to use &amp;quot;six&amp;quot;. I suggest not to use it, for code cleanness. If some compatibility code will be required, it will be shipped in _compat module.&lt;br /&gt;
# http://python3porting.com/noconv.html suggests to convert to python3 and then convert back to python2. I agree with that and will do so.&lt;br /&gt;
# Hold up to ideas listed on http://lucumr.pocoo.org/2013/5/21/porting-to-python-3-redux/, like &amp;quot;Test for 2.x not 3.x&amp;quot;.&lt;br /&gt;
# The conversion will look like this: 3.3 -&amp;gt; 2.7 -&amp;gt; 2.6 [-&amp;gt; 3.2] [-&amp;gt; 3.4?].&lt;br /&gt;
# To minimize the number of errors need to be fixed during an iteration, the conversion will be done by a number of fixes. A fix is a line from &amp;quot;2to3 -l&amp;quot;. Every &amp;quot;fix&amp;quot; will be tested in order mentioned above, after it gives 0 errors, another one will be applied.&lt;br /&gt;
&lt;br /&gt;
=====Write migrations=====&lt;br /&gt;
* Switch to Alembic&lt;br /&gt;
* It still doesn&#039;t support hacks around SQLite migrations.&lt;br /&gt;
* But there is a workaround which looks small and which we could use perhaps -- https://github.com/klugjohannes/alembic-sqlite&lt;br /&gt;
&lt;br /&gt;
=====Backport to 3.2=====&lt;br /&gt;
* As said on http://lucumr.pocoo.org/2013/5/21/porting-to-python-3-redux/, &amp;quot;Supporting 3.2 is possible if you are willing to wrap all your strings in function calls which I don&#039;t recommend doing for aesthetic and performance reasons&amp;quot;.&lt;br /&gt;
* Mostly we use hardcore unicode strings in tests. Maybe code aesthetics is not so important there?&lt;br /&gt;
&lt;br /&gt;
==What I do and don&#039;t know==&lt;br /&gt;
# Paste. I have no idea what it is for.&lt;br /&gt;
# sqlalchemy-migrate. Never used it. Though I have worked with django&#039;s south.&lt;br /&gt;
# No experience in migrating to Python 3 and no proper experience in Python 3.&lt;/div&gt;</summary>
		<author><name>Breton</name></author>
	</entry>
	<entry>
		<id>https://wiki.mediagoblin.org/index.php?title=User:Breton/GSoC2014&amp;diff=1513</id>
		<title>User:Breton/GSoC2014</title>
		<link rel="alternate" type="text/html" href="https://wiki.mediagoblin.org/index.php?title=User:Breton/GSoC2014&amp;diff=1513"/>
		<updated>2014-03-19T00:02:26Z</updated>

		<summary type="html">&lt;p&gt;Breton: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==About me==&lt;br /&gt;
&lt;br /&gt;
My name is Boris Bobrov. I am a fourth-year student in Moscow State University, Tashkent branch, applied math and informatics faculty.&lt;br /&gt;
&lt;br /&gt;
You can contact me via:&lt;br /&gt;
* jabber: breton@jabber.ru&lt;br /&gt;
* email: breton@cynicmansion.ru&lt;br /&gt;
* irc: breton in #mediagoblin&lt;br /&gt;
&lt;br /&gt;
===Experience===&lt;br /&gt;
* 3.5 years of Python&lt;br /&gt;
* 3 years of Django&lt;br /&gt;
* 3.5 years of C in university&lt;br /&gt;
* 1.5 years of C++ in university&lt;br /&gt;
* 4 years of javascript (though I don&#039;t write too much in it); with jQuery and pure&lt;br /&gt;
* 6 years of HTML and CSS&lt;br /&gt;
* 1.5 year of Scheme and 12 months of Common Lisp&lt;br /&gt;
* basic knowledge of system administration (set up nginx, uwsgi etc, familiar with cron, shell scripting)&lt;br /&gt;
* a couple of FreeBSD kernel modules&lt;br /&gt;
&lt;br /&gt;
===I use===&lt;br /&gt;
* Debian as main OS&lt;br /&gt;
* git (mercurial where required)&lt;br /&gt;
* vim&lt;br /&gt;
&lt;br /&gt;
I am quite new to Mediagoblin community, but you may already know me by http://issues.mediagoblin.org/ticket/858 for the start&lt;br /&gt;
&lt;br /&gt;
==Python 3 port==&lt;br /&gt;
&lt;br /&gt;
===The goal===&lt;br /&gt;
&lt;br /&gt;
Have Mediagoblin running on python3 and python2 with a single codebase.&lt;br /&gt;
&lt;br /&gt;
===Rough plan===&lt;br /&gt;
&lt;br /&gt;
====Requirements====&lt;br /&gt;
In bug https://issues.mediagoblin.org/ticket/813 there is a table (with my little edit):&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Library&lt;br /&gt;
!py3?&lt;br /&gt;
!notes&lt;br /&gt;
|-&lt;br /&gt;
| setuptools         || X    || Distribute&lt;br /&gt;
|-&lt;br /&gt;
| PasteScript        || ??   || not *technically* necessary;&lt;br /&gt;
|-&lt;br /&gt;
| wtforms            || X    ||&lt;br /&gt;
|-&lt;br /&gt;
| py-bcrypt          || X    ||&lt;br /&gt;
|-&lt;br /&gt;
| pytest&amp;gt;=2.3.1      || X    ||&lt;br /&gt;
|-&lt;br /&gt;
| pytest-xdist       || X    ||&lt;br /&gt;
|-&lt;br /&gt;
| werkzeug&amp;gt;=0.7      || X    ||&lt;br /&gt;
|-&lt;br /&gt;
| celery&amp;gt;=3.0        || X    ||&lt;br /&gt;
|-&lt;br /&gt;
| kombu              || X    ||&lt;br /&gt;
|-&lt;br /&gt;
| jinja2             || X    ||&lt;br /&gt;
|-&lt;br /&gt;
| sphinx             || X    ||&lt;br /&gt;
|-&lt;br /&gt;
| Babel&amp;lt;1.0          ||      || Babel 0.9.6 does not support py3&lt;br /&gt;
|-&lt;br /&gt;
| argparse           || X    ||&lt;br /&gt;
|-&lt;br /&gt;
| webtest&amp;lt;2          || X    ||&lt;br /&gt;
|-&lt;br /&gt;
| ConfigObj          || X    || officially supported from now&lt;br /&gt;
|-&lt;br /&gt;
| Markdown           || X    ||&lt;br /&gt;
|-&lt;br /&gt;
| sqlalchemy&amp;gt;=0.8.0  || X    ||&lt;br /&gt;
|-&lt;br /&gt;
| sqlalchemy-migrate ||      || unmaintained anyhow :\&lt;br /&gt;
|-&lt;br /&gt;
| mock               || X    ||&lt;br /&gt;
|-&lt;br /&gt;
| itsdangerous       || X    ||&lt;br /&gt;
|-&lt;br /&gt;
| pytz               || X    ||&lt;br /&gt;
|-&lt;br /&gt;
| six                || X    ||&lt;br /&gt;
|-&lt;br /&gt;
| oauthlib==0.5.0    || X    ||&lt;br /&gt;
|-&lt;br /&gt;
| unidecode          || X    ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
sqlalchemy-migrate is suggested to change to Alembic.&lt;br /&gt;
&lt;br /&gt;
Something need to be done with Babel. &#039;&#039;&#039;TODO&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
====Version considerations====&lt;br /&gt;
&lt;br /&gt;
We should support is 3.2. 3.1 is too old and is present in old Debian. RHEL people install the latest version anyway. 3.2 is available in current Debian.&lt;br /&gt;
Though 3.3 has some nice features that would make the migration easier, u&#039;&#039; strings for example.&lt;br /&gt;
&lt;br /&gt;
The goal is to have a nice clean codebase that runs python 2.6, 2.7, 3.3. If some time will be left, 3.2 will be supported.&lt;br /&gt;
&lt;br /&gt;
====Caveats====&lt;br /&gt;
&lt;br /&gt;
Article http://lucumr.pocoo.org/2013/5/21/porting-to-python-3-redux/ describes some caveats, they should be checked:&lt;br /&gt;
&lt;br /&gt;
# Metaclass Syntax Changes -- metaclasses are not used in gmg&lt;br /&gt;
# Dictionaries. Mostly describes how to write dictionary-like objects. I think it&#039;s not interesting in our case, though TODO.&lt;br /&gt;
# General Iterator Changes -- not used.&lt;br /&gt;
# Transformation Codecs -- are used in some parts. Also, it differs in 3.2 and 3.3.&lt;br /&gt;
# Filesystem and file IO access -- something happens in gmg, not sure yet, what.&lt;br /&gt;
# The last and the biggest -- String Handling&lt;br /&gt;
&lt;br /&gt;
====Plan====&lt;br /&gt;
&lt;br /&gt;
# sort out versions of dependencies. Babel &amp;lt; 1.0 does not support py3. Maybe switch to newer versions of babel? Etc.&lt;br /&gt;
# adopt tox -- https://bitbucket.org/hpk42/tox, use it for different Python versions and interpreters.&lt;br /&gt;
# do something about Paste. The whole Paste as well as pastescript is python3-incompatible.&lt;br /&gt;
# follow suggestion on #813: &amp;quot;Start porting MediaGoblin&#039;s code to python 3 generally. Ignore migrations, just support MediaGoblin &amp;quot;starting with the latest database schema&amp;quot;, or even easier, set up your database on the python 2 branch before you git checkout the python 3 branch. ;)&amp;quot;&lt;br /&gt;
# write migrations&lt;br /&gt;
# if time left, backport to 3.2&lt;br /&gt;
&lt;br /&gt;
=====Sort out versions of dependencies=====&lt;br /&gt;
# Babel &amp;lt; 1.0 does not support py3. Maybe switch to newer versions of babel?&lt;br /&gt;
# TODO, some stuff didn&#039;t work while I was trying to convert to py3.&lt;br /&gt;
&lt;br /&gt;
=====Adopt tox=====&lt;br /&gt;
&lt;br /&gt;
=====Do something about Paste=====&lt;br /&gt;
&lt;br /&gt;
=====Start porting code to python3=====&lt;br /&gt;
# There is an option to use &amp;quot;six&amp;quot;. I suggest not to use it, for code cleanness. If some compatibility code will be required, it will be shipped in _compat module.&lt;br /&gt;
# http://python3porting.com/noconv.html suggests to convert to python3 and then convert back to python2. I agree with that and will do so.&lt;br /&gt;
# Hold up to ideas listed on http://lucumr.pocoo.org/2013/5/21/porting-to-python-3-redux/, like &amp;quot;Test for 2.x not 3.x&amp;quot;.&lt;br /&gt;
# The conversion will look like this: 3.3 -&amp;gt; 2.7 -&amp;gt; 2.6 [-&amp;gt; 3.2] [-&amp;gt; 3.4?].&lt;br /&gt;
# To minimize the number of errors need to be fixed during an iteration, the conversion will be done by a number of fixes. A fix is a line from &amp;quot;2to3 -l&amp;quot;. Every &amp;quot;fix&amp;quot; will be tested in order mentioned above, after it gives 0 errors, another one will be applied.&lt;br /&gt;
&lt;br /&gt;
=====Write migrations=====&lt;br /&gt;
* Maybe switch to Alembic&lt;br /&gt;
* It still doesn&#039;t support hacks around SQLite migrations.&lt;br /&gt;
* But there is a workaround which looks small and which we could use perhaps -- https://github.com/klugjohannes/alembic-sqlite&lt;br /&gt;
&lt;br /&gt;
=====Backport to 3.2=====&lt;br /&gt;
* As said on http://lucumr.pocoo.org/2013/5/21/porting-to-python-3-redux/, &amp;quot;Supporting 3.2 is possible if you are willing to wrap all your strings in function calls which I don&#039;t recommend doing for aesthetic and performance reasons&amp;quot;.&lt;br /&gt;
* Mostly we use hardcore unicode strings in tests. Maybe code aesthetics is not so important there?&lt;br /&gt;
&lt;br /&gt;
==What I do and don&#039;t know==&lt;br /&gt;
# Paste. I have no idea what it is for.&lt;br /&gt;
# sqlalchemy-migrate. Never used it. Though I have worked with django&#039;s south.&lt;br /&gt;
# No experience in migrating to Python 3 and no proper experience in Python 3.&lt;/div&gt;</summary>
		<author><name>Breton</name></author>
	</entry>
	<entry>
		<id>https://wiki.mediagoblin.org/index.php?title=User:Breton/GSoC2014&amp;diff=1512</id>
		<title>User:Breton/GSoC2014</title>
		<link rel="alternate" type="text/html" href="https://wiki.mediagoblin.org/index.php?title=User:Breton/GSoC2014&amp;diff=1512"/>
		<updated>2014-03-19T00:00:30Z</updated>

		<summary type="html">&lt;p&gt;Breton: fixed lists&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==About me==&lt;br /&gt;
&lt;br /&gt;
My name is Boris Bobrov. I am a fourth-year student in Moscow State University, Tashkent branch, applied math and informatics faculty.&lt;br /&gt;
&lt;br /&gt;
You can contact me via:&lt;br /&gt;
* jabber: breton@jabber.ru&lt;br /&gt;
* email: breton@cynicmansion.ru&lt;br /&gt;
* irc: breton in #mediagoblin&lt;br /&gt;
&lt;br /&gt;
===Experience===&lt;br /&gt;
* 3.5 years of Python&lt;br /&gt;
* 3 years of Django&lt;br /&gt;
* 3.5 years of C in university&lt;br /&gt;
* 1.5 years of C++ in university&lt;br /&gt;
* 4 years of javascript (though I don&#039;t write too much in it); with jQuery and pure&lt;br /&gt;
* 6 years of HTML and CSS&lt;br /&gt;
* 1.5 year of Scheme and 12 months of Common Lisp&lt;br /&gt;
* basic knowledge of system administration (set up nginx, uwsgi etc, familiar with cron, shell scripting)&lt;br /&gt;
* a couple of FreeBSD kernel modules&lt;br /&gt;
&lt;br /&gt;
===I use===&lt;br /&gt;
* Debian as main OS&lt;br /&gt;
* git (mercurial where required)&lt;br /&gt;
* vim&lt;br /&gt;
&lt;br /&gt;
I am quite new to Mediagoblin community, but you may already know me by http://issues.mediagoblin.org/ticket/858 for the start&lt;br /&gt;
&lt;br /&gt;
==Python 3 port==&lt;br /&gt;
&lt;br /&gt;
===The goal===&lt;br /&gt;
&lt;br /&gt;
Have Mediagoblin running on python3 and python2 with a single codebase.&lt;br /&gt;
&lt;br /&gt;
===Rough plan===&lt;br /&gt;
&lt;br /&gt;
====Requirements====&lt;br /&gt;
In bug https://issues.mediagoblin.org/ticket/813 there is a table (with my little edit):&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Library&lt;br /&gt;
!py3?&lt;br /&gt;
!notes&lt;br /&gt;
|-&lt;br /&gt;
| setuptools         || X    || Distribute&lt;br /&gt;
|-&lt;br /&gt;
| PasteScript        || ??   || not *technically* necessary;&lt;br /&gt;
|-&lt;br /&gt;
| wtforms            || X    ||&lt;br /&gt;
|-&lt;br /&gt;
| py-bcrypt          || X    ||&lt;br /&gt;
|-&lt;br /&gt;
| pytest&amp;gt;=2.3.1      || X    ||&lt;br /&gt;
|-&lt;br /&gt;
| pytest-xdist       || X    ||&lt;br /&gt;
|-&lt;br /&gt;
| werkzeug&amp;gt;=0.7      || X    ||&lt;br /&gt;
|-&lt;br /&gt;
| celery&amp;gt;=3.0        || X    ||&lt;br /&gt;
|-&lt;br /&gt;
| kombu              || X    ||&lt;br /&gt;
|-&lt;br /&gt;
| jinja2             || X    ||&lt;br /&gt;
|-&lt;br /&gt;
| sphinx             || X    ||&lt;br /&gt;
|-&lt;br /&gt;
| Babel&amp;lt;1.0          ||      || Babel 0.9.6 does not support py3&lt;br /&gt;
|-&lt;br /&gt;
| argparse           || X    ||&lt;br /&gt;
|-&lt;br /&gt;
| webtest&amp;lt;2          || X    ||&lt;br /&gt;
|-&lt;br /&gt;
| ConfigObj          || X    || officially supported from now&lt;br /&gt;
|-&lt;br /&gt;
| Markdown           || X    ||&lt;br /&gt;
|-&lt;br /&gt;
| sqlalchemy&amp;gt;=0.8.0  || X    ||&lt;br /&gt;
|-&lt;br /&gt;
| sqlalchemy-migrate ||      || unmaintained anyhow :\&lt;br /&gt;
|-&lt;br /&gt;
| mock               || X    ||&lt;br /&gt;
|-&lt;br /&gt;
| itsdangerous       || X    ||&lt;br /&gt;
|-&lt;br /&gt;
| pytz               || X    ||&lt;br /&gt;
|-&lt;br /&gt;
| six                || X    ||&lt;br /&gt;
|-&lt;br /&gt;
| oauthlib==0.5.0    || X    ||&lt;br /&gt;
|-&lt;br /&gt;
| unidecode          || X    ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
sqlalchemy-migrate is suggested to change to Alembic.&lt;br /&gt;
&lt;br /&gt;
Something need to be done with Babel. &#039;&#039;&#039;TODO&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
====Version considerations====&lt;br /&gt;
&lt;br /&gt;
We should support is 3.2. 3.1 is too old and is present in old Debian. RHEL people install the latest version anyway. 3.2 is available in current Debian.&lt;br /&gt;
Though 3.3 has some nice features that would make the migration easier, u&#039;&#039; strings for example.&lt;br /&gt;
&lt;br /&gt;
The goal is to have a nice clean codebase that runs python 2.6, 2.7, 3.3. If some time will be left, 3.2 will be supported.&lt;br /&gt;
&lt;br /&gt;
====Caveats====&lt;br /&gt;
&lt;br /&gt;
Article http://lucumr.pocoo.org/2013/5/21/porting-to-python-3-redux/ describes some caveats, they should be checked:&lt;br /&gt;
&lt;br /&gt;
# Metaclass Syntax Changes -- metaclasses are not used in gmg&lt;br /&gt;
# Dictionaries. Mostly describes how to write dictionary-like objects. I think it&#039;s not interesting in our case, though TODO.&lt;br /&gt;
# General Iterator Changes -- not used.&lt;br /&gt;
# Transformation Codecs -- are used in some parts. Also, it differs in 3.2 and 3.3.&lt;br /&gt;
# Filesystem and file IO access -- something happens in gmg, not sure yet, what.&lt;br /&gt;
# The last and the biggest -- String Handling&lt;br /&gt;
&lt;br /&gt;
====Plan====&lt;br /&gt;
&lt;br /&gt;
# sort out versions of dependencies. Babel &amp;lt; 1.0 does not support py3. Maybe switch to newer versions of babel? Etc.&lt;br /&gt;
# adopt tox -- https://bitbucket.org/hpk42/tox, use it for different Python versions and interpreters.&lt;br /&gt;
# do something about Paste. The whole Paste as well as pastescript is python3-incompatible.&lt;br /&gt;
# follow suggestion on #813: &amp;quot;Start porting MediaGoblin&#039;s code to python 3 generally. Ignore migrations, just support MediaGoblin &amp;quot;starting with the latest database schema&amp;quot;, or even easier, set up your database on the python 2 branch before you git checkout the python 3 branch. ;)&amp;quot;&lt;br /&gt;
# write migrations&lt;br /&gt;
# if time left, backport to 3.2&lt;br /&gt;
&lt;br /&gt;
=====Sort out versions of dependencies=====&lt;br /&gt;
# Babel &amp;lt; 1.0 does not support py3. Maybe switch to newer versions of babel?&lt;br /&gt;
# TODO, some stuff didn&#039;t work while I was trying to convert to py3.&lt;br /&gt;
&lt;br /&gt;
=====Adopt tox=====&lt;br /&gt;
&lt;br /&gt;
=====Do something about Paste=====&lt;br /&gt;
&lt;br /&gt;
=====Start porting code to python3=====&lt;br /&gt;
# There is an option to use &amp;quot;six&amp;quot;. I suggest not to use it, for code cleanness. If some compatibility code will be required, it will be shipped in _compat module.&lt;br /&gt;
# http://python3porting.com/noconv.html suggests to convert to python3 and then convert back to python2. I agree with that and will do so.&lt;br /&gt;
# Hold up to ideas listed on http://lucumr.pocoo.org/2013/5/21/porting-to-python-3-redux/, like &amp;quot;Test for 2.x not 3.x&amp;quot;.&lt;br /&gt;
# The conversion will look like this: 3.3 -&amp;gt; 2.7 -&amp;gt; 2.6 [-&amp;gt; 3.2] [-&amp;gt; 3.4?].&lt;br /&gt;
# To minimize the number of errors need to be fixed during an iteration, the conversion will be done by a number of fixes. A fix is a line from &amp;quot;2to3 -l&amp;quot;. Every &amp;quot;fix&amp;quot; will be tested in order mentioned above, after it gives 0 errors, another one will be applied.&lt;br /&gt;
&lt;br /&gt;
=====Write migrations=====&lt;br /&gt;
* Maybe switch to Alembic&lt;br /&gt;
* It still doesn&#039;t support hacks around SQLite migrations.&lt;br /&gt;
* But there is a workaround which looks small and which we could use perhaps -- https://github.com/klugjohannes/alembic-sqlite&lt;br /&gt;
&lt;br /&gt;
=====Backport to 3.2=====&lt;br /&gt;
* As said on http://lucumr.pocoo.org/2013/5/21/porting-to-python-3-redux/, &amp;quot;Supporting 3.2 is possible if you are willing to wrap all your strings in function calls which I don&#039;t recommend doing for aesthetic and performance reasons&amp;quot;.&lt;br /&gt;
* Mostly we use hardcore unicode strings in tests. Maybe code aesthetics is not so important there?&lt;br /&gt;
&lt;br /&gt;
==What I do and don&#039;t know==&lt;br /&gt;
# Paste. I have no idea what it is for.&lt;br /&gt;
# sqlalchemy-migrate. Never used it. Though I have worked with django&#039;s south.&lt;/div&gt;</summary>
		<author><name>Breton</name></author>
	</entry>
	<entry>
		<id>https://wiki.mediagoblin.org/index.php?title=User:Breton/GSoC2014&amp;diff=1511</id>
		<title>User:Breton/GSoC2014</title>
		<link rel="alternate" type="text/html" href="https://wiki.mediagoblin.org/index.php?title=User:Breton/GSoC2014&amp;diff=1511"/>
		<updated>2014-03-18T23:56:14Z</updated>

		<summary type="html">&lt;p&gt;Breton: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==About me==&lt;br /&gt;
&lt;br /&gt;
My name is Boris Bobrov. I am a fourth-year student in Moscow State University, Tashkent branch, applied math and informatics faculty.&lt;br /&gt;
&lt;br /&gt;
You can contact me via:&lt;br /&gt;
 - jabber: breton@jabber.ru&lt;br /&gt;
 - email: breton@cynicmansion.ru&lt;br /&gt;
 - irc: breton in #mediagoblin&lt;br /&gt;
&lt;br /&gt;
===Experience===&lt;br /&gt;
 - 3.5 years of Python&lt;br /&gt;
 - 3 years of Django&lt;br /&gt;
 - 3.5 years of C in university&lt;br /&gt;
 - 1.5 years of C++ in university&lt;br /&gt;
 - 4 years of javascript (though I don&#039;t write too much in it); with jQuery and pure&lt;br /&gt;
 - 6 years of HTML and CSS&lt;br /&gt;
 - 1.5 year of Scheme and 12 months of Common Lisp&lt;br /&gt;
 - basic knowledge of system administration (set up nginx, uwsgi etc, familiar with cron, shell scripting)&lt;br /&gt;
 - a couple of FreeBSD kernel modules&lt;br /&gt;
&lt;br /&gt;
===I use===&lt;br /&gt;
 - Debian as main OS&lt;br /&gt;
 - git (mercurial where required)&lt;br /&gt;
 - vim&lt;br /&gt;
&lt;br /&gt;
I am quite new to Mediagoblin community, but you may already know me by http://issues.mediagoblin.org/ticket/858 for the start&lt;br /&gt;
&lt;br /&gt;
==Python 3 port==&lt;br /&gt;
&lt;br /&gt;
===The goal===&lt;br /&gt;
&lt;br /&gt;
Have Mediagoblin running on python3 and python2 with a single codebase.&lt;br /&gt;
&lt;br /&gt;
===Rough plan===&lt;br /&gt;
&lt;br /&gt;
====Requirements====&lt;br /&gt;
In bug https://issues.mediagoblin.org/ticket/813 there is a table (with my little edit):&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Library&lt;br /&gt;
!py3?&lt;br /&gt;
!notes&lt;br /&gt;
|-&lt;br /&gt;
| setuptools         || X    || Distribute&lt;br /&gt;
|-&lt;br /&gt;
| PasteScript        || ??   || not *technically* necessary;&lt;br /&gt;
|-&lt;br /&gt;
| wtforms            || X    ||&lt;br /&gt;
|-&lt;br /&gt;
| py-bcrypt          || X    ||&lt;br /&gt;
|-&lt;br /&gt;
| pytest&amp;gt;=2.3.1      || X    ||&lt;br /&gt;
|-&lt;br /&gt;
| pytest-xdist       || X    ||&lt;br /&gt;
|-&lt;br /&gt;
| werkzeug&amp;gt;=0.7      || X    ||&lt;br /&gt;
|-&lt;br /&gt;
| celery&amp;gt;=3.0        || X    ||&lt;br /&gt;
|-&lt;br /&gt;
| kombu              || X    ||&lt;br /&gt;
|-&lt;br /&gt;
| jinja2             || X    ||&lt;br /&gt;
|-&lt;br /&gt;
| sphinx             || X    ||&lt;br /&gt;
|-&lt;br /&gt;
| Babel&amp;lt;1.0          ||      || Babel 0.9.6 does not support py3&lt;br /&gt;
|-&lt;br /&gt;
| argparse           || X    ||&lt;br /&gt;
|-&lt;br /&gt;
| webtest&amp;lt;2          || X    ||&lt;br /&gt;
|-&lt;br /&gt;
| ConfigObj          || X    || officially supported from now&lt;br /&gt;
|-&lt;br /&gt;
| Markdown           || X    ||&lt;br /&gt;
|-&lt;br /&gt;
| sqlalchemy&amp;gt;=0.8.0  || X    ||&lt;br /&gt;
|-&lt;br /&gt;
| sqlalchemy-migrate ||      || unmaintained anyhow :\&lt;br /&gt;
|-&lt;br /&gt;
| mock               || X    ||&lt;br /&gt;
|-&lt;br /&gt;
| itsdangerous       || X    ||&lt;br /&gt;
|-&lt;br /&gt;
| pytz               || X    ||&lt;br /&gt;
|-&lt;br /&gt;
| six                || X    ||&lt;br /&gt;
|-&lt;br /&gt;
| oauthlib==0.5.0    || X    ||&lt;br /&gt;
|-&lt;br /&gt;
| unidecode          || X    ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
sqlalchemy-migrate is suggested to change to Alembic.&lt;br /&gt;
&lt;br /&gt;
Something need to be done with Babel. &#039;&#039;&#039;TODO&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
====Version considerations====&lt;br /&gt;
&lt;br /&gt;
We should support is 3.2. 3.1 is too old and is present in old Debian. RHEL people install the latest version anyway. 3.2 is available in current Debian.&lt;br /&gt;
Though 3.3 has some nice features that would make the migration easier, u&#039;&#039; strings for example.&lt;br /&gt;
&lt;br /&gt;
The goal is to have a nice clean codebase that runs python 2.6, 2.7, 3.3. If some time will be left, 3.2 will be supported.&lt;br /&gt;
&lt;br /&gt;
====Caveats====&lt;br /&gt;
&lt;br /&gt;
Article http://lucumr.pocoo.org/2013/5/21/porting-to-python-3-redux/ describes some caveats, they should be checked:&lt;br /&gt;
&lt;br /&gt;
# Metaclass Syntax Changes -- metaclasses are not used in gmg&lt;br /&gt;
# Dictionaries. Mostly describes how to write dictionary-like objects. I think it&#039;s not interesting in our case, though TODO.&lt;br /&gt;
# General Iterator Changes -- not used.&lt;br /&gt;
# Transformation Codecs -- are used in some parts. Also, it differs in 3.2 and 3.3.&lt;br /&gt;
# Filesystem and file IO access -- something happens in gmg, not sure yet, what.&lt;br /&gt;
# The last and the biggest -- String Handling&lt;br /&gt;
&lt;br /&gt;
====Plan====&lt;br /&gt;
&lt;br /&gt;
# sort out versions of dependencies. Babel &amp;lt; 1.0 does not support py3. Maybe switch to newer versions of babel? Etc.&lt;br /&gt;
# adopt tox -- https://bitbucket.org/hpk42/tox, use it for different Python versions and interpreters.&lt;br /&gt;
# do something about Paste. The whole Paste as well as pastescript is python3-incompatible.&lt;br /&gt;
# follow suggestion on #813: &amp;quot;Start porting MediaGoblin&#039;s code to python 3 generally. Ignore migrations, just support MediaGoblin &amp;quot;starting with the latest database schema&amp;quot;, or even easier, set up your database on the python 2 branch before you git checkout the python 3 branch. ;)&amp;quot;&lt;br /&gt;
# write migrations&lt;br /&gt;
# if time left, backport to 3.2&lt;br /&gt;
&lt;br /&gt;
=====Sort out versions of dependencies=====&lt;br /&gt;
# Babel &amp;lt; 1.0 does not support py3. Maybe switch to newer versions of babel?&lt;br /&gt;
# TODO, some stuff didn&#039;t work while I was trying to convert to py3.&lt;br /&gt;
&lt;br /&gt;
=====Adopt tox=====&lt;br /&gt;
&lt;br /&gt;
=====Do something about Paste=====&lt;br /&gt;
&lt;br /&gt;
=====Start porting code to python3=====&lt;br /&gt;
# There is an option to use &amp;quot;six&amp;quot;. I suggest not to use it, for code cleanness. If some compatibility code will be required, it will be shipped in _compat module.&lt;br /&gt;
# http://python3porting.com/noconv.html suggests to convert to python3 and then convert back to python2. I agree with that and will do so.&lt;br /&gt;
# Hold up to ideas listed on http://lucumr.pocoo.org/2013/5/21/porting-to-python-3-redux/, like &amp;quot;Test for 2.x not 3.x&amp;quot;.&lt;br /&gt;
# The conversion will look like this: 3.3 -&amp;gt; 2.7 -&amp;gt; 2.6 [-&amp;gt; 3.2] [-&amp;gt; 3.4?].&lt;br /&gt;
# To minimize the number of errors need to be fixed during an iteration, the conversion will be done by a number of fixes. A fix is a line from &amp;quot;2to3 -l&amp;quot;. Every &amp;quot;fix&amp;quot; will be tested in order mentioned above, after it gives 0 errors, another one will be applied.&lt;br /&gt;
&lt;br /&gt;
=====Write migrations=====&lt;br /&gt;
- Maybe switch to Alembic&lt;br /&gt;
- It still doesn&#039;t support hacks around SQLite migrations.&lt;br /&gt;
- But there is a workaround which looks small and which we could use perhaps -- https://github.com/klugjohannes/alembic-sqlite&lt;br /&gt;
&lt;br /&gt;
=====Backport to 3.2=====&lt;br /&gt;
- As said on http://lucumr.pocoo.org/2013/5/21/porting-to-python-3-redux/, &amp;quot;Supporting 3.2 is possible if you are willing to wrap all your strings in function calls which I don&#039;t recommend doing for aesthetic and performance reasons&amp;quot;.&lt;br /&gt;
- Mostly we use hardcore unicode strings in tests. Maybe code aesthetics is not so important there?&lt;br /&gt;
&lt;br /&gt;
==What I do and don&#039;t know==&lt;br /&gt;
# Paste. I have no idea what it is for.&lt;br /&gt;
# sqlalchemy-migrate. Never used it. Though I have worked with django&#039;s south.&lt;/div&gt;</summary>
		<author><name>Breton</name></author>
	</entry>
	<entry>
		<id>https://wiki.mediagoblin.org/index.php?title=User:Breton/GSoC2014&amp;diff=1510</id>
		<title>User:Breton/GSoC2014</title>
		<link rel="alternate" type="text/html" href="https://wiki.mediagoblin.org/index.php?title=User:Breton/GSoC2014&amp;diff=1510"/>
		<updated>2014-03-18T23:54:27Z</updated>

		<summary type="html">&lt;p&gt;Breton: styling and some additions&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;My name is Boris Bobrov. I am a fourth-year student in Moscow State University, Tashkent branch, applied math and informatics faculty.&lt;br /&gt;
&lt;br /&gt;
==About me==&lt;br /&gt;
===Experience===&lt;br /&gt;
 - 3.5 years of Python&lt;br /&gt;
 - 3 years of Django&lt;br /&gt;
 - 3.5 years of C in university&lt;br /&gt;
 - 1.5 years of C++ in university&lt;br /&gt;
 - 4 years of javascript (though I don&#039;t write too much in it); with jQuery and pure&lt;br /&gt;
 - 6 years of HTML and CSS&lt;br /&gt;
 - 1.5 year of Scheme and 12 months of Common Lisp&lt;br /&gt;
 - basic knowledge of system administration (set up nginx, uwsgi etc, familiar with cron, shell scripting)&lt;br /&gt;
 - a couple of FreeBSD kernel modules&lt;br /&gt;
&lt;br /&gt;
===I use===&lt;br /&gt;
 - Debian as main OS&lt;br /&gt;
 - git (mercurial where required)&lt;br /&gt;
 - vim&lt;br /&gt;
&lt;br /&gt;
I am quite new to Mediagoblin community, but you may already know me by http://issues.mediagoblin.org/ticket/858 for the start&lt;br /&gt;
&lt;br /&gt;
==Python 3 port==&lt;br /&gt;
&lt;br /&gt;
===The goal===&lt;br /&gt;
&lt;br /&gt;
Have Mediagoblin running on python3 and python2 with a single codebase.&lt;br /&gt;
&lt;br /&gt;
===Rough plan===&lt;br /&gt;
&lt;br /&gt;
====Requirements====&lt;br /&gt;
In bug https://issues.mediagoblin.org/ticket/813 there is a table (with my little edit):&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Library&lt;br /&gt;
!py3?&lt;br /&gt;
!notes&lt;br /&gt;
|-&lt;br /&gt;
| setuptools         || X    || Distribute&lt;br /&gt;
|-&lt;br /&gt;
| PasteScript        || ??   || not *technically* necessary;&lt;br /&gt;
|-&lt;br /&gt;
| wtforms            || X    ||&lt;br /&gt;
|-&lt;br /&gt;
| py-bcrypt          || X    ||&lt;br /&gt;
|-&lt;br /&gt;
| pytest&amp;gt;=2.3.1      || X    ||&lt;br /&gt;
|-&lt;br /&gt;
| pytest-xdist       || X    ||&lt;br /&gt;
|-&lt;br /&gt;
| werkzeug&amp;gt;=0.7      || X    ||&lt;br /&gt;
|-&lt;br /&gt;
| celery&amp;gt;=3.0        || X    ||&lt;br /&gt;
|-&lt;br /&gt;
| kombu              || X    ||&lt;br /&gt;
|-&lt;br /&gt;
| jinja2             || X    ||&lt;br /&gt;
|-&lt;br /&gt;
| sphinx             || X    ||&lt;br /&gt;
|-&lt;br /&gt;
| Babel&amp;lt;1.0          ||      || Babel 0.9.6 does not support py3&lt;br /&gt;
|-&lt;br /&gt;
| argparse           || X    ||&lt;br /&gt;
|-&lt;br /&gt;
| webtest&amp;lt;2          || X    ||&lt;br /&gt;
|-&lt;br /&gt;
| ConfigObj          || X    || officially supported from now&lt;br /&gt;
|-&lt;br /&gt;
| Markdown           || X    ||&lt;br /&gt;
|-&lt;br /&gt;
| sqlalchemy&amp;gt;=0.8.0  || X    ||&lt;br /&gt;
|-&lt;br /&gt;
| sqlalchemy-migrate ||      || unmaintained anyhow :\&lt;br /&gt;
|-&lt;br /&gt;
| mock               || X    ||&lt;br /&gt;
|-&lt;br /&gt;
| itsdangerous       || X    ||&lt;br /&gt;
|-&lt;br /&gt;
| pytz               || X    ||&lt;br /&gt;
|-&lt;br /&gt;
| six                || X    ||&lt;br /&gt;
|-&lt;br /&gt;
| oauthlib==0.5.0    || X    ||&lt;br /&gt;
|-&lt;br /&gt;
| unidecode          || X    ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
sqlalchemy-migrate is suggested to change to Alembic.&lt;br /&gt;
&lt;br /&gt;
Something need to be done with Babel. &#039;&#039;&#039;TODO&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
====Version considerations====&lt;br /&gt;
&lt;br /&gt;
We should support is 3.2. 3.1 is too old and is present in old Debian. RHEL people install the latest version anyway. 3.2 is available in current Debian.&lt;br /&gt;
Though 3.3 has some nice features that would make the migration easier, u&#039;&#039; strings for example.&lt;br /&gt;
&lt;br /&gt;
The goal is to have a nice clean codebase that runs python 2.6, 2.7, 3.3. If some time will be left, 3.2 will be supported.&lt;br /&gt;
&lt;br /&gt;
====Caveats====&lt;br /&gt;
&lt;br /&gt;
Article http://lucumr.pocoo.org/2013/5/21/porting-to-python-3-redux/ describes some caveats, they should be checked:&lt;br /&gt;
&lt;br /&gt;
# Metaclass Syntax Changes -- metaclasses are not used in gmg&lt;br /&gt;
# Dictionaries. Mostly describes how to write dictionary-like objects. I think it&#039;s not interesting in our case, though TODO.&lt;br /&gt;
# General Iterator Changes -- not used.&lt;br /&gt;
# Transformation Codecs -- are used in some parts. Also, it differs in 3.2 and 3.3.&lt;br /&gt;
# Filesystem and file IO access -- something happens in gmg, not sure yet, what.&lt;br /&gt;
# The last and the biggest -- String Handling&lt;br /&gt;
&lt;br /&gt;
====Plan====&lt;br /&gt;
&lt;br /&gt;
# sort out versions of dependencies. Babel &amp;lt; 1.0 does not support py3. Maybe switch to newer versions of babel? Etc.&lt;br /&gt;
# adopt tox -- https://bitbucket.org/hpk42/tox, use it for different Python versions and interpreters.&lt;br /&gt;
# do something about Paste. The whole Paste as well as pastescript is python3-incompatible.&lt;br /&gt;
# follow suggestion on #813: &amp;quot;Start porting MediaGoblin&#039;s code to python 3 generally. Ignore migrations, just support MediaGoblin &amp;quot;starting with the latest database schema&amp;quot;, or even easier, set up your database on the python 2 branch before you git checkout the python 3 branch. ;)&amp;quot;&lt;br /&gt;
# write migrations&lt;br /&gt;
# if time left, backport to 3.2&lt;br /&gt;
&lt;br /&gt;
=====Sort out versions of dependencies=====&lt;br /&gt;
# Babel &amp;lt; 1.0 does not support py3. Maybe switch to newer versions of babel?&lt;br /&gt;
# TODO, some stuff didn&#039;t work while I was trying to convert to py3.&lt;br /&gt;
&lt;br /&gt;
=====Adopt tox=====&lt;br /&gt;
&lt;br /&gt;
=====Do something about Paste=====&lt;br /&gt;
&lt;br /&gt;
=====Start porting code to python3=====&lt;br /&gt;
# There is an option to use &amp;quot;six&amp;quot;. I suggest not to use it, for code cleanness. If some compatibility code will be required, it will be shipped in _compat module.&lt;br /&gt;
# http://python3porting.com/noconv.html suggests to convert to python3 and then convert back to python2. I agree with that and will do so.&lt;br /&gt;
# Hold up to ideas listed on http://lucumr.pocoo.org/2013/5/21/porting-to-python-3-redux/, like &amp;quot;Test for 2.x not 3.x&amp;quot;.&lt;br /&gt;
# The conversion will look like this: 3.3 -&amp;gt; 2.7 -&amp;gt; 2.6 [-&amp;gt; 3.2] [-&amp;gt; 3.4?].&lt;br /&gt;
# To minimize the number of errors need to be fixed during an iteration, the conversion will be done by a number of fixes. A fix is a line from &amp;quot;2to3 -l&amp;quot;. Every &amp;quot;fix&amp;quot; will be tested in order mentioned above, after it gives 0 errors, another one will be applied.&lt;br /&gt;
&lt;br /&gt;
=====Write migrations=====&lt;br /&gt;
- Maybe switch to Alembic&lt;br /&gt;
- It still doesn&#039;t support hacks around SQLite migrations.&lt;br /&gt;
- But there is a workaround which looks small and which we could use perhaps -- https://github.com/klugjohannes/alembic-sqlite&lt;br /&gt;
&lt;br /&gt;
=====Backport to 3.2=====&lt;br /&gt;
- As said on http://lucumr.pocoo.org/2013/5/21/porting-to-python-3-redux/, &amp;quot;Supporting 3.2 is possible if you are willing to wrap all your strings in function calls which I don&#039;t recommend doing for aesthetic and performance reasons&amp;quot;.&lt;br /&gt;
- Mostly we use hardcore unicode strings in tests. Maybe code aesthetics is not so important there?&lt;br /&gt;
&lt;br /&gt;
==What I do and don&#039;t know==&lt;br /&gt;
# Paste. I have no idea what it is for.&lt;br /&gt;
# sqlalchemy-migrate. Never used it. Though I have worked with django&#039;s south.&lt;/div&gt;</summary>
		<author><name>Breton</name></author>
	</entry>
	<entry>
		<id>https://wiki.mediagoblin.org/index.php?title=User:Breton/GSoC2014&amp;diff=1509</id>
		<title>User:Breton/GSoC2014</title>
		<link rel="alternate" type="text/html" href="https://wiki.mediagoblin.org/index.php?title=User:Breton/GSoC2014&amp;diff=1509"/>
		<updated>2014-03-18T23:31:07Z</updated>

		<summary type="html">&lt;p&gt;Breton: application unstyled&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;My name is Boris Bobrov. I am a fourth-year student in Moscow State University, Tashkent branch, applied math and informatics faculty.&lt;br /&gt;
&lt;br /&gt;
Experience:&lt;br /&gt;
 - 3.5 years of Python&lt;br /&gt;
 - 3 years of Django&lt;br /&gt;
 - 3.5 years of C in university&lt;br /&gt;
 - 1.5 years of C++ in university&lt;br /&gt;
 - 4 years of javascript (though I don&#039;t write too much in it); with jQuery and pure&lt;br /&gt;
 - 6 years of HTML and CSS&lt;br /&gt;
 - 1.5 year of Scheme and 12 months of Common Lisp&lt;br /&gt;
 - basic knowledge of system administration (set up nginx, uwsgi etc, familiar with cron, shell scripting)&lt;br /&gt;
 - a couple of FreeBSD kernel modules&lt;br /&gt;
&lt;br /&gt;
I use:&lt;br /&gt;
 - Debian as main OS&lt;br /&gt;
 - git (mercurial where required)&lt;br /&gt;
 - vim&lt;br /&gt;
&lt;br /&gt;
I am quite new to Mediagoblin community, but you may already know me by http://issues.mediagoblin.org/ticket/858 for the start&lt;br /&gt;
&lt;br /&gt;
Python 3 port.&lt;br /&gt;
&lt;br /&gt;
The goal is to have Mediagoblin running on python3 and a /HackingHowto for those who want it too.&lt;br /&gt;
&lt;br /&gt;
In bug https://issues.mediagoblin.org/ticket/813 there is a table (with my little edit):&lt;br /&gt;
| Library            | py3? | notes                               |&lt;br /&gt;
|--------------------+------+-------------------------------------|&lt;br /&gt;
| setuptools         | X    | Distribute                          |&lt;br /&gt;
| PasteScript        | ??   | not *technically* necessary;        |&lt;br /&gt;
| wtforms            | X    |                                     |&lt;br /&gt;
| py-bcrypt          | X    |                                     |&lt;br /&gt;
| pytest&amp;gt;=2.3.1      | X    |                                     |&lt;br /&gt;
| pytest-xdist       | X    |                                     |&lt;br /&gt;
| werkzeug&amp;gt;=0.7      | X    |                                     |&lt;br /&gt;
| celery&amp;gt;=3.0        | X    |                                     |&lt;br /&gt;
| kombu              | X    |                                     |&lt;br /&gt;
| jinja2             | X    |                                     |&lt;br /&gt;
| sphinx             | X    |                                     |&lt;br /&gt;
| Babel&amp;lt;1.0          |      | Babel 0.9.6 does not support py3    |&lt;br /&gt;
| argparse           | X    |                                     |&lt;br /&gt;
| webtest&amp;lt;2          | X    |                                     |&lt;br /&gt;
| ConfigObj          | X    | officially supported from now       |&lt;br /&gt;
| Markdown           | X    |                                     |&lt;br /&gt;
| sqlalchemy&amp;gt;=0.8.0  | X    |                                     |&lt;br /&gt;
| sqlalchemy-migrate |      | unmaintained anyhow :\              |&lt;br /&gt;
| mock               | X    |                                     |&lt;br /&gt;
| itsdangerous       | X    |                                     |&lt;br /&gt;
| pytz               | X    |                                     |&lt;br /&gt;
| six                | X    |                                     |&lt;br /&gt;
| oauthlib==0.5.0    | X    |                                     |&lt;br /&gt;
| unidecode          | X    |                                     |&lt;br /&gt;
&lt;br /&gt;
sqlalchemy-migrate is suggested to change to Alembic, which runs python3. TODO: tests with sqlite&lt;br /&gt;
&lt;br /&gt;
Something need to be done with Babel. TODO.&lt;br /&gt;
&lt;br /&gt;
We should support is 3.2. 3.1 is too old and is present in old Debian. RHEL people install the latest version anyway. 3.2 is available in current Debian.&lt;br /&gt;
Though 3.3 has some nice features that would make the migration easier, u&#039;&#039; strings for example.&lt;br /&gt;
&lt;br /&gt;
The goal is to have a nice clean codebase that runs python 2.6, 2.7, 3.3. If some time will be left, 3.2 will be supported.&lt;br /&gt;
&lt;br /&gt;
Article http://lucumr.pocoo.org/2013/5/21/porting-to-python-3-redux/ describes some caveats, they should be checked:&lt;br /&gt;
&lt;br /&gt;
1. Metaclass Syntax Changes -- metaclasses are not used in gmg&lt;br /&gt;
2. Dictionaries. Mostly describes how to write dictionary-like objects. I think it&#039;s not interesting in our case, though TODO.&lt;br /&gt;
3. General Iterator Changes -- not used.&lt;br /&gt;
4. Transformation Codecs -- are used in some parts. Also, it differs in 3.2 and 3.3.&lt;br /&gt;
5. Filesystem and file IO access -- something happens in gmg, not sure yet, what.&lt;br /&gt;
6. The last and the biggest -- String Handling&lt;br /&gt;
&lt;br /&gt;
Plan.&lt;br /&gt;
&lt;br /&gt;
0. sort out versions of dependencies. Babel &amp;lt; 1.0 does not support py3. Maybe switch to newer versions of babel? Etc.&lt;br /&gt;
1. adopt tox -- https://bitbucket.org/hpk42/tox, use it for different Python versions and interpreters.&lt;br /&gt;
2. do something about Paste. The whole paste, as well as pastescript is python3-incompatible.&lt;br /&gt;
3. follow suggestion on #813: &amp;quot;Start porting MediaGoblin&#039;s code to python 3 generally. Ignore migrations, just support MediaGoblin &amp;quot;starting with the latest database schema&amp;quot;, or even easier, set up your database on the python 2 branch before you git checkout the python 3 branch. ;)&amp;quot;&lt;br /&gt;
4. write migrations&lt;br /&gt;
5. if time left, backport to 3.2&lt;br /&gt;
&lt;br /&gt;
Sort out versions of dependencies.&lt;br /&gt;
1. Babel &amp;lt; 1.0 does not support py3. Maybe switch to newer versions of babel?&lt;br /&gt;
X. TODO, some stuff didn&#039;t work while I was trying to convert to py3.&lt;br /&gt;
&lt;br /&gt;
Adopt tox.&lt;br /&gt;
&lt;br /&gt;
Do something about Paste&lt;br /&gt;
&lt;br /&gt;
Start porting code to python3 generally.&lt;br /&gt;
1. There is an option to use &amp;quot;six&amp;quot;. I suggest not to use it, for code cleanness. If some compatibility code will be required, it will be shipped in _compat module.&lt;br /&gt;
2. http://python3porting.com/noconv.html suggests to convert to python3 and then convert back to python2. I agree with that and will do so.&lt;br /&gt;
3. Hold up to ideas listed on http://lucumr.pocoo.org/2013/5/21/porting-to-python-3-redux/, like &amp;quot;Test for 2.x not 3.x&amp;quot;.&lt;br /&gt;
4. The conversion will look like this: 3.3 -&amp;gt; 2.7 -&amp;gt; 2.6 -&amp;gt; 3.2 (-&amp;gt; 3.4?).&lt;br /&gt;
5. To minimize the number of errors need to be fixed during an iteration, the conversion will be done by a number of fixes. A fix is a line from &amp;quot;2to3 -l&amp;quot;. Every &amp;quot;fix&amp;quot; will be tested in order mentioned above, after it gives 0 errors, another one will be applied.&lt;br /&gt;
&lt;br /&gt;
Write migrations.&lt;br /&gt;
Maybe switch to Alembic. It still doesn&#039;t support hacks around SQLite migrations.&lt;br /&gt;
But there is a workaround which looks small and which we could use perhaps -- https://github.com/klugjohannes/alembic-sqlite&lt;br /&gt;
&lt;br /&gt;
Backport to 3.2.&lt;br /&gt;
As said on http://lucumr.pocoo.org/2013/5/21/porting-to-python-3-redux/, &amp;quot;Supporting 3.2 is possible if you are willing to wrap all your strings in function calls which I don&#039;t recommend doing for aesthetic and performance reasons&amp;quot;.&lt;br /&gt;
Mostly we use hardcore unicode strings in tests. Maybe code aesthetics is not so important there?&lt;/div&gt;</summary>
		<author><name>Breton</name></author>
	</entry>
</feed>