Tag Archives: virtualmin

Fixing proFTP overwrite problems in Virtualmin

For some reason, the proFTP configuration in Virtualmin (v3.88) was not allowing files to be overwritten, despite the configuration in /etc/proftpd/proftpd.conf as follows:

# Umask 022 is a good standard umask to prevent new files and dirs
# (second parm) from being group and world writable.
Umask 022  022
# Normally, we want files to be overwriteable.
AllowOverwrite on

# Uncomment this if you are using NIS or LDAP via NSS to retrieve passwords:
# PersistentPasswd off


To solve this, add the following to the bottom of the config file (/etc/proftpd/proftpd.conf):

        AllowOverwrite  on


Then restart proFTP:

service proftpd restart

Getting git to deploy your site in branch folders via post-receive

Aim:  get the site deployed like so; [webroot]/[branch_name]

I’m using this on our development server, so the devs can view all branches on it.

I first set our server up as described in this previous post on deploying with virtualmin.  Then use the following in hooks-receive:

#get the ref name
while read oldrev newrev ref
#remove ref path</h1>
branch=`basename $refbranch`
#add full path
#create directory if it doesn’t exist
if [ ! -d “$branchpath” ]; then
mkdir “$branchpath”
echo “Created new folder for branch $branch”
cd “$branchpath”

git –git-dir=[path_to_git_dir] –work-tree=”$branchpath” checkout -f “$branch”
git –git-dir=[path_to_git_dir] –work-tree=”$branchpath” clean -fd
echo “Updated files in $branch directory”

Once you’ve done that, you may want to add a file to the web root so people know what branches they can view.  I’m using the following very simple php script (index.php, in my webroot):


$dirs = scandir(‘.’);
$remove = array(‘.’,’..’,’.gitignore’,’.project’,’index.php’,’git’);
$html = ”;
foreach($dirs as $dir){
    $date = date(‘jS M Y’,filemtime($dir));
    $html .= ‘<a href=”/’ . $dir . ‘”>’ . $dir . ‘</a> – ‘ . $date . ‘<br />’;

<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN”
<title>Development site</title>

<p>Please choose your branch (branch name – last modified):<br />
<?php echo $html; ?>


Add to the $remove array any files/directories you do not want showing up.

Auto-deploy your Virtualmin website with git

Virtualmin’s non-standard implementation of git can be a little awkward to work with, primarily because git itself assumes too many things about the environment by default. However, there is a very easy way to auto-deploy your website from a virtualmin git repo to your virtualmin website root (public_html) using git hooks.

This assumes you have installed git onto your virtualmin server, and will be accessing the remote (virtualmin) repository over ssh (you can also use any protocol that works with git hooks; http doesn’t!)

  1. Create a new virtual server in virtualmin, and set up a repository for it
  2. On the virtualmin server (ssh into it, or whatever method you prefer), navigate to the git directory (/home/sitename/public_html/git/git.git/), and execute the following commands:
    git config core.bare false
    git config receive.denycurrentbranch ignore
  3. Then go to add the hook; go into the hooks directory, create a file called post-receive, and add the following:
    cd /home/sitename/public_html/
    git –git-dir=/home/sitename/public_html/git/reponame.git –work-tree=/home/sitename/public_html/ checkout -f
  4. Add execute permissions on the hook, and ensure the ownership is correct (www-data:sitename)
  5. And that’s it…get the url for your repo (something like sitename@siteurl:public_html/git/git.git), and set it up on your local copy of git, then create some files and push from local to remote and it should automatically deploy – by the way, you will need to use “git push origin master” the first time you push to the empty repo

I think this will just deploy the master branch, and I don’t think it will delete files that are deleted locally (not sure exactly how the checkout command works).

I’ll be adding another tutorial that incorporates branches and proper sync between the two.