Unverified Commit 1897df10 authored by Tom Moulard's avatar Tom Moulard
Browse files
parents
Loading
Loading
Loading
Loading

README.md

0 → 100644
+154 −0
Original line number Diff line number Diff line
# Server configuration

## Goal
```bash
$ export SITE=tom.moulard.org
$ docker-compose up -d
```

Now you have my own server configuration


## TODO
### New ideas
 - [X] traefik
 - [X] gitlab
 - [X] nextcloud
    - [ ] CI/CD worker(s)
 - [X] nginx
 - [X] weechat
 - [X] transmission
 - [X] vpn
 - [X] jupyter
 - [ ] readthedoc / [DokuWiki](https://hub.docker.com/r/mprasil/dokuwiki)
 - [X] pastebin
 - [ ] image hosting
 - [ ] [hackmd](https://github.com/hackmdio/docker-hackmd) [main repo](https://github.com/hackmdio/codimd)
 - [ ] jekyll
 - [ ] [monitoring](https://www.brianchristner.io/how-to-monitor-traefik-reverse-proxy-with-prometheus/)
 - [ ] proxy
 - [ ] [RSS agregator server](https://www.freshrss.org/)
 - [ ] calendar
 - [ ] url shortener
 - [ ] File host [jirafeau](https://jirafeau.net/)
 - [ ] DNS updater
 - [ ] factorio server
 - [ ] news group server
 - [ ] vlc server
 - [ ] blog
[more](https://github.com/Kickball/awesome-selfhosted)

### List
 - [ ] which database ? maria / mysql / mongo / postgres
    - [ ] gitlab postgresSQL / MySQL - MariaDB
    - [ ] nextcloud postgresSQL / MySQL - MariaDB / Oracle
 - [X] nginx.conf
 - [ ] create a git repository auto in gitlab for // FIXME
 - [ ] Create a Dockerfile for a mail server
 - [X] reverse proxy with ssl
 - [ ] multi files configuration
 - [ ] Testing
    - [X] traefik
    - [X] gitlab
    - [ ] nextcloud
    - [X] nginx
    - [ ] weechat
    - [X] transmission
    - [X] vpn
    - [X] jupyter
    - [X] pastebin

### Configuration files
 - [ ] have default configuration files
    - [X] traefik
    - [ ] gitlab
    - [ ] gitlab runner
    - [ ] transmission
    - [ ] pastebin
    - [ ] nextcloud
    - [X] nginx

## Configuration
Don't forget to change db passwords. (migth not be needed since they are beyond
the reverse proxy).
Fill vpn secrets(if none provided, they are generated directly).
Configuration files are: `docker-compose.yml`, `nginx.conf`

### Scalling up
```bash
docker-compose scale nginx=2
```

### Adress table
| Status | Address | port(s)|
|:--:|--|--|
| [X] | traefik.${SITE} | 80, 443 (redirect 80 to 443) |
| [X] | gitlab.${SITE} | 22, 80, 443 |
| [ ] | cloud.${SITE} | 80, 443 |
| [X] | ${SITE} | 80, 443 |
| [ ] | mail.${SITE} | 25(recv mail), 465(ssl), 587(TLS), 143(IMAP), 993(IMAP), 110(POP3), 995(POP3) |
| [X] | torrent.${SITE} | 80, 443 (redirect 80 to 443) |
| [X] | vpn.${SITE} | 500, 4500 |
| [X] | jupiter.${SITE} | 80, 443 (redirect 80 to 443) |
| [X] | paste.${SITE} | 80, 443 (redirect 80 to 443) |
| [ ] | irc.${SITE} | ?? |

### Miscellaneous
| Status | Address | port(s)|
|:--:|--|--|
| [X] | ${SITE2} | 80, 443 (redirect 80 to 443) |


## Installation
### Traefik
```
defaultEntryPoints = ["http", "https"]

[entryPoints]
  [entryPoints.http]
    address = ":80"
      [entryPoints.http.redirect]
        entryPoint = "https"
  [entryPoints.https]
    address = ":443"
      [entryPoints.https.tls]

# API definition
[api]
entryPoint = "traefik"
dashboard = true
  [api.statistics]
    recentErrors = 42

[[acme.domains]]
main = "${SITE}"
sans = ["paste.${SITE}", "traefik.${SITE}", "gitlab.${SITE}"]

[acme]
email = "${EMAIL}"
storage = "acme.json"
entryPoint = "https"
onHostRule = true
  [acme.httpChallenge]
  entryPoint = "http"

[docker]
watch = true
exposedByDefault = false
```
### Nginx
Configuration file to put in `$HOME/srv/nginx/nginx.conf`
```
server {
    root /etc/nginx/conf.d/www;
    index index.html;

    location /{
        try_files $uri $uri/ =404;
        autoindex on;
    }
}
```

And put your files in the folder `$HOME/srv/nginx/www`.
 No newline at end of file

docker-compose.yml

0 → 100644
+217 −0
Original line number Diff line number Diff line
version: "2"
networks:
  srv:
  gitlab:

services:
  traefik:
    image: traefik:1.5.4
    container_name: traefik
    restart: always
    ports:
      - '80:80'
      - '443:443'
      - '8080:8080'
    networks:
      - srv
    labels:
      - 'traefik.enable=true'
      - 'traefik.port=8080'
      - 'traefik.frontend.rule=Host:traefik.${SITE}'
    volumes:
      - '/var/run/docker.sock:/var/run/docker.sock'
      - '$HOME/srv/traefik/traefik.toml:/traefik.toml'
      - '$HOME/srv/traefik/acme.json:/acme.json'

  gitlab:
    image: 'gitlab/gitlab-ce:latest'
    container_name: gitlab
    restart: always
    hostname: 'gitlab.${SITE}'
    environment:
      GITLAB_OMNIBUS_CONFIG: |
        external_url 'http://gitlab.${SITE}:80'
        gitlab_rails['gitlab_shell_ssh_port'] = 22
    ports:
      - '22:22'
    volumes:
      - '$HOME/srv/gitlab/config:/etc/gitlab'
      - '$HOME/srv/gitlab/logs:/var/log/gitlab'
      - '$HOME/srv/gitlab/data:/var/opt/gitlab'
    networks:
      - srv
      # - gitlab
    labels:
      - 'traefik.enable=true'
      - 'traefik.frontend.rule=Host:gitlab.${SITE}'
      - 'traefik.port=80'

  runner:
    image: gitlab/gitlab-runner:latest
    restart: always
    container_name: gitlab_runner
    volumes:
      - '$HOME/srv/gitlab/runner:/etc/gitlab-runner'
      - '/var/run/docker.sock:/var/run/docker.sock'
    networks:
      - gitlab
    links:
      - gitlab
    labels:
      - 'traefik.enable=false'
    environment:
      - 'GITLAB_URL=https://gitlab${SITE}/'
      - 'GITLAB_TOKEN='

  nginx:
    image: nginx:stable-alpine
    container_name: nginx
    volumes:
      - '$HOME/srv/nginx:/etc/nginx/conf.d'
    networks:
      - srv
    labels:
      - 'traefik.enable=true'
      - 'traefik.frontend.rule=Host:${SITE}'
      - 'traefik.port=80'

  cyprine:
    image: nginx:stable-alpine
    container_name: cyprine
    volumes:
      - '$HOME/srv/cyprine:/etc/nginx/conf.d'
    networks:
      - srv
    labels:
      - 'traefik.enable=true'
      - 'traefik.frontend.rule=Host:${SITE2}'
      - 'traefik.port=80'

  transmission:
    image: linuxserver/transmission:2.94-r1-ls12
    container_name: transmission
    restart: always
    environment:
      - 'PGID=1000'
      - 'PUID=1000'
      - 'TZ=Europe/Paris'
    ports:
      - '51413:51413'
      - '51413:51413/udp'
    volumes:
      - '$HOME/srv/transmission/config:/config'
      - '$HOME/srv/transmission/downloads:/downloads'
      - '$HOME/srv/transmission/watch:/watch'
    networks:
      - srv
    labels:
      - 'traefik.enable=true'
      - 'traefik.frontend.rule=Host:torrent.${SITE}'
      - 'traefik.port=9091'

  vpn:
    image: hwdsl2/ipsec-vpn-server:latest
    restart: always
    container_name: vpn
    privileged: true
    environment:
      - 'VPN_IPSEC_PSK='
      - 'VPN_USER='
      - 'VPN_PASSWORD='
      - 'VPN_ADDL_USERS=' # space separated values
      - 'VPN_ADDL_PASSWORDS=' # space separated values
    ports:
      - '500:500'
      - '4500:4500/udp'
    volumes:
      - '/lib/modules:/lib/modules:ro'

  jupyter:
    image: jupyter/base-notebook:2662627f26e0
    container_name: jupyter
    restart: always
    environment:
      - 'JUPYTER_ENABLE_LAB=yes'
    volumes:
      - '$HOME/srv/jupyter/jupyter_notebook_config.py:/root/.jupyter/jupyter_notebook_config.py'
      - '$HOME/srv/jupyter/notbooks:/notebooks'
    networks:
      - srv
    labels:
      - 'traefik.enable=true'
      - 'traefik.frontend.rule=Host:jupyter.${SITE}'
      - 'traefik.port=8888'

  pastebin:
    image: mkodockx/docker-pastebin:latest
    container_name: pastebin
    restart: always
    networks:
      - srv
    labels:
      - 'traefik.enable=true'
      - 'traefik.frontend.rule=Host:paste.${SITE}'
      - 'traefik.port=80'

  # doc:
  #   image: jekyll/jekyll:latest
  #   command: jekyll serve --force_polling --livereload
  #   container_name: doc
  #   # restart: always
  #   environment:
  #     - 'JEKYLL_ENV=docker'
  #   volumes:
  #     - '$HOME/srv/documentation/site:/srv/jekyll'
  #     - '$HOME/srv/documentation/bundle:/usr/local/bundle'
  #   networks:
  #     - srv
  #   labels:
  #     - 'traefik.enable=true'
  #     - 'traefik.frontend.rule=Host:wiki.${SITE}'
  #     - 'traefik.port=4000'

  # db:
  #   image: mariadb:10.1
  #   container_name: mariadb
  #   command: --transaction-isolation=READ-COMMITTED --binlog-format=ROW
  #   restart: always
  #   volumes:
  #     - '$HOME/srv/nextcloud/db:/var/lib/mysql'
  #   environment:
  #     - 'MYSQL_DATABASE=nextcloud'
  #     - 'MYSQL_USER=nextcloud'
  #     - 'MYSQL_PASSWORD='
  #     - 'MYSQL_ROOT_PASSWORD='
  #   labels:
  #     - 'traefik.enable=false'

  # nextcloud:
  #   image: nextcloud:16.0-fpm-alpine
  #   container_name: nextcloud
  #   restart: always
  #   links:
  #     - db
  #   volumes:
  #     - '$HOME/srv/nextcloud/data:/var/www/html'
  #     - '$HOME/srv/nextcloud/db:/var/lib/mysql '
  #     - '$HOME/srv/nextcloud/apps:/var/www/html/custom_apps'
  #     - '$HOME/srv/nextcloud/config:/var/www/html/config'
  #     - '$HOME/srv/nextcloud/data:/var/www/html/data'
  #     - '$HOME/srv/nextcloud/theme:/var/www/html/themes/<YOUR_CUSTOM_THEME>'
  #   networks:
  #     - srv
  #   labels:
  #     - 'traefik.enable=true'
  #     - 'traefik.frontend.rule=Host:cloud.${SITE}'
  #     - 'traefik.port=80'

  # weechat:
  #   image: craighurley/docker-weechat:latest
  #   container_name: weechat
  #   restart: always
  #   volumes:
  #     - '$HOME/srv/weechat:/home/user/.weechat'
  #   labels:
  #     - 'traefik.enable=true'
  #     - 'traefik.frontend.rule=Host:irc.${SITE}'
  #     - 'traefik.port=80'