summaryrefslogtreecommitdiff
path: root/doc/install.sh
blob: 89691d54f3bcfff426678bcf244661fbaa974b84 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
#!/bin/bash

# NOTE: This script is still a work in progress

# This script is meant to automate the deployment of Szurubooru via Docker/Docker-Compose,
# and to automatically take the necessary steps to allow Szurubooru to run on ARM devices
# such as the Raspberry Pi.

###########################################[Notes]###########################################
# * Written and tested on Raspberry Pi 4 running Raspbian 10 (armv7), heavily based on a fork
#   by kaijuagenda for the Pi 3: https://github.com/kaijuagenda/szurubooru-rpi3
#
# * Modifies docker-compose.yml rather than relying on a static alternative file to hopefully
#   avoid the need for parallel maintenance of two files.
#############################################################################################

# Colorized flags for check status output
ERROR="[\e[31mERROR\e[0m]"
OK="[\e[32mOK\e[0m]"
NOTICE="[\e[33mNOTICE\e[0m]"

echo 'Welcome to Szurubooru.  This install script will ask you to set a few basic'\
     'config values, then get szurubooru up and running.'

echo "Checking a few things to ensure successful deployment..."

# Check to ensure Docker and Docker-Compose are both installed and usable via standard commands
if ! command -v docker &> /dev/null || ! command -v docker-compose &> /dev/null; then
    echo -e "${ERROR} Both Docker and Docker-Compose must already be installed to use this script."
    echo "        Please ensure both are installed and available using commands docker and"
    echo "        docker-compose, then run this script again."
    exit 1
else echo -e "${OK} Docker and Docker-Compose Installation verified"
fi

# Check to ensure the current user can access the Docker daemon
# https://github.com/rr-/szurubooru/pull/366#discussion_r541795141
if [[ "$(docker ps &> /dev/null | echo $?)" > 0 ]]; then
    echo -e "${ERROR} Unable to verify Docker daemon access!  Please ensure the current user is"
    echo "        authorized for Docker access."
    echo "        For more info, see the official Docker documentation at"
    echo "        https://docs.docker.com/engine/install/linux-postinstall/#manage-docker-as-a-non-root-user"
    exit 1
else echo "${OK} Docker Daemon accessible."
fi


########################################################################################
# Check CPU architectue and, if ARM (such as Raspberry Pi), modify docker-compose.yml
# https://github.com/rr-/szurubooru/wiki/ARM-and-Raspberry-Pi-Support-for-Docker-builds
# https://github.com/rr-/szurubooru/blob/master/docker-compose.yml
########################################################################################

if [[ "$(uname -m)" == 'a'* ]]; then
    echo -e "${NOTICE} ARM architecture detected.  Modfying docker-compose.yml for local build."
    # Modify docker-compose file to build locally instead of pulling from dockerhub
    sed -zi "s|image: szurubooru/server:latest|build:\n      context: ./server|; \
             s|image: szurubooru/client:latest|build:\n      context: ./client|" ./docker-compose.yml
fi


function server_config () {
    ################################################################################################################
    # Copy ./server/config.yaml.dist to ./server/config.yaml, then prompt the user to set the basic config settings
    # https://github.com/rr-/szurubooru/blob/master/doc/INSTALL.md
    ################################################################################################################

    cp server/config.yaml.dist server/config.yaml
    echo -e "\n===[General Settings]==="

    # Prompt for Secret, proposing a randomly generated 32-character alphanumeric value as a default.
    default_secret="$(tr -dc '[:alnum:]' < /dev/urandom | dd bs=4 count=8 2>/dev/null)"
    echo "Enter your Secret (Used to salt the users' password hashes and generate filenames for static content)"
    read -e -p "> " -i "$default_secret" SECRET
    sed -i "s|secret: change|secret: $SECRET|" ./server/config.yaml

    # Other useful (but less important) settings
    echo "Enter the desired name for your server. (Shown in the website title and on the front page)"
    read -e -p "> " -i "szurubooru" SERVERNAME
    echo "Enter the full url to the homepage of this szurubooru site, with no trailing slash."
    read -e -p "> " URL
    sed -i "s|name: szurubooru|name: $SERVERNAME|;s|domain: |domain: $URL|" ./server/config.yaml

    # SMTP (email) settings
    echo -e "\n===[SMTP (Email) Settings]==="
    echo "If host name is left blank, the password reset feature will be disabled."
    echo "Enter your email server's host address."
    read -e -p "> " SMTP_HOST

    if [ -n "$SMTP_HOST" ]; then # Prompt for additional SMTP details and then update server/config.yaml if host was set
        echo "Enter the Port number for your SMTP server"; read -e -p "> " SMTP_PORT
        echo "Enter the UserName for your SMTP server"; read -e -p "> " SMTP_USER
        echo "Enter the Password for your SMTP server"; read -e -p -s "> " SMTP_PASS
        echo "Enter the 'From' address emails should show"; read -e -p "> " SMTP_FROM
        sed -i "s|host: |host: $SMTP_HOST|; \
                s|port: |port: $SMTP_PORT|; \
                s|user: |user: $SMTP_USER|; \
                s|pass: |pass: $SMTP_PASS|; \
                s|from: |from: $SMTP_FROM|" ./server/config.yaml
    else # Warn user that they should set a contact email if no smtp host is specified
        echo -e "${NOTICE} No SMTP host specified!  It is strongly recommended you set a contact email"
    echo "          in the next prompt for manual password reset requests."
    fi

    echo "Enter your server's primary contact email address."
    read -e -p "> " CONTACT_ADDR
    if [ -n "$CONTACT_ADDR" ]; then sed -i "s|contact_email: |contact_email: $CONTACT_ADDR |" ./server/config.yaml; fi
}

