<?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=Sturm</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=Sturm"/>
	<link rel="alternate" type="text/html" href="https://wiki.mediagoblin.org/Special:Contributions/Sturm"/>
	<updated>2026-05-01T09:55:27Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.39.17</generator>
	<entry>
		<id>https://wiki.mediagoblin.org/index.php?title=Deployment&amp;diff=1939</id>
		<title>Deployment</title>
		<link rel="alternate" type="text/html" href="https://wiki.mediagoblin.org/index.php?title=Deployment&amp;diff=1939"/>
		<updated>2020-05-11T03:52:38Z</updated>

		<summary type="html">&lt;p&gt;Sturm: /* 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://nathanielca.se/fossrit/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.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;
If you&#039;re getting strange errors when trying to upload something, your WSGI setup is probably not starting Celery. You should start it yourself, perhaps with your preferred init system or service supervisor.&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:&lt;br /&gt;
 &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>Sturm</name></author>
	</entry>
	<entry>
		<id>https://wiki.mediagoblin.org/index.php?title=Virtual_Machine_Hosting&amp;diff=1938</id>
		<title>Virtual Machine Hosting</title>
		<link rel="alternate" type="text/html" href="https://wiki.mediagoblin.org/index.php?title=Virtual_Machine_Hosting&amp;diff=1938"/>
		<updated>2020-05-11T03:52:13Z</updated>

		<summary type="html">&lt;p&gt;Sturm: /* Install MediaGoblin Prerequisites */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Needswork}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Motivation =&lt;br /&gt;
