summaryrefslogtreecommitdiffstats
path: root/contrib
diff options
context:
space:
mode:
authorThomas Boerger <thomas@webhippie.de>2017-03-15 13:30:00 +0100
committerGitHub <noreply@github.com>2017-03-15 13:30:00 +0100
commita06c3ad2c02a5473184711be6dbf1b30f0299e11 (patch)
treece0ac065a6afa843ce298d00d1761b5cf48accf9 /contrib
parent09fe4a2ae9dfa8b3bc8a5039d0feab1e1a34d07b (diff)
downloadgitea-a06c3ad2c02a5473184711be6dbf1b30f0299e11.tar.gz
gitea-a06c3ad2c02a5473184711be6dbf1b30f0299e11.zip
Synced gitignores with github repo (#1245)
* Renamed scripts directory into contrib * Added script to download gitignores from github * Synced gitignores with github repo
Diffstat (limited to 'contrib')
-rw-r--r--contrib/README1
-rwxr-xr-xcontrib/autoboot.sh2
-rw-r--r--contrib/init/centos/gitea93
-rw-r--r--contrib/init/debian/gitea86
-rw-r--r--contrib/init/freebsd/gitea47
-rw-r--r--contrib/init/gentoo/gitea15
-rwxr-xr-xcontrib/init/openbsd/gitea19
-rw-r--r--contrib/init/suse/gitea115
-rw-r--r--contrib/launchd/io.gitea.web.plist39
-rwxr-xr-xcontrib/migrate/gogs_migrate.sh206
-rw-r--r--contrib/mysql.sql2
-rw-r--r--contrib/supervisor/gitea16
-rw-r--r--contrib/systemd/gitea.service26
-rw-r--r--contrib/windows/install-as-service.bat25
14 files changed, 692 insertions, 0 deletions
diff --git a/contrib/README b/contrib/README
new file mode 100644
index 0000000000..fddd5ac901
--- /dev/null
+++ b/contrib/README
@@ -0,0 +1 @@
+All files in subdirectories are templates, do modifications based on your environment first. \ No newline at end of file
diff --git a/contrib/autoboot.sh b/contrib/autoboot.sh
new file mode 100755
index 0000000000..eb16d58170
--- /dev/null
+++ b/contrib/autoboot.sh
@@ -0,0 +1,2 @@
+#!/bin/sh
+su git -c "/home/git/gogs/scripts/gogs_supervisord.sh restart"
diff --git a/contrib/init/centos/gitea b/contrib/init/centos/gitea
new file mode 100644
index 0000000000..c24fc1f01e
--- /dev/null
+++ b/contrib/init/centos/gitea
@@ -0,0 +1,93 @@
+#!/bin/sh
+#
+# /etc/rc.d/init.d/gitea
+#
+# Runs the Gitea Git with a cup of tea.
+#
+#
+# chkconfig: - 85 15
+#
+
+### BEGIN INIT INFO
+# Provides: gitea
+# Required-Start: $remote_fs $syslog
+# Required-Stop: $remote_fs $syslog
+# Default-Start: 2 3 4 5
+# Default-Stop: 0 1 6
+# Short-Description: Start gitea at boot time.
+# Description: Control gitea.
+### END INIT INFO
+
+# Source function library.
+. /etc/init.d/functions
+
+# Default values
+
+NAME=gitea
+GITEA_HOME=/home/git/gitea
+GITEA_PATH=${GITEA_HOME}/$NAME
+GITEA_USER=git
+SERVICENAME="Gitea - Git with a cup of tea"
+LOCKFILE=/var/lock/subsys/gitea
+LOGPATH=${GITEA_HOME}/log
+LOGFILE=${LOGPATH}/gitea.log
+RETVAL=0
+
+# Read configuration from /etc/sysconfig/gitea to override defaults
+[ -r /etc/sysconfig/$NAME ] && . /etc/sysconfig/$NAME
+
+# Don't do anything if nothing is installed
+[ -x ${GITEA_PATH} ] || exit 0
+# exit if logpath dir is not created.
+[ -x ${LOGPATH} ] || exit 0
+
+DAEMON_OPTS="--check $NAME"
+
+# Set additional options, if any
+[ ! -z "$GITEA_USER" ] && DAEMON_OPTS="$DAEMON_OPTS --user=${GITEA_USER}"
+
+start() {
+ cd ${GITEA_HOME}
+ echo -n "Starting ${SERVICENAME}: "
+ daemon $DAEMON_OPTS "${GITEA_PATH} web > ${LOGFILE} 2>&1 &"
+ RETVAL=$?
+ echo
+ [ $RETVAL = 0 ] && touch ${LOCKFILE}
+
+ return $RETVAL
+}
+
+stop() {
+ cd ${GITEA_HOME}
+ echo -n "Shutting down ${SERVICENAME}: "
+ killproc ${NAME}
+ RETVAL=$?
+ echo
+ [ $RETVAL = 0 ] && rm -f ${LOCKFILE}
+}
+
+case "$1" in
+ start)
+ status ${NAME} > /dev/null 2>&1 && exit 0
+ start
+ ;;
+ stop)
+ stop
+ ;;
+ status)
+ status ${NAME}
+ ;;
+ restart)
+ stop
+ start
+ ;;
+ reload)
+ stop
+ start
+ ;;
+ *)
+ echo "Usage: ${NAME} {start|stop|status|restart}"
+ exit 1
+ ;;
+esac
+exit $RETVAL
diff --git a/contrib/init/debian/gitea b/contrib/init/debian/gitea
new file mode 100644
index 0000000000..0cde38a6bd
--- /dev/null
+++ b/contrib/init/debian/gitea
@@ -0,0 +1,86 @@
+#!/bin/sh
+### BEGIN INIT INFO
+# Provides: gitea
+# Required-Start: $syslog $network
+# Required-Stop: $syslog
+# Default-Start: 2 3 4 5
+# Default-Stop: 0 1 6
+# Short-Description: A self-hosted Git service written in Go.
+# Description: A self-hosted Git service written in Go.
+### END INIT INFO
+
+# Author: Danny Boisvert
+
+# Do NOT "set -e"
+
+# PATH should only include /usr/* if it runs after the mountnfs.sh script
+PATH=/sbin:/usr/sbin:/bin:/usr/bin
+DESC="Go Git Service"
+NAME=gitea
+SERVICEVERBOSE=yes
+PIDFILE=/var/run/$NAME.pid
+SCRIPTNAME=/etc/init.d/$NAME
+WORKINGDIR=/home/git/gitea
+DAEMON=$WORKINGDIR/$NAME
+DAEMON_ARGS="web"
+USER=git
+USERBIND="setcap cap_net_bind_service=+ep"
+STOP_SCHEDULE="${STOP_SCHEDULE:-QUIT/5/TERM/1/KILL/5}"
+
+# Read configuration variable file if it is present
+[ -r /etc/default/$NAME ] && . /etc/default/$NAME
+
+# Exit if the package is not installed
+[ -x "$DAEMON" ] || exit 0
+
+do_start()
+{
+ $USERBIND $DAEMON
+ sh -c "USER=$USER start-stop-daemon --start --quiet --pidfile $PIDFILE --make-pidfile \\
+ --background --chdir $WORKINGDIR --chuid $USER \\
+ --exec $DAEMON -- $DAEMON_ARGS"
+}
+
+do_stop()
+{
+ start-stop-daemon --stop --quiet --retry=$STOP_SCHEDULE --pidfile $PIDFILE --name $NAME --oknodo
+ rm -f $PIDFILE
+}
+
+do_status()
+{
+ if [ -f $PIDFILE ]; then
+ if kill -0 $(cat "$PIDFILE"); then
+ echo "$NAME is running, PID is $(cat $PIDFILE)"
+ else
+ echo "$NAME process is dead, but pidfile exists"
+ fi
+ else
+ echo "$NAME is not running"
+ fi
+}
+
+case "$1" in
+ start)
+ echo "Starting $DESC" "$NAME"
+ do_start
+ ;;
+ stop)
+ echo "Stopping $DESC" "$NAME"
+ do_stop
+ ;;
+ status)
+ do_status
+ ;;
+ restart)
+ echo "Restarting $DESC" "$NAME"
+ do_stop
+ do_start
+ ;;
+ *)
+ echo "Usage: $SCRIPTNAME {start|stop|status|restart}" >&2
+ exit 2
+ ;;
+esac
+
+exit 0
diff --git a/contrib/init/freebsd/gitea b/contrib/init/freebsd/gitea
new file mode 100644
index 0000000000..898606f35f
--- /dev/null
+++ b/contrib/init/freebsd/gitea
@@ -0,0 +1,47 @@
+#!/bin/sh
+#
+# $FreeBSD$
+#
+# PROVIDE: gitea
+# REQUIRE: NETWORKING SYSLOG
+# KEYWORD: shutdown
+#
+# Add the following lines to /etc/rc.conf to enable gitea:
+#
+#gitea_enable="YES"
+
+. /etc/rc.subr
+
+name="gitea"
+rcvar="gitea_enable"
+
+load_rc_config $name
+
+: ${gitea_user:="git"}
+: ${gitea_enable:="NO"}
+: ${gitea_directory:="/home/git"}
+
+command="${gitea_directory}/gitea web"
+procname="$(echo $command |cut -d' ' -f1)"
+
+pidfile="${gitea_directory}/${name}.pid"
+
+start_cmd="${name}_start"
+stop_cmd="${name}_stop"
+
+gitea_start() {
+ cd ${gitea_directory}
+ export USER=${gitea_user}
+ export HOME=/usr/home/${gitea_user}
+ /usr/sbin/daemon -f -u ${gitea_user} -p ${pidfile} $command
+}
+
+gitea_stop() {
+ if [ ! -f $pidfile ]; then
+ echo "GITEA PID File not found. Maybe GITEA is not running?"
+ else
+ kill $(cat $pidfile)
+ fi
+}
+
+run_rc_command "$1"
diff --git a/contrib/init/gentoo/gitea b/contrib/init/gentoo/gitea
new file mode 100644
index 0000000000..d8c150d417
--- /dev/null
+++ b/contrib/init/gentoo/gitea
@@ -0,0 +1,15 @@
+#!/sbin/openrc-run
+
+DIR=/home/git/gitea
+USER=git
+
+start_stop_daemon_args="--user ${USER} --chdir ${DIR}"
+command="${DIR}/gitea"
+command_args="web"
+command_background=yes
+pidfile=/var/run/gitea.pid
+
+depend()
+{
+ need net
+}
diff --git a/contrib/init/openbsd/gitea b/contrib/init/openbsd/gitea
new file mode 100755
index 0000000000..c43190b558
--- /dev/null
+++ b/contrib/init/openbsd/gitea
@@ -0,0 +1,19 @@
+#!/bin/sh
+#
+# $OpenBSD$
+
+daemon="/home/git/gitea/gitea"
+daemon_user="git"
+daemon_flags="web"
+
+gitea_directory="/home/git/gitea"
+
+rc_bg=YES
+
+. /etc/rc.d/rc.subr
+
+rc_start() {
+ ${rcexec} "cd ${gitea_directory}; ${daemon} ${daemon_flags} ${_bg}"
+}
+
+rc_cmd $1
diff --git a/contrib/init/suse/gitea b/contrib/init/suse/gitea
new file mode 100644
index 0000000000..77fb6689cf
--- /dev/null
+++ b/contrib/init/suse/gitea
@@ -0,0 +1,115 @@
+#!/bin/sh
+#
+# /etc/init.d/gitea
+#
+# Runs the Gitea Git with a cup of tea.
+#
+
+### BEGIN INIT INFO
+# Provides: gitea
+# Required-Start: $remote_fs
+# Required-Stop: $remote_fs
+# Default-Start: 2 3 4 5
+# Default-Stop: 0 1 6
+# Short-Description: Start gitea at boot time.
+# Description: Control gitea.
+### END INIT INFO
+
+# Default values
+
+NAME=gitea
+GITEA_HOME=/home/git/gitea
+GITEA_PATH=${GITEA_HOME}/$NAME
+GITEA_USER=git
+SERVICENAME="Git - with a cup of tea"
+LOCKFILE=/var/lock/subsys/gitea
+LOGPATH=${GITEA_HOME}/log
+LOGFILE=${LOGPATH}/error.log
+# gitea creates its own gitea.log from stdout
+RETVAL=0
+
+# Read configuration from /etc/sysconfig/gitea to override defaults
+[ -r /etc/sysconfig/$NAME ] && . /etc/sysconfig/$NAME
+
+# Don't do anything if nothing is installed
+test -x ${GITEA_PATH} || { echo "$NAME not installed";
+ if [ "$1" = "stop" ]; then exit 0;
+ else exit 5; fi; }
+
+# exit if logpath dir is not created.
+test -r ${LOGPATH} || { echo "$LOGPATH not existing";
+ if [ "$1" = "stop" ]; then exit 0;
+ else exit 6; fi; }
+
+# Source function library.
+. /etc/rc.status
+
+# Reset status of this service
+rc_reset
+
+
+case "$1" in
+ start)
+ echo -n "Starting ${SERVICENAME} "
+
+ # As we can't use startproc, we have to check ourselves if the service is already running
+ /sbin/checkproc ${GITEA_PATH}
+ if [ $? -eq 0 ]; then
+ # return skipped as service is already running
+ (exit 5)
+ else
+ su - ${GITEA_USER} -c "USER=${GITEA_USER} ${GITEA_PATH} web 2>&1 >>${LOGFILE} &"
+ fi
+
+ # Remember status and be verbose
+ rc_status -v
+ ;;
+
+ stop)
+ echo -n "Shutting down ${SERVICENAME} "
+
+ ## Stop daemon with killproc(8) and if this fails
+ ## killproc sets the return value according to LSB.
+ /sbin/killproc ${GITEA_PATH}
+
+ # Remember status and be verbose
+ rc_status -v
+ ;;
+
+ restart)
+ ## Stop the service and regardless of whether it was
+ ## running or not, start it again.
+ $0 stop
+ $0 start
+
+ # Remember status and be quiet
+ rc_status
+ ;;
+
+ status)
+ echo -n "Checking for ${SERVICENAME} "
+ ## Check status with checkproc(8), if process is running
+ ## checkproc will return with exit status 0.
+
+ # Return value is slightly different for the status command:
+ # 0 - service up and running
+ # 1 - service dead, but /var/run/ pid file exists
+ # 2 - service dead, but /var/lock/ lock file exists
+ # 3 - service not running (unused)
+ # 4 - service status unknown :-(
+ # 5--199 reserved (5--99 LSB, 100--149 distro, 150--199 appl.)
+
+ # NOTE: checkproc returns LSB compliant status values.
+ /sbin/checkproc ${GITEA_PATH}
+ # NOTE: rc_status knows that we called this init script with
+ # "status" option and adapts its messages accordingly.
+ rc_status -v
+ ;;
+
+ *)
+ echo "Usage: $0 {start|stop|status|restart}"
+ exit 1
+ ;;
+
+esac
+rc_exit
diff --git a/contrib/launchd/io.gitea.web.plist b/contrib/launchd/io.gitea.web.plist
new file mode 100644
index 0000000000..43ec612b07
--- /dev/null
+++ b/contrib/launchd/io.gitea.web.plist
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+ <dict>
+ <key>Label</key>
+ <string>io.gitea.web</string>
+ <!-- assumes Gitea is running under 'git' account -->
+ <!-- modify below to reflect your settings -->
+ <key>UserName</key>
+ <string>git</string>
+ <key>GroupName</key>
+ <string>git</string>
+ <key>ProgramArguments</key>
+ <array>
+ <!-- assumes Gitea is installed in /Users/git/gitea -->
+ <!-- modify below to reflect your settings -->
+ <string>/Users/git/gitea/gitea</string>
+ <string>web</string>
+ </array>
+ <key>RunAtLoad</key>
+ <true/>
+ <key>KeepAlive</key>
+ <true/>
+ <!-- assumes Gitea is installed in /Users/git/gitea -->
+ <!-- modify below to reflect your settings -->
+ <key>WorkingDirectory</key>
+ <string>/Users/git/gitea/</string>
+ <key>StandardOutPath</key>
+ <string>/Users/git/gitea/log/stdout.log</string>
+ <key>StandardErrorPath</key>
+ <string>/Users/git/gitea/log/stderr.log</string>
+ <!-- default 256 is too low for Gitea needs using parallel pipes -->
+ <key>SoftResourceLimits</key>
+ <dict>
+ <key>NumberOfFiles</key>
+ <integer>8192</integer>
+ </dict>
+ </dict>
+</plist>
diff --git a/contrib/migrate/gogs_migrate.sh b/contrib/migrate/gogs_migrate.sh
new file mode 100755
index 0000000000..e9bb5aa02e
--- /dev/null
+++ b/contrib/migrate/gogs_migrate.sh
@@ -0,0 +1,206 @@
+#!/bin/bash
+
+gitea_version=1.0.1
+tested_gogs_version="0.9.114.1227"
+gogs_binary=gogs
+gitea_binary=gitea
+download_gitea=true
+gitea_path=
+
+function usage() {
+ echo "Optional parameters: [-b Gitea binary] [-i Gitea install dir] [-o gogs binary] [-h help]";
+ exit 1;
+}
+
+while getopts ":b::i:o:h:" opt; do
+ case $opt in
+ b)
+ gitea_binary=${OPTARG}
+ download_gitea=false
+ ;;
+ i)
+ gitea_path=${OPTARG}
+ ;;
+ o)
+ gogs_binary=${OPTARG}
+ ;;
+ h)
+ usage
+ ;;
+ \?)
+ echo -e "Invalid option: -$OPTARG"
+ exit 1
+ ;;
+ :)
+ usage
+ exit 1
+ ;;
+ esac
+done
+
+function exitOnError() {
+ if [ "$?" != "0" ]; then
+ echo -e $1
+ exit 1
+ fi
+}
+
+function checkBinary() {
+ if [ ! -f $1 ]; then
+ echo "Unable to find $1"
+ exit 1
+ fi
+}
+
+function continueYN(){
+ while true; do
+ echo -e "$1 Yes or No"
+ read yn
+ case $yn in
+ [Yy]* ) break;;
+ [Nn]* ) exit 1;;
+ * ) echo "Please answer yes or no.";;
+ esac
+ done
+}
+
+########## Binary checks
+if pidof "$gogs_binary" >/dev/null; then
+ echo "Please stop gogs before migrating to Gitea"
+ exit 1
+fi
+
+checkBinary "$gogs_binary"
+
+if [ ! -x "$gogs_binary" ]; then
+ echo "Please make sure that you are running this script as the gogs user"
+ exit 1
+fi
+
+########## Version check
+gogs_version=$(./$gogs_binary --version)
+original_IFS=$IFS
+IFS="." && current_version=(${gogs_version#"Gogs version "}) && minimal_version=($tested_gogs_version)
+IFS=$original_IFS
+
+count=0
+for i in "${current_version[@]}"
+do
+ if [ $i -gt ${minimal_version[$count]} ]; then
+ echo -e "!!!--WARNING--!!!\nYour $gogs_version is newer than the tested Gogs version $tested_gogs_version\nUse this script on your own risk\n!!!--WARNING--!!!"
+ break
+ fi
+ let count+=1
+done
+
+########## Disclaimer
+continueYN "This migration script creates a backup before it starts with the actual migration
+If something goes wrong you could always resotre this backup.
+The backups are stored into your gogs folder in gogs-dump-[timestamp].zip file
+
+Migrating from gogs to gitea, are you sure?"
+
+########## gogs dump
+echo "Creating a backup of gogs, this could take a while..."
+./"$gogs_binary" dump
+exitOnError "Failed to create a gogs dump"
+
+########## Create Gitea folder
+if [ -z "$gitea_path" ]; then
+ echo "Where do you want to install Gitea?"
+ read gitea_path
+fi
+
+if [ ! -d "$gitea_path" ]; then
+ mkdir -p "$gitea_path"
+ exitOnError
+fi
+
+if [ "$(ls -A $gitea_path)" ]; then
+ continueYN "!!!--WARNING--!!!\nDirectory $gitea_path is not empty, do you want to continue?"
+fi
+
+
+########## Download Gitea
+if [ $download_gitea == true ]; then
+
+ ########## Detect os
+ case "$OSTYPE" in
+ darwin*) platform="darwin-10.6";;
+ linux*) platform="linux" ;;
+ freebsd*) platform="bsd" ;;
+ netbsd*) platform="bsd" ;;
+ openbsd*) platform="bsd" ;;
+ *) echo "Unsupported os: $OSTYPE\n Please download/compile your own binary and run this script with the -b option" exit 1;;
+ esac
+
+ arch=""
+ bits=""
+ if [[ "$platform" == "linux" ]] || [[ "$platform" == "bsd" ]]; then
+ arch="$(uname -m | sed -e 's/arm\(.*\)/arm-\1/' -e s/aarch64.*/arm64/)"
+ fi
+
+ if [[ "$platform" == "bsd" ]] && [[ "$arch" != "arm"* ]]; then
+ echo "Currently Gitea only supports arm prebuilt binarys on bsd"
+ exit 1
+ fi
+
+ if [[ "$arch" != "arm"* ]] && [[ "$arch" != "mips"* ]]; then
+ arch=""
+ case "$(getconf LONG_BIT)" in
+ 64*) bits="amd64";;
+ 32*) bits="386" ;;
+ esac
+ fi
+
+ ########## Wget Gitea
+ echo "Downloading Gitea"
+ file="gitea-$gitea_version-$platform-$arch$bits"
+ url="https://dl.gitea.io/gitea/$gitea_version/$file"
+ wget "$url" -P "$gitea_path"
+ exitOnError "Failed to download $url"
+
+ wget "$url.sha256" -P "$gitea_path"
+ exitOnError "Failed to Gitea checksum $url.sha256"
+
+ echo "Comparing checksums"
+ gogs_dir=$(pwd)
+ cd "$gitea_path"
+
+ sha256sum -c "$file.sha256"
+ exitOnError "Downloaded Gitea checksums do not match"
+
+ rm "$file.sha256"
+ mv "$file" gitea
+ cd "$gogs_dir"
+
+else
+ checkBinary "$gitea_binary"
+ if [ "$gitea_binary" != "$gitea_path/gitea" ];then
+ cp "$gitea_binary" "$gitea_path/gitea"
+ fi
+fi
+
+########## Copy gogs data to Gitea folder
+echo "Copying gogs data to Gitea, this could take a while..."
+cp -R custom "$gitea_path"
+cp -R data "$gitea_path"
+#cp -R conf "$gitea_path"
+
+########## Moving & deleting old files
+#mv $gitea_path/conf $gitea_path/options
+cd "$gitea_path"
+mv "custom/conf/app.ini" "custom/conf/gogs_app.ini"
+url="https://raw.githubusercontent.com/go-gitea/gitea/v$gitea_version/conf/app.ini"
+wget "$url" -P "custom/conf/"
+exitOnError "Unable to download Gitea app.ini"
+rm -f conf/README.md
+
+echo -e "Migration is almost complete, you only need to merge custom/conf/gogs_app.ini into custom/conf/app.ini"
+continueYN "Do you want to start Gitea?"
+
+########## Starting Gitea
+echo "Starting Gitea"
+chmod +x gitea
+./gitea web
+exitOnError "Failed to start Gitea" \ No newline at end of file
diff --git a/contrib/mysql.sql b/contrib/mysql.sql
new file mode 100644
index 0000000000..aad8beddfa
--- /dev/null
+++ b/contrib/mysql.sql
@@ -0,0 +1,2 @@
+DROP DATABASE IF EXISTS gitea;
+CREATE DATABASE IF NOT EXISTS gitea CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
diff --git a/contrib/supervisor/gitea b/contrib/supervisor/gitea
new file mode 100644
index 0000000000..a8a908d50b
--- /dev/null
+++ b/contrib/supervisor/gitea
@@ -0,0 +1,16 @@
+[program:gitea]
+directory=/home/git/go/src/github.com/go-gitea/gitea/
+command=/home/git/go/src/github.com/go-gitea/gitea/gitea web
+autostart=true
+autorestart=true
+startsecs=10
+stdout_logfile=/var/log/gitea/stdout.log
+stdout_logfile_maxbytes=1MB
+stdout_logfile_backups=10
+stdout_capture_maxbytes=1MB
+stderr_logfile=/var/log/gitea/stderr.log
+stderr_logfile_maxbytes=1MB
+stderr_logfile_backups=10
+stderr_capture_maxbytes=1MB
+user = git
+environment = HOME="/home/git", USER="git" \ No newline at end of file
diff --git a/contrib/systemd/gitea.service b/contrib/systemd/gitea.service
new file mode 100644
index 0000000000..758f1590f1
--- /dev/null
+++ b/contrib/systemd/gitea.service
@@ -0,0 +1,26 @@
+[Unit]
+Description=Gitea (Git with a cup of tea)
+After=syslog.target
+After=network.target
+#After=mysqld.service
+#After=postgresql.service
+#After=memcached.service
+#After=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/gitea
+ExecStart=/home/git/gitea/gitea web
+Restart=always
+Environment=USER=git HOME=/home/git
+
+[Install]
+WantedBy=multi-user.target
diff --git a/contrib/windows/install-as-service.bat b/contrib/windows/install-as-service.bat
new file mode 100644
index 0000000000..4a513b7dcb
--- /dev/null
+++ b/contrib/windows/install-as-service.bat
@@ -0,0 +1,25 @@
+@ECHO off
+
+:: This script relies on nssm.exe to work.
+:: Please, download it and make it available on the system path,
+:: or copy it to the gogs path.
+:: https://nssm.cc/download
+:: This script itself should run in the gogs path, too.
+:: In case of startup failure, please read carefully the log file.
+:: Make sure Gitea work running manually with "gitea web" before running
+:: this script.
+:: And, please, read carefully the installation docs first:
+:: https://gogs.io/docs/installation
+:: To unistall the service, run "nssm remove gogs" and restart Windows.
+
+:: Set the folder where you extracted Gitea. Omit the last slash.
+SET gogspath=C:\gogs
+
+nssm install gogs "%gogspath%\gogs.exe"
+nssm set gogs AppParameters "web"
+nssm set gogs Description "A painless self-hosted Git service."
+nssm set gogs DisplayName "Gitea - Git with a cup of tea"
+nssm set gogs Start SERVICE_DELAYED_AUTO_START
+nssm set gogs AppStdout "%gogspath%\gogs.log"
+nssm start gogs
+pause