This guide shows you how to install a standard copy of the Goteo code. To personalize your installation (changing views, etc) it's strongly recommended to create a plugin where views are overwritten. Otherwise any change you make to the code will be lost on software updates (or you will go throught a lot of pain updating the code).

Please referer to the "extend section" to learn how to do that.

This guide is intended for production settings, for development using Docker is recommended.

Note that you can use docker to build all the scripts and then copy those files to the server. Just add docker/exec in front of any command with grunt, composer or npm

Server requirements

  • PHP v7 (PHP 7.1 recommended) or later with extensions gd, mcrypt, curl, mbstring, json, mysql activated
  • Access to the terminal in the webserver and cron.
  • Apache, Nginx or any other server with ModRewrite activated
  • MySQL 5.7 (or MariaDB 10.2) or later

At this point, there are still no production-ready releases. Please refer to the developers documentation for more info.

You will need to install dependencies and to build a dist production folder to point the webserver onto it.

We use Composer and Grunt for that. Be sure to have it installed in your system.

Quick start

Install all the required dependencies:

composer install
npm install

Create and edit your confinguration:

cp config/demo-settings.yml config/settings.yml

Create the compiled minimized system:

grunt build:dist

Point your web server to handle all request by the file goteo/dist/index.php

Alternatively, use grunt build:devel for javascript/css debugging and point the webserver to goteo/dist/index_dev.php

Goteo configuration

You will need to create a new file in the folder config named settings.yml

Use demo-settings.yml or vagrant-settings.yml as a example.

Particularly you must configure the db: section with the proper username/password for MySQL in the file config/settings.yml

You can specify a different dev-settings.yml file which will be used by public/index_dev.php

It is also possible to define a custom settings file with the env var GOTEO_CONFIG_FILE, ie:

export GOTEO_CONFIG_FILE='/my/path/my-settings.yml'
grunt serve

Example installation config/settings.yml: You can overwrite any variable defined in Resources/defaults.yml in this file

# Goteo settings file

# Internal secret for hashes
secret: --a-very-secret-string---

# local enviroment: local, beta, real
env: local
debug: true # whether to show trace for errors or not
            # This is always true for local or beta env
# liveport: 35729 # Local development only livereload port (optional)

# Default system language
lang: es

# Default timezone
timezone: Europe/Madrid

# url
    main: //
    # static resources url if you use a different assets server
    assets: //
    #optional, configure this as hostname only (ex: if you want languages to be selected as subdomains (,

    # If you want to use a CDN or another web server to serve the cached images
    # You can define this constants. All cached images links will point to this
    # Url, event if don't exists yet.
    # Example:
    # Point a to var/cache/images
    # the place a .htaccess in var/cache/images/.htaccess with this content
    # <ifmodule mod_rewrite.c>
    # RewriteEngine on
    # RewriteCond %{REQUEST_FILENAME} !-f
    # RewriteCond %{REQUEST_FILENAME} !-d
    # RewriteRule ^(.*)$1 [R=302,L]
    # </ifmodule>

# Extend is the directory to personalize your copy of
# Routes, classes and templates can be overridden by copying the main structure
# ie:
#    - Autoloading classes
#    - Templates will be found first from extend/plugin-name/Resources/templates path
#    - Tests should be placed into extend/plugin-name/tests path
#    - Routes can be overwritten
#    - Service container can be tampered

        active: true # plugin should be active=true to be loaded

# Payment methods, must be registered as classes implementing Goteo\Payment\Method\PaymentMethodInterface
    # Paypal
        active: true
        testMode:  true # set to false to real checkouts
        password: paypal-password
        signature: PAYPAL-Signature
        # brandName: Your organisation
        # headerImageUrl: Some URL image for the header
        # logoImageUrl: logo URL
        # borderColor: B5DADC

    # This is a built-in payment method using internal credit
    # Comissions can be configured here if needed
        active: true
    # A stupid payment method defined in the plugin goteo-dev
    # Useful for development and testing
        active: true

    # Additional custom payment methods should be added here

# Force using https protocol
ssl: false

# IMPORTANT! if ssl is true and your server is behind a proxy
# List the trusted proxies for SSL connection here
    # Cloudflare IP list:
    # -
    # -
    # -
    # -
    # -
    # -
    # -
    # -
    # -
    # -
    # -
    # -
    # -
    # -

# Default commission fee
fee: 4

# Filesystem used by goteo
    handler:    local      # 's3' to use AmazonS3 storage, 'local' to use local file system
    # Only need to be defined credentials if file system is s3:
    # AWS credentials
    aws: &aws1
        key:        your-aws-key
        secret:     your-aws-secret
        region:     eu-west-1

        static:        # where to store the assets (css, js, images)
        mail:  # where to store alternative mail view

# Database stuff
    driver:   mysql     # Database driver (mysql)
    host:     localhost # Database host
    port:     3306      # Database port
    charset:  utf8mb4     # Database charset
    database: your_goteo_db     # Database schema (database name)
    username: your_user     # Database user for the goteo database
    password: your_password  # Password for the goteo database

# HTML Metas
    title:       --meta-title--       # Html default <title>
    description: --meta-description-- # Html default <meta description>
    keywords:    --keywords--         # Html default <meta keywords>
    author:      --author--           # Html default <meta author>
    copyright:   --copyright--        # Html default <meta copyright>

