├── data ├── Dockerfile └── README.md ├── ansible ├── newdroplet.yml ├── installwhatpanel.yml ├── README.md └── addswap.yml ├── mysqlsetup.sh ├── cptransfer.sh ├── backup ├── 20.mysql └── 90.dup ├── Dockerfile └── README.md /data/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM busybox 2 | VOLUME ["/var/lib/mysql","/var/www/","/data","/backup"] 3 | CMD ["/bin/sh"] 4 | -------------------------------------------------------------------------------- /ansible/newdroplet.yml: -------------------------------------------------------------------------------- 1 | --- 2 | - hosts: localhost 3 | tasks: 4 | - name: Create new DO Droplet 5 | digital_ocean: > 6 | state=present 7 | command=droplet 8 | name={{ doname }} 9 | size_id=66 10 | region_id=4 11 | image_id=4296335 12 | ssh_key_ids=160794 13 | 14 | -------------------------------------------------------------------------------- /mysqlsetup.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | VOLUME_HOME="/var/lib/mysql" 4 | 5 | if [[ ! -d $VOLUME_HOME/mysql ]]; then 6 | echo "=> An empty or uninitialized MySQL volume is detected in $VOLUME_HOME" 7 | echo "=> Installing MySQL ..." 8 | mysql_install_db > /dev/null 2>&1 9 | echo "=> Done!" 10 | else 11 | echo "=> Using an existing volume of MySQL" 12 | fi 13 | -------------------------------------------------------------------------------- /ansible/installwhatpanel.yml: -------------------------------------------------------------------------------- 1 | --- 2 | - hosts: all 3 | remote_user: root 4 | 5 | tasks: 6 | - name: setup python-pip 7 | apt: pkg=python-pip state=latest 8 | 9 | - name: setup docker-py 10 | command: pip install docker-py 11 | 12 | - name: run data container 13 | docker: image=paimpozhil/data name="{{ doname }}" tty=yes 14 | 15 | - name: run whatpanel container 16 | docker: image=paimpozhil/whatpanel volumes_from="{{ doname }}" ports=8000:8000,80:80,2222:22,443:443 17 | -------------------------------------------------------------------------------- /ansible/README.md: -------------------------------------------------------------------------------- 1 | WhatPanel setup with Ansible 2 | ============================ 3 | 4 | This is to make the easy whatpanel setup MUCH more easy and automated. 5 | 6 | ``` 7 | ## use this if you need to setup swap 8 | ansible-playbook [--ask-pass] addswap.yml -i [inventory] 9 | 10 | ## use this to install whatpanel on a server that has docker. 11 | ansible-playbook [--ask-pass] installwhatpanel.yml -i [inventory] 12 | 13 | ``` 14 | 15 | 16 | We will soon release a webgui that will do this so you dont have to touch terminals and commands at all. 17 | 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /cptransfer.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | echo "Dont use work in progress" 4 | echo "Fetching files via FTP" 5 | 6 | cphost=$1 7 | cpport=$2 8 | cpuser=$3 9 | cppass=$4 10 | transfertype=$5 11 | 12 | 13 | 14 | if [ "$cpport" == "" ] ; 15 | then 16 | cpport=22 17 | fi 18 | 19 | 20 | if ["$transfertype" == ""] ; 21 | then 22 | 23 | rsync -avz -e '"shpass -p '$cppass' ssh" $cpuser@$cphost:/home/$cpuser/public_html/ /var/www/ 24 | 25 | fi 26 | 27 | if ["$transfertype" == "lftp"] ; 28 | then 29 | 30 | lftp -e "set ftp:ssl-allow off;" ftp://$cpuser:$cppass@$cphost << EOF 31 | mirror --use-cache /public_html /var/www 32 | quit 0 33 | EOF 34 | 35 | fi 36 | 37 | 38 | 39 | echo " Trying to dump mysql output via Shell" 40 | sshpass -p '$cppass' ssh $cpuser@$cphost -p $cpport mysqldump -u$cpuser -p$cppass --all-databases > tmpsql.sql 41 | 42 | echo "inserting data into mysql database" 43 | mysql < tmpsql.sql 44 | 45 | echo "removing temp file" 46 | rm tmpsql.sql 47 | -------------------------------------------------------------------------------- /ansible/addswap.yml: -------------------------------------------------------------------------------- 1 | --- 2 | - hosts: all 3 | remote_user: root 4 | 5 | tasks: 6 | - name: Create swap space 7 | command: fallocate -l 4G /swapfile 8 | when: ansible_swaptotal_mb < 1 9 | 10 | - name: Make swap 11 | command: mkswap /swapfile 12 | when: ansible_swaptotal_mb < 1 13 | 14 | - name: Add to fstab 15 | action: lineinfile dest=/etc/fstab regexp="swapfile" line="/swapfile none swap sw 0 0" state=present 16 | 17 | - name: Turn swap on 18 | command: swapon -a 19 | 20 | - name: Set swapiness 21 | shell: sysctl vm.swappiness=10 22 | 23 | - name: Add to swappiness to sysctl.conf 24 | action: lineinfile dest=/etc/sysctl.conf regexp="swappiness" line="vm.swappiness=10" state=present 25 | 26 | - name: Set Cache Pressure 27 | shell: sysctl vm.vfs_cache_pressure=50 28 | 29 | - name: Add to vfs_cache_pressure to sysctl.conf 30 | action: lineinfile dest=/etc/sysctl.conf regexp="cache_pressure" line="vm.vfs_cache_pressure = 50" state=present 31 | -------------------------------------------------------------------------------- /data/README.md: -------------------------------------------------------------------------------- 1 | ### This is the Standard Data container for WhatPanel 2 | 3 | It provides the following volumes which can be used from the other Containers. 4 | * /data 5 | * /backup 6 | * /var/lib/mysql 7 | * /var/www 8 | 9 | Our other standard containers like 10 | Apache/Nginx/etc will use these volumes to persist their data. You can 11 | add more volumes in Dockerfile if you wish to OR you can just use the 12 | subdirectories under /data for postgres/etc. 13 | 14 | #### Quick way 15 | 16 | ``` 17 | docker run -td --name [yourdataname] paimpozhil/data 18 | 19 | ##Now you have the volumes setup , run another container to utlize this 20 | 21 | docker run -ti --name whatever --volumes-from [yourdataname] [imagename] /your/command 22 | 23 | ``` 24 | 25 | #### How to build & run with your modifications. 26 | ``` 27 | docker build -t stddata . 28 | ``` 29 | 30 | #### How to start a data volume 31 | ``` 32 | docker run -td --name [yourdataname] stddata 33 | ``` 34 | 35 | #### How to use in other containers 36 | docker run -ti --name whatever --volumes-from [yourdataname] [imagename] /bin/bash 37 | 38 | -------------------------------------------------------------------------------- /backup/20.mysql: -------------------------------------------------------------------------------- 1 | ### backupninja MySQL config file ### 2 | 3 | # hotcopy = < yes | no > (default = no) 4 | # make a backup of the actual database binary files using mysqlhotcopy. 5 | hotcopy = no 6 | 7 | # sqldump = < yes | no > (default = no) 8 | # make a backup using mysqldump. this creates text files with sql commands 9 | # sufficient to recontruct the database. 10 | # 11 | sqldump = yes 12 | 13 | # sqldumpoptions = 14 | # (default = --lock-tables --complete-insert --add-drop-table --quick --quote-names) 15 | # arguments to pass to mysqldump 16 | # sqldumpoptions = --add-drop-table --quick --quote-names 17 | 18 | # compress = < yes | no > (default = yes) 19 | # if yes, compress the sqldump output. 20 | compress = no 21 | 22 | # dbhost = (default = localhost) 23 | 24 | 25 | # backupdir = (default: /var/backups/mysql) 26 | # where to dump the backups. hotcopy backups will be in a subdirectory 27 | # 'hotcopy' and sqldump backups will be in a subdirectory 'sqldump' 28 | backupdir = /backup/mysql 29 | 30 | # databases = (default = all) 31 | # which databases to backup. should either be the word 'all' or a 32 | # space separated list of database names. 33 | databases = all 34 | 35 | dbusername = root 36 | dbpassword = 37 | 38 | configfile = /etc/my.cnf 39 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM centos:centos6 2 | 3 | MAINTAINER paimpozhil@gmail.com 4 | 5 | # Centos default image for some reason does not have tools like Wget/Tar/etc so lets add them 6 | RUN yum -y install wget 7 | 8 | RUN wget -O- https://raw.github.com/Eugeny/ajenti/master/scripts/install-rhel.sh | sh 9 | 10 | # install the Mysql / php / git / cron / duplicity / backup ninja 11 | RUN yum -y install /sbin/service which nano openssh-server git mysql-server mysql php-mysql \ 12 | php-gd php-mcrypt php-zip php-xml php-iconv php-curl php-soap php-simplexml \ 13 | php-pdo php-dom php-cli tar dbus-python.x86_64 dbus-python-devel.x86_64 dbus \ 14 | php-hash php-mysql vixie-cron backupninja duplicity dialog 15 | 16 | #work around the vsftpd 3.0.2 dependency issue 17 | RUN yum -y install http://mirror.neu.edu.cn/CentALT/6/x86_64/vsftpd-3.0.2-2.el6.x86_64.rpm 18 | 19 | #install Ajenti the control panel 20 | RUN yum -y install ajenti-v ajenti-v-ftp-vsftpd ajenti-v-php-fpm ajenti-v-mysql 21 | 22 | ## fix the locale problems iwth default centos image.. may not be necessary in future. 23 | RUN yum -y reinstall glibc-common 24 | 25 | # setup the services to start on the container bootup 26 | RUN chkconfig mysqld on && chkconfig nginx on && chkconfig php-fpm on && chkconfig crond on && chkconfig ajenti on 27 | 28 | # defaut centos image seems to have issues with few missing files from this library 29 | RUN rpm --nodeps -e cracklib-dicts-2.8.16-4.el6.x86_64 30 | RUN yum -y install cracklib-dicts.x86_64 31 | 32 | #allow the ssh root access.. - Diable if you dont need but for our containers we prefer SSH access. 33 | RUN sed -i "s/UsePAM.*/UsePAM no/g" /etc/ssh/sshd_config 34 | RUN sed -i "s/#PermitRootLogin/PermitRootLogin/g" /etc/ssh/sshd_config 35 | 36 | #cron needs this fix 37 | RUN sed -i '/session required pam_loginuid.so/c\#session required pam_loginuid.so' /etc/pam.d/crond 38 | 39 | RUN echo 'root:ch@ngem3' | chpasswd 40 | 41 | RUN mkdir /scripts 42 | ADD mysqlsetup.sh /scripts/mysqlsetup.sh 43 | RUN chmod 0755 /scripts/* 44 | 45 | RUN echo "/scripts/mysqlsetup.sh" >> /etc/rc.d/rc.local 46 | 47 | ADD backup /etc/backup.d/ 48 | 49 | RUN chmod 0600 /etc/backup.* -R 50 | 51 | 52 | EXPOSE 22 80 8000 3306 443 53 | 54 | CMD ["/sbin/init"] 55 | 56 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | WhatPanel 2 | ========= 3 | 4 | Docker based solution for easy web hosting with Ajenti supports FTP/Cron/Sql databases on Centos. 5 | 6 | This is basically very simple control panel, if you have docker installed, you can get going with just one command :) 7 | 8 | By default has MYSQL/PHP enabled but with Ajenti you can easily install ruby/python/nodejs or any custom softwares with simple 9 | yum install commands 10 | Refer : https://github.com/Eugeny/ajenti-v 11 | 12 | ##The IDEA: 13 | 14 | * Easily & Lazily Host websites on multiple small VPS/Clouds instead of one large Dedicated server 15 | * Dont have single point of failure 16 | * Provide as much isolation as you can between clients 17 | * Allow Web w SSL/Domain aliasing/DNS/Emailing/Database in a single setup 18 | * Very easy to move around/scale/create dev environments 19 | 20 | ##How to use? 21 | 22 | Follow this tutorial if you like step by step instructions 23 | #### http://greenycloud.com/hosting-on-whatpanel/ 24 | 25 | ``` 26 | ## The quickest -one paste- but not so great way to test the control panel 27 | docker run -d -p 8000:8000 -p 80:80 -p 443:443 -p 2222:22 -p 21:21 paimpozhil/whatpanel 28 | 29 | ## Best way to run control panel is with a volume attached to serve /var/lib/mysql /var/www,etc paimpozhil/data has them so 30 | 31 | docker run -td --name yourdataname paimpozhil/data 32 | docker run -d -p 8000:8000 -p 80:80 -p 443:443 -p 2222:22 -p 21:21 --volumes-from yourdataname paimpozhil/whatpanel 33 | 34 | ``` 35 | 36 | or 37 | 38 | Build it yourself 39 | ``` 40 | git clone https://github.com/paimpozhil/WhatPanel.git 41 | cd WhatPanel 42 | ## make your changes to Dockerfile if you'd like 43 | docker build -t whatpanel . 44 | docker run -d -p 8000:8000 -p 80:80 -p 443:443 -p 2222:22 -p 21:21 whatpanel 45 | 46 | ## optionally build the data container (inside data directory) & use --volumes-from to seperate the data from server configuration. Learn how to use Data volumes from http://docs.docker.io/use/working_with_volumes/ 47 | 48 | ``` 49 | 50 | Visit https://[ip of server]:8000 in your browser 51 | default logins root/admin 52 | 53 | login and go to websites section. 54 | 55 | to access server in ssh : 56 | default ssh port 2222 57 | default logins root/ch@ngem3 58 | 59 | on the docker-run command you can use different external ports than defaults for more security 60 | ex -p 7090:8000 , -p 2345:22 so it wont be obvious target for the attacker/viruses to try and hit your server. 61 | 62 | 63 | ##Why Centos Image ? 64 | 65 | I would have loved to use the Ubuntu image / phusion baseimage however the ubuntu repositories are not suited for web hosting/ecommerce environments. 66 | 67 | Most existing websites require php 5.3.x - 5.4 but Ubuntu provides 5.5.9., Nice for new web-apps but not for existing sites. 68 | 69 | I tried both VsFTPd/PureFTPD and both didnt work with Ajenti inside docker in Ubuntu image, and most web hosting envinroments need some sort of FTP solution atleast rarely. so I went to the Centos and everything was very smooth. 70 | 71 | ##Backups 72 | 73 | The image comes with Backup Ninja preinstalled.. to get started ssh into your container and issue 74 | ``` 75 | ninjahelper 76 | ``` 77 | for more info please check https://labs.riseup.net/code/projects/backupninja 78 | 79 | ##What about DNS / Email? 80 | 81 | Regarding DNS: 82 | 83 | I would MUCH prefer to host the DNS with cheap DNS hosting that many domain providers provide like Godaddy/etc. They might charge you 1$ / year or so additional and would take away all these pains. 84 | 85 | Or you may use a professional DNS service like Amazon Route53 and other hosted DNS solutions however they charge you like 1$/month range. 86 | 87 | But like all the shared cPanel servers if you like to host it yourself.. see below 88 | 89 | Ajenti already supports bind9 and email configuration out of the box. You may have to edit the bind dns zone files as a whole, this may change when Ajenti supports better GUI for bind. 90 | 91 | Regarding EMAIL: 92 | 93 | If all you need is outgoing emails to just work like contact forms (php mail() or just mail command in CLI) then use the following guide. 94 | 95 | http://www.dockerforums.com/t/how-to-setup-outgoing-emails-within-centos-whatpanel-containers/75 96 | 97 | For the Impatient. 98 | ``` 99 | yum install exim mailx 100 | ## install mail server & utils 101 | chkconfig exim on 102 | ## start exim on boot 103 | alternatives --config mta 104 | ## choose exim and you are set. 105 | ``` 106 | 107 | If you are looking for incoming emails to work, read below.. I will support them in the near future but with a warning. 108 | 109 | Like DNS , Email is very critical for many business I wouldnt host my own email inside a container / VPS or even my dedicated servers that also host my web app because web apps may get hacked and will probably get blacklisted in other email spamlists. 110 | 111 | You should go with a hosted email with exchange like 1&1 for 10$/year range or Rackspace for 2$/user/month range or 5$/user/month with Google/outlook instead of doing this for critical 112 | 113 | All you need to do is ssh into server , `yum install bind9` / `yum install ajenti-v-mail` 114 | 115 | Or add these instructions into docker file and run the image with additional ports opened .. 116 | `ex: -p 53:53 (DNS) -p 25:25 (SMTP ), -p 143:143 (IMAP) -p 110:110 (POP) and so on.` 117 | 118 | 119 | ##To Do 120 | 121 | cPanel Transfer script 122 | 123 | 124 | 125 | ## Need support? 126 | 127 | ### http://dockerteam.com 128 | 129 | ## Credits 130 | 131 | Ajenti: its the cPanel/Plesk killer. 132 | 133 | #### https://github.com/Eugeny/ajenti 134 | 135 | #### https://github.com/Eugeny/ajenti-v 136 | 137 | Centos Project 138 | 139 | Docker.io 140 | -------------------------------------------------------------------------------- /backup/90.dup: -------------------------------------------------------------------------------- 1 | # passed directly to duplicity 2 | #options = --verbosity 8 3 | options = 4 | 5 | # default is 0, but set to 19 if you want to lower the priority. 6 | nicelevel = 19 7 | 8 | # default is yes. set to no to skip the test if the remote host is alive. 9 | # if 'desturl' is set below, 'testconnect' must be set to 'no' for now. 10 | testconnect = yes 11 | 12 | ## temporary directory used by duplicity, set to some other location if your /tmp is small 13 | ## default is either /tmp or /usr/tmp, depending on the system 14 | ## 15 | ## Default: 16 | # tmpdir = /tmp 17 | 18 | ###################################################### 19 | ## gpg section 20 | ## (how to encrypt and optionally sign the backups) 21 | ## 22 | ## WARNING: old (pre-0.9.4) example.dup used to give wrong information about 23 | ## the way the following options are used. Please read the following 24 | ## carefully. 25 | ## 26 | ## If the encryptkey variable is set: 27 | ## - data is encrypted with the GnuPG public key specified by the encryptkey 28 | ## variable 29 | ## - if signing is enabled, data is signed with the GnuPG private 30 | ## key specified by the signkey variable 31 | ## - the password variable is used to unlock the GnuPG key(s) used 32 | ## for encryption and (optionnal) signing 33 | ## 34 | ## If the encryptkey option is not set: 35 | ## - data signing is not possible 36 | ## - the password variable is used to encrypt the data with symmetric 37 | ## encryption: no GnuPG key pair is needed 38 | 39 | [gpg] 40 | 41 | # when set to yes, encryptkey variable must be set below; if you want to use 42 | # two different keys for encryption and signing, you must also set the signkey 43 | # variable below. 44 | # default is no, for backwards compatibility with backupninja <= 0.5. 45 | sign = no 46 | 47 | # ID of the GnuPG public key used for data encryption. 48 | # if not set, symmetric encryption is used, and data signing is not possible. 49 | encryptkey = 50 | 51 | # ID of the GnuPG private key used for data signing. 52 | # if not set, encryptkey will be used. 53 | signkey = 54 | 55 | # password --- CHANGE THIS or you are dead . 56 | # NB: neither quote this, nor should it include any quotes 57 | password = whatpanelbackup 58 | 59 | ###################################################### 60 | ## source section 61 | ## (where the files to be backed up are coming from) 62 | 63 | [source] 64 | 65 | # A few notes about includes and excludes: 66 | # 1. include, exclude and vsinclude statements support globbing with '*' 67 | # 2. Symlinks are not dereferenced. Moreover, an include line whose path 68 | # contains, at any level, a symlink to a directory, will only have the 69 | # symlink backed-up, not the target directory's content. Yes, you have to 70 | # dereference yourself the symlinks, or to use 'mount --bind' instead. 71 | # Example: let's say /home is a symlink to /mnt/crypt/home ; the following 72 | # line will only backup a "/home" symlink ; neither /home/user nor 73 | # /home/user/Mail will be backed-up : 74 | # include = /home/user/Mail 75 | # A workaround is to 'mount --bind /mnt/crypt/home /home' ; another one is to 76 | # write : 77 | # include = /mnt/crypt/home/user/Mail 78 | # 3. All the excludes come after all the includes. The order is not otherwise 79 | # taken into account. 80 | 81 | # files to include in the backup 82 | include = /backup 83 | include = /var/www 84 | include = /data 85 | 86 | # If vservers = yes in /etc/backupninja.conf then the following variables can 87 | # be used: 88 | # vsnames = all | ... (default = all) 89 | # vsinclude = 90 | # vsinclude = 91 | # ... 92 | # Any path specified in vsinclude is added to the include list for each vserver 93 | # listed in vsnames (or all if vsnames = all, which is the default). 94 | # 95 | # For example, vsinclude = /home will backup the /home directory in every 96 | # vserver listed in vsnames. If you have 'vsnames = foo bar baz', this 97 | # vsinclude will add to the include list /vservers/foo/home, /vservers/bar/home 98 | # and /vservers/baz/home. 99 | # Vservers paths are derived from . 100 | 101 | 102 | # files to exclude from the backup 103 | exclude = /home/*/.gnupg 104 | exclude = /home/*/.local/share/Trash 105 | exclude = /home/*/.Trash 106 | exclude = /home/*/.thumbnails 107 | exclude = /home/*/.beagle 108 | exclude = /home/*/.aMule 109 | exclude = /home/*/gtk-gnutella-downloads 110 | exclude = /var/cache/backupninja/duplicity 111 | 112 | ###################################################### 113 | ## destination section 114 | ## (where the files are copied to) 115 | 116 | [dest] 117 | 118 | # perform an incremental backup? (default = yes) 119 | # if incremental = no, perform a full backup in order to start a new backup set 120 | incremental = yes 121 | 122 | # how many days of incremental backups before doing a full backup again ; 123 | # default is 30 days (one can also use the time format of duplicity). 124 | # if increments = keep, never automatically perform a new full backup ; 125 | # only perform incremental backups. 126 | #increments = 30 127 | #increments = keep 128 | increments = 30 129 | 130 | # how many days of data to keep ; default is 60 days. 131 | # (you can also use the time format of duplicity) 132 | # 'keep = yes' means : do not delete old data, the remote host will take care of this 133 | #keep = 60 134 | #keep = 1Y 135 | #keep = yes 136 | keep = 120 137 | 138 | # for how many full backups do we keep their later increments ; 139 | # default is all (keep all increments). 140 | # increments for older full backups will be deleted : only the more 141 | # recent ones (count provided) will be kept 142 | #keepincroffulls = all 143 | #keepincroffulls = 6 144 | keepincroffulls = all 145 | 146 | # full destination URL, in duplicity format; if set, desturl overrides 147 | # sshoptions, destdir, desthost and destuser; it also disables testconnect and 148 | # bandwithlimit. For details, see duplicity manpage, section "URL FORMAT". 149 | #desturl = file:///usr/local/backup 150 | #desturl = rsync://user@other.host//var/backup/bla 151 | #desturl = s3+http://your_bucket 152 | #desturl = ftp://myftpuser@ftp.example.org/remote/ftp/path 153 | 154 | # Amazon Web Services Access Key ID and Secret Access Key, needed for backups 155 | # to S3 buckets. 156 | #awsaccesskeyid = YOUR_AWS_ACCESS_KEY_ID 157 | #awssecretaccesskey = YOUR_AWS_SECRET_KEY 158 | 159 | ## RackSpace's CloudFiles username, API key, and authentication URL. 160 | ## cfusername = YOUR_CF_USERNAME 161 | ## cfapikey = YOUR_CF_API_KEY 162 | ## cfauthurl = YOUR_CF_AUTH_URL 163 | ## 164 | ## Default: 165 | # cfusername = 166 | # cfapikey = 167 | # cfauthurl = 168 | 169 | # FTP password, needed for backups using desturl = ftp://... 170 | #ftp_password = 171 | 172 | # bandwith limit, in kbit/s ; default is 0, i.e. no limit 173 | # if using 'desturl' above, 'bandwidthlimit' must not be set 174 | # an example setting of 128 Kbit/s would be: 175 | #bandwidthlimit = 128 176 | bandwidthlimit = 177 | 178 | ## duplicity < 0.6.17 179 | ## ------------------ 180 | ## passed directly to ssh, scp (and sftp in duplicity >=0.4.2) 181 | ## warning: sftp does not support all scp options, especially -i; as 182 | ## a workaround, you can use "-o " 183 | ## an example setting would be: 184 | ## sshoptions = -o IdentityFile=/root/.ssh/id_rsa_duplicity 185 | ## 186 | ## duplicity >= 0.6.17 187 | ## ------------------ 188 | ## supports only "-o IdentityFile=..." 189 | ## 190 | ## Default: 191 | # sshoptions = 192 | 193 | # put the backups under this destination directory 194 | # if using 'desturl' above, this must not be set 195 | # in all other cases, this must be set! 196 | destdir = backups 197 | 198 | # the machine which will receive the backups 199 | # if using 'desturl' above, this must not be set 200 | # in all other cases, this must be set! 201 | # not to change the backuphost to your backup server if you are not using any other backup method. 202 | desthost = backuphost 203 | 204 | # make the files owned by this user 205 | # if using 'desturl' above, this must not be set 206 | # note: if using an SSH based transport and 'type' is set to 'remote', you must 207 | # be able to 'ssh backupuser@backuphost' without specifying a password. 208 | destuser = backupser 209 | 210 | --------------------------------------------------------------------------------