&lt;br /&gt;
If you want to give MediaGoblin a try, but would prefer to run it on someone else&#039;s machine for a while, then you may be interested in spinning up an [http://aws.amazon.com/ec2/ EC2] instance from an [http://aws.amazon.com/amis AMI] pre-loaded with MediaGoblin. The following [http://aws.amazon.com/articles/0155828273219400 recipe] should make a public MediaGoblin AMI. Make your own or skip ahead Martha Stewart style to [https://console.aws.amazon.com/ec2/home?region=us-east-1#launchAmi=ami-3bf33252 ami-3bf33252]&lt;br /&gt;
&lt;br /&gt;
== Get your favorite distribution to fit in less than 10 Gb volume size ==&lt;br /&gt;
&lt;br /&gt;
Ubuntu makes this easy. Start with an official EC2 Ubuntu instance in us-east: [https://console.aws.amazon.com/ec2/home?region=us-east-1#launchAmi=ami-61be7908 ami-61be7908]. Other [http://ubuntutym2.u-toyama.ac.jp/uec-images/lucid/20110719/ official Ubuntu AMIs] are also available&lt;br /&gt;
&lt;br /&gt;
Login to this fresh instance using [http://aws.amazon.com/archives/Amazon-EC2/5673744618146887 EC2 tools]&lt;br /&gt;
&amp;lt;pre&amp;gt;me@myhomemachine:~$ ssh -i $(KEY_PATH) ubuntu@ec2-##-##-##-##.compute-1.amazonaws.com&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Once logged in, update the links to package updating materials&lt;br /&gt;
&amp;lt;pre&amp;gt;sudo apt-get update&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then run the package manager to download and install the latest patches&lt;br /&gt;
&amp;lt;pre&amp;gt;sudo apt-get -u upgrade&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Reboot from the EC2 instance manager. Then log in and install any remaining upgrades&lt;br /&gt;
&amp;lt;pre&amp;gt;sudo apt-get update&lt;br /&gt;
sudo apt-get -u upgrade&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Limit remote access to improve security ==&lt;br /&gt;
&lt;br /&gt;
Disable password-based login by editing /etc/ssh/sshd_config to explicitly disallow it.&lt;br /&gt;
&amp;lt;pre&amp;gt;+# Disable password-based login&lt;br /&gt;
+PasswordAuthentication no&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Also remove this moot parameter&lt;br /&gt;
&amp;lt;pre&amp;gt;-# To enable empty passwords, change to yes (NOT RECOMMENDED)&lt;br /&gt;
-PermitEmptyPasswords no&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Reboot the ssh server&lt;br /&gt;
&amp;lt;pre&amp;gt;sudo restart ssh&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Disable root login, and specify login by ubuntu only by editing /etc/ssh/sshd_config&lt;br /&gt;
&amp;lt;pre&amp;gt;-PermitRootLogin yes&lt;br /&gt;
+PermitRootLogin no&lt;br /&gt;
+AllowUsers ubuntu&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Reboot the ssh server&lt;br /&gt;
&amp;lt;pre&amp;gt;sudo restart ssh&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Install MediaGoblin Prerequisites ==&lt;br /&gt;
&lt;br /&gt;
Setup directory for mediagoblin source code&lt;br /&gt;
&amp;lt;pre&amp;gt;mkdir src&lt;br /&gt;
cd src&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The following matches the [[HackingHowto]] except for how mongodb is installed. MongoDB is only at version 1.2.2 in Lucid 10.04, which the original AMI is based on, but MediaGoblin requires v1.3+&lt;br /&gt;
&amp;lt;pre&amp;gt;sudo apt-get install git-core python python-dev python-lxml&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[http://www.mongodb.org/display/DOCS/Ubuntu+and+Debian+packages Get the latest mongodb]&lt;br /&gt;
&lt;br /&gt;
First get the gpg key for the 10gen repository&lt;br /&gt;
&amp;lt;pre&amp;gt;sudo apt-key adv --keyserver keyserver.ubuntu.com --recv 7F0CEB10&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Add the 10gen repository to the list of apt sources by editing /etc/apt/sources.list&lt;br /&gt;
&amp;lt;pre&amp;gt;+deb http://downloads-distro.mongodb.org/repo/ubuntu-upstart dist 10gen&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Install mongodb&lt;br /&gt;
&amp;lt;pre&amp;gt;sudo apt-get update&lt;br /&gt;
sudo apt-get install mongodb-10gen&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Fetch the mediagoblin code from the git repository, buildout, and test&lt;br /&gt;
&amp;lt;pre&amp;gt;git clone git://gitorious.org/mediagoblin/mediagoblin.git&lt;br /&gt;
cd mediagoblin&lt;br /&gt;
python bootstrap.py &amp;amp;&amp;amp; ./bin/buildout&lt;br /&gt;
./runtests.sh&lt;br /&gt;
###Ran 45 tests in 12.160s ... OK!&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Install sendmail&lt;br /&gt;
&amp;lt;pre&amp;gt;sudo apt-get install sendmail&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Configure MediaGoblin]]&lt;br /&gt;
&amp;lt;pre&amp;gt;cp paste.ini paste_local.ini&lt;br /&gt;
cp mediagoblin.example.ini mediagoblin.ini&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Edit paste_local.ini to allow remote connections&lt;br /&gt;
&amp;lt;pre&amp;gt;-host = 127.0.0.1&lt;br /&gt;
+host = 0.0.0.0&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Prepare instance for bundling into a public AMI ==&lt;br /&gt;
&lt;br /&gt;
The instance you&#039;ve built so far is currently configured to accept your private key as a login. Lock yourself out now...or don&#039;t, and see if anyone notices. It&#039;s your call. &lt;br /&gt;
&lt;br /&gt;
Find and remove your public key&lt;br /&gt;
&amp;lt;pre&amp;gt;sudo find / -name &amp;quot;authorized_keys&amp;quot; -print -exec rm {} \;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Verify you can not log in to the instance anymore&lt;br /&gt;
&amp;lt;pre&amp;gt;me@myhomemachine:~$ ssh -i $(KEY_PATH) ubuntu@ec2-##-##-##-##.compute-1.amazonaws.com&lt;br /&gt;
##Permission denied (publickey).&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Take a snapshot, convert the snapshot to an AMI, then set the AMI permissions to public.&lt;/div&gt;</summary>
		<author><name>Sturm</name></author>
	</entry>
	<entry>
		<id>https://wiki.mediagoblin.org/index.php?title=Configure_MediaGoblin&amp;diff=1937</id>
		<title>Configure MediaGoblin</title>
		<link rel="alternate" type="text/html" href="https://wiki.mediagoblin.org/index.php?title=Configure_MediaGoblin&amp;diff=1937"/>
		<updated>2020-05-11T03:51:08Z</updated>

		<summary type="html">&lt;p&gt;Sturm: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= The config files =&lt;br /&gt;
&lt;br /&gt;
So basically there are two config files (and one meta-config file).&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;mediagoblin.ini:&#039;&#039;&#039; Use this to configure MediaGoblin, the application.  Want to use a different storage system?  Configure it here!&lt;br /&gt;
* &#039;&#039;&#039;paste.ini:&#039;&#039;&#039; This just actually configures the web server that launches the MediaGoblin application, and some other things (like actually sets up the applications that serve your static files).&lt;br /&gt;
&lt;br /&gt;
And then there&#039;s the meta-config file:&lt;br /&gt;
* &#039;&#039;&#039;mediagoblin/config_spec.ini:&#039;&#039;&#039; This sets the defaults for config file options and the type conversion for things in mediagoblin.ini.  Developers who add new config options should probably register them and their types here (and set some good defaults, if applicable).&lt;br /&gt;
&lt;br /&gt;
= Changing config files =&lt;br /&gt;
&lt;br /&gt;
So you want to turn on (or off) all the bells and whistles, set up mediagoblin to use a storage system running out of a distributed cluster of Commodore 64s, change your email server configuration, etc.  Where do you set all this stuff up?&lt;br /&gt;
&lt;br /&gt;
You should do the following:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# copy the config files&lt;br /&gt;
$ cp paste.ini paste_local.ini&lt;br /&gt;
$ cp mediagoblin.example.ini mediagoblin.ini&lt;br /&gt;
&lt;br /&gt;
lazyserver.sh defaults to using paste_local.ini if it is present; you can also specify a config file like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
./lazyserver.sh -c paste_local.ini&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Also, all the ./bin/gmg commands have arguments to allow you to pass in the config file.  For example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
./bin/gmg shell -cf mediagoblin.ini&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(It&#039;s important to note that the ./bin/gmg commands don&#039;t care about the paster file, they just care about the mediagoblin config file.)&lt;br /&gt;
&lt;br /&gt;
BTW, all these ./bin/gmg subcommands have help.  You can check them like:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
./bin/gmg shell --help&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
for more info.&lt;br /&gt;
&lt;br /&gt;
= Setting up Cloud Files public storage =&lt;br /&gt;
&lt;br /&gt;
In mediagoblin.ini, add this to the file and edit it to fit your needs.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[storage:publicstore]&lt;br /&gt;
storage_class = mediagoblin.storage.cloudfiles:CloudFilesStorage&lt;br /&gt;
cloudfiles_user = user&lt;br /&gt;
cloudfiles_api_key = 1a2b3c4d5e6f7g8h9i&lt;br /&gt;
cloudfiles_container = mediagoblin&lt;br /&gt;
&lt;br /&gt;
# Uncomment this and fill it in to set the API endpoint to anything other&lt;br /&gt;
# than Rackspace Cloud Files US&lt;br /&gt;
# cloudfiles_host = https://example.org/v1.0 &lt;br /&gt;
&lt;br /&gt;
# Only applicable if you run MediaGoblin on a Rackspace Cloud Server&lt;br /&gt;
# it routes traffic through the internal Rackspace network, this&lt;br /&gt;
# means that the bandwith is free.&lt;br /&gt;
cloudfiles_use_servicenet = false&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To make these settings work with OpenStack Object Storage (Swift) you will need to set the API endpoint (&amp;lt;code&amp;gt;cloudfiles_host&amp;lt;/code&amp;gt;) to avoid it defaulting to Rackspace Cloud Files US.  &lt;br /&gt;
&lt;br /&gt;
*NOTE: cloudfiles_host does not appear to be honored by the cloudfiles plugin of MediaGoblin 0.9.0.  It also specifically depends on the Rackspace CDN or at least the CDN endpoint headers returned by Swift.  If you wish to use your own Swift cluster and serve the files out of Swift directly, or configure your own CDN endpoint, you&#039;ll need to modify this plugin or create a new/derived storage plugin.&lt;br /&gt;
&lt;br /&gt;
= Attachments =&lt;br /&gt;
&lt;br /&gt;
Attachment are arbitrary files that are associated to a media entry. &lt;br /&gt;
&lt;br /&gt;
For example, it could be the GIMP .xcf file for an image, the .blend of a Blender render.&lt;br /&gt;
&lt;br /&gt;
== Hazards ==&lt;br /&gt;
&lt;br /&gt;
Attachments are not filtered or scanned and therefore present a security risk. They can be used to perform XSS attacks or to upload malicious content. Make sure your environment is safe before enabling it.&lt;br /&gt;
&lt;br /&gt;
== Allow attachments ==&lt;br /&gt;
&lt;br /&gt;
To allow attachments, add&lt;br /&gt;
&lt;br /&gt;
  allow_attachments = true&lt;br /&gt;
&lt;br /&gt;
to your mediagoblin.ini&lt;br /&gt;
&lt;br /&gt;
= Disable transcoding =&lt;br /&gt;
&lt;br /&gt;
Transcoding means that your video is resized or converted to another format, which usually takes a lot of time and CPU power.&lt;br /&gt;
&lt;br /&gt;
Currently transcoding is disabled for a video only if its mime-type, container, video and audio formats are all explicitly excluded at once in the configuration.&lt;br /&gt;
&lt;br /&gt;
Add this section to your &amp;lt;code&amp;gt;mediagoblin.ini&amp;lt;/code&amp;gt; video plugin config to disable transcoding of WebM and Ogg/Theora videos:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[plugins]&lt;br /&gt;
[[mediagoblin.media_types.video]]&lt;br /&gt;
[[[skip_transcode]]]&lt;br /&gt;
mime_types = video/webm, video/ogg, application/ogg, application/x-annodex&lt;br /&gt;
container_formats = Matroska, Ogg&lt;br /&gt;
video_codecs = VP8 video, Theora&lt;br /&gt;
audio_codecs = Vorbis,&lt;br /&gt;
dimensions_match = false&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Or to support most of the major formats supported by browsers:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[[[skip_transcode]]]&lt;br /&gt;
mime_types = video/webm, video/ogg, video/mp4, audio/ogg, application/ogg, application/x-annodex&lt;br /&gt;
container_formats = Matroska, Ogg, ISO MP4/M4A &lt;br /&gt;
video_codecs = VP8 video, VP9 video, Theora, H.264, H.264 / AVC, MPEG-4 video&lt;br /&gt;
audio_codecs = Vorbis, MPEG-4 AAC audio&lt;br /&gt;
dimensions_match = false&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Sturm</name></author>
	</entry>
	<entry>
		<id>https://wiki.mediagoblin.org/index.php?title=Configure_MediaGoblin&amp;diff=1936</id>
		<title>Configure MediaGoblin</title>
		<link rel="alternate" type="text/html" href="https://wiki.mediagoblin.org/index.php?title=Configure_MediaGoblin&amp;diff=1936"/>
		<updated>2020-05-11T03:50:32Z</updated>

		<summary type="html">&lt;p&gt;Sturm: /* Changing config files */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= The config files =&lt;br /&gt;
&lt;br /&gt;
So basically there are two config files (and one meta-config file).&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;mediagoblin.ini:&#039;&#039;&#039; Use this to configure MediaGoblin, the application.  Want to use a different storage system?  Configure it here!&lt;br /&gt;
* &#039;&#039;&#039;paste.ini:&#039;&#039;&#039; This just actually configures the web server that launches the MediaGoblin application, and some other things (like actually sets up the applications that serve your static files).&lt;br /&gt;
&lt;br /&gt;
And then there&#039;s the meta-config file:&lt;br /&gt;
* &#039;&#039;&#039;mediagoblin/config_spec.ini:&#039;&#039;&#039; This sets the defaults for config file options and the type conversion for things in mediagoblin.ini.  Developers who add new config options should probably register them and their types here (and set some good defaults, if applicable).&lt;br /&gt;
&lt;br /&gt;
= Changing config files =&lt;br /&gt;
&lt;br /&gt;
So you want to turn on (or off) all the bells and whistles, set up mediagoblin to use a storage system running out of a distributed cluster of Commodore 64s, change your email server configuration, etc.  Where do you set all this stuff up?&lt;br /&gt;
&lt;br /&gt;
You should do the following:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# copy the config files&lt;br /&gt;
$ cp paste.ini paste_local.ini&lt;br /&gt;
$ cp mediagoblin.example.ini mediagoblin.ini&lt;br /&gt;
&lt;br /&gt;
lazyserver.sh defaults to using paste_local.ini if it is present; you can also specify a config file like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
./lazyserver.sh -c paste_local.ini&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Also, all the ./bin/gmg commands have arguments to allow you to pass in the config file.  For example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
./bin/gmg shell -cf mediagoblin.ini&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(It&#039;s important to note that the ./bin/gmg commands don&#039;t care about the paster file, they just care about the mediagoblin config file.)&lt;br /&gt;
&lt;br /&gt;
BTW, all these ./bin/gmg subcommands have help.  You can check them like:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
./bin/gmg shell --help&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
for more info.&lt;br /&gt;
&lt;br /&gt;
= Setting up Cloud Files public storage =&lt;br /&gt;
&lt;br /&gt;
In mediagoblin.ini (or mediagoblin_local.ini), add this to the file and edit it to fit your needs.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[storage:publicstore]&lt;br /&gt;
storage_class = mediagoblin.storage.cloudfiles:CloudFilesStorage&lt;br /&gt;
cloudfiles_user = user&lt;br /&gt;
cloudfiles_api_key = 1a2b3c4d5e6f7g8h9i&lt;br /&gt;
cloudfiles_container = mediagoblin&lt;br /&gt;
&lt;br /&gt;
# Uncomment this and fill it in to set the API endpoint to anything other&lt;br /&gt;
# than Rackspace Cloud Files US&lt;br /&gt;
# cloudfiles_host = https://example.org/v1.0 &lt;br /&gt;
&lt;br /&gt;
# Only applicable if you run MediaGoblin on a Rackspace Cloud Server&lt;br /&gt;
# it routes traffic through the internal Rackspace network, this&lt;br /&gt;
# means that the bandwith is free.&lt;br /&gt;
cloudfiles_use_servicenet = false&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To make these settings work with OpenStack Object Storage (Swift) you will need to set the API endpoint (&amp;lt;code&amp;gt;cloudfiles_host&amp;lt;/code&amp;gt;) to avoid it defaulting to Rackspace Cloud Files US.  &lt;br /&gt;
&lt;br /&gt;
*NOTE: cloudfiles_host does not appear to be honored by the cloudfiles plugin of MediaGoblin 0.9.0.  It also specifically depends on the Rackspace CDN or at least the CDN endpoint headers returned by Swift.  If you wish to use your own Swift cluster and serve the files out of Swift directly, or configure your own CDN endpoint, you&#039;ll need to modify this plugin or create a new/derived storage plugin.&lt;br /&gt;
&lt;br /&gt;
= Attachments =&lt;br /&gt;
&lt;br /&gt;
Attachment are arbitrary files that are associated to a media entry. &lt;br /&gt;
&lt;br /&gt;
For example, it could be the GIMP .xcf file for an image, the .blend of a Blender render.&lt;br /&gt;
&lt;br /&gt;
== Hazards ==&lt;br /&gt;
&lt;br /&gt;
Attachments are not filtered or scanned and therefore present a security risk. They can be used to perform XSS attacks or to upload malicious content. Make sure your environment is safe before enabling it.&lt;br /&gt;
&lt;br /&gt;
== Allow attachments ==&lt;br /&gt;
&lt;br /&gt;
To allow attachments, add&lt;br /&gt;
&lt;br /&gt;
  allow_attachments = true&lt;br /&gt;
&lt;br /&gt;
to your mediagoblin.ini (or mediagoblin_local.ini)&lt;br /&gt;
&lt;br /&gt;
= Disable transcoding =&lt;br /&gt;
&lt;br /&gt;
Transcoding means that your video is resized or converted to another format, which usually takes a lot of time and CPU power.&lt;br /&gt;
&lt;br /&gt;
Currently transcoding is disabled for a video only if its mime-type, container, video and audio formats are all explicitly excluded at once in the configuration.&lt;br /&gt;
&lt;br /&gt;
Add this section to your &amp;lt;code&amp;gt;mediagoblin_local.ini&amp;lt;/code&amp;gt; video plugin config to disable transcoding of WebM and Ogg/Theora videos:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[plugins]&lt;br /&gt;
[[mediagoblin.media_types.video]]&lt;br /&gt;
[[[skip_transcode]]]&lt;br /&gt;
mime_types = video/webm, video/ogg, application/ogg, application/x-annodex&lt;br /&gt;
container_formats = Matroska, Ogg&lt;br /&gt;
video_codecs = VP8 video, Theora&lt;br /&gt;
audio_codecs = Vorbis,&lt;br /&gt;
dimensions_match = false&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Or to support most of the major formats supported by browsers:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[[[skip_transcode]]]&lt;br /&gt;
mime_types = video/webm, video/ogg, video/mp4, audio/ogg, application/ogg, application/x-annodex&lt;br /&gt;
container_formats = Matroska, Ogg, ISO MP4/M4A &lt;br /&gt;
video_codecs = VP8 video, VP9 video, Theora, H.264, H.264 / AVC, MPEG-4 video&lt;br /&gt;
audio_codecs = Vorbis, MPEG-4 AAC audio&lt;br /&gt;
dimensions_match = false&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Sturm</name></author>
	</entry>
	<entry>
		<id>https://wiki.mediagoblin.org/index.php?title=MediaTypeRefactor/DesignDoc&amp;diff=1935</id>
		<title>MediaTypeRefactor/DesignDoc</title>
		<link rel="alternate" type="text/html" href="https://wiki.mediagoblin.org/index.php?title=MediaTypeRefactor/DesignDoc&amp;diff=1935"/>
		<updated>2020-05-11T03:48:39Z</updated>

		<summary type="html">&lt;p&gt;Sturm: /* Installation */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Media Types Design =&lt;br /&gt;
&lt;br /&gt;
This document is based on requirements/wishes listed in http://wiki.mediagoblin.org/MediaTypeRefactor&lt;br /&gt;
&lt;br /&gt;
*Note*:   * Attachments have deliberately been excluded from this document to reduce complexity&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Publishing clients =&lt;br /&gt;
&lt;br /&gt;
These are described optimal behaviours of different types of publishing clients.&lt;br /&gt;
&lt;br /&gt;
== CLI ==&lt;br /&gt;
&lt;br /&gt;
=== Single-file ===&lt;br /&gt;
&lt;br /&gt;
{{{&lt;br /&gt;
gmg submit FILE&lt;br /&gt;
}}}&lt;br /&gt;
&lt;br /&gt;
=== *n*-file ===&lt;br /&gt;
&lt;br /&gt;
{{{&lt;br /&gt;
gmg submit FILE_1 FILE_2 [...] FILE_N&lt;br /&gt;
}}}&lt;br /&gt;
&lt;br /&gt;
=== *n*-file with media metadata ===&lt;br /&gt;
&lt;br /&gt;
GStreamer `gst-launch` inspired exclamation-mark-separated &amp;quot;elements&amp;quot; of media entries:&lt;br /&gt;
&lt;br /&gt;
{{{&lt;br /&gt;
gmg submit FILE_1 title=TITLE_1 description=DESCRIPTION_1 ! \&lt;br /&gt;
    FILE_2 title=TITLE_2 ! \&lt;br /&gt;
    FILE_3 title=TITLE_3 tags=TAGS_3[...]&lt;br /&gt;
}}}&lt;br /&gt;
&lt;br /&gt;
== WWW ==&lt;br /&gt;
&lt;br /&gt;
=== *n*-file ===&lt;br /&gt;
&lt;br /&gt;
*Note*: Requires browser [http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#dnd drag and drop] support.&lt;br /&gt;
&lt;br /&gt;
{{{&lt;br /&gt;
,-----------------------------------------------.&lt;br /&gt;
| S U B M I T   F I L E S                       |&lt;br /&gt;
|                                               |&lt;br /&gt;
|        Drag media from your desktop           |&lt;br /&gt;
|              and drop it here                 |&lt;br /&gt;
|                                               |&lt;br /&gt;
`-----------------------------------------------Â´&lt;br /&gt;
}}}&lt;br /&gt;
&lt;br /&gt;
*Note*:   * What if there&#039;s folders in there?&lt;br /&gt;
  * What about publishing-metadata?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Single-file ===&lt;br /&gt;
&lt;br /&gt;
Could be used as fallback for browsers not supporting [http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#dnd drag and drop].&lt;br /&gt;
&lt;br /&gt;
{{{&lt;br /&gt;
,-----------------------------------------------.&lt;br /&gt;
| S U B M I T   F I L E                         |&lt;br /&gt;
|                                               |&lt;br /&gt;
| Source file: [ /home/joar/Pictures... Browse] |&lt;br /&gt;
|                                               |&lt;br /&gt;
| [Submit]                                      |&lt;br /&gt;
`-----------------------------------------------Â´&lt;br /&gt;
}}}&lt;br /&gt;
&lt;br /&gt;
== API ==&lt;br /&gt;
&lt;br /&gt;
TBD&lt;br /&gt;
&lt;br /&gt;
= Media types =&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
&lt;br /&gt;
{{{&lt;br /&gt;
pip install mediagoblin-video&lt;br /&gt;
echo &amp;quot;[[mediagoblin.media_types.video]]&amp;quot; &amp;gt;&amp;gt; mediagoblin.ini&lt;br /&gt;
gmg dbupdate&lt;br /&gt;
}}}&lt;br /&gt;
&lt;br /&gt;
*Note*:   * We could build a wrapper around pip that performs the installation steps automatically.&lt;br /&gt;
  * What about dependencies such as GStreamer and related packages? We could include that in our wrapper, but it&#039;d have to take into account all the different distributions&#039; package managers out there.&lt;br /&gt;
&lt;br /&gt;
== Negotiation ==&lt;br /&gt;
&lt;br /&gt;
Media type negotiation is done per-file by iterating through a registry of enabled media type plugins. Several negotiation mechanisms may exists, such as a cheap file-extension based one and a more expensive file content sniffing negotiation step.&lt;br /&gt;
&lt;br /&gt;
== Output files ==&lt;br /&gt;
&lt;br /&gt;
Some media types such as ASCII art and images might have a very simple data structure:&lt;br /&gt;
&lt;br /&gt;
{{{&lt;br /&gt;
This illustrates the output of the ``mediagoblin.media_types.image`` media&lt;br /&gt;
type:&lt;br /&gt;
&lt;br /&gt;
ORIGINAL IMAGE    -&amp;gt;    THUMBNAIL JPEG&lt;br /&gt;
                     MEDIUM SIZED JPEG&lt;br /&gt;
}}}&lt;br /&gt;
&lt;br /&gt;
Media types such as `video` and `3D object` might have more complex output files:&lt;br /&gt;
&lt;br /&gt;
{{{&lt;br /&gt;
ORIGINAL VIDEO  -&amp;gt;      THUMBNAIL JPEG&lt;br /&gt;
                       640px-wide WEBM # Displayed on media page&lt;br /&gt;
                             720p WEBM # Displayed in full-screen player&lt;br /&gt;
                            1080p WEBM # Displayed in full-screen player&lt;br /&gt;
                      640px-wide H.264 # Alternate container/stream formats&lt;br /&gt;
                            720p H.264&lt;br /&gt;
                           1080p H.264&lt;br /&gt;
}}}&lt;br /&gt;
&lt;br /&gt;
we should therefore allow a lot of flexibility for the files&lt;br /&gt;
&lt;br /&gt;
= Media processing =&lt;br /&gt;
&lt;br /&gt;
Processing takes the original file and creates files of lesser size/quality that  The pipeline is as follows:&lt;br /&gt;
&lt;br /&gt;
  # The application receives a bytestream, optional byte stream metadata (i.e. filename) and publishing-metadata. The bytestream and bytestream metadata is sourced from the *original file*.&lt;br /&gt;
    * Possibly we could have &amp;quot;adapters&amp;quot; of some sort that provides this data consistently across publishing clients.&lt;br /&gt;
*Note*:  Some users have expressed a wish for mediagoblin to simply read a folder with files and create a &amp;quot;web album&amp;quot; from them.&lt;br /&gt;
&lt;br /&gt;
  * The media type negotiation mechanism decides one or more suitable media type plugins to handle the conversion of the *original file*, pushes task data to the task broker and creates a *MediaEntry* in the database and populates it with at least the media type.&lt;br /&gt;
  * The task handler now checks the task broker for a new task when received the task handler looks up the processing method for the selected media type and runs it.&lt;br /&gt;
  * The media processor converts the *original file* into smaller, displayable media. These media files are then placed in the *public storage*.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Note*:   * Are there cases where we should accept more than one input file?&lt;/div&gt;</summary>
		<author><name>Sturm</name></author>
	</entry>
	<entry>
		<id>https://wiki.mediagoblin.org/index.php?title=User_privileges&amp;diff=1934</id>
		<title>User privileges</title>
		<link rel="alternate" type="text/html" href="https://wiki.mediagoblin.org/index.php?title=User_privileges&amp;diff=1934"/>
		<updated>2020-05-11T03:48:14Z</updated>

		<summary type="html">&lt;p&gt;Sturm: /* To change the default set of privileges */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Since 0.6.0, there&#039;s a user privileges/permissions system. You can make the user &amp;quot;USERNAME&amp;quot; an admin by doing&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
./bin/gmg makeadmin USERNAME&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
An admin gets access to an Admin Panel, and when looking at other user pages, is able to revoke/give privileges. Default ones are:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
active 	Yes 	&lt;br /&gt;
admin 	No 	&lt;br /&gt;
commenter 	Yes 	&lt;br /&gt;
moderator 	No 	&lt;br /&gt;
reporter 	Yes 	&lt;br /&gt;
uploader 	Yes 	&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==To change the default set of privileges==&lt;br /&gt;
This is currently possible by checking out a branch that tilly-q is working on.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git remote add tilly-q git://gitorious.org/mediagoblin/npigeons-mediagoblin.git&lt;br /&gt;
git fetch --all&lt;br /&gt;
git cherry-pick 0a5981fd5416c60858c3e460f943692d1c62629d&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Then set something like &amp;lt;pre&amp;gt;user_privilege_scheme= &amp;quot;reporter,commenter&amp;quot;&amp;lt;/pre&amp;gt; in your mediagoblin.ini&lt;/div&gt;</summary>
		<author><name>Sturm</name></author>
	</entry>
	<entry>
		<id>https://wiki.mediagoblin.org/index.php?title=PluginsTips&amp;diff=1933</id>
		<title>PluginsTips</title>
		<link rel="alternate" type="text/html" href="https://wiki.mediagoblin.org/index.php?title=PluginsTips&amp;diff=1933"/>
		<updated>2020-05-11T03:48:00Z</updated>

		<summary type="html">&lt;p&gt;Sturm: /* Quickstart */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Quickstart==&lt;br /&gt;
In the [https://gitorious.org/mediagoblin mediagoblin repository], there&#039;s a sample plugin under mediagoblin/plugins/sampleplugin that you can use to get started with plugin creation. The simplest way to get up and running is to &lt;br /&gt;
# Follow [[HackingHowto#How_to_set_up_and_maintain_an_environment_for_hacking_with_virtualenv]] to set up a local virtualenv mediagoblin instance &lt;br /&gt;
#* run it with ./lazyserver.sh so you get debug output (if you run celeryd separately, you won&#039;t see logging.info from stuff run in celery tasks)&lt;br /&gt;
# &amp;lt;tt&amp;gt;cp -r mediagoblin/plugins/sampleplugin mediagoblin/plugins/myplugin&amp;lt;/tt&amp;gt; (where &amp;quot;myplugin&amp;quot; is your plugin name)&lt;br /&gt;
# edit &amp;lt;tt&amp;gt;mediagoblin.ini&amp;lt;/tt&amp;gt; and add &amp;lt;nowiki&amp;gt;[[mediagoblin.plugins.myplugin]]&amp;lt;/nowiki&amp;gt; under the &amp;lt;nowiki&amp;gt;[plugins]&amp;lt;/nowiki&amp;gt; section to enable your plugin&lt;br /&gt;
&lt;br /&gt;
Now you can look at e.g. other core or non-core plugins for inspiration. See [[Available Plugins]] for non-core plugins.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The way you change things in plugins is by use of &#039;&#039;&#039;hooks&#039;&#039;&#039;. At certain points in the mediagoblin code, a function will say &amp;quot;run all hooks with name XYZ&amp;quot;, and if you&#039;ve defined a hook with such a name in a plugin you&#039;ve enabled, it&#039;ll get run there. The [http://mediagoblin.readthedocs.org/en/latest/pluginwriter/api.html documentation on Plugin API] is your friend for defining hooks. The sample plugin shows a use of the &#039;setup&#039; hook.&lt;br /&gt;
&lt;br /&gt;
Note: templates are hooked with a call to pluginapi.register_template_hooks, instead of adding to the hooks variable.&lt;br /&gt;
&lt;br /&gt;
==Making an installable plugin==&lt;br /&gt;
If you followed the steps above, you can use your plugin by copying it into the plugins folder; however, to get a plugin that is easily installable by users (e.g. with &amp;lt;tt&amp;gt;pip install myplugin&amp;lt;/tt&amp;gt;), it should have a certain folder layout. &lt;br /&gt;
&lt;br /&gt;
A good example is the [https://github.com/commonsmachinery/mg-rdfa/ RDFa plugin]. This uses a setup.py file to install the files under the mediagoblin_rdfa folder into the lib/ folder of your mediagoblin installation. If you&#039;ve checked out both mediagoblin and mg-rdfa in the same folder, e.g. ~/src/, you can do &amp;lt;pre&amp;gt;cd ~/src/mg-rdfa/&lt;br /&gt;
../mediagoblin/bin/python setup.py build&lt;br /&gt;
../mediagoblin/bin/python setup.py install&amp;lt;/pre&amp;gt; to install it to your mediagoblin instance.&lt;br /&gt;
&lt;br /&gt;
The file layout of the repo is:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
setup.py&lt;br /&gt;
MANIFEST.in&lt;br /&gt;
README.md&lt;br /&gt;
mediagoblin_rdfa/&lt;br /&gt;
                 __init.py__&lt;br /&gt;
                 templates/&lt;br /&gt;
                           mediagoblin/&lt;br /&gt;
                                       plugins/&lt;br /&gt;
                                               rdfa/&lt;br /&gt;
                                                    metadata.html&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The setup.py file defines an option include_package_data=True, which makes it read the file MANIFEST.in; MANIFEST.in contains rules for which files to include when installing. In this case, rule &amp;lt;tt&amp;gt;recursive-include mediagoblin_rdfa *.html&amp;lt;/tt&amp;gt; makes it include the HTML template file (and any other you put under mediagoblin_rdfa), retaining the folder layout.&lt;br /&gt;
&lt;br /&gt;
==Referencing the mediagoblin test set in a plugin==&lt;br /&gt;
&lt;br /&gt;
The tests in mediagoblin define a nice &amp;quot;test_app&amp;quot; and functions for logging in and posting and so on. You can use this in your installable plugin.&lt;br /&gt;
&lt;br /&gt;
From your plugin (assuming a layout like mg-rdfa described above), doing&lt;br /&gt;
&lt;br /&gt;
    cp -r ../mediagoblin/mediagoblin/tests .&lt;br /&gt;
&lt;br /&gt;
lets you run&lt;br /&gt;
&lt;br /&gt;
    ../mediagoblin/bin/py.test tests --boxed               &lt;br /&gt;
&lt;br /&gt;
In fact, the only files you need are `conftest.py` and `pytest.ini`, and then you can copy over a single `test_foo.py` (only making sure import statements are absolute) and it should run fine.&lt;br /&gt;
&lt;br /&gt;
You also need to call setup_plugins() in your setup() function for your plugin to be properly loaded before testing.&lt;br /&gt;
&lt;br /&gt;
An example of this test method is in the [https://gitorious.org/mediagoblin-stock/mediagoblin-hidden_original/ &amp;quot;hidden original&amp;quot; plugin], which subclasses the submission tests.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
See also [http://mediagoblin.readthedocs.org/en/latest/pluginwriter/tests.html Writing unit tests for plugins] in the docs.&lt;br /&gt;
&lt;br /&gt;
== Translating / Localising plugins ==&lt;br /&gt;
&#039;&#039;How do we do [[Translations]] in plugins?&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
(At least, a plugin would have to install a .mo file in e.g. lib/python2.7/site-packages/pluginname-0.1.3-py2.7.egg/pluginname/i18n/nn_NO/LC_MESSAGES/pluginname.mo (with domain &amp;quot;pluginname&amp;quot;?). Then mediagoblin would have to either discover that the file exists when setting up the plugin, or the plugin would have to add that to some list in some hook.&lt;br /&gt;
&lt;br /&gt;
mg_globals.py seems to create a gettext variable pointing at mediagoblin/i18n:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
thread_scope.translations = gettext.translation(&lt;br /&gt;
    &#039;mediagoblin&#039;,&lt;br /&gt;
    pkg_resources.resource_filename(&lt;br /&gt;
        &#039;mediagoblin&#039;, &#039;i18n&#039;), [&#039;en&#039;], fallback=True)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
which is installed into the jinja template in template.py:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    template_env.install_gettext_callables(&lt;br /&gt;
        mg_globals.thread_scope.translations.ugettext,&lt;br /&gt;
        mg_globals.thread_scope.translations.ungettext)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
in a function called by app.py:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        request.template_env = template.get_jinja_env(&lt;br /&gt;
            self.template_loader, request.locale)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
== Making database models ==&lt;br /&gt;
See [[SQLAlchemy Tips]]&lt;/div&gt;</summary>
		<author><name>Sturm</name></author>
	</entry>
	<entry>
		<id>https://wiki.mediagoblin.org/index.php?title=GMG_FAQ&amp;diff=1932</id>
		<title>GMG FAQ</title>
		<link rel="alternate" type="text/html" href="https://wiki.mediagoblin.org/index.php?title=GMG_FAQ&amp;diff=1932"/>
		<updated>2020-05-11T03:47:32Z</updated>

		<summary type="html">&lt;p&gt;Sturm: /* Authentication is disabled after an update */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;NOTE:&#039;&#039;&#039; MediaGoblin is in heavy development, so the answers in this FAQ are very likely to be incomplete or obsolete. Please use the documentation, git, mailing list, IRC &#039;&#039;etc&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Is it possible to upload many files at a time? ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;As of 2013-09-08:&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* There is at least one script for that, based on the API, [https://github.com/joar/automgtic automgtic by joar]. It might not work now in some way due to API changes.&lt;br /&gt;
&lt;br /&gt;
* There is experimental support for a [http://piwigo.org/ Piwigo] compatible API, usable with [http://yorba.org/shotwell/ Shotwell]; see &amp;quot;[http://saz.im/blog/shotwell-mg.html Using Shotwell with Mediagoblin]&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
* pythonsnake has made [https://github.com/pythonsnake/MediaDwarf/tree/486_multiupload a branch for multiupload] in his repo. Source: [http://www.reddit.com/r/linux/comments/1lselg/mediagoblin_050_released_with_help_from_opw_and/cc3lgu6]&lt;br /&gt;
&lt;br /&gt;
* if you have files already on the server, you can use &amp;quot;gmg batchaddmedia&amp;quot; in the local shell to import media in Mediagoblin&lt;br /&gt;
&lt;br /&gt;
== There is an SQL error ==&lt;br /&gt;
If you&#039;ve changed configuration (like enabling a plug-in) or updated the code, you may need to run a dbupdate, please see [http://docs.mediagoblin.org/siteadmin/deploying.html#install-mediagoblin-and-virtualenv]. The database must be readable (and probably writeable).&lt;br /&gt;
&lt;br /&gt;
== Authentication is disabled after an update ==&lt;br /&gt;
&lt;br /&gt;
Add this to the [plugins] section of mediagoblin.ini:&lt;br /&gt;
&amp;lt;pre&amp;gt;[[mediagoblin.plugins.basic_auth]]&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
See mediagoblin.ini and [http://lists.mediagoblin.org/pipermail/devel/2013-July/000610.html] for examples of more.&lt;br /&gt;
&lt;br /&gt;
== Development ==&lt;br /&gt;
&lt;br /&gt;
=== Why did you [http://issues.mediagoblin.org/ticket/557 switch] from MongoDB to SQL? ===&lt;br /&gt;
There are some notes at&lt;br /&gt;
* [[Scaling Down]]&lt;br /&gt;
* [[SQL Database Backend]]&lt;/div&gt;</summary>
		<author><name>Sturm</name></author>
	</entry>
	<entry>
		<id>https://wiki.mediagoblin.org/index.php?title=Deployment&amp;diff=1929</id>
		<title>Deployment</title>
		<link rel="alternate" type="text/html" href="https://wiki.mediagoblin.org/index.php?title=Deployment&amp;diff=1929"/>
		<updated>2020-04-28T15:30:17Z</updated>

		<summary type="html">&lt;p&gt;Sturm: Remove systemd scripts - these are included in the official docs&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://nathanielca.se/fossrit/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;
If you&#039;re getting strange errors when trying to upload something, your WSGI setup is probably not starting Celery. You should start it yourself, perhaps with your preferred init system or service supervisor.&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:&lt;br /&gt;
 &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>Sturm</name></author>
	</entry>
	<entry>
		<id>https://wiki.mediagoblin.org/index.php?title=UnitTests&amp;diff=1923</id>
		<title>UnitTests</title>
		<link rel="alternate" type="text/html" href="https://wiki.mediagoblin.org/index.php?title=UnitTests&amp;diff=1923"/>
		<updated>2019-09-19T08:03:23Z</updated>

		<summary type="html">&lt;p&gt;Sturm: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Unit tests =&lt;br /&gt;
&lt;br /&gt;
FIXME - i think there&#039;s some information in chris&#039; brain dumps page that should get ported here. &lt;br /&gt;
&lt;br /&gt;
In the meantime, if you&#039;re interested in helping with unit tests, come see us in #mediagoblin on freenode.net.&lt;br /&gt;
&lt;br /&gt;
== Running the unit tests ==&lt;br /&gt;
&lt;br /&gt;
To run the unit tests, do:&lt;br /&gt;
&lt;br /&gt;
    ./runtests.sh&lt;br /&gt;
&lt;br /&gt;
To run a specific test, do:&lt;br /&gt;
&lt;br /&gt;
    ./runtests.sh &amp;lt;TEST&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For example:&lt;br /&gt;
&lt;br /&gt;
    ./runtests.sh mediagoblin/tests/test_submission.py::TestSubmissionBasics::test_collection_selection&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;runtests.sh&amp;lt;/tt&amp;gt; does some minor setup and calls py.test.  If you pass in &amp;lt;tt&amp;gt;-h&amp;lt;/tt&amp;gt;, you&#039;ll get the&lt;br /&gt;
py.test help which shows you options for other things you can do with the unit test system.  For details see the [https://docs.pytest.org/en/latest/usage.html pytest] documentation.&lt;/div&gt;</summary>
		<author><name>Sturm</name></author>
	</entry>
	<entry>
		<id>https://wiki.mediagoblin.org/index.php?title=UnitTests&amp;diff=1922</id>
		<title>UnitTests</title>
		<link rel="alternate" type="text/html" href="https://wiki.mediagoblin.org/index.php?title=UnitTests&amp;diff=1922"/>
		<updated>2019-09-19T07:48:29Z</updated>

		<summary type="html">&lt;p&gt;Sturm: Update testing docs.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Unit tests =&lt;br /&gt;
&lt;br /&gt;
FIXME - i think there&#039;s some information in chris&#039; brain dumps page that should get ported here. &lt;br /&gt;
&lt;br /&gt;
In the meantime, if you&#039;re interested in helping with unit tests, come see us in #mediagoblin on freenode.net.&lt;br /&gt;
&lt;br /&gt;
== Running the unit tests ==&lt;br /&gt;
&lt;br /&gt;
To run the unit tests, do:&lt;br /&gt;
&lt;br /&gt;
    ./runtests.sh&lt;br /&gt;
&lt;br /&gt;
To run a specific test, do:&lt;br /&gt;
&lt;br /&gt;
    ./runtests.sh &amp;lt;TEST&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For example:&lt;br /&gt;
&lt;br /&gt;
    ./runtests.sh mediagoblin/tests/test_submission.py::TestSubmissionBasics.test_collection_selection&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;runtests.sh&amp;lt;/tt&amp;gt; does some minor setup and calls py.test.  If you pass in &amp;lt;tt&amp;gt;-h&amp;lt;/tt&amp;gt;, you&#039;ll get the&lt;br /&gt;
py.test help which shows you options for other things you can do with the unit test system.&lt;/div&gt;</summary>
		<author><name>Sturm</name></author>
	</entry>
	<entry>
		<id>https://wiki.mediagoblin.org/index.php?title=Meeting&amp;diff=1855</id>
		<title>Meeting</title>
		<link rel="alternate" type="text/html" href="https://wiki.mediagoblin.org/index.php?title=Meeting&amp;diff=1855"/>
		<updated>2016-09-17T15:30:34Z</updated>

		<summary type="html">&lt;p&gt;Sturm: Remove old link to logs archive&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. See below for logs of each meeting.&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;
=== Oct 1, 2016 ===&lt;br /&gt;
&lt;br /&gt;
== Past Meetings ==&lt;br /&gt;
&lt;br /&gt;
=== Sept 4, 2016, 17:00 UTC ===&lt;br /&gt;
&lt;br /&gt;
[[20160904_Log]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== May 7, 2016 ===&lt;br /&gt;
&lt;br /&gt;
=== April 2, 2016, 17:00 UTC ===&lt;br /&gt;
* 0.9.0 release (done!)&lt;br /&gt;
* GSoC&lt;br /&gt;
* 1.0&lt;br /&gt;
&lt;br /&gt;
[[20160402_Log]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== March 5, 2016, 9:00AM Pacific Time, 17:00 UTC ===&lt;br /&gt;
* 0.9.0 release (imminent!)&lt;br /&gt;
* GSoC&lt;br /&gt;
** Project ideas&lt;br /&gt;
** Interested mentors?&lt;br /&gt;
* Federation mini-update&lt;br /&gt;
&lt;br /&gt;
[[20160305_Log]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== February 6, 2016, 9:00AM Pacific Time, 17:00 UTC ===&lt;br /&gt;
&lt;br /&gt;
* Continuous integration / Commit Notifications&lt;br /&gt;
* Move sqlite to development-only? (no more migrations)&lt;br /&gt;
* Upcoming 0.9.0 release&lt;br /&gt;
* Path to 1.0&lt;br /&gt;
* Stripe retreat update&lt;br /&gt;
* ActivityPub update (related!)&lt;br /&gt;
* GSOC ideas, and volunteers?&lt;br /&gt;
&lt;br /&gt;
[[20160206_Log]]&lt;br /&gt;
&lt;br /&gt;
=== January 2, 2016, 9:00AM Pacific Time, 17:00 UTC ===&lt;br /&gt;
&lt;br /&gt;
* 0.9.0&lt;br /&gt;
* FOSDEM&lt;br /&gt;
* 0.8.2&lt;br /&gt;
[[20160102_Log]]&lt;br /&gt;
&lt;br /&gt;
=== November 7, 2015, 9:00AM Pacific Time, 17:00 UTC ===&lt;br /&gt;
&lt;br /&gt;
* 0.8.1 and 0.9.0&lt;br /&gt;
* Activipy and W3C Social WG stuff&lt;br /&gt;
* Help squash bugs!&lt;br /&gt;
* Revisiting the code / issue hosting situation??&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>Sturm</name></author>
	</entry>
</feed>