diff --git a/conf/app.ini b/conf/app.ini
index 4f76db4dee..33afae97f2 100644
--- a/conf/app.ini
+++ b/conf/app.ini
@@ -18,6 +18,7 @@ DOMAIN = localhost
 ROOT_URL = %(PROTOCOL)s://%(DOMAIN)s:%(HTTP_PORT)s/
 HTTP_ADDR = 
 HTTP_PORT = 3000
+SSH_PORT = 22
 ; Disable CDN even in "prod" mode
 OFFLINE_MODE = false
 DISABLE_ROUTER_LOG = false
diff --git a/modules/base/conf.go b/modules/base/conf.go
index 88085172c2..99bac9006f 100644
--- a/modules/base/conf.go
+++ b/modules/base/conf.go
@@ -49,6 +49,7 @@ var (
 	AppName          string
 	AppLogo          string
 	AppUrl           string
+	SshPort          int
 	OfflineMode      bool
 	DisableRouterLog bool
 	ProdMode         bool
@@ -330,6 +331,7 @@ func NewConfigContext() {
 	AppLogo = Cfg.MustValue("", "APP_LOGO", "img/favicon.png")
 	AppUrl = Cfg.MustValue("server", "ROOT_URL")
 	Domain = Cfg.MustValue("server", "DOMAIN")
+	SshPort = Cfg.MustInt("server", "SSH_PORT", 22)
 	OfflineMode = Cfg.MustBool("server", "OFFLINE_MODE", false)
 	DisableRouterLog = Cfg.MustBool("server", "DISABLE_ROUTER_LOG", false)
 	SecretKey = Cfg.MustValue("security", "SECRET_KEY")
diff --git a/modules/middleware/repo.go b/modules/middleware/repo.go
index 4a10edf881..1516482167 100644
--- a/modules/middleware/repo.go
+++ b/modules/middleware/repo.go
@@ -153,7 +153,11 @@ func RepoAssignment(redirect bool, args ...bool) martini.Handler {
 		ctx.Data["IsRepositoryOwner"] = ctx.Repo.IsOwner
 		ctx.Data["BranchName"] = ""
 
-		ctx.Repo.CloneLink.SSH = fmt.Sprintf("%s@%s:%s/%s.git", base.RunUser, base.Domain, user.LowerName, repo.LowerName)
+		sshPrefix := ""
+		if base.SshPort != 22 {
+			sshPrefix = "ssh://"
+		}
+		ctx.Repo.CloneLink.SSH = fmt.Sprintf("%s%s@%s:%s/%s.git", sshPrefix, base.RunUser, base.Domain, user.LowerName, repo.LowerName)
 		ctx.Repo.CloneLink.HTTPS = fmt.Sprintf("%s%s/%s.git", base.AppUrl, user.LowerName, repo.LowerName)
 		ctx.Data["CloneLink"] = ctx.Repo.CloneLink