Задать вопрос
Пользователь пока ничего не рассказал о себе

Наибольший вклад в теги

Все теги (12)

Лучшие ответы пользователя

Все ответы (22)
  • Развертывание web приложения на Go?

    mirrr
    @mirrr
    Программист и просто хороший человек
    Опишу свой способ, который перекликается со способом Алексей . Все это делается одним bash-скриптом, но распишу примерный алгоритм.

    1) Создаем юзера под которым будет работать приложение и переключаемся на него:
    useradd -s /bin/bash <имя_пользователя>
    su <имя_пользователя>


    2) Генерируем новый ключ для деплоя
    ssh-keygen -t rsa -C "<имя_пользователя>@<домен_сервиса>"
    cat ~/.ssh/id_rsa.pub

    Например, в gitlab добавляем этот ключ Project>Settings>Deploy Key

    3) Клонируем приложение и собираем приложение
    cd ~
    git clone ssh://______.git app 
    # здесь не буду расписывать, можно устанавливать через go get и т.д. способы отличаются
    # для go get нужно прописать $GOPATH в .bash_profile


    4) Создаем systemd service
    exit #выходим из-под юзера
    nano /etc/systemd/system/<service_name>.service

    Вписываем:
    [Unit]
    Description=<description>
    
    [Service]
    Restart=always
    RestartSec=10
    EnvironmentFile=-/<service_path>/env
    WorkingDirectory=/<service_path>/appDir
    ExecStart=/<service_path>/appDir/appName
    LimitNOFILE=524576
    LimitNPROC=524576
    User=<user>
    Group=<userGroup>
    StandardOutput=syslog
    StandardError=syslog
    SyslogIdentifier=<service_name>
    
    
    [Install]
    WantedBy=multi-user.target


    5) Запускаем сервис и ставим в автозагрузку:

    systemctl start <имя_сервиса>
    systemctl enable <имя_сервиса>


    Посмотреть статус:

    systemctl status <имя_сервиса>

    6) Разрешаем просмотр логов и перезапуск сервиса под созданным пользователем
    Добавляем в /etc/sudoers строчки:

    Defaults:<имя_пользователя> !authenticate
    <имя_пользователя> ALL=/usr/bin/systemctl restart <имя_сервиса>, /usr/bin/systemctl stop <имя_сервиса>, /usr/bin/systemctl start <имя_сервиса>, /usr/bin/journalctl


    Теперь эти операции не будут требовать пароля:
    sudo journalctl -f  -u <имя_сервиса> 
    sudo systemctl stop <имя_сервиса>
    sudo systemctl start <имя_сервиса>
    sudo systemctl restart <имя_сервиса>


    7) настраиваем виртуальный хост nginx для проксирования на порт приложения, если требуется:
    server {
        listen 80;
        server_name site.ru;
    
        client_max_body_size 256m;
        access_log  /var/log/nginx-site-acc;
        error_log /var/log/nginx-site-err;
        log_not_found off;
    
        location ^~ / {
            proxy_pass http://localhost:<порт_приложения>;
            proxy_set_header Host $host:$server_port;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_buffer_size 16k;
            proxy_buffers 32 16k;
            proxy_connect_timeout 300;
            proxy_send_timeout 300;
            proxy_read_timeout 300;
        }
    
        location ^~ /files {
            alias /home/<имя_пользователя>/app/some_files;
        }
    }
    Ответ написан
    Комментировать
  • Работа программистом на полставки?

    mirrr
    @mirrr
    Программист и просто хороший человек
    Я поначалу работал вообще по одному дню в неделю (на заводе урезали рабочую неделю до 4 дней), так-что, думаю, 3 дня — вполне. Например можно брать проекты здесь: www.free-lance.ru/
    Ответ написан
    Комментировать
  • Как сделать эту функцию не такой страшной?

    mirrr
    @mirrr
    Программист и просто хороший человек
    func dataValid(result []string) bool {
    	return v.IsLogin(result[0]) && isLoginAvailable(result[0]) &&
    		v.IsEmail(result[1]) && isEmailAvailable(result[1]) &&
    		v.IsPass(result[2])
    }
    Ответ написан
    3 комментария
  • Как реализовать нормальные отношения между доками в mgo golang??

    mirrr
    @mirrr
    Программист и просто хороший человек
    В агрегациях монги, начиная с 3.2 есть аналог LEFT JOIN - $lookup. В mgo агрегации реализуются через Pipe. Маленький пример на коленке, в поле news при выборке попадают все новости автора:

    package main
    
    import (
    	"encoding/json"
    	"fmt"
    	"gopkg.in/mgo.v2"
    )
    
    type (
    	obj map[string]interface{}
    	arr []interface{}
    )
    
    func main() {
    	mongo, err := mgo.Dial("localhost")
    	if err != nil {
    		panic(err)
    	}
    
    	info := []obj{}
    
    	if err := mongo.DB("myDB").C("authors").Pipe(arr{
    		obj{"$match": obj{"banned": false}},
    		obj{"$lookup": obj{"from": "news", "localField": "_id", "foreignField": "authorID", "as": "news"}},
    	}).All(&info); err != nil {
    		fmt.Println("Error:", err)
    	}
    
    	printJSON(info)
    }
    
    func printJSON(t interface{}) {
    	j, _ := json.MarshalIndent(t, "", "\t")
    	fmt.Println(string(j))
    }
    Ответ написан
    Комментировать
  • Что выбрать с++, с или go для алгоритма?

    mirrr
    @mirrr
    Программист и просто хороший человек
    В С и С++ я начинающий, буду учиться по-ходу. Но 12 лет в Php+JS.

    Нет времени объяснять, используйте Go!
    Ответ написан
    1 комментарий

Лучшие вопросы пользователя

Все вопросы (4)