Developing Lightning components that you can deploy anywhere is for the most part the same as developing them to run within Salesforce. Everything you already know about Lightning components development still applies. The only real difference is in how you embed your Lightning components app in the remote web container, or origin server.
Lightning Out is added to external apps in the form of a JavaScript library you include in the page on the origin server, and markup you add to configure and activate your Lightning components app. Once initialized, Lightning Out pulls in your Lightning components app over a secure connection, spins it up, and inserts it into the DOM of the page it’s running on. Once it reaches this point, your “normal” Lightning components code takes over and runs the show.
In addition to some straightforward markup, there’s a modest amount of setup and preparation within Salesforce to enable the secure connection between Salesforce and the origin server. And, because the origin server is hosting the app, you need to manage authentication with your own code.
This setup process is similar to what you’d do for an application that connects to Salesforce using the Force.com REST API, and you should expect it to require an equivalent amount of work.