3 # creates a new apache website for a specified domain.
5 # auto-find the scripts, since we might want to run this as sudo.
6 export WORKDIR="$( \cd "$(\dirname "$0")" && /bin/pwd )" # obtain the script's working directory.
7 source "$WORKDIR/../core/launch_feisty_meow.sh"
9 # some convenient defaults for our current usage.
11 BASE_PATH="$HOME/apps"
12 STORAGE_SUFFIX="/public"
14 # this function writes out the new configuration file for the site.
15 function write_apache_config()
17 local appname="$1"; shift
18 local sitename="$1"; shift
19 local site_config="/etc/apache2/sites-available/${sitename}.conf"
21 # check if config file already exists and bail if so.
22 if [ -f "$site_config" ]; then
23 echo "The apache configuration file already exists at:"
25 echo "Please remove this file before proceeding, if it is junk. For example:"
26 echo " sudo rm $site_config"
30 echo "Creating a new apache2 site for $sitename with config file:"
33 # path where site gets checked out, in some arcane manner, and which happens to be
34 # above the path where we put webroot (in the storage suffix, if defined).
35 local path_above="${BASE_PATH}/${appname}"
36 # no slash between appname and suffix, in case suffix is empty.
37 local full_path="${BASE_PATH}/${appname}${STORAGE_SUFFIX}"
38 #echo really full path is $full_path
40 #hmmm: the code below is just getting bigger. it would be nice to create the chunks of permission stuff
41 # via iteration rather than hardcoding.
44 # we have to enable some directory access through the user's folders.
45 # this is probably going to end up repeated in multiple apache files, but
46 # hopefully that's not a problem.
47 #hmmm: fix above note if it's not a problem.
50 # set up the user's web folder as an apache user web directory.
52 #above didn't help either.
55 #all of below might be borked. trying different approach above.
56 # set permissions on the root folders.
58 ### Options -ExecCGI +Indexes +FollowSymLinks +Includes
62 #### set permissions on the root of the home folders.
63 ###<Directory \"/home\">
64 ### Options -ExecCGI +Indexes +FollowSymLinks +Includes
68 #### set permissions on the user's home folder.
69 ###<Directory \"$HOME\">
70 ### Options -ExecCGI +Indexes +FollowSymLinks +Includes
74 #### set permissions on the user's storage folder for all apps.
75 ###<Directory \"$BASE_PATH\">
76 ### Options +ExecCGI +Indexes +FollowSymLinks +Includes +MultiViews
80 #### set permissions on the actual app folder.
81 ###<Directory \"$path_above\">
82 ### Options +ExecCGI +Indexes +FollowSymLinks +Includes +MultiViews
87 # set permissions on the actual app folder.
88 <Directory \"$full_path\">
89 Options +ExecCGI +Indexes +FollowSymLinks +Includes +MultiViews
96 ServerName ${sitename}
97 # ServerAlias ${sitename} *.${sitename}
98 DocumentRoot ${full_path}
99 ErrorLog \${APACHE_LOG_DIR}/${sitename}-error.log
100 CustomLog \${APACHE_LOG_DIR}/${sitename}-access.log combined
101 Include /etc/apache2/conf-library/basic-options.conf
102 Include /etc/apache2/conf-library/rewrite-enabling.conf
107 # turns on the config file we create above for apache.
108 function enable_site()
110 local sitename="$1"; shift
111 local site_config="/etc/apache2/sites-available/${sitename}.conf"
113 outfile="$TMP/apacheout.$RANDOM"
114 a2ensite "$(basename $site_config)" &>$outfile
115 if [ $? -ne 0 ]; then
116 # an error happened, so we show the command's output at least.
119 echo "There was a problem enabling the apache config file in:"
121 echo "Please consult the apache error logs for more details."
127 # restarts the apache2 service.
128 function restart_apache()
130 service apache2 restart
131 if [ $? -ne 0 ]; then
132 echo "There was a problem restarting the apache2 service."
133 echo "Please consult the apache error logs for more details."
138 # chown folder to group www-data. can be done without setting a user, right?
140 # sets up the serverpilot storage location for a user hosted web site.
141 function maybe_create_site_storage()
143 local our_app="$1"; shift
144 # make sure the base path for storage of all the apps for this user exists.
145 local full_path="$BASE_PATH/$our_app"
146 if [ ! -d "$full_path" ]; then
148 check_result "The app storage path could not be created.\n Path in question is: $full_path"
151 # now give the web server some access to the folder. this is crucial since the folders
152 # can be hosted in any user folder, and the group permissions will usually be only for the user.
153 chown -R $(logname):www-data "$BASE_PATH"
154 check_result "Failed to set www-data as the owner on the path: $full_path"
155 # note that web serving will also hose up unless the path to the folder is writable. so we walk backwards
156 # and make sure group access is available.
157 local chow_path="$full_path"
158 while [[ $chow_path != $HOME ]]; do
159 #echo chow path is now $chow_path
160 chmod -R g+rx "$chow_path"
161 check_result "Failed to add group permissions for www-data on the path: $chow_path"
162 # reassert the user's ownership of any directories we might have just created.
163 chown $(logname) "$chow_path"
164 check_result "changing ownership to user failed on the path: $chow_path"
165 chow_path="$(dirname "$chow_path")"
169 # main body of script.
171 if (( $EUID != 0 )); then
172 echo "This script must be run as root or sudo."
179 if [ -z "$appname" -o -z "$site" ]; then
180 echo "This script needs to know (1) the appname (application name) for the new"
181 echo "site and (2) the DNS name for the apache virtual host."
182 echo "The appname should work as a file-system compatible folder name."
186 maybe_create_site_storage "$appname"
187 write_apache_config "$appname" "$site"