Instantly share code, notes, and snippets.

Embed
What would you like to do?
Nextcloud - Cloud-Init with Docker
version: '3'
volumes:
nextcloud:
services:
app:
image: nextcloud
ports:
- 80:80
environment:
- SQLITE_DATABASE=cloud
- NEXTCLOUD_ADMIN_USER=pirate
- NEXTCLOUD_ADMIN_PASSWORD=hypriot
volumes:
- nextcloud:/var/www/html
- /var/cloud/data:/var/www/html/data
restart: always
apt-get install pv unzip hdparm
curl -O https://raw.githubusercontent.com/hypriot/flash/master/$(uname -s)/flash
chmod +x flash
sudo mv flash /usr/local/bin/flash
# Download this yaml from this repo
rm ./user-data.yml
curl -O https://gist.githubusercontent.com/RenEvo/6a9e244b670df334c42578b8fe95400b/raw/user-data.yml
flash \
--hostname mycloud.home.renevo.com \
--userdata ./user-data.yml \
https://github.com/DieterReuter/image-builder-rpi64/releases/download/v20171013-172949/hypriotos-rpi64-v20171013-172949.img.zip
#cloud-config
# vim: syntax=yaml
#
# The current version of cloud-init in the Hypriot rpi-64 is 0.7.9
# When dealing with cloud-init, it is SUPER important to know the version
# I have wasted many hours creating servers to find out the module I was trying to use wasn't in the cloud-init version I had
# Documentation: http://cloudinit.readthedocs.io/en/0.7.9/index.html
# Set your hostname here, the manage_etc_hosts will update the hosts file entries as well
hostname: nextcloud-pi64
manage_etc_hosts: true
# This expands the root volume to the entire SD Card, similar to what the raspbian images did on first boot.
# This doesn't seem to be required, its more here for posterity in understanding what is going on
resize_rootfs: true
growpart:
mode: auto
devices: ["/"]
ignore_growroot_disabled: false
# You could modify this for your own user information
users:
- name: pirate
gecos: "Hypriot Pirate"
sudo: ALL=(ALL) NOPASSWD:ALL
shell: /bin/bash
groups: users,docker,video
plain_text_passwd: hypriot
lock_passwd: false
ssh_pwauth: true
chpasswd: { expire: false }
# Update our packages on first boot, saves us some time
package_update: true
package_upgrade: true
package_reboot_if_required: true
# Install any additional packages you need here
# I add ntp because.. without it, rpi is useless in keeping track of time.
packages:
- ntp
# Set the locale of the system
locale: "en_US.UTF-8"
# Set the timezone
# Value of 'timezone' must exist in /usr/share/zoneinfo
timezone: "America/Los_Angeles"
# Tell docker to tag this node appropriately
# Currently we need the experimental?
write_files:
- path: "/etc/docker/daemon.json"
owner: "root:root"
content: |
{
"labels": [ "os=linux", "arch=arm64" ],
"experimental": true
}
# These commands will be ran once on first boot only
runcmd:
# Pickup the hostname changes
- [ systemctl, restart, avahi-daemon ]
# Pickup the daemon.json changes
- [ systemctl, restart, docker ]
# Init a swarm, because why not
- [docker, swarm, init ]
# Run portainer, so we can see our logs and control stuff from a UI
- [
docker, service, create,
"--detach=false",
"--name", "portainer",
"--publish", "9000:9000",
"--mount", "type=volume,src=portainer_data,dst=/data",
"--mount", "type=bind,src=//var/run/docker.sock,dst=/var/run/docker.sock",
"portainer/portainer", "-H", "unix:///var/run/docker.sock", "--no-auth"
]
# Create a specific directory to store all the data, this way you could mount an external drive later (coming soon!)
- [mkdir, "-p", "/var/cloud/data" ]
# This gives the nextcloud permissions to write to this directory since it runs as www-data
- [setfacl, "-m", "u:www-data:rwx", "/var/cloud/data" ]
# Create the nextcloud instance configuring it on startup - you should change the user/password below to something less obvious or use the config UI
- [
docker, service, create,
"--detach=false",
"--name", "nextcloud",
"--publish", "80:80",
"--mount", "type=volume,src=nextcloud,dst=/var/www/html",
"--mount", "type=bind,src=//var/cloud/data,dst=/var/www/html/data",
"--env", "SQLITE_DATABASE=nextcloud",
"--env", "NEXTCLOUD_ADMIN_USER=pirate",
"--env", "NEXTCLOUD_ADMIN_PASSWORD=hypriot",
"nextcloud:latest"
]
@ismangil

This comment has been minimized.

ismangil commented Jan 11, 2018

Reading your blog post, and being a Docker noob trying to get a custom image: what's the difference between using cloud-init and creating a Docker image by writing Dockerfiles?

@breandan

This comment has been minimized.

breandan commented Jun 11, 2018

@RenEvo Having some trouble reproducing your setup. It seems that Portainer is only run on first boot. After rebooting, it must be manually restarted. Any suggestions?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment