How to get auto-deploy working from Gitlab to your Digital Ocean (DO) server. Install https://github.com/olipo186/Git-Auto-Deploy (via apt-get): ``` sudo apt-get install software-properties-common sudo add-apt-repository ppa:olipo186/git-auto-deploy sudo apt-get update sudo apt-get install git-auto-deploy ``` Change config file to match your setup: ``` nano /etc/git-auto-deploy.conf.json ``` Here's my config file: ``` { "logfilepath": "/var/log/git-auto-deploy.log", "host": "0.0.0.0", "port": 8016, "global_deploy": [ "echo Deploy started!", "echo Deploy completed!" ], "repositories": [ { "url": "https://gitlab.com/username/domain.com.git", "branch": "master", "remote": "origin", "path": "/site", "deploy": "echo deploying", "secret-token": "secretstuff" } ] } ``` You need to make sure you have the port you specify - in my case 8016 - allowed by the firewall: ``` sudo ufw allow 8016/tcp ``` Time to start the `git-auto-deploy` service and test the port. ``` service git-auto-deploy start service git-auto-deploy status // * /usr/bin/git-auto-deploy is running ``` From another machine, check if the port is receiving connections: ``` $ telnet domain.com 8016 Trying XXX.XXX.XX.XX... Connected to domain.com. Escape character is '^]'. ``` Now you can add it as a hook in Gitlab. As per git-auto-deploy docs, 'Go to your repository -> Settings -> Web hooks. In "URL", enter your hostname and port (http://domain.com:8016). Hit "Add Web Hook"''. The secret token must be the same as in `git-auto-deploy.conf.json` above. I left "Enable SSL verification" unchecked. After you add it, click the 'test' button to make sure it returns HTTP 200. On DO server, there will be a new user, git-auto-deploy and group with the same name. You need to generate an SSH key for this user _on the server_ in their home directory, under .ssh(`cd ~/.ssh`): ``` ssh-keygen -t rsa -C "git_auto_deploy_on_digital_ocean" -b 4096 ``` Add the new public key (contents of the `~/.ssh/id_rsa.pub`) to Gitlab, click on user icon in the top right, then user settings -> SSH keys Test it on the server: ``` git init git remote add origin https://gitlab.com/username/domain.com.git git fetch ``` If the fetch completes without error then your SSH key works. Here's the directory structure to keep all the service stuff (.git directory, package.json, etc.) outside of the publicly-accessible folder: ``` |--site |--.git |--package.json |--public_html |--assets |--index.html ``` You're ready to test it out. Put a tail on the log file: ``` tail -f /var/log/git-auto-deploy.log ``` On your machine, commit a test file and push: ``` touch test.html git add test.html git commit -m 'test' git push ``` Inside the logfile, you should see something like this: ``` [INFO ] Updating repository /site [INFO ] HEAD is now at 7d1153a updated gulp to reflect directory change [INFO ] Repository /site successfully updated [INFO ] Executing 3 deploy commands [INFO ] Deploy started! [INFO ] deploying [INFO ] Deploy completed! [INFO ] 3 commands executed with status; [0, 0, 0] [DEBUG] Successfully released lock: /site/status_running [INFO ] Done ``` If you see an error like below, it means your folder/file permissions are incorrect. Make sure the `git-auto-deploy` user can write to the folder. I just made this user owner of the `public` folder. ``` [ERROR] error: cannot open .git/FETCH_HEAD: Permission denied ``` If you see the below, try to run a `git pull` inside the repo on the server before you test pushing to Gitlab from your machine. ``` [ERROR] fatal: Not a git repository (or any of the parent directories): .git ``` On the server, all the files from repo should now be present. Now every time you push to Gitlab, these changes will also be pushed to your DO server. Rejoice!