Instantly share code, notes, and snippets.

Embed
What would you like to do?
Installing Gitea on Raspberry Pi with nginx, SSL and automatic backups

Setup Gitea on Raspberry Pi (3)

These instructions are based on this article: https://www.alexruf.net/2016/05/23/setup-gogs-git-service.html.

Setup Raspberry Pi with minimal Raspbian image. You need to connect to the HDMI port and set the following:

sudo raspi-config

There you need to enable the SSH server and you should change the hostname.

Then configure the correct timezone:

sudo dpkg-reconfigure tzdata

Now log in via ssh and execute the following commands:

sudo apt-get update
sudo apt-get upgrade
sudo apt-get install zip git -y

# Create a new user:
sudo adduser --disabled-login --gecos 'Gitea' git

# Install go 1.8.1
wget https://storage.googleapis.com/golang/go1.8.1.linux-armv6l.tar.gz
sudo tar -C /usr/local -xzf go1.8.1.linux-armv6l.tar.gz

# Change to user git:
sudo su - git

# Set environment variables
export PATH=/usr/local/go/bin:$PATH
export GOPATH="$HOME/"

# Download and build go-bindata
go get github.com/jteeuwen/go-bindata
cd $GOPATH/src/github.com/jteeuwen/go-bindata/go-bindata
export PATH=$GOPATH/src/github.com/jteeuwen/go-bindata/go-bindata:$PATH

# Download the latest gitea version:
go get -d -u code.gitea.io/gitea
cd $GOPATH/src/code.gitea.io/gitea

# Build it
TAGS="bindata sqlite" make generate build

# Now type `exit` to go back to pi user.

Create the file /etc/systemd/system/gitea.service and add the following content:

[Unit]
Description=Gitea
After=syslog.target
After=network.target
After=mariadb.service mysqld.service postgresql.service memcached.service redis.service

[Service]
# Modify these two values and uncomment them if you have
# repos with lots of files and get an HTTP error 500 because
# of that
###
#LimitMEMLOCK=infinity
#LimitNOFILE=65535
Type=simple
User=git
Group=git
WorkingDirectory=/home/git/src/code.gitea.io/gitea
ExecStart=/home/git/src/code.gitea.io/gitea/gitea web web
Restart=always
Environment=USER=git HOME=/home/git

[Install]
WantedBy=multi-user.target
# Start gitea:
sudo systemctl enable gitea
sudo systemctl start gitea

Install and setup nginx with ssl

# Install and configure nginx (see https://gogs.io/docs/advanced/configuration_for_source_builds#setting-up-nginx-sever):
sudo apt-get install nginx -y

Edit /etc/nginx/sites-available/gitea and insert the following:

server {
    listen 443 ssl;
    server_name gitea <your-domain>;
    ssl_certificate     /etc/letsencrypt/live/<your-domain>/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/<your-domain>/privkey.pem;

    location / {
        client_max_body_size 364M;
        proxy_pass http://localhost:3000;
        proxy_connect_timeout 600;
        proxy_send_timeout 600;
        proxy_read_timeout 600;
        send_timeout 600;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

server {
    listen 80;
    server_name gitea <your-domain>;
    return 301 https://$host$request_uri;
}

Now we need to create the ssl certificates for the domains.

cd ~
wget https://dl.eff.org/certbot-auto
chmod a+x certbot-auto
sudo ./certbot-auto certonly --standalone -d <your-domain>

In order to update the certificates automatically, we need to create a cron job via sudo crontab -e and insert the following line:

0 1 2 * * sudo service nginx stop && sudo /home/pi/certbot-auto renew --dry-run && sudo service nginx start

This executes the three commands on every first day of a month at 2 AM.

Then enable the gitea nginx-site and restart the nginx server:

sudo ln -s /etc/nginx/sites-available/gitea /etc/nginx/sites-enabled/gitea
sudo rm /etc/nginx/sites-enabled/default
sudo service nginx restart

Create backup-script

Now we want to create a backup script that is run by crontab every day. To do so, create a new file called gitea-backup.sh and insert the following content (replace YOUR_SERVER/YOUR/DIR as well as USER and PASSWORD):

#!/bin/bash

# Create directory if it does not exist
mkdir -p git

# Mount NAS directory
sudo mount -t cifs //<your-nas>/Git git -o user=<your-nas-user>,pass=<your-password>

# Create backup directory if it does not exist and cd into it
mkdir -p git/gitea-backups

# Run the backup job
sudo zip -r "git/gitea-backups/gitea-backup-$(date +"%Y-%m-%d %H-%M-%S").zip" /home/git/src/code.gitea.io/gitea/custom /home/git/src/code.gitea.io/gitea/data /home/git/gitea-repositories

# Remove all files, keeping the last recent one and cd back
cd git/gitea-backups
ls -t1 . | tail -n +3 | xargs -d '\n' rm -f
cd ../..

# Allow changing the backup dir and files
sudo chmod -R 777 git/gitea-backups

# Clean up everything
sudo umount git
rmdir git

Now chmod +x gitea-backup.sh and create a new crontab entry:

crontab -e

# Now add the following line:
0 0 * * * /home/pi/gitea-backup.sh

This calls our script everyday at 0:00 AM, creates a gogs dump and copies it to our network share.

Update Gitea

sudo su - git
export GOPATH="$HOME/"
export PATH=$GOPATH/src/github.com/jteeuwen/go-bindata/go-bindata:$PATH
export PATH=/usr/local/go/bin:$PATH
cd $GOPATH/src/code.gitea.io/gitea/
git checkout HEAD -- public/swagger.v1.json
go get -d -u code.gitea.io/gitea
TAGS="bindata sqlite" make generate build
exit
sudo systemctl restart gitea
@Bennnsen

This comment has been minimized.

Bennnsen commented Jan 31, 2018

Great work man. But one thing was missing "go install github.com/jteeuwen/go-bindata" ater go get github.com/jteeuwen/go-bindata. Thanks for the guide

@strasp09

This comment has been minimized.

strasp09 commented Mar 14, 2018

Great job. Some users should run export PATH=$PATH:$GOPATH/bin before building Gitea, otherwise get error running "go-bindata": exec: "go-bindata": executable file not found in $PATH. Thank you.

@dguglielmi

This comment has been minimized.

dguglielmi commented May 29, 2018

I made an installation script based on your doc. Thank you! https://gist.github.com/dguglielmi/f8d99e7740fe84c706c5bc312d671adb

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment