> For the complete documentation index, see [llms.txt](https://shoppinpal.gitbook.io/docs-shoppinpal-com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://shoppinpal.gitbook.io/docs-shoppinpal-com/1.-the-ideal-workspace/setup-a-machine-in-the-cloud/setup-box-on-digitalocean/shared-filesystem/dropbox.md).

# Dropbox

## Setup box

### Shared FileSystem

#### Dropbox

1. We can use dropbox for efficient 2-way project sync!
   * This approach works for any IDE - `atom` or `webstorm` or `vscode` - they don't have to know about the remote filesystem.
   * This will allow us to write code locally and have the changes show up on the remote box.
     * Adding/deleting files will work
     * File permissions will be properly reflected
     * Configuring `selective sync` via the dropbox UI will prevent the transfer of bulky dependencies back to your local filesystem
     * such features are often difficult to setup or absent in other sync tools.
   * Tools like `SourceTree` can simply deal with our local filesystem without any knowledge of the remote filesystem.
2. Install Dropbox agent
   * <https://www.dropbox.com/install-linux>
   * for digitalocean 64-bit droplets with Ubuntu OS:

     ```
     cd ~ && \
     curl -Lo dropbox-linux-x86_64.tar.gz https://www.dropbox.com/download?plat=lnx.x86_64 && \
     sudo mkdir -p /opt/dropbox && \
     sudo tar xzfv dropbox-linux-x86_64.tar.gz --strip 1 -C /opt/dropbox && \
     /opt/dropbox/dropboxd
     ```
3. Link the machine by copy/pasting the URL from the output window into your browser. Here's a sample of what you'll see:

   ```
    This client is not linked to any account...
    Please visit https://www.dropbox.com/cli_link?host_id=xxx
    to link this machine.
   ```
4. Once you are done linking, you will see the following output:

   ```
    This computer is now linked to Dropbox. Welcome xxx
   ```

   1. Leave the terminal window with `dropboxd` running in the foreground, as-is.
      * NOTE: `dropboxd` will start syncing everything in your dropbox account immediately, the next few steps will work to correct this behaviour.
5. Open a new `ssh` session with your remote machine and download the `dropbox.py` command-line tool so we may tell `dropboxd` to avoid syncing anything other than our code/projects.

   ```
    mkdir -p ~/bin && \
    wget -O ~/bin/dropbox.py "http://www.dropbox.com/download?dl=packages/dropbox.py" && \
    chmod 755 ~/bin/dropbox.py && \
    ~/bin/dropbox.py help
   ```
6. Switch to your `Dropbox` directory and exclude any files that it has begun syncing:&#x20;

   ```
    cd ~/Dropbox/ && ~/bin/dropbox.py exclude add *
   ```
7. Check the status: `~/bin/dropbox.py status`
   1. If its still trying to sync then every few minutes, rerun: `cd ~/Dropbox/ && ~/bin/dropbox.py exclude add *`
   2. Keep running the status check again too: `~/bin/dropbox.py status`
   3. After the status check declares: `Up to date`
      * Run this command one last time to be sure: `cd ~/Dropbox/ && ~/bin/dropbox.py exclude add *`
   4. Now the contents of your `Dropbox` directory should be empty: `cd ~/Dropbox/ && ls`
   5. Feel free to take a look at everything which has been excluded: `~/bin/dropbox.py exclude list`
   6. If the directory you want to sync is also excluded, then remove it from exclude list by `~/bin/dropbox.py exclude remove [DIRECTORY] [DIRECTORY]`
8. Now that we've excluded everything known to us, you can place any new code-related projects & folders into dropbox and they will sync between.
   * <https://www.digitalocean.com/community/questions/dropbox-works-with-digitalocean-droplets>

     > You probably don't want to host content out of your Dropbox folder, but there's a basic trick for mirroring Dropbox content outside of the Dropbox folder: create a symbolic link.
     >
     > Example: ln -s /var/www/foo.com \~/Dropbox/foo.com
     >
     > This will cause Dropbox to treat /var/www/foo.com as if it resided inside the Dropbox folder. All other clients will see foo.com as a folder within the Dropbox folder, and will transparently sync across that symlink.
9. We cannot count on keeping our first ssh session alive forever to run `dropboxd` so let's [set it up as a service](https://www.digitalocean.com/community/tutorials/how-to-install-dropbox-client-as-a-service-on-ubuntu-14-04#set-up-service-script)

   ```
    cd ~ && \
    sudo curl -o /etc/init.d/dropbox https://gist.githubusercontent.com/thisismitch/d0133d91452585ae2adc/raw/699e7909bdae922201b8069fde3011bbf2062048/dropbox && \
    sudo chmod +x /etc/init.d/dropbox && \
    echo DROPBOX_USERS="root" >> /etc/default/dropbox && \
    sudo update-rc.d dropbox defaults && \
    sudo service dropbox start
   ```

   * As a safety measure, I [forked](https://gist.github.com/pulkitsinghal/b7d9230e6ef398bce307468e849baf27) `thisismitch`'s gist in case it ever gets taken down.
10. As a convenience, on your remote box, you can edit `~/.bashrc` to add an alias:

    ```
     # added on jul 18 2017 by pulkit
     alias dropbox='~/bin/dropbox.py'
    ```

    &#x20;this will let you use shorthand like `dropbox status` instead of `~/bin/dropbox.py status`
11. If you code using dropbox for sync long enough, you will run into an issue where dropbox will either crash or hang or both because of a limit on maximum number of files it can monitor for changes.
    * If you are lucky then the logs will magically pop-up on your console stating:

      ```
        Unable to monitor entire Dropbox folder hierarchy. Please run "echo fs.inotify.max_user_watches=100000 | sudo tee -a /etc/sysctl.conf; sudo sysctl -p" and restart Dropbox to fix the problem.
        Unable to monitor entire Dropbox folder hierarchy. Please run "echo fs.inotify.max_user_watches=100000 | sudo tee -a /etc/sysctl.conf; sudo sysctl -p" and restart Dropbox to fix the problem.
      ```
    * You can protect against this by [understanding](https://stackoverflow.com/questions/35711897/dropbox-fs-inotify-error) what is going on. For example I found out that I had provided significantly less resources than what dropbox recommends!

      ```
        # how many watchers have been made available?
        $ cat /proc/sys/fs/inotify/max_user_watches
        8192

        # how many watchers have been made available?
        $ sysctl fs.inotify.max_user_watches
        fs.inotify.max_user_watches = 8192
      ```
    * Or you could simply go ahead and make the fix:

      ```
        # 1. increase the number of watchers
        $ echo fs.inotify.max_user_watches=100000 | sudo tee -a /etc/sysctl.conf; sudo sysctl -p
        # 2. stop dropbox daemon if its running
        $ ~/bin/dropbox.py stop
        # 3. start the daemon again
        $ /opt/dropbox/dropboxd &

        # 4. check the status, it should start humming along again, soon:
        $ dropbox status
        Syncing (22,758 files remaining)
        Indexing 21,025 files...
        Uploading 1,729 files...

        $ dropbox status
        Syncing (21,995 files remaining)
        Indexing 19,825 files...
        Uploading 2,166 files...
      ```
    * You're welcome ;)

#### Other References

* <https://www.digitalocean.com/community/tutorials/how-to-install-dropbox-client-as-a-service-on-ubuntu-14-04>
* <https://www.dropbox.com/install-linux>
* <https://github.com/jolantis/digitalocean-droplet-install-guide#setup-dropbox-sync>
* <http://www.dropboxwiki.com/tips-and-tricks/using-the-official-dropbox-command-line-interface-cli#EXCLUDE>
* <http://www.dropboxwiki.com/tips-and-tricks/install-dropbox-in-an-entirely-text-based-linux-environment#Post-installation>


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://shoppinpal.gitbook.io/docs-shoppinpal-com/1.-the-ideal-workspace/setup-a-machine-in-the-cloud/setup-box-on-digitalocean/shared-filesystem/dropbox.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