function set_env () {
    ############################################################################################################
    # Copy ./doc/example.env to ./.env, then prompt the user to set the basic config settings
    # https://github.com/rr-/szurubooru/blob/master/doc/INSTALL.md
    ############################################################################################################
    cp doc/example.env .env
    echo -e "\n===[Environmental Variables]==="
    echo "Enter your desired database username."; read -e -p "> " -i "szuru" DB_USER
    while true; do # Ensures the user sets a database password for security reasons.
    echo "Enter your desired database password. (Will not print to console)"; read -s -p "> " DB_PASS
        if [ -z $DB_PASS ]; then echo -e "\nERROR: You must set a password!"; else break; fi
    done
    echo ""
    echo "Enter the build info you'd like to display on the home screen."; read -e -p "> " -i "latest" BUILD_INFO
    echo "Enter the port # to expose the HTTP service to."
    echo "Set to 127.0.0.1:8080 if you wish to reverse proxy the docker's port."; read -e -p "> " -i "8080" PORT
    echo "Enter the URL base to run szurubooru under"; read -e -p "> " -i "/" BASE_URL
    echo "Enter the directory in which you wish to store image data."; read -e -p "> " -i "/var/local/szurubooru/data" MOUNT_DATA
    echo "Enter the directory in which you wish to store database files."; read -e -p "> " -i "/var/local/szurubooru/sql" MOUNT_SQL
    sed -i "s|POSTGRES_USER=szuru|POSTGRES_USER=$DB_USER|; \
            s|POSTGRES_PASSWORD=changeme|POSTGRES_PASSWORD=$DB_PASS|; \
            s|BUILD_INFO=latest|BUILD_INFO=$BUILD_INFO|; \
            s|PORT=8080|PORT=$PORT|; \
            s|BASE_URL=/|BASE_URL=$URL|; \
            s|MOUNT_DATA=/var/local/szurubooru/data|MOUNT_DATA=$MOUNT_DATA|; \
            s|MOUNT_SQL=/var/local/szurubooru/sql|MOUNT_SQL=$MOUNT_SQL|" .env
}

echo "Creating and setting up server configuration (server/config.yaml)..."
server_config # Configuration via ./server/config.yaml

echo -e "\nCreating and setting up environmental variables (.env)..."
set_env # Configuration via ./.env

echo -e "\nConfig is all done!  Now pulling Docker containers..."
docker-compose pull # Download containers

echo "Starting SQL container..."
docker-compose up -d sql # Start SQL first

echo "Waiting 30s to ensure the database is ready for connection..."
sleep 30 # Give the database time to become available

echo "Starting Server and Client containers..."
docker-compose up -d # Start remaining containers

# Ensure files can be uploaded by setting ownership of the /data/ mount point
puid=$(grep "PUID=" server/Dockerfile | sed "s/.*=//")
guid=$(grep "PGID=" server/Dockerfile | sed "s/.*=//")
mount=$(grep "MOUNT_DATA" .env | sed 's/MOUNT_DATA=//')
echo "Performing a quick ownership change of $mount to make sure images can be submitted..."
chown -R $puid:$guid "$mount"

echo "All done!  You should now be able to access Szurubooru using the port number you set."
exit 0