Home

Awesome

Remote dotfiles

Build Status Code Climate Coverage Status bitHound Score Codacy Badge Dependency Status npm version

Describe your dotfiles configuration, have it automatically tuned for every server and then automatically deploy to all your servers.

var config = dotfiles()
    .bash(__dirname + '/bash/*.sh')
    .bin(__dirname + '/bin/*')
    .servers([
        {
            alias: 'prod',
            host: 'production.example.com'
        },
        {
            alias: 'gate',
            forwardAgent: true,
            host: 'gateway.example.com',
            port: 3133
        }
    ])
    .proxies(function(from, to){
        if (to === 'prod') return 'gate';
    })
    .ssh('ServerAliveInterval 30')
    .custom({
        // Deploy any custom files
        // Make sure a custom file has a string 'remote-dotfiles' in it to enable overwriting
        '.gitignore': __dirname + '/gitconfig',
        '.welcome': 'Custom contents can be passed as a string'
    });

You can investigate the resulting config file set:

// Get a stream of Vinyl files for local machine
config.stream();

// Get a stream of Vinyl files for machine aliased prod
config.stream('prod');

// Or use a pretty printer in the console
config.stream()
    .pipe(dotfiles.pretty())
    .pipe(process.stdout, {end: false});

Now you should deploy it:

config.deploy().done();

config.deploy(function(progress){
    console.log(Math.round(progress * 100) + '% done.');
}).done();

config.deploy({
    // Limit the parallel deployments over SSH
    parallelLimit: 3,

    progress: function(){},

    // Only deploy to one server
    target: 'host-alias'
})

Or, for quicker iterating, you can temporarily only deploy locally:

config.deploy.local().done();

CLI

You can also deploy from the CLI, if you module.exports your config:

remote-dotfiles deploy ./my-config.js local
remote-dotfiles deploy ./my-config.js all
remote-dotfiles deploy ./my-config.js server-alias

.bash

// Short call
config.bash(__dirname + '/*.sh');

// Use a list
config.bash([
    __dirname + '/*.sh',
    __dirname + '/*.bash'
]);

// Use separate arguments
config.bash(
    __dirname + '/*.sh',
    __dirname + '/*.bash'
);

// Use raw data
config.bash(
    'alias foo=bar',
    __dirname + '/*.bash'
);

// Use functions
config.bash(
    // server will be an empty object if generating for localhost
    function(server){
        return 'echo Welcome to ' + server.alias;
    }
);

.bin

// Short call
config.bin(__dirname + '/*.py');

// Use a list
config.bin([
    __dirname + '/foo.py',
    __dirname + '/bar.py'
]);

// Use separate arguments
config.bin(
    __dirname + '/foo.py',
    __dirname + '/bar.py'
);

As a result, added files will be added to PATH with their extensions stripped.