+++ title = “Self hosted Netlify using docker-compose, gitea, and drone-ci” date = 2019-11-16T15:30:03+05:30 draft = true tags = [“golang”, “docker”, “self hosted”] categories = [“tutorials”] type = “post” url = “blog/2019/11/16/selfhosted-netlify” author = “Rohan Verma” +++
I had been using netlify to deploy a few of my static sites. The process for deployment is seamless and all you need to do is push to master. Pushing to the develop branch or creating a pull request on github creates a mirror with a unique URL which can be used to preview the site.
It worked well, but I often feel that I will eventually be tied down or stuck to the service. One day the pricing will change or the service will disappear. Also, for my small static sites, the features it offers are too much.
I also wanted to setup CI/CD for my other projects, and setting up my own CI/CD pipeline and migrating static sites would be a good easy step to start.
This article is derived from Self-hosting with Docker by Joel Hans. I might skip a few details, which are covered there.
version: '2'
services:
proxy:
image: jwilder/nginx-proxy
container_name: proxy
restart: unless-stopped
labels:
com.github.jrcs.letsencrypt_nginx_proxy_companion.nginx_proxy: "true"
volumes:
- /var/run/docker.sock:/tmp/docker.sock:ro
- certs:/etc/nginx/certs:rw
- vhost.d:/etc/nginx/vhost.d
- html:/usr/share/nginx/html
- ./uploadsize.conf:/etc/nginx/conf.d/uploadsize.conf:ro
ports:
- "80:80"
- "443:443"
networks:
- "default"
- "proxy-tier"
proxy-letsencrypt:
image: jrcs/letsencrypt-nginx-proxy-companion
container_name: letsencrypt
restart: unless-stopped
environment:
- NGINX_PROXY_CONTAINER=proxy
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
volumes_from:
- "proxy"
depends_on:
- "proxy"
networks:
- "default"
- "proxy-tier"
portainer:
image: portainer/portainer
container_name: portainer
restart: always
environment:
- VIRTUAL_HOST=docker.rohanverma.net
- LETSENCRYPT_HOST=docker.rohanverma.net
- [email protected]
volumes:
- ./portainer/:/data
- /var/run/docker.sock:/var/run/docker.sock
privileged: true
ports:
- "9000:9000"
gitea:
image: gitea/gitea:latest
container_name: gitea
restart: unless-stopped
environment:
- VIRTUAL_HOST=gitea.rohanverma.net
- LETSENCRYPT_HOST=gitea.rohanverma.net
- [email protected]
- VIRTUAL_PORT=3000
- ROOT_URL=https://gitea.rohanverma.net
- DOMAIN=gitea.rohanverma.net
- PROTOCOL=http
- USER_UID=1000
- USER_GID=1000
volumes:
- ./gitea:/data
ports:
- "5000:3000"
- "222:22"
networks:
- proxy-tier
- default
drone:
container_name: drone
image: drone/drone:latest
restart: always
environment:
- DRONE_GITEA_SERVER=https://gitea.rohanverma.net
- DRONE_GIT_ALWAYS_AUTH=false
- DRONE_RUNNER_CAPACITY=3
- DRONE_SERVER_HOST=drone.rohanverma.net
- DRONE_SERVER_PROTO=https
- DRONE_TLS_AUTOCERT=false
- DRONE_RPC_SECRET=xxxxxxxx
- DRONE_GITEA_CLIENT_ID=xxxxxxxxxxxxxxxxx
- DRONE_GITEA_CLIENT_SECRET=xxxxxxxxxxxxxxxxxx
- VIRTUAL_HOST=drone.rohanverma.net
- VIRTUAL_PORT=80
- DRONE_USER_CREATE=username:rhnvrm,admin:true
- DRONE_DEBUG=true
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- ./drone:/data
privileged: true
ports:
- "5151:80"
networks:
- default
drone-agent:
container_name: drone-agent
image: drone/agent:latest
command: agent
restart: always
depends_on:
- drone
privileged: true
volumes:
- /var/run/docker.sock:/var/run/docker.sock
environment:
- DRONE_RPC_SERVER=https://drone.rohanverma.net
- DRONE_RPC_SECRET=xxxxxxxx
- DRONE_RUNNER_CAPACITY=3
- DRONE_RUNNER_NAME="local"
networks:
- default
rohanvermanet:
container_name: rohanvermanet
build:
dockerfile: Dockerfile
context: ../apps/rohanverma.net
ports:
- "8080:80"
environment:
- VIRTUAL_HOST=rohanverma.net
- LETSENCRYPT_HOST=rohanverma.net
- [email protected]
nextrohanvermanet:
container_name: nextrohanvermanet
build:
dockerfile: Dockerfile
context: ../apps/next.rohanverma.net
ports:
- "8079:80"
environment:
- VIRTUAL_HOST=next.rohanverma.net
- LETSENCRYPT_HOST=next.rohanverma.net
- [email protected]
volumes:
certs:
vhost.d:
html:
networks:
proxy-tier:
The drone.yml file
---
kind: pipeline
type: docker
name: default
steps:
- name: ssh commands for rohanverma.net
image: appleboy/drone-ssh
when:
branch:
- master
settings:
host: 159.89.175.2
username: deploy
port: 22
key:
from_secret: ssh_key
script_stop: true
script:
- cd /home/rhnvrm/apps/rohanverma.net
- git fetch origin
- git checkout origin/master
- cd /home/rhnvrm/proxy
- docker-compose build rohanvermanet
- docker-compose up -d rohanvermanet
- name: ssh commands for next.rohanverma.net
image: appleboy/drone-ssh
when:
branch:
- develop
settings:
host: 159.89.175.2
username: deploy
port: 22
key:
from_secret: ssh_key
script_stop: true
script:
- cd /home/rhnvrm/apps/next.rohanverma.net
- git fetch origin
- git checkout origin/develop
- cd /home/rhnvrm/proxy
- docker-compose build nextrohanvermanet
- docker-compose up -d nextrohanvermanet