# Mail transport
    # receiving emails
    mail:     # Main
    contact:     # consulting head
    manager:  # accounts manager
    fail:      # dev head
    log:  # Loggin mail

    # allowed addresses while in BETA/LOCAL env in PREG format
    beta_senders: "(.+)example\\.org|(.+)example\\.com"

    # Default users where to send project notifications by default
    # Only used if no consultants are assigned
        root: 'Root'

        name:          Goteo Sender
        type:          smtp
        # if type is smtp:
            auth:     true
            secure:   ssl
            port:     587
            username: smtp-usermail
            password: smtp-password

        total: 50000  # Maximum sending quota in 24 hours time (useful for SMTP servers like Amazon SES)
        sender: 40000 # Part of this quota used by newsletter mailing

    # Amazon SNS key to process automatic bounces: 'arn:aws:sns:us-east-1:XXXXXXXXX:amazon-ses-bounces'
    # URL mus be: goteo_url.tld/aws-sns.php
        client_id:        XXXXXXXXX
        region:           us-east-1
        bounces_topic:    amazon-ses-bounces
        complaints_topic: amazon-ses-complaints

# This will be used for geolocating users, projects, and mail tracking
    # Path to maxmind databases, you need to download (and keep updated) either the free o commercial
    # databases from maxmind. Check this for more info:
    # relative paths are allowed (ie: you can save your maxmind databases into config/resources/maxmind if you want)
    # Un comment next 2 lines if you have it installed and working:
    # maxmind:
    #    cities: /usr/share/GeoIP/GeoLite2-City.mmdb
    google_maps_key: # Google Maps Key
                     # Ge one here:

# Social Login Services
# Fill an uncomment the needed one's
    # Credentials app Facebook
       active: false
       id:     000000000000000                  #
       secret: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa #

    # Credentials app Twitter
       active: false
       id:      aaaaaaaaaaaaaaaaaaaaaa                     #
       secret:  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa #

    # Credentials app Linkedin
       active: false
       id:     aaaaaaaaaaaa     #
       secret: aaaaaaaaaaaaaaaa #

    # Credentials Google
       active: false
       id: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
       secret: aaaaaaaaaaaaaaaaaa

    # OpenID logins does not need for Keys, just active/inactive
        active: false

        active: true

# Optional analytics ID's
# Example:
# google: UA-0000000-01

Database install

First you'll need an empty database and have your config/settings.yml file with the section db properly configured with your database parameters.

Once you got it, install the database schema and a minimal data set is easy: In a terminal, in the root directory where Goteo code is, run the command migrate:

php bin/console migrate install

This should give you an empty system with only one user "root".

Login with user "root" and password "root" (no quotes). Go to change the password and email Try login with that password and manage the contents at

The install script also creates demo project, you can remove all demo data by using the command ./bin/console dev:statusinit --erase' from the dev-plugin.

Cron configuration

You will need to add a cron/crontab line in order to process severals project related events:

* * * * *   nice /usr/bin/php /path/to/installation/bin/console cron --lock --logmail > /dev/null 2>&1

Refer to the Console scripts documentation for more info

Server configuration

Goteo has been tested under Nginx and Apache configurations.

Apache config:

Modrewrite must be enabled for apache below 2.2.16:

<IfModule mod_rewrite.c>
    Options -MultiViews

    RewriteEngine On
    #RewriteBase /path/to/goteo-folder/dist
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^ index.php [QSA,L]

Alternatively, if you use Apache 2.2.16 or higher, you can use the FallbackResource directive to make your .htaccess even easier:

FallbackResource /index.php


  • If you want to debug the site, you must point the server to the index_dev.php file instead of index.php. This way error traces will be shown in the error pages
  • If you cannot configure the server to point to the dist/ folder, the .htaccess file on the root folder can be used as alternative (using this solution will force the use of the URL assets to point to the dist/ folder.)

Apache 2.4 config demo:

<VirtualHost *:80>
    ServerName domain.tld

    ServerAdmin webmaster@localhost
    DocumentRoot /path/to/my/goteo-folder/dist

    # Custom settings for apache
    SetEnv GOTEO_CONFIG_FILE /path/to/my/settings.yml

    FallbackResource /index.php

    <Directory /path/to/my/goteo-folder/dist>
        Options Indexes FollowSymlinks
        AllowOverride All
        Require all granted

    #LogLevel info ssl:warn

    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined


Nginx config demo:

server {
    server_name domain.tld www.domain.tld;
    root /path/to/my/goteo-folder/dist;

    location / {
        # try to serve file directly, fallback to front controller
        try_files $uri /index.php$is_args$args;

    # If you have 2 front controllers for dev|prod use the following line instead
    # location ~ ^/(index|index_dev)\.php(/|$) {
    location ~ ^/index\.php(/|$) {
        # the ubuntu default
        fastcgi_pass   unix:/var/run/php/php7.0-fpm.sock;
        # for running on centos
        #fastcgi_pass   unix:/var/run/php-fpm/www.sock;

        fastcgi_split_path_info ^(.+\.php)(/.*)$;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param HTTPS off;

        # Prevents URIs that include the front controller. This will 404:
        # http://domain.tld/index.php/some-path
        # Enable the internal directive to disable URIs like this
        # internal;

    #return 404 for all php files as we do have a front controller
    location ~ \.php$ {
        return 404;

    error_log /var/log/nginx/project_error.log;
    access_log /var/log/nginx/project_access.log;