2021-02-28 14:17:18 +00:00
/ *
2021-03-01 14:41:43 +00:00
GoToSocial
Copyright ( C ) 2021 GoToSocial Authors admin @ gotosocial . org
2021-02-28 14:17:18 +00:00
2021-03-01 14:41:43 +00:00
This program is free software : you can redistribute it and / or modify
it under the terms of the GNU Affero General Public License as published by
the Free Software Foundation , either version 3 of the License , or
( at your option ) any later version .
2021-02-28 14:17:18 +00:00
2021-03-01 14:41:43 +00:00
This program is distributed in the hope that it will be useful ,
but WITHOUT ANY WARRANTY ; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
GNU Affero General Public License for more details .
2021-02-28 14:17:18 +00:00
2021-03-01 14:41:43 +00:00
You should have received a copy of the GNU Affero General Public License
along with this program . If not , see < http : //www.gnu.org/licenses/>.
2021-02-28 14:17:18 +00:00
* /
2021-02-27 21:57:50 +00:00
package main
import (
2021-03-04 13:38:18 +00:00
"fmt"
2021-03-02 21:52:31 +00:00
"os"
"github.com/sirupsen/logrus"
2021-04-01 18:46:45 +00:00
"github.com/superseriousbusiness/gotosocial/internal/action"
"github.com/superseriousbusiness/gotosocial/internal/config"
"github.com/superseriousbusiness/gotosocial/internal/db"
"github.com/superseriousbusiness/gotosocial/internal/gotosocial"
"github.com/superseriousbusiness/gotosocial/internal/log"
2021-03-03 10:28:28 +00:00
"github.com/urfave/cli/v2"
2021-02-27 21:57:50 +00:00
)
func main ( ) {
2021-03-04 13:38:18 +00:00
flagNames := config . GetFlagNames ( )
envNames := config . GetEnvNames ( )
2021-03-03 10:28:28 +00:00
app := & cli . App {
2021-03-03 20:15:20 +00:00
Usage : "a fediverse social media server" ,
2021-03-03 10:28:28 +00:00
Flags : [ ] cli . Flag {
2021-03-03 17:12:02 +00:00
// GENERAL FLAGS
2021-03-03 10:28:28 +00:00
& cli . StringFlag {
2021-03-03 17:12:02 +00:00
Name : flagNames . LogLevel ,
Usage : "Log level to run at: debug, info, warn, fatal" ,
Value : "info" ,
EnvVars : [ ] string { "GTS_LOG_LEVEL" } ,
2021-03-03 10:28:28 +00:00
} ,
& cli . StringFlag {
2021-03-03 17:12:02 +00:00
Name : flagNames . ApplicationName ,
Usage : "Name of the application, used in various places internally" ,
Value : "gotosocial" ,
EnvVars : [ ] string { envNames . ApplicationName } ,
Hidden : true ,
} ,
2021-03-03 20:15:20 +00:00
& cli . StringFlag {
Name : flagNames . ConfigPath ,
Usage : "Path to a yaml file containing gotosocial configuration. Values set in this file will be overwritten by values set as env vars or arguments" ,
Value : "" ,
EnvVars : [ ] string { envNames . ConfigPath } ,
} ,
2021-03-22 21:26:54 +00:00
& cli . StringFlag {
Name : flagNames . Host ,
Usage : "Hostname to use for the server (eg., example.org, gotosocial.whatever.com)" ,
Value : "localhost" ,
EnvVars : [ ] string { envNames . Host } ,
} ,
& cli . StringFlag {
Name : flagNames . Protocol ,
Usage : "Protocol to use for the REST api of the server (only use http for debugging and tests!)" ,
Value : "https" ,
EnvVars : [ ] string { envNames . Protocol } ,
} ,
2021-03-03 17:12:02 +00:00
// DATABASE FLAGS
& cli . StringFlag {
Name : flagNames . DbType ,
Usage : "Database type: eg., postgres" ,
Value : "postgres" ,
EnvVars : [ ] string { envNames . DbType } ,
} ,
& cli . StringFlag {
Name : flagNames . DbAddress ,
Usage : "Database ipv4 address or hostname" ,
Value : "localhost" ,
EnvVars : [ ] string { envNames . DbAddress } ,
} ,
& cli . IntFlag {
Name : flagNames . DbPort ,
Usage : "Database port" ,
Value : 5432 ,
EnvVars : [ ] string { envNames . DbPort } ,
} ,
& cli . StringFlag {
Name : flagNames . DbUser ,
Usage : "Database username" ,
Value : "postgres" ,
EnvVars : [ ] string { envNames . DbUser } ,
} ,
& cli . StringFlag {
2021-03-04 13:38:18 +00:00
Name : flagNames . DbPassword ,
Usage : "Database password" ,
EnvVars : [ ] string { envNames . DbPassword } ,
2021-03-03 17:12:02 +00:00
} ,
& cli . StringFlag {
Name : flagNames . DbDatabase ,
Usage : "Database name" ,
Value : "postgres" ,
EnvVars : [ ] string { envNames . DbDatabase } ,
2021-03-03 10:28:28 +00:00
} ,
2021-03-18 22:27:43 +00:00
// TEMPLATE FLAGS
& cli . StringFlag {
Name : flagNames . TemplateBaseDir ,
2021-04-01 18:46:45 +00:00
Usage : "Basedir for html templating files for rendering pages and composing emails." ,
2021-03-18 22:27:43 +00:00
Value : "./web/template/" ,
EnvVars : [ ] string { envNames . TemplateBaseDir } ,
} ,
2021-04-01 18:46:45 +00:00
// ACCOUNTS FLAGS
& cli . BoolFlag {
Name : flagNames . AccountsOpenRegistration ,
Usage : "Allow anyone to submit an account signup request. If false, server will be invite-only." ,
Value : true ,
EnvVars : [ ] string { envNames . AccountsOpenRegistration } ,
} ,
& cli . BoolFlag {
Name : flagNames . AccountsRequireApproval ,
Usage : "Do account signups require approval by an admin or moderator before user can log in? If false, new registrations will be automatically approved." ,
Value : true ,
EnvVars : [ ] string { envNames . AccountsRequireApproval } ,
} ,
// MEDIA FLAGS
& cli . IntFlag {
Name : flagNames . MediaMaxImageSize ,
Usage : "Max size of accepted images in bytes" ,
Value : 1048576 , // 1mb
EnvVars : [ ] string { envNames . MediaMaxImageSize } ,
} ,
& cli . IntFlag {
Name : flagNames . MediaMaxVideoSize ,
Usage : "Max size of accepted videos in bytes" ,
Value : 5242880 , // 5mb
EnvVars : [ ] string { envNames . MediaMaxVideoSize } ,
} ,
// STORAGE FLAGS
& cli . StringFlag {
Name : flagNames . StorageBackend ,
Usage : "Storage backend to use for media attachments" ,
Value : "local" ,
EnvVars : [ ] string { envNames . StorageBackend } ,
} ,
& cli . StringFlag {
Name : flagNames . StorageBasePath ,
Usage : "Full path to an already-created directory where gts should store/retrieve media files" ,
Value : "/opt/gotosocial" ,
EnvVars : [ ] string { envNames . StorageBasePath } ,
} ,
& cli . StringFlag {
Name : flagNames . StorageServeProtocol ,
Usage : "Protocol to use for serving media attachments (use https if storage is local)" ,
Value : "https" ,
EnvVars : [ ] string { envNames . StorageServeProtocol } ,
} ,
& cli . StringFlag {
Name : flagNames . StorageServeHost ,
Usage : "Hostname to serve media attachments from (use the same value as host if storage is local)" ,
Value : "localhost" ,
EnvVars : [ ] string { envNames . StorageServeHost } ,
} ,
& cli . StringFlag {
Name : flagNames . StorageServeBasePath ,
Usage : "Path to append to protocol and hostname to create the base path from which media files will be served (default will mostly be fine)" ,
Value : "/fileserver/media" ,
EnvVars : [ ] string { envNames . StorageServeBasePath } ,
} ,
2021-03-03 10:28:28 +00:00
} ,
Commands : [ ] * cli . Command {
{
Name : "server" ,
Usage : "gotosocial server-related tasks" ,
Subcommands : [ ] * cli . Command {
{
2021-03-04 13:38:18 +00:00
Name : "start" ,
Usage : "start the gotosocial server" ,
Action : func ( c * cli . Context ) error {
2021-03-09 16:03:40 +00:00
return runAction ( c , gotosocial . Run )
2021-03-04 13:38:18 +00:00
} ,
} ,
} ,
} ,
{
Name : "db" ,
Usage : "database-related tasks and utils" ,
Subcommands : [ ] * cli . Command {
{
Name : "init" ,
Usage : "initialize a database with the required schema for gotosocial; has no effect & is safe to run on an already-initialized db" ,
Action : func ( c * cli . Context ) error {
return runAction ( c , db . Initialize )
} ,
2021-03-03 10:28:28 +00:00
} ,
} ,
} ,
} ,
2021-03-02 21:52:31 +00:00
}
2021-03-03 10:28:28 +00:00
err := app . Run ( os . Args )
if err != nil {
logrus . Fatal ( err )
2021-03-02 21:52:31 +00:00
}
2021-02-27 21:57:50 +00:00
}
2021-03-04 13:38:18 +00:00
// runAction builds up the config and logger necessary for any
// gotosocial action, and then executes the action.
func runAction ( c * cli . Context , a action . GTSAction ) error {
// create a new *config.Config based on the config path provided...
2021-03-18 22:27:43 +00:00
conf , err := config . FromFile ( c . String ( config . GetFlagNames ( ) . ConfigPath ) )
2021-03-04 13:38:18 +00:00
if err != nil {
return fmt . Errorf ( "error creating config: %s" , err )
}
// ... and the flags set on the *cli.Context by urfave
2021-03-18 22:27:43 +00:00
conf . ParseCLIFlags ( c )
2021-03-04 13:38:18 +00:00
// create a logger with the log level, formatting, and output splitter already set
log , err := log . New ( conf . LogLevel )
if err != nil {
return fmt . Errorf ( "error creating logger: %s" , err )
}
return a ( c . Context , conf , log )
}